Existe una necesidad urgente de implementar el código del algoritmo Apriori en lenguaje C
+ ((tfs_delim(is_tfscan(s)) == TFS_REC) ?0 :1))
#define BUFFER(s) tfs_buf( is_tfscan(s))
/*------------------------------------ ------------ ----------------------------------
Constantes
- -------------------------------------- ------------ ------------------*/
#ifndef QUIET /* Si no es un silencio version*/
/* -- - Mensaje de error--- */
static const char *errmsgs[] = {
/* E_NONE 0 * / "no hay error\n",
/* E_NOMEM -1 */ "no hay suficiente memoria\n",
/* E_FOPEN -2 */ "no se puede abrir el archivo %s \n",
/* E_FREAD -3 */ "error de lectura en el archivo %s\n",
/* E_FWRITE -4 */ "error de escritura en el archivo %s \n",
/* E_OPTION -5 */ "opción desconocida -%c\n",
/* E_OPTARG -6 */ "argumento de opción faltante\n",
/* E_ARGCNT -7 */ "número incorrecto de argumentos\n",
/* E_SUPP -8 */ "soporte mínimo no válido %d\n",
/* E_NOTAS -9 */ "no hay elementos ni transacciones en las que trabajar\n",
for (tacnt = 0; 1; tacnt++) { /* bucle de lectura de transacciones*/ p>
k = is_read(itemset, in) /* Leer la siguiente transacción*/
if (k < 0) error( k, fn_in, RECCNT(itemset), BUFFER(itemset)
if (k > 0) break /* Comprobar errores y final del archivo*/
k = is_tsize(itemset); /p>
if (k > max) max = k; /* Tamaño de la transacción*/
if (taset && (tas_add(taset, NULL, 0) ! = 0))
error(E_NOMEM); /* Agregar transacción cargada*/
}/* Agregar al conjunto de transacciones*/
fclose( in) ; in = NULL; /* Cerrar el archivo de entrada*/
fclose(in); in = NULL /* Cerrar el archivo de entrada*/
n /
n = is_cnt(itemset);/* Obtener el número de elementos*/
if( detallado ) MSG(fprintf(stderr, "[%d elemento(s),", n));
if( detallado ) MSG( fprintf(stderr, " %d transacción(es)] hecho ", tacnt));
if( detallado ) MSG(fprintf(stderr, "[%.2fs].\n", SEC_SINCE(t));
/* --- Ordenar y recodificar elementos--- */
if( verbose ) MSG(fprintf(stderr, "Ordenar y recodificar elementos..."));
t = clock(); /* Iniciar temporizador*/
map = (int*)malloc(is_cnt(itemset) *sizeof(int));
if (!map ) error( E_NOMEM); /* Crear mapa de identificador de elementos */
n = is_recode(itemset, supp, 2, map); /* 2: Modo de clasificación */
tas_recode(taset, map, n); /* Recodificar la transacción cargada*/
max = tas_max(taset);
a.size */
// Usar el correspondiente en otras partes de la implementación
// Identificar a la identificación interna
stat->reserve( n+ 2 ) ;
stat->push_back( 0 )
para(int j= 0; j< n ;j++ )
para(int j= 0 ; j< n ;j++ )
for(int j=0; j< j++ )
{
stat->push_back( 0 ) ; p >
relist->insert( Element( atoi( is_name( itemset, j ) ),j) );
}
if( detallado ) MSG(fprintf(stderr , "[%d elemento(s)] ", n));
if( detallado ) MSG(fprintf(stderr, "done [%.2fs].\n", SEC_SINCE(t)) ;
/* --- Creando árbol de transacciones --- */
if( detallado ) MSG(fprintf(stderr, "creando árbol de transacciones ..."));< / p>
t = reloj(); /* Iniciar temporizador*/
tatree = tat_create(taset,1 /* Crear árbol de transacciones*/
if ( ! tatree) error(E_NOMEM) /* (compactar transacciones) */
tt = clock() /* Presta atención al tiempo de compilación*/
if( detallado ) MSG (fprintf(stderr, "done [%.2fs].\n", SEC_SINCE(t));
/* --- Crear un árbol de proyecto --- */
if( detallado ) MSG(fprintf(stderr, "Verificar subconjunto de tamaño 1"));
t = reloj(); tc = 0 /* Iniciar temporizador y */< / p>
istree = ist_create(n, supp); /* Crear un árbol de conjunto de elementos*/
if (! istree) error(E_NOMEM);
for (k = n; --k >= 0; ) /* Establecer frecuencia única*/
ist_setcnt(istree, k, is_getfrq( itemset, k));
ist_settac(istree, tacnt); /* Establecer el número de transacciones*/
use = (char*)malloc(n *sizeof(char) );
if (!usage) error(E_NOMEM); /* Crear un vector de uso del proyecto */
/* --- Verificar un subconjunto de proyectos - -- * /
while (ist_height(istree) < max && ( ( ismax == -1 && endApriori == false )
|| ist_height(istree) < ismax )
)<
/p>
{
nbgen = 0; cuando no se alcanza la altura, */
if (k < 0) error(E_NOMEM); árbol de proyecto Nivel 1*/
if (k != 0) break /* Si no se agrega ningún nivel, break */
if( detallado ) MSG(fprintf(stderr, " % d", ist_height(istree));
if ((i < n) /* Verifique el nivel actual de uso del proyecto*/
&& (i *(double) tt < 0.1 *n *tc)) {
n = i; x = clock() /* Si el elemento se elimina, y */
tas_filter( taset, uso ); / * El tiempo de cálculo es suficiente, */
tat_delete(tatree); /* Eliminar elementos innecesarios*/
tatree = tat_create(taset, 1); p>
if (!tatree) error(E_NOMEM);
tt = clock() -x /* Reconstruir el árbol de transacciones y */
}/* Nota el nuevo tiempo de construcción */
x = clock(); /* Iniciar temporizador*/
ist_countx(istree, tatree, nbfreq, istree->supp); árbol*/
tc = reloj() -x
actNfC = 1-double(nbfreq)/double(nbgen)
avgNfC = avgNfC + actNfC ;
if( detallado )
{
cout<<" \t Fk: "< } bdnsize += nbgen - nbfreq; if( nivel >=4 && ( bdnsize / nbgen < 1.5 ) && ( bdnsize > 100 ) { if( actNfC < ratioNfC ) { eps = 0; endApriori = true; } else if( actNfC > 0.25 ) endApriori = true ; } }/* y presta atención al nuevo tiempo de conteo*/ if( detallado ) MSG(fprintf (stderr, " done [%.2fs].\n", SEC_SINCE(t))); /* --- Conjunto de elementos de filtro --- */ t = clock(); /* Iniciar el temporizador*/ #ifdef MAXIMAL /* Filtrar el conjunto máximo de elementos*/
/p>
if( detallado ) MSG(fprintf(stderr, "Filtrar el conjunto de elementos más grande...");
if(detallado) MSG(fprintf(stderr, "Filtrar el elemento más grande set..."); Conjunto de elementos...."));
if( ratioNfC == 0 || nbgen < k+1 || ist_height(istree)>= max )
ist_filter2(istree, IST_MAXFRQ, 0);
else
ist_ filter2(istree, IST_MAXFRQ, bdn);
if( detallado ) MSG (fprintf(stderr, " done [%.2fs].\n", SEC_SINCE(t)));
vacío = (n <= 0) ?1 : 0; */
#endif /* ¿Es el más grande?*/
#ifdef CERRADO /* Filtrar conjunto de elementos cerrados*/
if( detallado ) MSG( fprintf (stderr, "Filtrar conjunto de elementos cerrados ."));
ist_filter(istree, IST_CLOSED);
if( detallado ) MSG(fprintf(stderr, " hecho [%.2fs] .\n", SEC_SINCE( t));
for (k = n; --k >= 0; ) /* Comprobar si hay elementos en todos los t.a*/
if (is_getfrq(itemset, k ) == tacnt) break;
vacío = ( k <= 0) ?1 : 0 /* Compruebe si el conjunto de elementos está vacío*/
#endif /* Cerrado */
/* --- Imprimir conjunto de elementos--- */
for (i = ist_height(istree); --i > = 0; )
map[i] = 0; /* Borrar contador de conjunto de elementos*/
if( detallado ) MSG(fprintf(stderr, "escribiendo %s... ", (fn_out) ?"
t = reloj(); /* Iniciar temporizador */
if (fn_out) { /* Si el archivo de salida se proporciona, */
out = fopen(fn_out, " w"); /* Abre el archivo de salida*/
if (! out) error(E_FOPEN, fn_out);
if (empty) fprintf(out, " (%d)\n", tacnt);
}/* Reportar un elemento vacío set */
ist_init(istree); /* init. Extraer conjunto de elementos*/
set = is_tract(itemset); /* Obtener búfer de transacción*/
< p); > for (n = vacío; 1; n++) { /* Extraer el conjunto de elementos del árbol*/k = ist_set(istree, set, &supp);
if ( k <= 0) break; /* Obtener el siguiente conjunto de elementos frecuentes*/
map[k-1]++
;/* Calcular el conjunto de elementos*/
if (fn_out) { /* Si se proporciona el archivo de salida*/
for (i = 0; i < k; i++) { /* Recorrer elementos*/
fputs(is_name(itemset, set[i]), out);
fputc(' ', out); Nombre*/
}/* seguido de delimitador*
f
fprintf(out, "(%d)\n", supp); p>
}/* Soporte para imprimir conjuntos de elementos*/
else
{
short unsigned * is = new short unsigned [k];
for (i = 0; i < k; i++) /* Recorrer elementos*/
{
is[i] = set[i];
}
if( k < nivel || nbgen < k+1 || ist_ altura(istree)>= max )
{
bdPapriori-> insertar(es, k ,supp
(*stat)[ 0 ] ++;
(*stat)[ k+1 ]+ +;
if( maxBdP & lt; k )
maxBdP = k
}
else
{
generadoFk = verdadero
}
eliminar[] es
}
}<; /p>
if (fn_out ) { /* si se proporciona un archivo de salida */
if (fflush(out) != 0) error(E_FWRITE, fn_out);
if (out ! = stdout) fclose(out);
out = NULL /* Cerrar el archivo de salida*/
}
if( detallado ) MSG(fprintf(stderr, "[%d conjunto(s)] hecho ", n));
if( detallado ) MSG(fprintf(stderr, "[%.2fs].\n " , SEC_SINCE(t));
/* --- Imprimir estadísticas del conjunto de elementos --- */
k = ist_height(istree); /* Encuentra el último no- contador cero*/
if ((k > 0) &&(map[k-1] <= 0)) k--;
if( detallado ){ p >
printf("%d\n", vacío); /* Imprime el número de conjuntos de elementos*/
for (i = 0; i < k; i ++) printf( "% d\n", map[i]);
}
/* --- Limpieza --- */
#ifndef NDEBUG / * si esta es una versión de depuración*/
free(usage); /* Eliminar el vector de uso del elemento*/
free(map) y el mapa de identificador */; p> <
p> ist_delete(istree); /* Eliminar árbol de conjunto de elementos, */
if (taset) tas _delete(taset, 0); /* Conjunto de transacciones, */
is_delete ( conjunto de elementos); /* y conjunto de elementos*/
#endif
return tatree
}