nysol-zdd 3.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. checksums.yaml +7 -0
  2. data/ext/zdd_so/BDD.cc +495 -0
  3. data/ext/zdd_so/BDD.h +356 -0
  4. data/ext/zdd_so/BDDDG.cc +1818 -0
  5. data/ext/zdd_so/BDDDG.h +107 -0
  6. data/ext/zdd_so/BDDHASH.cc +91 -0
  7. data/ext/zdd_so/BtoI.cc +503 -0
  8. data/ext/zdd_so/BtoI.h +144 -0
  9. data/ext/zdd_so/CtoI.cc +1072 -0
  10. data/ext/zdd_so/CtoI.h +186 -0
  11. data/ext/zdd_so/MLZBDDV.cc +153 -0
  12. data/ext/zdd_so/MLZBDDV.h +42 -0
  13. data/ext/zdd_so/SOP.cc +608 -0
  14. data/ext/zdd_so/SOP.h +199 -0
  15. data/ext/zdd_so/ZBDD.cc +1035 -0
  16. data/ext/zdd_so/ZBDD.h +243 -0
  17. data/ext/zdd_so/ZBDDDG.cc +1834 -0
  18. data/ext/zdd_so/ZBDDDG.h +105 -0
  19. data/ext/zdd_so/ZBDDHASH.cc +91 -0
  20. data/ext/zdd_so/bddc.c +2816 -0
  21. data/ext/zdd_so/bddc.h +132 -0
  22. data/ext/zdd_so/extconf.rb +25 -0
  23. data/ext/zdd_so/include/aheap.c +211 -0
  24. data/ext/zdd_so/include/aheap.h +111 -0
  25. data/ext/zdd_so/include/base.c +93 -0
  26. data/ext/zdd_so/include/base.h +60 -0
  27. data/ext/zdd_so/include/itemset.c +473 -0
  28. data/ext/zdd_so/include/itemset.h +153 -0
  29. data/ext/zdd_so/include/problem.c +371 -0
  30. data/ext/zdd_so/include/problem.h +160 -0
  31. data/ext/zdd_so/include/queue.c +518 -0
  32. data/ext/zdd_so/include/queue.h +177 -0
  33. data/ext/zdd_so/include/sgraph.c +331 -0
  34. data/ext/zdd_so/include/sgraph.h +170 -0
  35. data/ext/zdd_so/include/stdlib2.c +832 -0
  36. data/ext/zdd_so/include/stdlib2.h +746 -0
  37. data/ext/zdd_so/include/trsact.c +723 -0
  38. data/ext/zdd_so/include/trsact.h +167 -0
  39. data/ext/zdd_so/include/vec.c +583 -0
  40. data/ext/zdd_so/include/vec.h +159 -0
  41. data/ext/zdd_so/lcm-vsop.cc +596 -0
  42. data/ext/zdd_so/print.cc +683 -0
  43. data/ext/zdd_so/table.cc +330 -0
  44. data/ext/zdd_so/vsop.h +88 -0
  45. data/ext/zdd_so/zdd_so.cpp +3277 -0
  46. data/lib/nysol/zdd.rb +31 -0
  47. metadata +131 -0
@@ -0,0 +1,153 @@
1
+ /* itemset search input/output common routines
2
+ 25/Nov/2007 by Takeaki Uno e-mail:uno@nii.jp,
3
+ homepage: http://research.nii.ac.jp/~uno/index.html */
4
+ /* This program is available for only academic use, basically.
5
+ Anyone can modify this program, but he/she has to write down
6
+ the change of the modification on the top of the source code.
7
+ Neither contact nor appointment to Takeaki Uno is needed.
8
+ If one wants to re-distribute this code, do not forget to
9
+ refer the newest code, and show the link to homepage of
10
+ Takeaki Uno, to notify the news about the codes for the users.
11
+ For the commercial use, please make a contact to Takeaki Uno. */
12
+
13
+ /* routines for itemset mining */
14
+
15
+ #ifndef _itemset_h_
16
+ #define _itemset_h_
17
+
18
+ #include"stdlib2.h"
19
+ #include"queue.h"
20
+ #define AHEAP_KEY_WEIGHT
21
+ #include"aheap.h"
22
+
23
+
24
+ typedef struct {
25
+ int a;
26
+ QUEUE itemset; // current operating itemset
27
+ QUEUE add; // for equisupport (hypercube decomposition)
28
+ int ub, lb; // upper/lower bounds for the itemset size
29
+ WEIGHT frq, pfrq, frq_ub, frq_lb; // upper/lower bounds for the frequency
30
+ WEIGHT rposi_lb, rposi_ub, posi_lb, posi_ub, nega_ub, nega_lb; // upper/lower bounds for the sum of positive/negative weights
31
+ WEIGHT setrule_lb; // frequency lower bound for set rule
32
+ double ratio, prob; // confidence and independent probability of the current pattern
33
+ double ratio_ub, ratio_lb, prob_ub, prob_lb; // upper/lower bounds for confidence and independent probability
34
+ QUEUE_INT target; // target item for rule mining
35
+ char *itemflag; // 1 if it is include in the pattern (and 2 if included in add)
36
+ WEIGHT *item_frq; // frequency of each item
37
+ WEIGHT total_weight; // total weight of the input database
38
+ int len_ub, len_lb; // upper/lower bounds for the length of the pattern
39
+ int gap_ub, gap_lb; // upper/lower bounds for the gaps in the pattern
40
+ LONG *sc; // #itemsets classified by the sizes
41
+ QUEUE_INT item_max, item_max_org; // (original) maximum item
42
+ AHEAP topk; // heap for topk mining. valid if topk->h is not NULL
43
+ int flag; // flag for various functions
44
+ PERM *perm; // permutation array for output itemset: item => original item
45
+ FILE *fp; // file pointer to the output file
46
+ LONG iters, iters2, iters3; //iterations
47
+ LONG solutions, solutions2; // number of solutions output
48
+ LONG outputs, outputs2; // #calls of ITEMSET_output_itemset or ITEMSET_solusion
49
+ LONG max_solutions; // maximum solutions to be output
50
+ void *X; // pointer to the original data
51
+ int dir; // direction flag for AGRAPH & SGRAPH
52
+
53
+ int multi_core; // number of processors
54
+ LONG *multi_iters, *multi_iters2, *multi_iters3; //iterations
55
+ LONG *multi_solutions, *multi_solutions2; // number of solutions output
56
+ LONG *multi_outputs, *multi_outputs2; // #calls of ITEMSET_output_itemset or ITEMSET_solusion
57
+ FILE2 *multi_fp; // output file2 pointer for multi-core mode
58
+ WEIGHT *set_weight; // the frequency of each prefix of current itemset
59
+ QUEUE **set_occ; // the occurrence of each prefix of current itemset
60
+
61
+ #ifdef MULTI_CORE
62
+ pthread_spinlock_t lock_counter; // couneter locker for jump counter
63
+ pthread_spinlock_t lock_sc; // couneter locker for
64
+ pthread_spinlock_t lock_output; // couneter locker for output
65
+ #endif
66
+ } ITEMSET;
67
+
68
+ /* parameters for ITEMSET.flag */
69
+
70
+ #define ITEMSET_ITERS2 4 // output #iters2
71
+ #define ITEMSET_PRE_FREQ 8 // output frequency preceding to each itemset
72
+ #define ITEMSET_FREQ 16 // output frequency following to each itemset
73
+ #define ITEMSET_ALL 32 // concat all combinations of "add" to each itemset
74
+
75
+ #define ITEMSET_TRSACT_ID 64 // output transaction ID's in occurrences
76
+ #define ITEMSET_OUTPUT_EDGE 128 // output itemset as edge set (refer AGRAPH)
77
+ #define ITEMSET_IGNORE_BOUND 256 // ignore constraint for frequency
78
+ #define ITEMSET_RM_DUP_TRSACT 512 // remove duplicated transaction ID's
79
+ #define ITEMSET_MULTI_OCC_PRINT 1024 //print each component of occ
80
+ // TRSACT_ID+MULTI_OCC_PRINT means print first two components of occ
81
+ #define ITEMSET_NOT_ITEMSET 2048 // do not print itemset to the output file
82
+ #define ITEMSET_RULE_SUPP 4096 // output confidence and item frquency by abusolute value
83
+ #define ITEMSET_OUTPUT_POSINEGA 8192 // output negative/positive frequencies
84
+ #define ITEMSET_MULTI_OUTPUT 16384 // for multi-core mode
85
+ #define ITEMSET_USE_ORG 32768 // use item_max_org to the size of use
86
+ #define ITEMSET_ITEMFRQ 65536 // allocate item_frq
87
+ #define ITEMSET_ADD 131072 // allocate add
88
+
89
+ #define ITEMSET_RULE_FRQ 262144
90
+ #define ITEMSET_RULE_INFRQ 524288
91
+ #define ITEMSET_RULE_RFRQ 1048576
92
+ #define ITEMSET_RULE_RINFRQ 2097152
93
+ #define ITEMSET_RFRQ 4194304
94
+ #define ITEMSET_RINFRQ 8388608
95
+ #define ITEMSET_POSI_RATIO 16777216
96
+ #define ITEMSET_SET_RULE 134217728
97
+
98
+ //#define ITEMSET_RULE (ITEMSET_RULE_FRQ + ITEMSET_RULE_INFRQ + ITEMSET_RULE_RFRQ + ITEMSET_RULE_RINFRQ + ITEMSET_RFRQ + ITEMSET_RINFRQ + ITEMSET_SET_RULE) // for check any rule is true
99
+ #define ITEMSET_RULE (ITEMSET_RULE_FRQ + ITEMSET_RULE_INFRQ + ITEMSET_RULE_RFRQ + ITEMSET_RULE_RINFRQ + ITEMSET_SET_RULE) // for check any rule is true
100
+
101
+ #ifndef ITEMSET_INTERVAL
102
+ #define ITEMSET_INTERVAL 500000
103
+ #endif
104
+
105
+ /* Output information about ITEMSET structure. flag&1: print frequency constraint */
106
+ void ITEMSET_print ( ITEMSET *II, int flag);
107
+
108
+ /* topk.end>0 => initialize heap for topk mining */
109
+ /* all pointers will be set to 0, but not for */
110
+ /* if topK mining, set topk.end to "K" */
111
+ void ITEMSET_init (ITEMSET *I);
112
+ void ITEMSET_init2 (ITEMSET *I, char *fname, PERM *perm, QUEUE_INT item_max, size_t item_max_org);
113
+ void ITEMSET_end (ITEMSET *I);
114
+
115
+ /* sum the counters computed by each thread */
116
+ void ITEMSET_merge_counters (ITEMSET *I);
117
+
118
+ /*******************************************************************/
119
+ /* output at the termination of the algorithm */
120
+ /* print #of itemsets of size k, for each k */
121
+ /*******************************************************************/
122
+ void ITEMSET_last_output (ITEMSET *I);
123
+
124
+ /* output frequency, coverage */
125
+ void ITEMSET_output_frequency (ITEMSET *I, int core_id);
126
+
127
+ /* output an itemset to the output file */
128
+ void ITEMSET_output_itemset (ITEMSET *I, QUEUE *occ, int core_id);
129
+
130
+ /* output itemsets with adding all combination of "add"
131
+ at the first call, i has to be "add->t" */
132
+ void ITEMSET_solution (ITEMSET *I, QUEUE *occ, int core_id);
133
+
134
+ /*************************************************************************/
135
+ /* ourput a rule */
136
+ /*************************************************************************/
137
+ void ITEMSET_output_rule (ITEMSET *I, QUEUE *occ, double p1, double p2, size_t item, int core_id);
138
+
139
+ /*************************************************************************/
140
+ /* check all rules for a pair of itemset and item */
141
+ /*************************************************************************/
142
+ void ITEMSET_check_rule (ITEMSET *I, WEIGHT *w, QUEUE *occ, size_t item, int core_id);
143
+
144
+ /*************************************************************************/
145
+ /* check all rules for an itemset and all items */
146
+ /*************************************************************************/
147
+ void ITEMSET_check_all_rule (ITEMSET *I, WEIGHT *w, QUEUE *occ, QUEUE *jump, WEIGHT total, int core_id);
148
+
149
+ #endif
150
+
151
+
152
+
153
+
@@ -0,0 +1,371 @@
1
+ /* Common problem input/output routines /structure
2
+ 25/Nov/2007 by Takeaki Uno e-mail:uno@nii.jp,
3
+ homepage: http://research.nii.ac.jp/~uno/index.html */
4
+ /* This program is available for only academic use, basically.
5
+ Anyone can modify this program, but he/she has to write down
6
+ the change of the modification on the top of the source code.
7
+ Neither contact nor appointment to Takeaki Uno is needed.
8
+ If one wants to re-distribute this code, do not forget to
9
+ refer the newest code, and show the link to homepage of
10
+ Takeaki Uno, to notify the news about the codes for the users.
11
+ For the commercial use, please make a contact to Takeaki Uno. */
12
+
13
+ /***************************************************/
14
+
15
+ #ifndef _problem_c_
16
+ #define _problem_c_
17
+
18
+ #include"problem.h"
19
+
20
+ #include"stdlib2.c"
21
+ #include"queue.c"
22
+ #include"itemset.c"
23
+
24
+ void PROBLEM_error (){
25
+ ERROR_MES = "command explanation";
26
+ EXIT;
27
+ }
28
+
29
+ /*************************************************************************/
30
+ /* PROBLEM and ITEMSET initialization */
31
+ /*************************************************************************/
32
+ void PROBLEM_init (PROBLEM *P){
33
+ P->start_time = clock();
34
+ RAND_INIT;
35
+ P->problem = 0;
36
+ P->prog = 0;
37
+ P->prog2 = 0;
38
+ P->input_fname = P->output_fname = P->weight_fname = NULL;
39
+ P->table_fname = P->position_fname = NULL;
40
+
41
+ P->sgraph_fname = P->sgraph2_fname = NULL;
42
+ P->sgraph_wfname = P->sgraph2_wfname = NULL;
43
+ P->agraph_fname = P->agraph2_fname = NULL;
44
+ P->trsact_fname = P->trsact2_fname = NULL;
45
+ P->trsact_fname2 = P->trsact2_fname2 = NULL;
46
+ P->trsact_wfname = P->trsact2_wfname = NULL;
47
+ P->trsact_wfname2 = P->trsact2_wfname2 = NULL;
48
+ P->trsact_pfname = P->trsact2_pfname = NULL;
49
+ P->seq_fname = P->seq2_fname = NULL;
50
+ P->fstar_fname = P->fstar2_fname = NULL;
51
+ P->mat_fname = P->mat2_fname = NULL;
52
+ P->smat_fname = P->smat2_fname = NULL;
53
+ P->setfamily_fname = P->setfamily2_fname = NULL;
54
+ P->setfamily_wfname = P->setfamily2_wfname = NULL;
55
+
56
+ P->root = 0;
57
+ P->dir = P->edge_dir = 0;
58
+ P->th = P->th2 = P->th3 = 0;
59
+ P->ratio = P->ratio2 = 0;
60
+ P->num = P->siz = P->dim = P->len = 0;
61
+ P->rows = 0;
62
+ P->clms = 0;
63
+
64
+ ITEMSET_init (&P->II);
65
+ ITEMSET_init (&P->II2);
66
+
67
+ P->vf = P->dep = NULL;
68
+ P->ff = INIT_QUEUE;
69
+
70
+ P->shift = NULL;
71
+ P->occ_w = P->occ_pw = P->occ_w2 = P->occ_pw2 = NULL;
72
+
73
+ P->itemjump = P->itemcand = P->vecjump = P->veccand = INIT_QUEUE; // for delivery
74
+ P->OQ = P->OQ2 = P->VQ = P->VQ2 = NULL; // for delivery
75
+ P->itemary = NULL;
76
+ P->itemmark = P->itemflag = P->vecmark = P->vecflag = NULL; // mark for vector
77
+ P->occ_t = P->vecary = NULL;
78
+ P->oo = INIT_QUEUE;
79
+
80
+ P->pat = NULL;
81
+ P->plen = P->perr = 0;
82
+
83
+ #ifdef _alist_h_
84
+ P->occ = INIT_MALIST;
85
+ #endif
86
+
87
+ #ifdef _trsact_h_
88
+ TRSACT_init (&P->TT);
89
+ TRSACT_init (&P->TT2);
90
+ #endif
91
+ #ifdef _sgraph_h_
92
+ P->SG = INIT_SGRAPH;
93
+ P->SG2 = INIT_SGRAPH;
94
+ #endif
95
+ #ifdef _agraph_h_
96
+ P->AG = INIT_AGRAPH;
97
+ P->AG2 = INIT_AGRAPH;
98
+ #endif
99
+ #ifdef _seq_h_
100
+ SEQ_init (&P->SS);
101
+ SEQ_init (&P->SS2);
102
+ #endif
103
+ #ifdef _fstar_h_
104
+ P->FS = INIT_FSTAR;
105
+ P->FS2 = INIT_FSTAR;
106
+ #endif
107
+
108
+ #ifdef _vec_h_
109
+ P->MM = INIT_MAT;
110
+ P->MM2 = INIT_MAT;
111
+ P->SM = INIT_SMAT;
112
+ P->SM2 = INIT_SMAT;
113
+ P->FF = INIT_SETFAMILY;
114
+ P->FF2 = INIT_SETFAMILY;
115
+ #endif
116
+ }
117
+
118
+ /*************************************************************************/
119
+ /* PROBLEM initialization */
120
+ /* all pointers are set to NULL, but don't touch filenames */
121
+ /* load_flag, flag to give TRSACT_load */
122
+ /* II->item_max will be item_max when do not load problem */
123
+ /* II-> */
124
+ /*************************************************************************/
125
+ void PROBLEM_init2 (PROBLEM *P, int flag){
126
+ int f=0;
127
+ /******************************/
128
+ #ifdef _trsact_h_
129
+ if ( P->trsact_fname ){
130
+ TRSACT_load (&P->TT, P->trsact_fname, P->trsact_fname2, P->trsact_wfname, P->trsact_wfname2, P->trsact_pfname); if (ERROR_MES) goto ERR;
131
+ if ( P->TT.flag & SHOW_MESSAGE ){
132
+ print_err ("trsact: %s", P->trsact_fname);
133
+ if ( P->trsact2_fname2 ) print_err (" ,2nd-trsact2 %s (from ID %d)", P->trsact_fname2, P->TT.end1);
134
+ print_err (" ,#transactions %d ,#items %d ,size %d", P->TT.rows_org, P->TT.clms_org, P->TT.eles_org);
135
+ print_err (" extracted database: #transactions %d ,#items %d ,size %zd", P->TT.T.t, P->TT.T.clms, P->TT.T.eles);
136
+ if ( P->trsact_wfname ) print_err (" ,weightfile %s", P->trsact_wfname);
137
+ if ( P->trsact_wfname2 ) print_err (" ,2nd-weightfile %s", P->trsact_wfname2);
138
+ if ( P->trsact_pfname ) print_err (" ,item-order-file %s", P->trsact_pfname);
139
+ print_err ("\n");
140
+ }
141
+ }
142
+ if ( P->trsact2_fname ){
143
+ TRSACT_load (&P->TT2, P->trsact2_fname, P->trsact2_fname2, P->trsact2_wfname, P->trsact2_wfname2, P->trsact2_pfname); if (ERROR_MES) goto ERR;
144
+ if ( P->TT2.flag & SHOW_MESSAGE ){
145
+ print_err ("trsact2: %s", P->trsact2_fname);
146
+ if ( P->trsact2_fname2 ) print_err (" ,2nd-trsact2 %s (from ID %d)", P->trsact2_fname2, P->TT.end1);
147
+ print_err (" ,#transactions %d ,#items %d ,size %zd", P->TT2.rows_org, P->TT2.clms_org, P->TT2.eles_org);
148
+ print_err (" extracted database: #transactions %d ,#items %d ,size %zd", P->TT2.T.t, P->TT2.T.clms, P->TT2.T.eles);
149
+ if ( P->trsact2_wfname ) print_err (" ,weightfile2 %s", P->trsact2_wfname);
150
+ if ( P->trsact2_wfname2 ) print_err (" ,2nd-weightfile2 %s", P->trsact2_wfname2);
151
+ if ( P->trsact2_pfname ) print_err (" ,item-order-file2 %s", P->trsact2_pfname);
152
+ print_err ("\n");
153
+ }
154
+ }
155
+ #endif
156
+ #ifdef _sgraph_h_
157
+ if ( P->sgraph_fname ){
158
+ SGRAPH_load (&P->SG, P->sgraph_fname, P->sgraph_wfname); if (ERROR_MES) goto ERR;
159
+ 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);
160
+ }
161
+ if ( P->sgraph2_fname ){
162
+ SGRAPH_load (&P->SG, P->sgraph2_fname, P->sgraph2_wfname); if (ERROR_MES) goto ERR;
163
+ 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);
164
+ }
165
+ #endif
166
+ #ifdef _agraph_h_
167
+ if ( P->agraph_fname ){
168
+ AGRAPH_load (&P->AG, P->agraph_fname); if (ERROR_MES) goto ERR;
169
+ 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);
170
+ }
171
+ if ( P->agraph2_fname ){
172
+ AGRAPH_load (&P->AG2, P->agraph_fname); if (ERROR_MES) goto ERR;
173
+ 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);
174
+ }
175
+ #endif
176
+ #ifdef _fstar_h_
177
+ if ( P->fstar_fname ){
178
+ FSTAR_load (&P->FS, P->fstar_fname); if (ERROR_MES) goto ERR;
179
+ 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);
180
+ }
181
+ if ( P->fstar2_fname ){
182
+ FSTAR_load (&P->FS2, P->fstar2_fname); if (ERROR_MES) goto ERR;
183
+ 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);
184
+ }
185
+
186
+ #endif
187
+ #ifdef _vec_h_
188
+ if ( P->mat_fname ){
189
+ MAT_load (&P->MM, P->mat_fname); if (ERROR_MES) goto ERR;
190
+ print_mes (P->MM.flag, "mat: %s ,#rows %d ,#clms %d\n", P->mat_fname, P->MM.t, P->MM.clms);
191
+ }
192
+ if ( P->mat2_fname ){
193
+ MAT_load (&P->MM2, P->mat2_fname); if (ERROR_MES) goto ERR;
194
+ print_mes (P->MM2.flag, "mat2: %s ,#rows %d ,#clms %d\n", P->mat2_fname, P->MM2.t, P->MM2.clms);
195
+ }
196
+ if ( P->smat_fname ){
197
+ SMAT_load (&P->SM, P->smat_fname); if (ERROR_MES) goto ERR;
198
+ 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);
199
+ }
200
+ if ( P->smat2_fname ){
201
+ SMAT_load (&P->SM2, P->smat2_fname); if (ERROR_MES) goto ERR;
202
+ 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);
203
+ }
204
+ if ( P->setfamily_fname ){
205
+ SETFAMILY_load (&P->FF, P->setfamily_fname, P->setfamily_wfname); if (ERROR_MES) goto ERR;
206
+ 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);
207
+ if ( P->setfamily_wfname ) print_mes (P->FF.flag, " ,weightfile %s", P->setfamily_wfname);
208
+ print_mes (P->FF.flag, "\n");
209
+ }
210
+ if ( P->setfamily2_fname ){
211
+ SETFAMILY_load (&P->FF2, P->setfamily2_fname, P->setfamily2_wfname); if (ERROR_MES) goto ERR;
212
+ 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);
213
+ if ( P->setfamily2_wfname ) print_mes (P->FF2.flag, " ,weightfile %s", P->setfamily2_wfname);
214
+ print_mes (P->FF2.flag, "\n");
215
+ }
216
+ #endif
217
+ if (P->input_fname){ f=1; print_err (" input: %s", P->input_fname); }
218
+ if (P->weight_fname){ f=1; print_err (" weight: %s", P->weight_fname); }
219
+ if (P->output_fname){ f=1; print_err (" output to: %s",P->output_fname); }
220
+ if ( f )print_err ("\n");
221
+
222
+ /******************************/
223
+
224
+ if ( flag&SHOW_MESSAGE ){
225
+ ITEMSET_print (&P->II, (flag&PROBLEM_PRINT_FRQ)? 1: 0);
226
+ if ( flag&PROBLEM_PRINT_DENSE ){
227
+ print_err ("density threshold");
228
+ fprint_real (stderr, P->dense);
229
+ print_err ("\n");
230
+ }
231
+ }
232
+
233
+ if ( !ERROR_MES ) return;
234
+ ERR:;
235
+ PROBLEM_end (P);
236
+ EXIT;
237
+ }
238
+
239
+ /* termination of problem */
240
+ void PROBLEM_end (PROBLEM *P){
241
+ ITEMSET *II = &P->II;
242
+
243
+ #ifdef _trsact_h_
244
+ TRSACT_end (&P->TT);
245
+ TRSACT_end (&P->TT2);
246
+ #endif
247
+ #ifdef _sgraph_h_
248
+ SGRAPH_end (&P->SG);
249
+ SGRAPH_end (&P->SG2);
250
+ #endif
251
+ #ifdef _agraph_h_
252
+ AGRAPH_end (&P->AG);
253
+ AGRAPH_end (&P->AG2);
254
+ #endif
255
+ #ifdef _seq_h_
256
+ SEQ_end (&P->SS);
257
+ SEQ_end (&P->SS2);
258
+ #endif
259
+ #ifdef _fstar_h_
260
+ FSTAR_end (&P->FS);
261
+ FSTAR_end (&P->FS2);
262
+ #endif
263
+ #ifdef _vec_h_
264
+ MAT_end (&P->MM);
265
+ MAT_end (&P->MM2);
266
+ SMAT_end (&P->SM);
267
+ SMAT_end (&P->SM2);
268
+ SETFAMILY_end (&P->FF);
269
+ SETFAMILY_end (&P->FF2);
270
+ #endif
271
+
272
+ /******************************/
273
+
274
+ mfree (P->vf, P->dep);
275
+ QUEUE_end (&P->ff);
276
+
277
+ ITEMSET_end (II);
278
+ ITEMSET_end (&P->II2);
279
+
280
+ if ( P->occ_pw2 != P->occ_pw && P->occ_pw2 != P->occ_w2 ) free2 (P->occ_pw2);
281
+ if ( P->occ_w2 != P->occ_w ) free2 (P->occ_w2);
282
+ if ( P->occ_pw != P->occ_w ) free2 (P->occ_pw);
283
+ mfree (P->shift, P->occ_t, P->occ_w);
284
+
285
+ if ( P->OQ ) free2 (P->OQ[0].v);
286
+ if ( P->OQ2 ) free2 (P->OQ2[0].v);
287
+ if ( P->VQ ) free2 (P->VQ[0].v);
288
+ if ( P->VQ2 ) free2 (P->VQ2[0].v);
289
+ mfree (P->OQ, P->OQ2, P->VQ, P->VQ2);
290
+
291
+
292
+ mfree (P->itemary, P->itemflag, P->itemmark, P->vecary, P->vecflag, P->vecmark);
293
+ QUEUE_end (&P->itemcand);
294
+ QUEUE_end (&P->itemjump);
295
+
296
+ QUEUE_end (&P->veccand);
297
+ QUEUE_end (&P->vecjump);
298
+ QUEUE_end (&P->oo);
299
+
300
+
301
+ #ifdef _alist_h_
302
+ MALIST_end (&P->occ);
303
+ #endif
304
+
305
+ #ifdef _undo_h_
306
+ ALISTundo_end ();
307
+ #endif
308
+
309
+ P->end_time = clock();
310
+ if ( print_time_flag )
311
+ print_err ("computation_time= %3f\n", ((double)(P->end_time - P->start_time))/CLOCKS_PER_SEC);
312
+
313
+ PROBLEM_init (P);
314
+ }
315
+
316
+ /* allocate arrays and structures */
317
+ void PROBLEM_alloc (PROBLEM *P, QUEUE_ID siz, QUEUE_ID siz2, size_t siz3, PERM *perm, int f){
318
+ #ifdef _alist_h_
319
+ ALIST_ID i;
320
+ #endif
321
+
322
+ if ( f&PROBLEM_SHIFT ) calloc2 (P->shift, siz+2, "PROBLEM_alloc: shift", goto ERR);
323
+ if ( f&PROBLEM_OCC_T ) calloc2 (P->occ_t, siz+2, "PROBLEM_alloc:occ_t", goto ERR);
324
+ if ( f&(PROBLEM_OCC_W+PROBLEM_OCC_PW) ) calloc2 (P->occ_w, siz+2, "PROBLEM_alloc:occ_w", goto ERR);
325
+ if ( f&PROBLEM_OCC_PW ){
326
+ calloc2 (P->occ_pw, siz+2, "PROBLEM_alloc:occ_pw", goto ERR);
327
+ } else P->occ_pw = P->occ_w;
328
+ if ( f&PROBLEM_OCC_W2 ){
329
+ calloc2 (P->occ_w2, siz+2, "PROBLEM_alloc:occ_w", goto ERR);
330
+ if ( f&PROBLEM_OCC_PW ){
331
+ calloc2 (P->occ_pw2, siz+2, "PROBLEM_alloc:occ_pw", goto ERR);
332
+ } else P->occ_pw2 = P->occ_w2;
333
+ } else { P->occ_w2 = P->occ_w; P->occ_pw2 = P->occ_pw; }
334
+
335
+ if ( f&PROBLEM_ITEMFLAG ) calloc2 (P->itemflag, siz+2, "PROBLEM_alloc:itemflag", goto ERR);
336
+ if ( f&PROBLEM_ITEMMARK ) calloc2 (P->itemmark, siz+2, "PROBLEM_alloc:itemmark", goto ERR);
337
+ if ( f&PROBLEM_ITEMARY ) calloc2(P->itemary, siz+2,"PROBLEM_alloc:itemary", goto ERR);
338
+ if ( f&PROBLEM_ITEMJUMP ) QUEUE_alloc (&P->itemjump, siz+2);
339
+ if ( f&PROBLEM_ITEMCAND ) QUEUE_alloc (&P->itemcand, siz+2);
340
+
341
+ if ( f&PROBLEM_VECFLAG ) calloc2 (P->vecflag, siz+2, "PROBLEM_alloc:vecflag", goto ERR);
342
+ if ( f&PROBLEM_VECMARK ) calloc2 (P->vecmark, siz2+2, "PROBLEM_alloc:vecmark", goto ERR);
343
+ if ( f&PROBLEM_VECARY ) calloc2 (P->vecary, siz2+2, "PROBLEM_alloc:vecary", goto ERR);
344
+ if ( f&PROBLEM_VECJUMP ) QUEUE_alloc (&P->vecjump, siz2+2);
345
+ if ( f&PROBLEM_VECCAND ) QUEUE_alloc (&P->veccand, siz2+2);
346
+
347
+ #ifdef _alist_h_
348
+ if ( f&PROBLEM_OCC3){
349
+ MALIST_alloc (&P->occ, siz, siz2+2); // element=>
350
+ if ( ERROR_MES ) goto ERR;
351
+ if ( f&PROBLEM_OCC2 )
352
+ FLOOP (i, 0, siz) MALIST_ins_tail (&P->occ, (f&PROBLEM_OCC1)?siz: 0, i, 0);
353
+ }
354
+ #endif
355
+
356
+ ITEMSET_init2 (&P->II, P->output_fname, perm, siz, siz3);
357
+ if ( P->II.target<siz && P->II.perm ) P->II.target = P->II.perm[P->II.target];
358
+
359
+ #ifdef _undo_h_
360
+ ALISTundo_init ();
361
+ #endif
362
+
363
+ return;
364
+ ERR:;
365
+ PROBLEM_end (P);
366
+ EXIT;
367
+ }
368
+
369
+ #endif
370
+
371
+