nysol-take 3.0.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (161) hide show
  1. checksums.yaml +7 -0
  2. data/bin/mbiclique.rb +317 -0
  3. data/bin/mbipolish.rb +362 -0
  4. data/bin/mccomp.rb +235 -0
  5. data/bin/mclique.rb +295 -0
  6. data/bin/mclique2g.rb +105 -0
  7. data/bin/mcliqueInfo.rb +203 -0
  8. data/bin/mfriends.rb +202 -0
  9. data/bin/mgdiff.rb +252 -0
  10. data/bin/mhifriend.rb +456 -0
  11. data/bin/mhipolish.rb +465 -0
  12. data/bin/mitemset.rb +168 -0
  13. data/bin/mpal.rb +410 -0
  14. data/bin/mpolishing.rb +399 -0
  15. data/bin/msequence.rb +165 -0
  16. data/bin/mtra2g.rb +476 -0
  17. data/bin/mtra2gc.rb +360 -0
  18. data/ext/grhfilrun/extconf.rb +12 -0
  19. data/ext/grhfilrun/grhfilrun.c +85 -0
  20. data/ext/grhfilrun/src/_sspc.c +358 -0
  21. data/ext/grhfilrun/src/aheap.c +545 -0
  22. data/ext/grhfilrun/src/aheap.h +251 -0
  23. data/ext/grhfilrun/src/base.c +92 -0
  24. data/ext/grhfilrun/src/base.h +59 -0
  25. data/ext/grhfilrun/src/fstar.c +497 -0
  26. data/ext/grhfilrun/src/fstar.h +80 -0
  27. data/ext/grhfilrun/src/grhfil.c +214 -0
  28. data/ext/grhfilrun/src/itemset.c +713 -0
  29. data/ext/grhfilrun/src/itemset.h +170 -0
  30. data/ext/grhfilrun/src/problem.c +415 -0
  31. data/ext/grhfilrun/src/problem.h +179 -0
  32. data/ext/grhfilrun/src/queue.c +533 -0
  33. data/ext/grhfilrun/src/queue.h +182 -0
  34. data/ext/grhfilrun/src/sample.c +19 -0
  35. data/ext/grhfilrun/src/sspc.c +597 -0
  36. data/ext/grhfilrun/src/sspc2.c +491 -0
  37. data/ext/grhfilrun/src/stdlib2.c +1482 -0
  38. data/ext/grhfilrun/src/stdlib2.h +892 -0
  39. data/ext/grhfilrun/src/trsact.c +817 -0
  40. data/ext/grhfilrun/src/trsact.h +160 -0
  41. data/ext/grhfilrun/src/vec.c +745 -0
  42. data/ext/grhfilrun/src/vec.h +172 -0
  43. data/ext/lcmrun/extconf.rb +20 -0
  44. data/ext/lcmrun/lcmrun.cpp +99 -0
  45. data/ext/lcmrun/src/aheap.c +216 -0
  46. data/ext/lcmrun/src/aheap.h +111 -0
  47. data/ext/lcmrun/src/base.c +92 -0
  48. data/ext/lcmrun/src/base.h +59 -0
  49. data/ext/lcmrun/src/itemset.c +496 -0
  50. data/ext/lcmrun/src/itemset.h +157 -0
  51. data/ext/lcmrun/src/lcm.c +427 -0
  52. data/ext/lcmrun/src/problem.c +349 -0
  53. data/ext/lcmrun/src/problem.h +177 -0
  54. data/ext/lcmrun/src/queue.c +528 -0
  55. data/ext/lcmrun/src/queue.h +176 -0
  56. data/ext/lcmrun/src/sgraph.c +359 -0
  57. data/ext/lcmrun/src/sgraph.h +173 -0
  58. data/ext/lcmrun/src/stdlib2.c +1282 -0
  59. data/ext/lcmrun/src/stdlib2.h +823 -0
  60. data/ext/lcmrun/src/trsact.c +747 -0
  61. data/ext/lcmrun/src/trsact.h +159 -0
  62. data/ext/lcmrun/src/vec.c +731 -0
  63. data/ext/lcmrun/src/vec.h +171 -0
  64. data/ext/lcmseq0run/extconf.rb +20 -0
  65. data/ext/lcmseq0run/lcmseq0run.cpp +59 -0
  66. data/ext/lcmseq0run/src/aheap.c +216 -0
  67. data/ext/lcmseq0run/src/aheap.h +111 -0
  68. data/ext/lcmseq0run/src/base.c +92 -0
  69. data/ext/lcmseq0run/src/base.h +59 -0
  70. data/ext/lcmseq0run/src/itemset.c +518 -0
  71. data/ext/lcmseq0run/src/itemset.h +157 -0
  72. data/ext/lcmseq0run/src/itemset_zero.c +522 -0
  73. data/ext/lcmseq0run/src/lcm_seq.c +446 -0
  74. data/ext/lcmseq0run/src/lcm_seq_zero.c +446 -0
  75. data/ext/lcmseq0run/src/problem.c +439 -0
  76. data/ext/lcmseq0run/src/problem.h +179 -0
  77. data/ext/lcmseq0run/src/problem_zero.c +439 -0
  78. data/ext/lcmseq0run/src/queue.c +533 -0
  79. data/ext/lcmseq0run/src/queue.h +182 -0
  80. data/ext/lcmseq0run/src/stdlib2.c +1350 -0
  81. data/ext/lcmseq0run/src/stdlib2.h +864 -0
  82. data/ext/lcmseq0run/src/trsact.c +747 -0
  83. data/ext/lcmseq0run/src/trsact.h +159 -0
  84. data/ext/lcmseq0run/src/vec.c +779 -0
  85. data/ext/lcmseq0run/src/vec.h +172 -0
  86. data/ext/lcmseqrun/extconf.rb +20 -0
  87. data/ext/lcmseqrun/lcmseqrun.cpp +101 -0
  88. data/ext/lcmseqrun/src/aheap.c +216 -0
  89. data/ext/lcmseqrun/src/aheap.h +111 -0
  90. data/ext/lcmseqrun/src/base.c +92 -0
  91. data/ext/lcmseqrun/src/base.h +59 -0
  92. data/ext/lcmseqrun/src/itemset.c +518 -0
  93. data/ext/lcmseqrun/src/itemset.h +157 -0
  94. data/ext/lcmseqrun/src/itemset_zero.c +522 -0
  95. data/ext/lcmseqrun/src/lcm_seq.c +447 -0
  96. data/ext/lcmseqrun/src/lcm_seq_zero.c +446 -0
  97. data/ext/lcmseqrun/src/problem.c +439 -0
  98. data/ext/lcmseqrun/src/problem.h +179 -0
  99. data/ext/lcmseqrun/src/problem_zero.c +439 -0
  100. data/ext/lcmseqrun/src/queue.c +533 -0
  101. data/ext/lcmseqrun/src/queue.h +182 -0
  102. data/ext/lcmseqrun/src/stdlib2.c +1350 -0
  103. data/ext/lcmseqrun/src/stdlib2.h +864 -0
  104. data/ext/lcmseqrun/src/trsact.c +747 -0
  105. data/ext/lcmseqrun/src/trsact.h +159 -0
  106. data/ext/lcmseqrun/src/vec.c +779 -0
  107. data/ext/lcmseqrun/src/vec.h +172 -0
  108. data/ext/lcmtransrun/extconf.rb +18 -0
  109. data/ext/lcmtransrun/lcmtransrun.cpp +264 -0
  110. data/ext/macerun/extconf.rb +20 -0
  111. data/ext/macerun/macerun.cpp +57 -0
  112. data/ext/macerun/src/aheap.c +217 -0
  113. data/ext/macerun/src/aheap.h +112 -0
  114. data/ext/macerun/src/itemset.c +491 -0
  115. data/ext/macerun/src/itemset.h +158 -0
  116. data/ext/macerun/src/mace.c +503 -0
  117. data/ext/macerun/src/problem.c +346 -0
  118. data/ext/macerun/src/problem.h +174 -0
  119. data/ext/macerun/src/queue.c +529 -0
  120. data/ext/macerun/src/queue.h +177 -0
  121. data/ext/macerun/src/sgraph.c +360 -0
  122. data/ext/macerun/src/sgraph.h +174 -0
  123. data/ext/macerun/src/stdlib2.c +993 -0
  124. data/ext/macerun/src/stdlib2.h +811 -0
  125. data/ext/macerun/src/vec.c +634 -0
  126. data/ext/macerun/src/vec.h +170 -0
  127. data/ext/sspcrun/extconf.rb +20 -0
  128. data/ext/sspcrun/src/_sspc.c +358 -0
  129. data/ext/sspcrun/src/aheap.c +545 -0
  130. data/ext/sspcrun/src/aheap.h +251 -0
  131. data/ext/sspcrun/src/base.c +92 -0
  132. data/ext/sspcrun/src/base.h +59 -0
  133. data/ext/sspcrun/src/fstar.c +496 -0
  134. data/ext/sspcrun/src/fstar.h +80 -0
  135. data/ext/sspcrun/src/grhfil.c +213 -0
  136. data/ext/sspcrun/src/itemset.c +713 -0
  137. data/ext/sspcrun/src/itemset.h +170 -0
  138. data/ext/sspcrun/src/problem.c +415 -0
  139. data/ext/sspcrun/src/problem.h +179 -0
  140. data/ext/sspcrun/src/queue.c +533 -0
  141. data/ext/sspcrun/src/queue.h +182 -0
  142. data/ext/sspcrun/src/sample.c +19 -0
  143. data/ext/sspcrun/src/sspc.c +598 -0
  144. data/ext/sspcrun/src/sspc2.c +491 -0
  145. data/ext/sspcrun/src/stdlib2.c +1482 -0
  146. data/ext/sspcrun/src/stdlib2.h +892 -0
  147. data/ext/sspcrun/src/trsact.c +817 -0
  148. data/ext/sspcrun/src/trsact.h +160 -0
  149. data/ext/sspcrun/src/vec.c +745 -0
  150. data/ext/sspcrun/src/vec.h +172 -0
  151. data/ext/sspcrun/sspcrun.cpp +54 -0
  152. data/lib/nysol/enumLcmEp.rb +338 -0
  153. data/lib/nysol/enumLcmEsp.rb +284 -0
  154. data/lib/nysol/enumLcmIs.rb +275 -0
  155. data/lib/nysol/enumLcmSeq.rb +143 -0
  156. data/lib/nysol/items.rb +201 -0
  157. data/lib/nysol/seqDB.rb +256 -0
  158. data/lib/nysol/take.rb +39 -0
  159. data/lib/nysol/taxonomy.rb +113 -0
  160. data/lib/nysol/traDB.rb +257 -0
  161. metadata +239 -0
@@ -0,0 +1,779 @@
1
+ /* library for vector and sparse vector, and matrix */
2
+ /* Takeaki Uno 27/Dec/2008 */
3
+
4
+ #ifndef _vec_c_
5
+ #define _vec_c_
6
+
7
+ #include"vec.h"
8
+ #include"stdlib2.c"
9
+ #include"queue.c"
10
+
11
+ MAT INIT_MAT = {TYPE_MAT,NULL,0,NULL,0,0,NULL,NULL,0,0,NULL,NULL};
12
+ SVEC INIT_SVEC_ELE = {0,0};
13
+ SVEC INIT_SVEC = {TYPE_SVEC,NULL,0,0};
14
+ SMAT INIT_SMAT = {TYPE_SMAT,NULL,0,NULL,0,0,NULL,NULL,0,0,0};
15
+ SETFAMILY INIT_SETFAMILY = INIT_SETFAMILY_;
16
+
17
+ QSORT_TYPE (SVEC_VAL, SVEC_VAL)
18
+ QSORT_TYPE (SVEC_VAL2, SVEC_VAL2)
19
+
20
+ /* allocate memory according to rows and rowt */
21
+ void VEC_alloc (VEC *V, VEC_ID clms){
22
+ *V = INIT_VEC;
23
+ V->end = clms;
24
+ calloc2 (V->v, clms+1, EXIT);
25
+ }
26
+
27
+ /* terminate routine for VEC */
28
+ void VEC_end (VEC *V){
29
+ free2 (V->v);
30
+ *V = INIT_VEC;
31
+ }
32
+
33
+ /* allocate memory according to rows and rowt */
34
+ void MAT_alloc (MAT *M, VEC_ID rows, VEC_ID clms){
35
+ VEC_ID i, clms2 = clms+(clms%2?1:2);
36
+ calloc2 (M->v, rows+1, EXIT);
37
+ calloc2 (M->buf_org, clms2 * (rows+1)+4, {free(M->v);EXIT;});
38
+ M->buf = M->buf_org; ADDR_FLOOR16(M->buf);
39
+ M->end = rows;
40
+ M->clms = clms;
41
+ FLOOP (i, 0, rows){
42
+ M->v[i].end = M->v[i].t = clms;
43
+ M->v[i].v = M->buf + i*(clms2);
44
+ // printf ("%p %p\n", M->buf, M->v[i].v);
45
+ }
46
+ }
47
+
48
+ /* terminate routine for MAT */
49
+ void MAT_end (MAT *M){
50
+ free2 (M->buf_org);
51
+ free2 (M->buf2_org);
52
+ free2 (M->v);
53
+ *M = INIT_MAT;
54
+ }
55
+
56
+ /* allocate memory */
57
+ void SVEC_alloc (SVEC *V, VEC_ID end){
58
+ *V = INIT_SVEC;
59
+ calloc2 (V->v, end+1, EXIT);
60
+ V->end = end;
61
+ V->t = 0;
62
+ }
63
+
64
+ /* terminate routine for SVEC */
65
+ void SVEC_end (SVEC *V){
66
+ free2 (V->v);
67
+ *V = INIT_SVEC;
68
+ }
69
+
70
+ /* allocate memory according to rows and rowt */
71
+ void SMAT_alloc (SMAT *M, VEC_ID rows, VEC_ID *rowt, VEC_ID clms, size_t eles){
72
+ VEC_ID i;
73
+ if ( eles == 0 ) ARY_SUM (M->ele_end, rowt, 0, rows); else M->ele_end = eles;
74
+ calloc2 (M->buf, M->ele_end*((M->flag&LOAD_DBLBUF)?2:1) +rows +2, EXIT);
75
+ malloc2 (M->v, rows+1, {free(M->buf);EXIT;});
76
+ ARY_FILL (M->v, 0, rows, INIT_SVEC);
77
+ M->end = rows;
78
+ M->clms = clms;
79
+ if ( rowt ){
80
+ FLOOP (i, 0, rows){
81
+ M->v[i].v = i? M->v[i-1].v + rowt[i-1] +1: M->buf;
82
+ M->v[i].end = rowt[i];
83
+ }
84
+ }
85
+ }
86
+
87
+ /* terminate routine for MAT */
88
+ void SMAT_end (SMAT *M){
89
+ free2 (M->buf);
90
+ free2 (M->buf2);
91
+ free2 (M->v);
92
+ *M = INIT_SMAT;
93
+ }
94
+
95
+
96
+
97
+ /* allocate memory according to rows and rowt */
98
+ /* if eles == 0, compute eles from rowt and rows */
99
+ void SETFAMILY_alloc (SETFAMILY *M, VEC_ID rows, VEC_ID *rowt, VEC_ID clms, size_t eles){
100
+ VEC_ID i;
101
+ char *buf;
102
+ if ( eles == 0 ) ARY_SUM (M->ele_end, rowt, 0, rows); else M->ele_end = eles;
103
+ calloc2 (buf, (M->ele_end*((M->flag&LOAD_DBLBUF)?2:1) +(((M->flag&LOAD_DBLBUF)||(M->flag&LOAD_ARC))?MAX(rows,clms):rows)+2)*M->unit, EXIT);
104
+ M->buf = (QUEUE_INT *)buf;
105
+ malloc2 (M->v, rows+1, {free(M->buf);EXIT;});
106
+ ARY_FILL (M->v, 0, rows, INIT_QUEUE);
107
+ M->end = rows;
108
+ M->clms = clms;
109
+ if ( rowt ){
110
+ FLOOP (i, 0, rows){
111
+ M->v[i].v = (QUEUE_INT *)buf;
112
+ buf += (rowt[i] +1)*M->unit;
113
+ M->v[i].end = rowt[i]+1;
114
+ }
115
+ }
116
+ }
117
+
118
+ /* allocate memory according to rows and rowt */
119
+ /* if eles == 0, compute eles from rowt and rows */
120
+ void SETFAMILY_alloc_weight (SETFAMILY *M, QUEUE_ID *t){
121
+ VEC_ID i;
122
+ calloc2 (M->w, M->end +1, EXIT);
123
+ calloc2 (M->wbuf, M->ele_end*((M->flag&LOAD_DBLBUF)?2:1)+1, {free(M->w);EXIT;});
124
+ M->w[0] = M->wbuf; FLOOP (i, 1, M->t) M->w[i] = M->w[i-1] + (t?t[i-1]:M->v[i-1].t);
125
+ }
126
+
127
+ /* terminate routine for MAT */
128
+ void SETFAMILY_end (SETFAMILY *M){
129
+ mfree (M->buf, M->buf2, M->v, M->rw, M->cw, M->wbuf, M->w, M->rperm, M->cperm);
130
+ *M = INIT_SETFAMILY;
131
+ }
132
+
133
+ /****************************************************************/
134
+ /****************************************************************/
135
+ /****************************************************************/
136
+
137
+ /* read binary file for MAT */
138
+ /* each unit-byte will be one number. if unit<0, the sign of unit is flipped, and each value is minesed the half of the maximum */
139
+ void MAT_load_bin (MAT *M, FILE2 *fp, int unit){
140
+ VEC_ID flag=0, i, j, jj;
141
+ size_t siz=0;
142
+ VEC_VAL z, neg=0;
143
+
144
+ if ( unit < 0 ){
145
+ unit = -unit; flag = 1; neg=128;
146
+ FLOOP (jj, 0, unit-1) neg *= 256;
147
+ }
148
+ if ( M->t == 0 ){ // determine #rows if M->t is 0 (not specified)
149
+ fseek(fp->fp, 0, SEEK_END);
150
+ siz = ftell(fp->fp);
151
+ fseek(fp->fp, 0, SEEK_SET);
152
+ M->t = (VEC_ID)(siz / unit / M->clms);
153
+ if ( M->flag & LOAD_TPOSE ) SWAP_VEC_ID (M->t, M->clms);
154
+ }
155
+ MAT_alloc (M, M->t, M->clms); if (ERROR_MES) return;
156
+ M->end = M->t;
157
+ FLOOP (i, 0, M->t){
158
+ FLOOP (j, 0, M->clms){
159
+ z=0; FLOOP (jj, 0, unit){ z *= 256; z += FILE2_getc (fp); }
160
+ if ( flag ) z -= neg;
161
+ if ( M->flag & LOAD_TPOSE ) M->v[j].v[i] = z;
162
+ else M->v[i].v[j] = z;
163
+ }
164
+ }
165
+ }
166
+
167
+ /* segmentation fault for illegal files */
168
+ /* count/read the number in file for MAT */
169
+ /* if *rows>0, only read count the numbers in a row, for the first scan. */
170
+ void MAT_file_load (MAT *M, FILE2 *fp){
171
+ QUEUE_ID c;
172
+ VEC_ID t=0;
173
+ double p;
174
+
175
+ for (t=0 ; (FILE_err&2)==0 ; t++){
176
+ ARY_SCAN (c, double, *fp, 0);
177
+ if ( M->flag & LOAD_TPOSE ){
178
+ if ( M->t == 0 ){ M->t = c; if ( M->clms>0 ) break; }
179
+ } else if ( M->clms == 0 ){ M->clms = c; if ( M->t>0 ) break; }
180
+ if ( c == 0 ) t--;
181
+ }
182
+ if ( M->flag & LOAD_TPOSE ){ if ( M->clms==0 ) M->clms = t;} else if ( M->t==0 ) M->t = t;
183
+ FILE2_reset (fp);
184
+ M->end = M->t;
185
+ MAT_alloc (M, M->t, M->clms); if (ERROR_MES) return;
186
+ FLOOP (t, 0, (M->flag&LOAD_TPOSE)? M->clms: M->t){
187
+ FLOOP (c, 0, (M->flag&LOAD_TPOSE)? M->t: M->clms){
188
+ p = FILE2_read_double(fp);
189
+ if ( FILE_err==1 || FILE_err==2 ) break;
190
+ if ( M->flag&LOAD_TPOSE ) M->v[c].v[t] = p;
191
+ else M->v[t].v[c] = p;
192
+ if ( FILE_err==5 || FILE_err==6 ) break;
193
+ }
194
+ FLOOP (c, c, (M->flag&LOAD_TPOSE)? M->t: M->clms){
195
+ if ( M->flag&LOAD_TPOSE ) M->v[c].v[t] = 0;
196
+ else M->v[t].v[c] = 0;
197
+ }
198
+ if ( !FILE_err ) FILE2_read_until_newline (fp);
199
+ }
200
+ }
201
+
202
+ /* load file with switching the format according to the flag */
203
+ void MAT_load (MAT *M){
204
+ FILE2 fp = INIT_FILE2;
205
+ int unit=0;
206
+ #ifdef USE_MATH
207
+ VEC_ID i;
208
+ #endif
209
+ if ( M->flag & VEC_LOAD_BIN ) unit = 1;
210
+ else if ( M->flag & VEC_LOAD_BIN2 ) unit = 2;
211
+ else if ( M->flag & VEC_LOAD_BIN4 ) unit = 4;
212
+ if ( M->flag & VEC_LOAD_CENTERIZE ) unit = -unit;
213
+
214
+ FILE2_open (fp, M->fname, "rb", EXIT);
215
+ if ( unit ) MAT_load_bin (M, &fp, unit);
216
+ else MAT_file_load (M, &fp);
217
+
218
+ FILE2_close (&fp); if (ERROR_MES) EXIT;
219
+ #ifdef USE_MATH
220
+ if ( M->flag&VEC_NORMALIZE ) FLOOP (i, 0, M->t) ARY_NORMALIZE (M->v[i].v,M->v[i].t);
221
+ #endif
222
+ print_mes (M, "mat: %s ,#rows %d ,#clms %d\n", M->fname, M->t, M->clms);
223
+ }
224
+
225
+
226
+ /* scan file and read the numbers for SMAT */
227
+ /* flag&1? SMAT, SETFAMILY, flag&2? tuple list format: array list :*/
228
+ void SMAT_file_load (SMAT *M, FILE2 *fp){
229
+ SVEC_VAL z=0;
230
+ VEC_ID t, x, y;
231
+ int flag=(M->type==TYPE_SMAT), flag2=(M->type==TYPE_SETFAMILY && (M->flag&LOAD_EDGEW));
232
+ FILE_COUNT C;
233
+
234
+ C = FILE2_count (fp, (M->flag&(LOAD_ELE+LOAD_TPOSE)) | FILE_COUNT_ROWT, 0, 0, 0, 0, 0);
235
+ if ( M->clms == 0 ) M->clms = C.clms;
236
+ if ( M->t == 0 ) M->t = C.rows;
237
+ if ( flag ) SMAT_alloc (M, M->t, C.rowt, M->clms, 0);
238
+ else {
239
+ if ( M->flag & LOAD_RC_SAME ){
240
+ ENMAX (M->clms, M->t);
241
+ t = M->t;
242
+ ENMAX (M->t, M->clms);
243
+ reallocx (C.rowt, t, M->t+1, 0, EXIT);
244
+ }
245
+ SETFAMILY_alloc ((SETFAMILY *)M, M->t, C.rowt, M->clms, 0);
246
+ if ( flag2 ) SETFAMILY_alloc_weight ((SETFAMILY *)M, C.rowt);
247
+ }
248
+ free2 (C.rowt);
249
+ if ( ERROR_MES ) return;
250
+ FILE2_reset (fp);
251
+ t=0;
252
+ do {
253
+ if ( M->flag&LOAD_ELE ){
254
+ x = (VEC_ID)FILE2_read_int (fp);
255
+ y = (VEC_ID)FILE2_read_int (fp);
256
+ if ( flag || flag2 ) z = FILE2_read_double (fp);
257
+ if ( FILE_err&4 ) goto LOOP_END2;
258
+ FILE2_read_until_newline (fp);
259
+ } else {
260
+ x = t;
261
+ y = (VEC_ID)FILE2_read_int (fp);
262
+ if ( FILE_err&4 ) goto LOOP_END2;
263
+ if ( flag ) z = FILE2_read_double (fp);
264
+ }
265
+ if ( M->flag&LOAD_TPOSE ) SWAP_VEC_ID (x, y);
266
+ // printf ("%d %d %d %d\n", x, M->t, y, M->clms);
267
+ if ( y >= M->clms || x >= M->t ) goto LOOP_END2;
268
+ // printf ("## %d %d\n", x, y);
269
+ if ( flag ){
270
+ M->v[x].v[M->v[x].t].i = y;
271
+ M->v[x].v[M->v[x].t].a = z;
272
+ M->v[x].t++;
273
+ } else {
274
+ if ( flag2 ) ((SETFAMILY *)M)->w[x][((SETFAMILY *)M)->v[x].t] = z;
275
+ QUE_INS (((SETFAMILY *)M)->v[x], y);
276
+
277
+ }
278
+ LOOP_END2:;
279
+ if ( !(M->flag&LOAD_ELE) && (FILE_err&3) ){ t++; if ( t >= M->t ) break; }
280
+ } while ( (FILE_err&2)==0 );
281
+ }
282
+
283
+ /* scan file and read the numbers for SMAT */
284
+ /* flag&1? SMAT, SETFAMILY, flag&2? tuple list format: array list :*/
285
+ void SETFAMILY_load_weight (SETFAMILY *M){
286
+ FILE2 fp = INIT_FILE2, fp2 = INIT_FILE2;
287
+ VEC_ID i, f;
288
+ QUEUE_ID j, *t;
289
+ WEIGHT w=0;
290
+
291
+ // if ( M->flag&LOAD_TPOSE ) error ("transope and weight can't be specified simultaneously", EXIT);
292
+ FILE2_open (fp, M->wfname, "r", EXIT);
293
+ SETFAMILY_alloc_weight (M, NULL);
294
+ if ( M->flag&LOAD_TPOSE ){
295
+ FILE2_open (fp2, M->fname, "r", EXIT);
296
+ calloc2 (t, M->t, EXIT);
297
+ do {
298
+ f = 0;
299
+ do {
300
+ if ( f == 0){
301
+ w = (WEIGHT)FILE2_read_double (&fp);
302
+ if ( FILE_err ) f = 1; // a line of weight file ends, and memorize it
303
+ }
304
+ i = FILE2_read_int (&fp2);
305
+ if ( FILE_err&4 ) goto END;
306
+ M->w[i][t[i]++] = w;
307
+ } while ( (FILE_err&3)==0 );
308
+ END:;
309
+ } while ( (FILE_err&2)==0 );
310
+ FILE2_close (&fp2);
311
+ } else {
312
+ FLOOP (i, 0, M->t){
313
+ FLOOP (j, 0, M->v[i].t)
314
+ M->w[i][j] = (WEIGHT)FILE2_read_double (&fp);
315
+ FILE2_read_until_newline (&fp);
316
+ }
317
+ }
318
+ FILE2_close (&fp);
319
+ }
320
+
321
+ /* load column/row weight from the file */
322
+ void SETFAMILY_load_column_weight (SETFAMILY *M){
323
+ int i;
324
+ ARY_LOAD (M->cw, WEIGHT, i, M->cwfname, 1, EXIT);
325
+ reallocx (M->cw, i, M->clms+1, 0, EXIT);
326
+ }
327
+
328
+ void SETFAMILY_load_row_weight (SETFAMILY *M){
329
+ int i;
330
+ ARY_LOAD (M->rw, WEIGHT, i, M->rwfname, 1, EXIT);
331
+ reallocx (M->rw, i, M->t+1, 0, EXIT);
332
+ }
333
+
334
+
335
+ /* load file with switching the format according to the flag */
336
+ void SMAT_load (SMAT *M){
337
+ FILE2 fp = INIT_FILE2;
338
+ VEC_ID i;
339
+ M->type = TYPE_SMAT;
340
+ FILE2_open (fp, M->fname, "r", EXIT);
341
+ SMAT_file_load (M, &fp);
342
+ FILE2_close (&fp); if (ERROR_MES) EXIT;
343
+ FLOOP (i, 0, M->t) M->v[i].v[M->v[i].t].i = M->clms; // end mark
344
+
345
+ #ifdef USE_MATH
346
+ if ( M->flag&VEC_NORMALIZE ) FLOOP (i, 0, M->t) SVEC_normalize (&M->v[i]); // normalize
347
+ #endif
348
+ if (M->flag&LOAD_INCSORT)
349
+ FLOOP (i, 0, M->t) qsort_VEC_ID ((VEC_ID *)(M->v[i].v), M->v[i].t, sizeof(SVEC_ELE));
350
+ if (M->flag&LOAD_DECSORT)
351
+ FLOOP (i, 0, M->t) qsort_VEC_ID ((VEC_ID *)(M->v[i].v), M->v[i].t, -(int)sizeof(SVEC_ELE));
352
+ if (M->flag&LOAD_RM_DUP)
353
+ FLOOP (i, 0, M->t) MQUE_UNIFY (M->v[i], SVEC_VAL);
354
+ M->eles = M->ele_end;
355
+ print_mes (M, "smat: %s ,#rows %d ,#clms %d ,#eles %zd\n", M->fname, M->t, M->clms, M->eles);
356
+
357
+ }
358
+
359
+ /* sort and duplication check */
360
+ void SETFAMILY_sort (SETFAMILY *M){
361
+ VEC_ID i;
362
+ PERM *p;
363
+ WEIGHT *ww, w;
364
+ QUEUE Q;
365
+ int flag = (M->flag&LOAD_INCSORT)? 1: ((M->flag&LOAD_DECSORT)? -1: 0);
366
+ if ( flag ){ // sort items in each row
367
+ malloc2 (p, M->clms, EXIT);
368
+ FLOOP (i, 0, M->t)
369
+ QUEUE_perm_WEIGHT (&M->v[i], M->w?M->w[i]:NULL, p, flag);
370
+ free (p);
371
+ }
372
+ flag = ((M->flag&(LOAD_SIZSORT+LOAD_WSORT))? ((M->flag&LOAD_DECROWSORT)? -1: 1): 0);
373
+ if ( flag ){ // sort the rows
374
+ if ( M->flag & LOAD_SIZSORT ) p = qsort_perm_VECt ((VEC *)M->v, M->t, flag*sizeof(QUEUE));
375
+ else p = qsort_perm_WEIGHT (M->rw, M->t, flag*sizeof(WEIGHT));
376
+ ARY_INV_PERM (M->rperm, p, M->t, EXIT);
377
+ if ( M->rw ) ARY_INVPERMUTE (M->rw, p, w, M->t, EXIT);
378
+ if ( M->w ) ARY_INVPERMUTE (M->w, p, ww, M->t, EXIT);
379
+ ARY_INVPERMUTE_ (M->v, p, Q, M->t);
380
+ free2 (p);
381
+ }
382
+ if (M->flag&LOAD_RM_DUP){ // unify the duplicated edges
383
+ FLOOP (i, 0, M->t)
384
+ QUEUE_rm_dup_WEIGHT (&M->v[i], M->w?M->w[i]:NULL);
385
+ }
386
+ }
387
+
388
+ /* scan file and load the data from file to SMAT structure */
389
+ void SETFAMILY_load (SETFAMILY *M){
390
+ FILE2 fp = INIT_FILE2;
391
+ VEC_ID i;
392
+
393
+ M->type = TYPE_SETFAMILY;
394
+ FILE2_open (fp, M->fname, "r", EXIT);
395
+ SMAT_file_load ((SMAT *)M, &fp);
396
+ FILE2_close (&fp); if(ERROR_MES) EXIT;
397
+ print_mes (M, "setfamily: %s ,#rows %d ,#clms %d ,#eles %zd", M->fname, M->t, M->clms, M->eles);
398
+ if ( !(M->flag&LOAD_ELE) && M->wfname ){
399
+ SETFAMILY_load_weight (M); if ( ERROR_MES ){ SETFAMILY_end (M); EXIT; }
400
+ print_mes (M, " ,weightfile %s", M->wfname);
401
+ }
402
+ if ( M->cwfname ){
403
+ SETFAMILY_load_column_weight (M); if ( ERROR_MES ){ SETFAMILY_end (M); EXIT; }
404
+ print_mes (M, " ,column-weightfile %s", M->cwfname);
405
+ }
406
+ if ( M->rwfname ){
407
+ SETFAMILY_load_row_weight (M); if ( ERROR_MES ){ SETFAMILY_end (M); EXIT; }
408
+ print_mes (M, " ,row-weightfile %s", M->rwfname);
409
+ }
410
+ print_mes (M, "\n");
411
+
412
+ SETFAMILY_sort (M);
413
+ FLOOP (i, 0, M->t) M->v[i].v[M->v[i].t] = M->clms; // end mark
414
+ M->eles = M->ele_end;
415
+ }
416
+
417
+ /* print routines */
418
+ void MAT_print (FILE *fp, MAT *M){
419
+ VEC *V;
420
+ MQUE_FLOOP (*M, V) ARY_FPRINT (fp, V->v, 0, V->t, VEC_VALF" ");
421
+ }
422
+ void SVEC_print (FILE *fp, SVEC *V){
423
+ SVEC_ELE *x;
424
+ MQUE_FLOOP (*V, x) fprintf (fp, "("QUEUE_IDF","SVEC_VALF") ", (*x).i, (*x).a);
425
+ fputc ('\n', fp);
426
+ }
427
+ void SMAT_print (FILE *fp, SMAT *M){
428
+ SVEC *V;
429
+ MQUE_FLOOP (*M, V) SVEC_print (fp, V);
430
+ }
431
+ void SETFAMILY_print (FILE *fp, SETFAMILY *M){
432
+ QUEUE_ID i, j;
433
+ FLOOP (j, 0, M->t){
434
+ if ( M->rw ) fprintf (fp, "[" WEIGHTF "] ", M->rw[j]);
435
+ FLOOP (i, 0, M->v[j].t){
436
+ if ( i>0 ) fprintf (fp, " ");
437
+ fprintf (fp, QUEUE_INTF, M->v[j].v[i]);
438
+ if ( M->w ) fprintf (fp, "(" WEIGHTF ")", M->w[j][i]);
439
+ }
440
+ fprintf (fp, "\n");
441
+ }
442
+ }
443
+
444
+ /*
445
+ void SETFAMILY_print_WEIGHT (FILE *fp, SETFAMILY *M){
446
+ if ( M->w ){
447
+ printf (","); fprint_WEIGHT (stdout, M->w[i][j]); }
448
+ printf ("\n");
449
+ }
450
+ */
451
+
452
+ /****************************************************************/
453
+ /** Inner product routines **************************************/
454
+ /****************************************************************/
455
+ SVEC_VAL2 SVEC_inpro (SVEC *V1, SVEC *V2){
456
+ VEC_ID i1, i2=0;
457
+ SVEC_VAL2 sum=0;
458
+ FLOOP (i1, 0, V1->t){
459
+ while (V2->v[i2].i < V1->v[i1].i) i2++;
460
+ if (V2->v[i2].i == V1->v[i1].i) sum += ((SVEC_VAL2)V2->v[i2].a)*V1->v[i1].a;
461
+ }
462
+ return (sum);
463
+ }
464
+
465
+
466
+ /* get ith vector */
467
+ void *MVEC_getvec (void *M, int i, int flag){
468
+ MAT *MM = (MAT *)M;
469
+ if (MM->type==TYPE_MAT) return (&MM->v[i]);
470
+ if (MM->type==TYPE_SMAT) return (&((SVEC *)M)->v[i]);
471
+ if (MM->type==TYPE_SETFAMILY) return (&((QUEUE *)M)->v[i]);
472
+ return (NULL);
473
+ }
474
+
475
+ /* compute the inner product of two vectors */
476
+ double VEC_inpro (VEC *V1, VEC *V2){
477
+ VEC_VAL sum=0;
478
+ VEC_VAL *v1 = V1->v, *v2 = V2->v, *v_end = v1 + MIN (V1->end, V2->end), *vv=v_end-1;
479
+ #ifdef USE_SIMD
480
+ __m128d u1, u2, u3;
481
+ double r[2];
482
+ if ( v1 < vv ){
483
+ u3 = _mm_load_pd (v1); v1 += 2;
484
+ u2 = _mm_load_pd (v2); v2 += 2;
485
+ u3 = _mm_mul_pd (u3, u2);
486
+ while ( v1 < vv ){
487
+ u1 = _mm_load_pd (v1); v1 += 2;
488
+ u2 = _mm_load_pd (v2); v2 += 2;
489
+ u1 = _mm_mul_pd (u1, u2);
490
+ u3 = _mm_add_pd (u3, u1);
491
+ }
492
+ _mm_storeu_pd (r, u3);
493
+ sum = r[0]+r[1];
494
+ _mm_empty();
495
+ }
496
+ #else
497
+ VEC_VAL a0, a1;
498
+ while ( v1 < vv ){
499
+ a0 = *v1 * *v2; v1++; v2++;
500
+ a1 = *v1 * *v2; v1++; v2++;
501
+ sum += a0 + a1;
502
+ }
503
+ #endif
504
+ if ( v1 < v_end ){ sum += *v1 * *v2; }
505
+ return (sum);
506
+ }
507
+
508
+ /* compute the l1-norm of two vectors */
509
+ double VEC_l1dist (VEC *V1, VEC *V2){
510
+ VEC_ID i, end=MIN(V1->end,V2->end);
511
+ double sum=0;
512
+ FLOOP (i, 0, end) sum += abs (((double)V1->v[i])- ((double)V2->v[i]));
513
+ return (sum);
514
+ }
515
+
516
+ /* compute the l-infinity-norm of two vectors */
517
+ double VEC_linfdist (VEC *V1, VEC *V2){
518
+ VEC_ID i, end=MIN(V1->end,V2->end);
519
+ double m=0;
520
+ FLOOP (i, 0, end) ENMAX (m, abs (((double)V1->v[i])- ((double)V2->v[i])));
521
+ return (m);
522
+ }
523
+
524
+ double SETFAMILY_resemblance (QUEUE *Q1, QUEUE *Q2){
525
+ int *x, *y=Q2->v, *yy = y+Q2->t, s=0;
526
+ MQUE_FLOOP (*Q1, x){
527
+ while ( *y < *x ){ if ( ++y == yy ) goto END; }
528
+ if ( *y == *x ){ s++; if ( ++y == yy ) goto END; }
529
+ }
530
+ END:;
531
+ return ( ((double)s) / ((double)(Q1->t + Q2->t)));
532
+ }
533
+
534
+
535
+ #ifdef USE_MATH
536
+
537
+ /****************************************************************/
538
+ /** Norm computation and normalization ************************/
539
+ /****************************************************************/
540
+ double SVEC_norm (SVEC *V){
541
+ SVEC_ELE *v;
542
+ double sum=0;
543
+ MQUE_FLOOP (*V, v) sum += ((double)(v->a)) * (v->a);
544
+ return (sqrt(sum));
545
+ }
546
+ void SVEC_normalize (SVEC *V){
547
+ SVEC_ELE *v;
548
+ double norm = SVEC_norm (V);
549
+ MQUE_FLOOP (*V, v) v->a /= norm;
550
+ }
551
+
552
+ double VEC_norm (VEC *V){
553
+ return (sqrt (VEC_inpro (V, V)));
554
+ }
555
+
556
+ void VEC_normalize (VEC *V){
557
+ double norm = VEC_norm (V);
558
+ VEC_VAL *v = V->v, *v_end = v + V->end;
559
+ #ifdef USE_SIMD
560
+ __m128d u1, u2;
561
+ while ( v < v_end ){
562
+ u1 = _mm_load_pd (v);
563
+ u2 = _mm_load1_pd (&norm);
564
+ u1 = _mm_div_pd (u1, u2);
565
+ _mm_storeu_pd (v, u1);
566
+ }
567
+ _mm_empty();
568
+ if ( v < v_end ) *v /= norm;
569
+ #else
570
+ while ( v < v_end ) *v /= norm;
571
+ #endif
572
+ }
573
+
574
+ /****************************************************************/
575
+ /** Euclidean distance routines *********************************/
576
+ /****************************************************************/
577
+
578
+ /* compute the Euclidean distance of two vectors (VEC) */
579
+ double VEC_eucdist_ (VEC *V1, VEC *V2){
580
+ double sum=0, a0;
581
+ VEC_VAL *v1 = V1->v, *v2 = V2->v, *v_end = v1 + MIN (V1->end, V2->end), *vv=v_end-1;
582
+ #ifdef USE_SIMD
583
+ __m128d u1, u2, u3;
584
+ double r[2];
585
+ if ( v1 < vv ){
586
+ u3 = _mm_load_pd (v1); v1 += 2;
587
+ u2 = _mm_load_pd (v2); v2 += 2;
588
+ u3 = _mm_sub_pd (u3, u2);
589
+ u3 = _mm_mul_pd (u3, u3);
590
+ while ( v1 < vv ){
591
+ u1 = _mm_load_pd (v1); v1 += 2;
592
+ u2 = _mm_load_pd (v2); v2 += 2;
593
+ u1 = _mm_sub_pd (u1, u2);
594
+ u1 = _mm_mul_pd (u1, u1);
595
+ u3 = _mm_add_pd (u3, u1);
596
+ }
597
+ _mm_storeu_pd (r, u3);
598
+ sum = r[0]+r[1];
599
+ _mm_empty();
600
+ }
601
+ #else
602
+ double a1;
603
+ while ( v1 < vv ){
604
+ a0 = *v1 - *v2; v1++; v2++;
605
+ a1 = *v1 - *v2; v1++; v2++;
606
+ sum += a0*a0 + a1*a1;
607
+ }
608
+ #endif
609
+ if ( v1 < v_end ){ a0 = *v1 - *v2; sum += a0*a0; }
610
+ return (sum);
611
+ }
612
+
613
+ double VEC_eucdist (VEC *V1, VEC *V2){
614
+ double p = SQRT (VEC_eucdist_ (V1, V2));
615
+ #ifdef USE_SIMD
616
+ _mm_empty ();
617
+ #endif
618
+ return (p);
619
+ }
620
+
621
+ /* compute the Euclidean distance of two vectors (SVEC)*/
622
+ double SVEC_eucdist_ (SVEC *V1, SVEC *V2){
623
+ VEC_ID i1, i2;
624
+ double sum=0, a;
625
+ for ( i1=i2=0 ; i1<V1->t && i2<V2->t ; ){
626
+ if (V2->v[i2].i > V1->v[i1].i) a = V1->v[i1].a;
627
+ else if (V2->v[i2].i < V1->v[i1].i) a = V2->v[i2].a;
628
+ else a = ((double)V2->v[i2].a) - ((double)V1->v[i1].a);
629
+ sum += a*a;
630
+ }
631
+ return (sum);
632
+ }
633
+
634
+ double SVEC_eucdist (SVEC *V1, SVEC *V2){
635
+ return (sqrt (SVEC_eucdist (V1, V2)));
636
+ }
637
+
638
+ /* compute the Euclidean distance of two vectors (VEC * SVEC)*/
639
+ double VEC_SVEC_eucdist (VEC *V1, SVEC *V2){
640
+ VEC_ID i, i2=0;
641
+ double sum=0, a;
642
+ FLOOP (i, 0, V1->end){
643
+ if ( i < V2->v[i2].i ) a = V1->v[i];
644
+ else { a = ((double)V1->v[i]) - ((double)V2->v[i2].a); i2++; }
645
+ sum += a*a;
646
+ }
647
+ return (sqrt(sum));
648
+ }
649
+
650
+ /**********************************************************/
651
+ /* Euclidean distance of vector and set */
652
+ double VEC_QUEUE_eucdist (VEC *V, QUEUE *Q){
653
+ VEC_ID i;
654
+ QUEUE_ID i2=0;
655
+ double sum=0, a;
656
+ FLOOP (i, 0, V->end){
657
+ if ( i < Q->v[i2] ) a = V->v[i];
658
+ else { a = ((double)V->v[i]) - 1.0; i2++; }
659
+ sum += a*a;
660
+ }
661
+ return (sqrt(sum));
662
+ }
663
+
664
+ /* compute Euclidean distance of two sets */
665
+ double QUEUE_eucdist (QUEUE *Q1, QUEUE *Q2){
666
+ double f;
667
+ MQUE_UNION(f, *Q1, *Q2);
668
+ return (sqrt(f));
669
+ }
670
+
671
+ double MVEC_norm (void *V){
672
+ VEC *VV = (VEC *)V;
673
+ double p;
674
+ if (VV->type==TYPE_VEC){ ARY_NORM (p, VV->v, VV->t); return (p); }
675
+ if (VV->type==TYPE_SVEC) return (SVEC_norm ((SVEC *)V));
676
+ if (VV->type==TYPE_QUEUE) return (sqrt(((QUEUE*)V)->t));
677
+ return (0.0);
678
+ }
679
+
680
+ double MMAT_norm_i (void *M, int i){
681
+ MAT *MM = (MAT *)M;
682
+ double p;
683
+ if (MM->type==TYPE_MAT){ ARY_NORM (p, MM->v[i].v, MM->v[i].t); return (p); }
684
+ if (MM->type==TYPE_SMAT) return (SVEC_norm (&((SMAT *)M)->v[i]));
685
+ if (MM->type==TYPE_SETFAMILY) return (sqrt (((SETFAMILY *)M)->v[i].t));
686
+ return (0.0);
687
+ }
688
+
689
+ double MVEC_eucdist (void *V, void *U){
690
+ VEC *VV = (VEC *)V;
691
+ double p;
692
+ if (VV->type==TYPE_VEC) return (VEC_eucdist ((VEC *)V, (VEC *)U));
693
+ if (VV->type==TYPE_SVEC) return (SVEC_eucdist ((SVEC *)V, (SVEC *)U));
694
+ if (VV->type==TYPE_QUEUE){ MQUE_DIF (p, *((QUEUE *)V), *((QUEUE *)U)); return (sqrt(p));}
695
+ return (0.0);
696
+ }
697
+
698
+ double MMAT_eucdist_ij (void *M, int i, int j){
699
+ MAT *MM=(MAT *)M;
700
+ double p;
701
+ if (MM->type==TYPE_MAT) return (VEC_eucdist ( &MM->v[i], &MM->v[j] ));
702
+ if (MM->type==TYPE_SMAT) return (SVEC_eucdist ( &((SMAT *)M)->v[i], &((SMAT *)M)->v[j]));
703
+ if (MM->type==TYPE_SETFAMILY){ MQUE_DIF (p, ((SETFAMILY *)M)->v[i], ((SETFAMILY *)M)->v[j]); return (sqrt(p)); }
704
+ return (0.0);
705
+ }
706
+
707
+
708
+ #endif
709
+
710
+ /**********************************************************/
711
+ /** multi-vector routines ******************************/
712
+ /**********************************************************/
713
+
714
+ /* compute the inner product, Euclidean distance for multi vector */
715
+ double MVEC_inpro (void *V, void *U){
716
+ VEC *VV = (VEC *)V, *UU = (VEC *)U;
717
+ double p;
718
+ if (VV->type==TYPE_VEC){
719
+ if (UU->type==TYPE_VEC){ ARY_INPRO (p, VV->v, UU->v, VV->t); return (p); }
720
+ if (UU->type==TYPE_SVEC){ ARY_SVEC_INPRO (p, *((SVEC *)U), VV->v); return (p); }
721
+ if (UU->type==TYPE_QUEUE){ ARY_QUEUE_INPRO (p, *((QUEUE *)U), VV->v); return (p); }
722
+ }
723
+ if (VV->type==TYPE_SVEC){
724
+ if (UU->type==TYPE_VEC){ ARY_SVEC_INPRO (p, *((SVEC *)V), UU->v); return (p);}
725
+ if (UU->type==TYPE_SVEC) return (SVEC_inpro ((SVEC *)V, (SVEC *)U));
726
+ // if (UU->type==TYPE_QUEUE) return (VEC_QUEUE_inpro (V, U));
727
+ }
728
+ if (VV->type==TYPE_QUEUE){
729
+ if (UU->type==TYPE_VEC){ ARY_QUEUE_INPRO (p, *((QUEUE *)V), UU->v); return (p); }
730
+ // else if (UU->type==TYPE_SVEC) return (SVEC_inpro (V, U));
731
+ if (UU->type==TYPE_QUEUE){ MQUE_INTSEC (p, *((QUEUE *)V), *((QUEUE *)U)); return (p);}
732
+ }
733
+ return (0.0);
734
+ }
735
+
736
+ double MVEC_double_inpro (void *V, double *w){
737
+ VEC *VV = (VEC *)V;
738
+ double p;
739
+ if (VV->type==TYPE_VEC){ ARY_INPRO (p, VV->v, w, VV->t); return (p); }
740
+ if (VV->type==TYPE_SVEC){ ARY_SVEC_INPRO (p, *((SVEC *)V), w); return (p); }
741
+ if (VV->type==TYPE_QUEUE){ ARY_QUEUE_INPRO (p, *((QUEUE *)V), w); return (p); }
742
+ return (0.0);
743
+ }
744
+
745
+ /* compute the inner product, euclidean distance for i,jth vector */
746
+ double MMAT_inpro_ij (void *M, int i, int j){
747
+ MAT *MM = (MAT *)M;
748
+ double p;
749
+ if (MM->type==TYPE_MAT){ ARY_INPRO (p, MM->v[i].v, MM->v[j].v, MM->v[j].t); return (p); }
750
+ if (MM->type==TYPE_SMAT) return (SVEC_inpro (&((SMAT *)M)->v[i], &((SMAT *)M)->v[j]));
751
+ if (MM->type==TYPE_SETFAMILY){
752
+ p = QUEUE_intsec_ (&((SETFAMILY *)M)->v[i], &((SETFAMILY *)M)->v[j]); return (p); }
753
+ return (0.0);
754
+ }
755
+
756
+ double MMAT_double_inpro_i (void *M, int i, double *w){
757
+ MAT *MM = (MAT *)M;
758
+ double p;
759
+ if (MM->type==TYPE_MAT){ ARY_INPRO (p, MM->v[i].v, w, MM->v[i].t); return (p); }
760
+ if (MM->type==TYPE_SMAT){ ARY_SVEC_INPRO (p, ((SMAT *)M)->v[i], w); return (p); }
761
+ if (MM->type==TYPE_SETFAMILY){ ARY_QUEUE_INPRO (p, ((SETFAMILY *)M)->v[i], w); return (p); }
762
+ return (0.0);
763
+ }
764
+
765
+ #ifdef _barray_h_
766
+ void SETFAMILY_to_BARRAY (BARRAY *A, SETFAMILY *F){
767
+ VEC_ID t;
768
+ size_t i=0;
769
+ BARRAY_init (A, F->clms, F->t);
770
+ FLOOP (t, 0, F->t){
771
+ BARRAY_set_subset (&A->v[i], &F->v[t]);
772
+ i += A->xend;
773
+ }
774
+ }
775
+ #endif
776
+
777
+ #endif
778
+
779
+