OSDN Git Service

ver1.1
[nysol/mining.git] / zdd / lib / SAPPOROBDD / src / BDDLCM / problem.c
diff --git a/zdd/lib/SAPPOROBDD/src/BDDLCM/problem.c b/zdd/lib/SAPPOROBDD/src/BDDLCM/problem.c
new file mode 100755 (executable)
index 0000000..451f1e5
--- /dev/null
@@ -0,0 +1,371 @@
+/*  Common problem input/output routines /structure
+            25/Nov/2007   by Takeaki Uno  e-mail:uno@nii.jp, 
+    homepage:   http://research.nii.ac.jp/~uno/index.html  */
+/* This program is available for only academic use, basically.
+   Anyone can modify this program, but he/she has to write down 
+    the change of the modification on the top of the source code.
+   Neither contact nor appointment to Takeaki Uno is needed.
+   If one wants to re-distribute this code, do not forget to 
+    refer the newest code, and show the link to homepage of 
+    Takeaki Uno, to notify the news about the codes for the users.
+   For the commercial use, please make a contact to Takeaki Uno. */
+
+/***************************************************/
+
+#ifndef _problem_c_
+#define _problem_c_
+
+#include"problem.h"
+
+#include"stdlib2.c"
+#include"queue.c"
+#include"itemset.c"
+
+void PROBLEM_error (){
+  ERROR_MES = "command explanation";
+  EXIT;
+}
+
+/*************************************************************************/
+/* PROBLEM and ITEMSET initialization */
+/*************************************************************************/
+void PROBLEM_init (PROBLEM *P){
+  P->start_time = clock();
+  RAND_INIT;
+  P->problem = 0;
+  P->prog = 0;
+  P->prog2 = 0;
+  P->input_fname = P->output_fname = P->weight_fname = NULL;
+  P->table_fname = P->position_fname = NULL;
+
+  P->sgraph_fname = P->sgraph2_fname = NULL;
+  P->sgraph_wfname = P->sgraph2_wfname = NULL;
+  P->agraph_fname = P->agraph2_fname = NULL;
+  P->trsact_fname = P->trsact2_fname = NULL;
+  P->trsact_fname2 = P->trsact2_fname2 = NULL;
+  P->trsact_wfname = P->trsact2_wfname = NULL;
+  P->trsact_wfname2 = P->trsact2_wfname2 = NULL;
+  P->trsact_pfname = P->trsact2_pfname = NULL;
+  P->seq_fname = P->seq2_fname = NULL;
+  P->fstar_fname = P->fstar2_fname = NULL;
+  P->mat_fname = P->mat2_fname = NULL;
+  P->smat_fname = P->smat2_fname = NULL;
+  P->setfamily_fname = P->setfamily2_fname = NULL;
+  P->setfamily_wfname = P->setfamily2_wfname = NULL;
+
+  P->root = 0;
+  P->dir = P->edge_dir = 0;
+  P->th = P->th2 = P->th3 = 0;
+  P->ratio = P->ratio2 = 0;
+  P->num = P->siz = P->dim = P->len = 0;
+  P->rows = 0;
+  P->clms = 0;
+  
+  ITEMSET_init (&P->II);
+  ITEMSET_init (&P->II2);
+
+  P->vf = P->dep = NULL;
+  P->ff = INIT_QUEUE;
+
+  P->shift = NULL;
+  P->occ_w = P->occ_pw = P->occ_w2 = P->occ_pw2 = NULL;
+
+  P->itemjump = P->itemcand = P->vecjump = P->veccand = INIT_QUEUE;  // for delivery
+  P->OQ = P->OQ2 = P->VQ = P->VQ2 = NULL;   // for delivery
+  P->itemary = NULL;
+  P->itemmark = P->itemflag = P->vecmark = P->vecflag = NULL;  // mark for vector
+  P->occ_t = P->vecary = NULL;
+  P->oo = INIT_QUEUE;
+  
+  P->pat = NULL;
+  P->plen = P->perr = 0;
+  
+#ifdef _alist_h_
+  P->occ = INIT_MALIST;
+#endif
+
+#ifdef _trsact_h_
+  TRSACT_init (&P->TT);
+  TRSACT_init (&P->TT2);
+#endif
+#ifdef _sgraph_h_
+  P->SG = INIT_SGRAPH;
+  P->SG2 = INIT_SGRAPH;
+#endif
+#ifdef _agraph_h_
+  P->AG = INIT_AGRAPH;
+  P->AG2 = INIT_AGRAPH;
+#endif
+#ifdef _seq_h_
+  SEQ_init (&P->SS);
+  SEQ_init (&P->SS2);
+#endif
+#ifdef _fstar_h_
+  P->FS = INIT_FSTAR;
+  P->FS2 = INIT_FSTAR;
+#endif
+
+#ifdef _vec_h_
+  P->MM = INIT_MAT;
+  P->MM2 = INIT_MAT;
+  P->SM = INIT_SMAT;
+  P->SM2 = INIT_SMAT;
+  P->FF = INIT_SETFAMILY;
+  P->FF2 = INIT_SETFAMILY;
+#endif
+}
+
+/*************************************************************************/
+/* PROBLEM initialization */
+/* all pointers are set to NULL, but don't touch filenames  */
+/* load_flag, flag to give TRSACT_load */
+/* II->item_max will be item_max when do not load problem */
+/* II-> */
+/*************************************************************************/
+void PROBLEM_init2 (PROBLEM *P, int flag){
+  int f=0;
+/******************************/
+#ifdef _trsact_h_
+  if ( P->trsact_fname ){
+    TRSACT_load (&P->TT, P->trsact_fname, P->trsact_fname2, P->trsact_wfname, P->trsact_wfname2, P->trsact_pfname);       if (ERROR_MES) goto ERR;
+    if ( P->TT.flag & SHOW_MESSAGE ){
+      print_err ("trsact: %s", P->trsact_fname);
+      if ( P->trsact2_fname2 ) print_err (" ,2nd-trsact2 %s (from ID %d)", P->trsact_fname2, P->TT.end1);
+      print_err (" ,#transactions %d ,#items %d ,size %d", P->TT.rows_org, P->TT.clms_org, P->TT.eles_org);
+      print_err (" extracted database: #transactions %d ,#items %d ,size %zd", P->TT.T.t, P->TT.T.clms, P->TT.T.eles);
+      if ( P->trsact_wfname ) print_err (" ,weightfile %s", P->trsact_wfname);
+      if ( P->trsact_wfname2 ) print_err (" ,2nd-weightfile %s", P->trsact_wfname2);
+      if ( P->trsact_pfname ) print_err (" ,item-order-file %s", P->trsact_pfname);
+      print_err ("\n");
+    }
+  }
+  if ( P->trsact2_fname ){
+    TRSACT_load (&P->TT2, P->trsact2_fname, P->trsact2_fname2, P->trsact2_wfname, P->trsact2_wfname2, P->trsact2_pfname);       if (ERROR_MES) goto ERR;
+    if ( P->TT2.flag & SHOW_MESSAGE ){
+      print_err ("trsact2: %s", P->trsact2_fname);
+      if ( P->trsact2_fname2 ) print_err (" ,2nd-trsact2 %s (from ID %d)", P->trsact2_fname2, P->TT.end1);
+      print_err (" ,#transactions %d ,#items %d ,size %zd", P->TT2.rows_org, P->TT2.clms_org, P->TT2.eles_org);
+      print_err (" extracted database: #transactions %d ,#items %d ,size %zd", P->TT2.T.t, P->TT2.T.clms, P->TT2.T.eles);
+      if ( P->trsact2_wfname ) print_err (" ,weightfile2 %s", P->trsact2_wfname);
+      if ( P->trsact2_wfname2 ) print_err (" ,2nd-weightfile2 %s", P->trsact2_wfname2);
+      if ( P->trsact2_pfname ) print_err (" ,item-order-file2 %s", P->trsact2_pfname);
+      print_err ("\n");
+    }
+  }
+#endif
+#ifdef _sgraph_h_
+  if ( P->sgraph_fname ){
+    SGRAPH_load (&P->SG, P->sgraph_fname, P->sgraph_wfname);    if (ERROR_MES) goto ERR;
+    print_mes (P->SG.flag, "sgraph: %s ,#nodes %d ,#edges %zd ,#arcs %zd\n", P->sgraph_fname, SGRAPH_NODE_NUM(P->SG), P->SG.edge.eles/2,  P->SG.in.eles);
+  }
+  if ( P->sgraph2_fname ){
+    SGRAPH_load (&P->SG, P->sgraph2_fname, P->sgraph2_wfname);    if (ERROR_MES) goto ERR;
+    print_mes (P->SG2.flag, "sgraph: %s ,#nodes %d ,#edges %zd ,#arcs %zd\n", P->sgraph2_fname, SGRAPH_NODE_NUM(P->SG2), P->SG2.edge.eles/2, P->SG2.in.eles);
+  }
+#endif
+#ifdef _agraph_h_
+  if ( P->agraph_fname ){
+    AGRAPH_load (&P->AG, P->agraph_fname);    if (ERROR_MES) goto ERR;
+    print_mes (P->AG.flag, "agraph: %s ,#nodes %d ,#edges %zd ,#arcs %zd\n", P->agraph_fname, P->AG.node_num, P->AG.edge_num,  P->AG.arc_num);
+  }
+  if ( P->agraph2_fname ){
+    AGRAPH_load (&P->AG2, P->agraph_fname);    if (ERROR_MES) goto ERR;
+    print_mes (P->AG2.flag, "agraph: %s ,#nodes %d ,#edges %zd ,#arcs %zd\n", P->agraph2_fname, P->AG2.node_num, P->AG2.edge_num,  P->AG2.arc_num);
+  }
+#endif
+#ifdef _fstar_h_
+  if ( P->fstar_fname ){
+    FSTAR_load (&P->FS, P->fstar_fname);    if (ERROR_MES) goto ERR;
+    print_mes (P->FS.flag, "agraph: %s ,#nodes %d(%d,%d) ,#edges %zd\n", P->fstar_fname, P->FS.node_num, P->FS.in_node_num, P->FS.out_node_num, P->FS.edge_num);
+  }
+  if ( P->fstar2_fname ){
+    FSTAR_load (&P->FS2, P->fstar2_fname);     if (ERROR_MES) goto ERR;
+    print_mes (P->FS2.flag, "agraph2: %s ,#nodes %d(%d,%d) ,#edges %zd\n", P->fstar2_fname, P->FS2.node_num, P->FS2.in_node_num, P->FS2.out_node_num, P->FS2.edge_num);
+  }
+
+#endif
+#ifdef _vec_h_
+  if ( P->mat_fname ){
+    MAT_load (&P->MM, P->mat_fname);   if (ERROR_MES) goto ERR;
+    print_mes (P->MM.flag, "mat: %s ,#rows %d ,#clms %d\n", P->mat_fname, P->MM.t, P->MM.clms);
+  }
+  if ( P->mat2_fname ){
+    MAT_load (&P->MM2, P->mat2_fname);    if (ERROR_MES) goto ERR;
+    print_mes (P->MM2.flag, "mat2: %s ,#rows %d ,#clms %d\n", P->mat2_fname, P->MM2.t, P->MM2.clms);
+  }
+  if ( P->smat_fname ){
+    SMAT_load (&P->SM, P->smat_fname);    if (ERROR_MES) goto ERR;
+    print_mes (P->SM.flag, "smat: %s ,#rows %d ,#clms %d ,#eles %zd\n", P->smat_fname, P->SM.t, P->SM.clms, P->SM.eles);
+  }
+  if ( P->smat2_fname ){
+    SMAT_load (&P->SM2, P->smat2_fname);    if (ERROR_MES) goto ERR;
+    print_mes (P->SM2.flag, "smat2: %s ,#rows %d ,#clms %d ,#eles %zd\n", P->smat2_fname, P->SM2.t, P->SM2.clms, P->SM2.eles);
+  }
+  if ( P->setfamily_fname ){
+    SETFAMILY_load (&P->FF, P->setfamily_fname, P->setfamily_wfname);   if (ERROR_MES) goto ERR;
+    print_mes (P->FF.flag, "setfamily: %s ,#rows %d ,#clms %d ,#eles %zd", P->setfamily_fname, P->FF.t, P->FF.clms, P->FF.eles);
+    if ( P->setfamily_wfname ) print_mes (P->FF.flag, " ,weightfile %s", P->setfamily_wfname);
+    print_mes (P->FF.flag, "\n");
+  }
+  if ( P->setfamily2_fname ){
+    SETFAMILY_load (&P->FF2, P->setfamily2_fname, P->setfamily2_wfname);   if (ERROR_MES) goto ERR;
+    print_mes (P->FF2.flag, "setfamily2: %s ,#rows %d ,#clms %d ,#eles %zd", P->setfamily2_fname, P->FF2.t, P->FF2.clms, P->FF2.eles);
+    if ( P->setfamily2_wfname ) print_mes (P->FF2.flag, " ,weightfile %s", P->setfamily2_wfname);
+    print_mes (P->FF2.flag, "\n");
+  }
+#endif
+  if (P->input_fname){ f=1; print_err (" input: %s", P->input_fname); }
+  if (P->weight_fname){ f=1; print_err (" weight: %s", P->weight_fname); }
+  if (P->output_fname){ f=1;  print_err (" output to: %s",P->output_fname); }
+  if ( f )print_err ("\n");
+
+/******************************/
+
+  if ( flag&SHOW_MESSAGE ){
+    ITEMSET_print (&P->II, (flag&PROBLEM_PRINT_FRQ)? 1: 0);
+    if ( flag&PROBLEM_PRINT_DENSE ){
+      print_err ("density threshold");
+      fprint_real (stderr, P->dense);
+      print_err ("\n");
+    }
+  }
+
+  if ( !ERROR_MES ) return;
+  ERR:;
+  PROBLEM_end (P);
+  EXIT;
+}
+
+/* termination of problem */
+void PROBLEM_end (PROBLEM *P){
+  ITEMSET *II = &P->II;
+
+#ifdef _trsact_h_
+  TRSACT_end (&P->TT);
+  TRSACT_end (&P->TT2);
+#endif
+#ifdef _sgraph_h_
+  SGRAPH_end (&P->SG);
+  SGRAPH_end (&P->SG2);
+#endif
+#ifdef _agraph_h_
+  AGRAPH_end (&P->AG);
+  AGRAPH_end (&P->AG2);
+#endif
+#ifdef _seq_h_
+  SEQ_end (&P->SS);
+  SEQ_end (&P->SS2);
+#endif
+#ifdef _fstar_h_
+  FSTAR_end (&P->FS);
+  FSTAR_end (&P->FS2);
+#endif
+#ifdef _vec_h_
+  MAT_end (&P->MM);
+  MAT_end (&P->MM2);
+  SMAT_end (&P->SM);
+  SMAT_end (&P->SM2);
+  SETFAMILY_end (&P->FF);
+  SETFAMILY_end (&P->FF2);
+#endif
+
+/******************************/
+
+  mfree (P->vf, P->dep);
+  QUEUE_end (&P->ff);
+
+  ITEMSET_end (II);
+  ITEMSET_end (&P->II2);
+
+  if ( P->occ_pw2 != P->occ_pw && P->occ_pw2 != P->occ_w2 ) free2 (P->occ_pw2);
+  if ( P->occ_w2 != P->occ_w ) free2 (P->occ_w2);
+  if ( P->occ_pw != P->occ_w ) free2 (P->occ_pw);
+  mfree (P->shift, P->occ_t, P->occ_w);
+
+  if ( P->OQ ) free2 (P->OQ[0].v);
+  if ( P->OQ2 ) free2 (P->OQ2[0].v);
+  if ( P->VQ ) free2 (P->VQ[0].v);
+  if ( P->VQ2 ) free2 (P->VQ2[0].v);
+  mfree (P->OQ, P->OQ2, P->VQ, P->VQ2);
+
+
+  mfree (P->itemary, P->itemflag, P->itemmark, P->vecary, P->vecflag, P->vecmark);
+  QUEUE_end (&P->itemcand);
+  QUEUE_end (&P->itemjump);
+
+  QUEUE_end (&P->veccand);
+  QUEUE_end (&P->vecjump);
+  QUEUE_end (&P->oo);
+
+
+#ifdef _alist_h_
+  MALIST_end (&P->occ);
+#endif
+
+#ifdef _undo_h_
+  ALISTundo_end ();
+#endif
+
+  P->end_time = clock();
+  if ( print_time_flag )
+    print_err ("computation_time= %3f\n", ((double)(P->end_time - P->start_time))/CLOCKS_PER_SEC);
+
+  PROBLEM_init (P);
+}
+
+/* allocate arrays and structures */
+void PROBLEM_alloc (PROBLEM *P, QUEUE_ID siz, QUEUE_ID siz2, size_t siz3, PERM *perm, int f){
+#ifdef _alist_h_
+  ALIST_ID i;
+#endif
+
+  if ( f&PROBLEM_SHIFT ) calloc2 (P->shift, siz+2, "PROBLEM_alloc: shift", goto ERR);
+  if ( f&PROBLEM_OCC_T ) calloc2 (P->occ_t, siz+2, "PROBLEM_alloc:occ_t", goto ERR);
+  if ( f&(PROBLEM_OCC_W+PROBLEM_OCC_PW) ) calloc2 (P->occ_w, siz+2, "PROBLEM_alloc:occ_w", goto ERR);
+  if ( f&PROBLEM_OCC_PW ){
+    calloc2 (P->occ_pw, siz+2, "PROBLEM_alloc:occ_pw", goto ERR);
+  } else P->occ_pw = P->occ_w;
+  if ( f&PROBLEM_OCC_W2 ){
+    calloc2 (P->occ_w2, siz+2, "PROBLEM_alloc:occ_w", goto ERR);
+    if ( f&PROBLEM_OCC_PW ){
+      calloc2 (P->occ_pw2, siz+2, "PROBLEM_alloc:occ_pw", goto ERR);
+    } else P->occ_pw2 = P->occ_w2;
+  } else { P->occ_w2 = P->occ_w; P->occ_pw2 = P->occ_pw; }
+
+  if ( f&PROBLEM_ITEMFLAG ) calloc2 (P->itemflag, siz+2, "PROBLEM_alloc:itemflag", goto ERR);
+  if ( f&PROBLEM_ITEMMARK ) calloc2 (P->itemmark, siz+2, "PROBLEM_alloc:itemmark", goto ERR);
+  if ( f&PROBLEM_ITEMARY ) calloc2(P->itemary, siz+2,"PROBLEM_alloc:itemary", goto ERR);
+  if ( f&PROBLEM_ITEMJUMP ) QUEUE_alloc (&P->itemjump, siz+2);
+  if ( f&PROBLEM_ITEMCAND ) QUEUE_alloc (&P->itemcand, siz+2);
+
+  if ( f&PROBLEM_VECFLAG ) calloc2 (P->vecflag, siz+2, "PROBLEM_alloc:vecflag", goto ERR);
+  if ( f&PROBLEM_VECMARK ) calloc2 (P->vecmark, siz2+2, "PROBLEM_alloc:vecmark", goto ERR);
+  if ( f&PROBLEM_VECARY ) calloc2 (P->vecary, siz2+2, "PROBLEM_alloc:vecary", goto ERR);
+  if ( f&PROBLEM_VECJUMP ) QUEUE_alloc (&P->vecjump, siz2+2);
+  if ( f&PROBLEM_VECCAND ) QUEUE_alloc (&P->veccand, siz2+2);
+
+#ifdef _alist_h_
+  if ( f&PROBLEM_OCC3){
+    MALIST_alloc (&P->occ, siz, siz2+2); // element=>
+if ( ERROR_MES ) goto ERR;
+    if ( f&PROBLEM_OCC2 )
+      FLOOP (i, 0, siz) MALIST_ins_tail (&P->occ, (f&PROBLEM_OCC1)?siz: 0, i, 0);
+  }
+#endif
+
+  ITEMSET_init2 (&P->II, P->output_fname, perm, siz, siz3);
+  if ( P->II.target<siz && P->II.perm ) P->II.target = P->II.perm[P->II.target];
+
+#ifdef _undo_h_
+  ALISTundo_init ();
+#endif
+
+  return;
+  ERR:;
+  PROBLEM_end (P);
+  EXIT;
+}
+
+#endif
+
+