7 func['| expr QUESTION expr COLON expr'] =<<'SCP_EOF'
11 * zdd1.iif(zdd2,zdd3) -> ZDD Object : 条件演算
13 * zdd1,zdd2,zdd3,zdd4 : ZDD Object
16 * zdd1に含まれるアイテム集合については、zdd2の項を選択し、それ以外のアイテム集合についてはzdd3の項を選択する。
17 * (a+b).iif(2a+3b+4c+5d,3a+4b+5c+6d) -> 2a+3b+5c+6d # zdd1に含まれるアイテム集合a,bは、zdd2の項2a,3bを選択し、それ以外はzdd3の項5c,6dを選択する。
19 * 典型的には比較演算子と組み合わせて以下のように利用する。
20 * > x.show # -> 3a+2b+2c
21 * > y.show # -> 2a+2b+4c
22 * # (x,yが上記の通り定義されていたとする)
24 * # xとyを比較し、yより大きい重みを持つ項をxから、それ以外をyから選ぶ。
25 * # x>yの結果はaであり、第1引数xから3aが選択され、その他のアイテム集合は第2引数yから2b,4cが選ばれる。
26 * > (x>y).iif(x,y) # -> 3a+2b+4c
28 * # xとyを比較し、yより大きい重みを持つ項をxから選ぶ。
29 * # 上の例と同様であるが、第2引数が0なのでa以外のアイテム集合は何も選択されない。
30 * > (x>y).iif(x,0) # -> 3a
32 * # xとyを比較し、yと同じ重みを持つ項をxから選ぶ。
33 * > (x==y).iif(x,0) # -> 2b
35 * ====== 上記の例において出力結果を示したコメントでは、アイテムをアルファベット小文字1文字で表し、項における重みとアイテム間のスペースおよびアイテム間のスペースを省略して表記している。
38 VALUE vsop_iif(int argc, VALUE *argv,VALUE self){
42 Data_Get_Struct(self,Vsop_Ruby,rmod);
43 rb_scan_args(argc, argv,\"20\",&v1,&v2);
44 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
45 CtoI *ctoi_modc = value2ctoi(v1);
46 CtoI *ctoi_mode = value2ctoi(v2);
49 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
50 rmod_rtn->cmod = ctoi_fin;
51 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
56 func['| expr MEET expr'] =<<'SCP_EOF'
60 * zdd1.meet(zdd2) -> ZDD Object : meet演算
62 * zdd1,zdd2 : ZDD Object
65 * zdd1に含まれるアイテム集合αとzdd2に含まれるアイテム集合βの共通集合α∩βを求める。
66 * 例えば、アイテム集合abc と bcd の共通集合は以下の通り。
67 * abc.meet(bcd) = abc ∩ bcd = bc
68 * 複数のアイテム集合間の演算では全組合せについて共通集合を求める。
69 * (abc + a).meet(bcd + b) = abc ∩ bcd + abc ∩ b + a ∩ bcd + a ∩ b
72 * 重みについては、同じアイテム集合を複数に展開して計算すればよい。
73 * (2abc).meet(bcd) = (abc+abc).meet(bcd) = bc + bc = 2bc
76 * > a=VSOP.itemset(\"a\")
77 * > b=VSOP.itemset(\"b\")
80 * # a + 2ab + 3b の各アイテム集合と引き数で指定されたアイテム集合 a との共通集合を求めると、
81 * # a + 2a + 3 = 3 a + 3となる。
85 * # アイテム集合bとの共通集合を求めると 1 + 2b + 3b = 5b + 1 となる。
89 * # アイテム集合 ab との共通集合を求めると a + 2ab + 3b となる。
93 * # 定数1は空のアイテム集合なので、それとの共通集合を求めると係数だけが残り 1 + 2 + 3 = 6 となる。
98 * > a=VSOP.itemset(\"a\")
99 * > b=VSOP.itemset(\"b\")
100 * > c=VSOP.itemset(\"c\")
102 * > f=((a*b*c)+2*(a*b)+(b*c)+1)
104 * a b c + 2 a b + b c + 1
109 * # abc + 2ab + bc + 1 の各アイテム集合と引き数で指定された 2ab + a の各アイテム集合との共通集合を求めると、
110 * # 以下の通りとなる(アイテム間のスペースは省略)。
119 * # 結果をまとめると 6ab + 3a + 2b + 4 となる。
122 * 6 a b + 3 a + 2 b + 4
124 * ====== 上記の例において出力結果を示したコメントでは、アイテムをアルファベット小文字1文字で表し、項における重みとアイテム間のスペースおよびアイテム間のスペースを省略して表記している。
127 VALUE vsop_meet(int argc, VALUE *argv,VALUE self){
130 Data_Get_Struct(self,Vsop_Ruby,rmod);
131 rb_scan_args(argc, argv,\"10\",&v);
132 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
133 CtoI *ctoi_modc = value2ctoi(v);
136 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
137 rmod_rtn->cmod = ctoi_fin;
138 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
143 func['| expr NE expr'] =<<'SCP_EOF'
147 * zdd1.ne?(zdd2) -> ZDD Object : 不等比較演算
149 * zdd1,zdd2 : ZDD Object
152 * zdd1に含まれるアイテム集合とzdd2に含まれるアイテム集合を比較し、重みが異なるアイテム集合を選択する。
156 * ==, >=, >, <=, <, iif
159 VALUE vsop_ne(int argc, VALUE *argv,VALUE self){
162 Data_Get_Struct(self,Vsop_Ruby,rmod);
163 rb_scan_args(argc, argv,\"10\",&v);
164 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
165 CtoI *ctoi_modc = value2ctoi(v);
168 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
169 rmod_rtn->cmod = ctoi_fin;
170 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
175 func['| print QUOTIENT IDVAR expr'] =<<'SCP_EOF'
177 VALUE vsop_print_arg1(VALUE self,char *arg){
180 Data_Get_Struct(self,Vsop_Ruby,rmod);
181 CtoI *ctoi_modd =new CtoI(*rmod->cmod);
182 int len = strlen(arg);
184 str_c = new char[len+1];
194 func['| print QUOTIENT IDVAR FNAME expr'] =<<'SCP_EOF'
196 VALUE vsop_print_arg2(int argc, VALUE *argv, VALUE self){
199 Data_Get_Struct(self,Vsop_Ruby,rmod);
200 CtoI *ctoi_mode =new CtoI(*rmod->cmod);
201 rb_scan_args(argc, argv,\"20\",&v1,&v2);
202 if(TYPE(v1)!=T_STRING){
203 rb_raise(rb_eRuntimeError,\"argument type error (1st argument must be STRING)\");
205 if(TYPE(v2)!=T_STRING){
206 rb_raise(rb_eRuntimeError,\"argument type error (2nd argument must be STRING)\");
208 char *arg1=RSTRING_PTR(v1);
209 char *arg2=RSTRING_PTR(v2);
215 str_c = new char[len];
216 strcpy(str_c,arg1+1);
219 str_c = new char[len+1];
224 char *str_d = new char[len+3];
225 sprintf(str_d,\"\\\"%s\\\"\",arg2);
235 func['| IMPORT LPAREN FNAME RPAREN'] =<<'SCP_EOF'
239 * VSOP.import(fileName) -> ZDD Object : ZDDのインポート
241 * fileName : Ruby String
244 * exportメソッドで出力されたZDDファイル(fileNameで指定)をインポートしZDDオブジェクトを復元する。
245 * exportする時のsymbolによるアイテムの宣言順序とimportする時の宣言順序は同じでなければならない。
249 * # まずZDDオブジェクトfをファイル\"dat.zdd\"にエキスポートする。
250 * > VSOP.symbol(\"a\")
251 * > VSOP.symbol(\"b\")
252 * > VSOP.symbol(\"c\")
253 * > f=5*a*b*c+3*a*b+2*b*c+c
255 * 5 a b c + 3 a b + 2 b c + c
256 * > f.export(\"dat.zdd\")
259 * # エキスポートされたファイル内容は以下の通り。
275 * # 以下のようにsymbolを宣言した後にimportすれば正しく復元される。
276 * > VSOP.symbol(\"a\")
277 * > VSOP.symbol(\"b\")
278 * > VSOP.symbol(\"c\")
279 * > f=VSOP.import(\"dat.zdd\")
281 * 5 a b c + 3 a b + 2 b c + c
284 * # もしアイテムb,cの宣言順序を入れ替えると結果においてもbとcが入れ替わってしまう。
285 * > VSOP.symbol(\"a\")
286 * > VSOP.symbol(\"c\")
287 * > VSOP.symbol(\"b\")
288 * > f=VSOP.import(\"dat.zdd\")
290 * 5 a c b + 3 a c + 2 c b + b
293 * # 宣言せずにインポートすると、x1,x2,x3のようなアイテム名が使われる。
294 * # この時、各アイテムの後ろに付いた数字は、アイテムの宣言の逆順による連番となる。
295 * # 以下の例では、x1=c, x2=b, x3=cである。
296 * > VSOP.import(\"dat.zdd\")
298 * 5 x3 x2 x1 + 3 x3 x2 + 2 x2 x1 + x1
302 VALUE vsop_import(int argc, VALUE *argv, VALUE self){
306 VALUE vz = rb_cv_get(self,\"@@init_cnt\");
307 int init_cnt_v = NUM2INT(vz);
308 if(init_cnt_v==0){ BDDV_Init(256, env_nmax);}
310 rb_cv_set(self,\"@@init_cnt\",INT2NUM(init_cnt_v));
312 if(init_cnt==0){ BDDV_Init(256, env_nmax);}
315 rb_scan_args(argc, argv,\"10\",&v);
316 if(TYPE(v)!=T_STRING){
317 rb_raise(rb_eRuntimeError,\"argument type error (1st argument must be STRING)\");
319 char *argtmp = RSTRING_PTR(v);
321 len = strlen(argtmp);
322 char *str_c = new char[len+3];
323 sprintf(str_c,\"\\\"%s\\\"\",argtmp);
326 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
327 rmod_rtn->cmod = ctoi_fin;
328 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
334 func['| expr LE expr'] =<<'SCP_EOF'
338 * zdd1 <= zdd2 : 以下比較演算
340 * zdd1,zdd2 : ZDD Object
343 * zdd1に含まれるアイテム集合とzdd2に含まれるアイテム集合を比較し、重みがzdd2以下のアイテム集合を選択する。
347 * ==, >=, >, <, ne?, iif
350 VALUE vsop_le(int argc, VALUE *argv,VALUE self){
353 Data_Get_Struct(self,Vsop_Ruby,rmod);
354 rb_scan_args(argc, argv,\"10\",&v);
355 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
356 CtoI *ctoi_modc = value2ctoi(v);
359 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
360 rmod_rtn->cmod = ctoi_fin;
361 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
366 func['| expr LT expr'] =<<'SCP_EOF'
370 * zdd1 < zdd2 -> ZDD Object : 小なり比較演算
372 * zdd1,zdd2 : ZDD Object
375 * zdd1に含まれるアイテム集合とzdd2に含まれるアイテム集合を比較し、重みがzdd2より小さいアイテム集合を選択する。
379 * ==, >=, >, <=, ne?, iif
382 VALUE vsop_lt(int argc, VALUE *argv,VALUE self){
385 Data_Get_Struct(self,Vsop_Ruby,rmod);
386 rb_scan_args(argc, argv,\"10\",&v);
387 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
388 CtoI *ctoi_modc = value2ctoi(v);
391 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
392 rmod_rtn->cmod = ctoi_fin;
393 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
398 func['| expr GE expr'] =<<'SCP_EOF'
402 * zdd1 >= zdd2 -> ZDD Object : 以上比較演算
404 * zdd1,zdd2 : ZDD Object
407 * zdd1に含まれるアイテム集合とzdd2に含まれるアイテム集合を比較し、重みがzdd2以上のアイテム集合を選択する。
411 * ==, >, <=, <, ne?, iif
414 VALUE vsop_ge(int argc, VALUE *argv,VALUE self){
417 Data_Get_Struct(self,Vsop_Ruby,rmod);
418 rb_scan_args(argc, argv,\"10\",&v);
419 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
420 CtoI *ctoi_modc = value2ctoi(v);
423 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
424 rmod_rtn->cmod = ctoi_fin;
425 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
430 func['| expr GT expr'] =<<'SCP_EOF'
434 * zdd1 > zdd2 -> ZDD Object : 大なり比較演算
436 * zdd1,zdd2 : ZDD Object
439 * zdd1に含まれるアイテム集合とzdd2に含まれるアイテム集合を比較し、重みがzdd2より大きいアイテム集合を選択する。
443 * ==, >=, <=, <, ne?, iif
446 VALUE vsop_gt(int argc, VALUE *argv,VALUE self){
449 Data_Get_Struct(self,Vsop_Ruby,rmod);
450 rb_scan_args(argc, argv,\"10\",&v);
451 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
452 CtoI *ctoi_modc = value2ctoi(v);
455 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
456 rmod_rtn->cmod = ctoi_fin;
457 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
463 func['| expr EQ expr'] =<<'SCP_EOF'
467 * zdd1 == zdd2 -> ZDD Object : 等価比較演算子
469 * zdd1,zdd2 : ZDD Object
472 * zdd1に含まれるアイテム集合とzdd2に含まれるアイテム集合を比較し、重みが同じアイテム集合を選択する。アイテム集合のみを返し、重みは1となることに注意する。
474 * 本パッケージで扱える比較演算子(関数)は以下の通り。
475 * zdd1 == zdd2 : 等価演算子
476 * zdd1 >= zdd2 : 以上演算子
477 * zdd1 > zdd2 : 大なり演算子
478 * zdd1 <= zdd2 : 以下演算子
479 * zdd1 < zdd2 : 小なり演算子
480 * zdd1.ne?(zdd2) : 不等関数
487 * # (x,yが上記の通り定義されていたとする)
489 * # xとyを比較し、同じ重みを持つアイテム集合を選択する。
493 * # xとyを比較し、y以上の重みを持つアイテム集合を選択する。
497 * # xとyを比較し、異なる重みを持つアイテム集合を選択する。
501 * zdd1にあってzdd2にない(もしくはその逆)アイテム集合の重みは0と考えればよい。
506 * # (x,yが上記の通り定義されていたとする)
508 * # アイテム集合cはyにないので項0cを考えればよい。
516 * ====== 上記の例において出力結果を示したコメントでは、アイテムをアルファベット小文字1文字で表し、項における重みとアイテム間のスペースおよびアイテム間のスペースを省略して表記している。
519 VALUE vsop_eq(int argc, VALUE *argv,VALUE self){
522 Data_Get_Struct(self,Vsop_Ruby,rmod);
523 rb_scan_args(argc, argv,\"10\",&v);
524 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
525 CtoI *ctoi_modc = value2ctoi(v);
528 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
529 rmod_rtn->cmod = ctoi_fin;
530 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
535 func['| u_expr TLE LPAREN expr RPAREN'] =<<'SCP_EOF'
539 * zdd1.termsLE(zdd2) -> ZDD Object : 重み比較による項選択(以下比較)
541 * zdd1,zdd2 : ZDD Object
544 * zdd1に含まれる項のうち、zdd2で与えられた定数以下の重みを持つ項(重み+アイテム集合)を選択する。
545 * 詳しくはtermsEQ演算子を参照のこと。
548 * termsEQ, termsNE, termsGE, termsGT, termsLE, termsLT, terms
551 VALUE vsop_termsLE(int argc, VALUE *argv, VALUE self){
554 Data_Get_Struct(self,Vsop_Ruby,rmod);
555 rb_scan_args(argc, argv,\"10\",&v);
556 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
557 CtoI *ctoi_modd = value2ctoi(v);
560 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
561 rmod_rtn->cmod = ctoi_fin;
562 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
567 func['| u_expr TLT LPAREN expr RPAREN'] =<<'SCP_EOF'
571 * zdd1.termsLT(zdd2) -> ZDD Object : 重み比較による項選択(小なり比較)
573 * zdd1,zdd2 : ZDD Object
576 * zdd1に含まれる項のうち、zdd2で与えられた定数より小さい重みを持つ項(重み+アイテム集合)を選択する。
577 * 詳しくはtermsEQ演算子を参照のこと。
580 * termsEQ, termsNE, termsGE, termsGT, termsLE, termsLT, terms
583 VALUE vsop_termsLT(int argc, VALUE *argv, VALUE self){
586 Data_Get_Struct(self,Vsop_Ruby,rmod);
587 rb_scan_args(argc, argv,\"10\",&v);
588 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
589 CtoI *ctoi_modd = value2ctoi(v);
592 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
593 rmod_rtn->cmod = ctoi_fin;
594 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
599 func['| u_expr TGE LPAREN expr RPAREN'] =<<'SCP_EOF'
603 * zdd1.termsGE(zdd2) -> ZDD Object : 重み比較による項選択(以上比較)
605 * zdd1,zdd2 : ZDD Object
608 * zdd1に含まれる項のうち、zdd2で与えられた定数以上の重みを持つ項(重み+アイテム集合)を選択する。
609 * 詳しくはtermsEQ演算子を参照のこと。
612 * termsEQ, termsNE, termsGE, termsGT, termsLE, termsLT, terms
615 VALUE vsop_termsGE(int argc, VALUE *argv, VALUE self){
618 Data_Get_Struct(self,Vsop_Ruby,rmod);
619 rb_scan_args(argc, argv,\"10\",&v);
620 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
621 CtoI *ctoi_modd = value2ctoi(v);
624 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
625 rmod_rtn->cmod = ctoi_fin;
626 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
631 func['| u_expr TGT LPAREN expr RPAREN'] =<<'SCP_EOF'
635 * 書式 zdd1.termsGT(zdd2) -> ZDD Object : 重み比較による項選択(大なり比較)
637 * zdd1,zdd2 : ZDD Object
640 * zdd1に含まれる項のうち、zdd2で与えられた定数より大きい重みを持つ項(重み+アイテム集合)を選択する。
641 * 詳しくはtermsEQ演算子を参照のこと。
644 * termsEQ, termsNE, termsGE, termsGT, termsLE, termsLT, terms
648 VALUE vsop_termsGT(int argc, VALUE *argv, VALUE self){
651 Data_Get_Struct(self,Vsop_Ruby,rmod);
652 rb_scan_args(argc, argv,\"10\",&v);
653 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
654 CtoI *ctoi_modd = value2ctoi(v);
657 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
658 rmod_rtn->cmod = ctoi_fin;
659 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
664 func['| u_expr TNE LPAREN expr RPAREN'] =<<'SCP_EOF'
668 * zdd1.termsNE(zdd2) -> ZDD Object : 重み比較による項選択(不等比較)
670 * zdd1,zdd2 : ZDD Object
673 * zdd1に含まれる項のうち、zdd2で与えられた定数と異なる重みを持つ項(重み+アイテム集合)を選択する。
674 * 詳しくはtermsEQ演算子を参照のこと。
677 * termsEQ, termsNE, termsGE, termsGT, termsLE, termsLT, terms
680 VALUE vsop_termsNE(int argc, VALUE *argv, VALUE self){
683 Data_Get_Struct(self,Vsop_Ruby,rmod);
684 rb_scan_args(argc, argv,\"10\",&v);
685 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
686 CtoI *ctoi_modd = value2ctoi(v);
689 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
690 rmod_rtn->cmod = ctoi_fin;
691 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
696 func['| u_expr TEQ LPAREN expr RPAREN'] =<<'SCP_EOF'
700 * zdd1.termsEQ(zdd2) -> ZDD Object : 重み比較による項選択(等価比較)
702 * zdd1,zdd2 : ZDD Object
705 * zdd1に含まれる項のうち、zdd2で与えられた定数と同じ重みを持つ項(重み+アイテム集合)を選択する。
706 * zdd2にはconstantメソッドにより生成されたVSOP定数オブジェクト、もしくはFixnum,Bignumのrubyオブジェクトで指定する。
708 * 本パッケージで扱える全ての項選択メソッドは以下の通り。
709 * zdd1.termsEQ(zdd2) : 等価比較
710 * zdd1.termsGE(zdd2) : 以上比較
711 * zdd1.termsGT(zdd2) : 大なり比較
712 * zdd1.termsLE(zdd2) : 以下比較
713 * zdd1.termsLT(zdd2) : 小なり比較
714 * zdd1.termsNE(zdd2) : 不等比較
719 * # xが上記の通り定義されていたとする。
722 * > x.termsEQ(3).show
726 * > x.termsGE(3).show
730 * > x.termsNE(3).show
734 * > x.termsGT(10).show
738 VALUE vsop_termsEQ(int argc, VALUE *argv, VALUE self){
741 Data_Get_Struct(self,Vsop_Ruby,rmod);
742 rb_scan_args(argc, argv,\"10\",&v);
743 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
744 CtoI *ctoi_modd = value2ctoi(v);
747 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
748 rmod_rtn->cmod = ctoi_fin;
749 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
754 func['| u_expr FPC LPAREN expr RPAREN'] =<<'SCP_EOF'
758 * zdd.freqpatC(minsup) : 頻出飽和アイテム集合の列挙
761 * minsup : Ruby Integer
764 * zddから最小サポートminsup以上出現する頻出飽和アイテム集合を全て列挙し、そのZDDオブジェクトを返す。
769 VALUE vsop_freqpatC(int argc, VALUE *argv, VALUE self){
772 Data_Get_Struct(self,Vsop_Ruby,rmod);
773 rb_scan_args(argc, argv,\"10\",&v);
774 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
775 CtoI *ctoi_modd = value2ctoi(v);
778 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
779 rmod_rtn->cmod = ctoi_fin;
780 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
785 func['| u_expr FPM LPAREN expr RPAREN'] =<<'SCP_EOF'
789 * zdd.freqpatM(minsup) -> ZDD Object : 頻出極大アイテム集合の列挙
792 * minsup : Ruby Integer
795 * zddから最小サポートminsup以上出現する頻出極大アイテム集合を全て列挙し、そのZDDオブジェクトを返す。
800 VALUE vsop_freqpatM(int argc, VALUE *argv, VALUE self){
803 Data_Get_Struct(self,Vsop_Ruby,rmod);
804 rb_scan_args(argc, argv,\"10\",&v);
805 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
806 CtoI *ctoi_modd = value2ctoi(v);
809 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
810 rmod_rtn->cmod = ctoi_fin;
811 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
816 func['| u_expr FPA LPAREN expr RPAREN'] =<<'SCP_EOF'
820 * zdd.freqpatA(minsup) : 頻出アイテム集合の列挙
823 * minsup : Ruby Integer
826 * zddから最小サポートminsup以上出現する頻出アイテム集合を全て列挙し、そのZDDオブジェクトを返す。
829 * > a=VSOP.itemset(\"a\")
830 * > b=VSOP.itemset(\"b\")
831 * > c=VSOP.itemset(\"c\")
832 * > d=VSOP.itemset(\"d\")
833 * > t=a*b + a + b*c*d + a*b*c + a
835 * a b c + a b + 2 a + b c d
837 * > t.freqpatA(1).show
838 * a b c + a b + a c + a + b c d + b c + b d + b + c d + c + d + 1
839 * > t.freqpatM(1).show
841 * > t.freqpatC(1).show
842 * a b c + a b + a + b c d + b c + b + 1
844 * > t.freqpatA(2).show
845 * a b + a + b c + b + c + 1
846 * > t.freqpatM(2).show
848 * > t.freqpatC(2).show
849 * a b + a + b c + b + 1
850 * > t.freqpatA(3).show
852 * > t.freqpatM(3).show
854 * > t.freqpatC(3).show
860 VALUE vsop_freqpatA(int argc, VALUE *argv, VALUE self){
863 Data_Get_Struct(self,Vsop_Ruby,rmod);
864 rb_scan_args(argc, argv,\"10\",&v);
865 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
866 CtoI *ctoi_modd = value2ctoi(v);
869 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
870 rmod_rtn->cmod = ctoi_fin;
871 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
876 func['| u_expr SYMGRP'] =<<'SCP_EOF'
880 * zdd.symgrp : Generates symmetric item sets in zdd.
887 VALUE vsop_symgrp(VALUE self){
889 Data_Get_Struct(self,Vsop_Ruby,rmod);
890 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
893 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
894 rmod_rtn->cmod = ctoi_fin;
895 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
900 func['| MINUS expr %prec UMINUS'] =<<'SCP_EOF'
904 * - zdd -> ZDD Object : -単項演算子
909 * zddに含まれる全てのアイテム集合の重みの符合を変える。
918 VALUE vsop_minus_op(VALUE self){
920 Data_Get_Struct(self,Vsop_Ruby,rmod);
921 CtoI *ctoi_modb =new CtoI(*rmod->cmod);
924 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
925 rmod_rtn->cmod = ctoi_fin;
926 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
931 func['| PLUS expr %prec UPLUS'] =<<'SCP_EOF'
935 * + zdd -> ZDD Object : 単項演算子
940 * zddに含まれる全てのアイテム集合をそのまま返す(何もしない)。
949 VALUE vsop_plus_op(VALUE self){
951 Data_Get_Struct(self,Vsop_Ruby,rmod);
952 CtoI *ctoi_modb =new CtoI(*rmod->cmod);
955 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
956 rmod_rtn->cmod = ctoi_fin;
957 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
962 func['| u_expr PERMITSYM LPAREN expr RPAREN'] =<<'SCP_EOF'
966 * zdd1.permitsym(zdd2) : Filters terms in zdd1 each of which consists of zdd2 number of items.
968 * zdd1,zdd2 : ZDD Object
974 VALUE vsop_permitsym(int argc, VALUE *argv, VALUE self){
977 Data_Get_Struct(self,Vsop_Ruby,rmod);
978 rb_scan_args(argc, argv,\"10\",&v);
979 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
980 CtoI *ctoi_modd = value2ctoi(v);
983 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
984 rmod_rtn->cmod = ctoi_fin;
985 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
990 func['| u_expr RESTRICT LPAREN expr RPAREN'] =<<'SCP_EOF'
994 * zdd1.restrict(zdd2) : restrict
996 * zdd1,zdd2 : ZDD Object
999 * zdd1に含まれる組合せの中から、zdd2中の少なくとも1つの組合せを包含する要素だけを抽出する。
1006 * # x,yが上記の通り定義されていたとする。
1009 * > x.restrinct(y).show
1011 * > x.restrinct(z).show
1013 * > x.restrinct(\"a\").show
1017 VALUE vsop_restrict(int argc, VALUE *argv, VALUE self){
1020 Data_Get_Struct(self,Vsop_Ruby,rmod);
1021 rb_scan_args(argc, argv,\"10\",&v);
1022 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
1023 CtoI *ctoi_modd = value2ctoi(v);
1026 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
1027 rmod_rtn->cmod = ctoi_fin;
1028 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
1034 func['| u_expr ITEMS'] =<<'SCP_EOF'
1038 * zdd.items -> ZDD Object : ZDDを構成する全アイテムの列挙
1043 * zdd上の全アイテムとその重みについて、新しいZDDオブジェクトを生成し返す。
1046 * > a=VSOP.itemset(\"a\")
1047 * > b=VSOP.itemset(\"b\")
1048 * > c=VSOP.itemset(\"c\")
1049 * > f=((a*b*c)+(a*b)+(b*c))
1051 * a b c + 2 a b + b c
1053 * # ZDDオブジェクトfは3つのアイテムa,b,cから構成されており、それぞれのアイテムの重みを以下の通り計算する。
1054 * # アイテムaを含む項は\"a b c\"と\"2 a b\"で、その重み合計は3となる。
1055 * # アイテムbは全ての項に含まれ、その重み合計は4となる。
1056 * # アイテムcを含む項は\"a b c\"と\"b c\"で、その重み合計は2となる。
1061 VALUE vsop_items(VALUE self){
1063 Data_Get_Struct(self,Vsop_Ruby,rmod);
1064 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
1067 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
1068 rmod_rtn->cmod = ctoi_fin;
1069 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
1074 func['| u_expr TOTALVAL'] =<<'SCP_EOF'
1078 * zdd.totalval -> Ruby Integer : 重みの合計
1083 * zddに含まれる項(定数項も含む)の重みの合計をruby整数で返す。
1088 * # xが上記の通り定義されていたとする。
1095 * 5 a + 3 b + c - 10
1096 * # xが上記の通り定義されていたとする。
1103 VALUE vsop_totalval(VALUE self){
1105 Data_Get_Struct(self,Vsop_Ruby,rmod);
1106 int val = rmod->cmod->TotalVal().GetInt();
1107 return INT2NUM(val);
1110 Data_Get_Struct(self,Vsop_Ruby,rmod);
1111 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
1114 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
1115 rmod_rtn->cmod = ctoi_fin;
1116 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
1122 func['| u_expr MINVAL'] =<<'SCP_EOF'
1126 * zdd.minval -> ZDD Object : 重みの最小値
1131 * zddに含まれる項(定数項も含む)のうち、最小の重みをVSOP定数オブジェクトで返す。
1136 * # xが上記の通り定義されていたとする。
1141 * # 最小値は定数項も含めて求められる。
1143 * 5 a - 3 b + c - 10
1144 * # xが上記の通り定義されていたとする。
1150 * 5 a - 3 b + 5 c - 3
1151 * # xが上記の通り定義されていたとする。
1152 * > x.termsEQ(x.maxval).show
1159 VALUE vsop_minval(VALUE self){
1161 Data_Get_Struct(self,Vsop_Ruby,rmod);
1162 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
1165 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
1166 rmod_rtn->cmod = ctoi_fin;
1167 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
1172 func['| u_expr MAXVAL'] =<<'SCP_EOF'
1176 * zdd.maxval -> ZDD Object : 重みの最大値
1181 * zddに含まれる項(定数項も含む)のうち、最大の重みをVSOP定数オブジェクトで返す。
1186 * # xが上記の通り定義されていたとする。
1190 * # 最大値は定数項も含めて求められる。
1192 * 5 a + 3 b + c + 10
1193 * # xが上記の通り定義されていたとする。
1199 * 5 a + 3 b + 5 c + 2
1200 * # xが上記の通り定義されていたとする。
1201 * > x.termsEQ(x.maxval).show
1208 VALUE vsop_maxval(VALUE self){
1210 Data_Get_Struct(self,Vsop_Ruby,rmod);
1211 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
1214 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
1215 rmod_rtn->cmod = ctoi_fin;
1216 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
1221 func['| expr REMAINDER expr'] =<<'SCP_EOF'
1225 * zdd1 % zdd2 -> ZDD Object : 剰余演算子
1227 * zdd1,zdd2 : ZDD Object
1230 * 剰余演算を行う。詳しくは / 演算子を参照。
1233 VALUE vsop_remainder(int argc, VALUE *argv,VALUE self){
1236 Data_Get_Struct(self,Vsop_Ruby,rmod);
1237 rb_scan_args(argc, argv,\"10\",&v);
1238 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
1239 CtoI *ctoi_modc = value2ctoi(v);
1242 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
1243 rmod_rtn->cmod = ctoi_fin;
1244 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
1249 func['| expr QUOTIENT expr'] =<<'SCP_EOF'
1253 * zdd1 / zdd2 -> ZDD Object : 除算演算子
1255 * zdd1,zdd2 : ZDD Object
1259 * 重み付き積和集合xの定数cによる除算x/cは、
1260 * xの各項(アイテム集合)の重み(頻度)をcで整数除算した商を重みに持つアイテム集合が計算される。
1262 * x.show # -> 13a+3b (xが左記の通り定義されていたとする)
1263 * x/5 -> 2a # aの項:13/5の商は2であるから2a。bの項:3/5の商は0であるから0bとなり表示されない。
1264 * x%5 -> 3a+3b # aの項:13/5の余りは3であるから3a。bの項:3/5の余りは3であるから3bとなる。
1266 * ==== b. 1つのアイテム集合による除算
1267 * 重み付き積和集合xのアイテム集合vによる除算x/vは、xの各項をvで除する演算である。
1269 * x.show # -> 7ab+5bc
1270 * y.show # -> 7ab+5bc+2c
1271 * # (x,yが上記の通り定義されていたとする)
1272 * x/'b' # -> 7a+5c # 7ab/bの商は7a。5bc/bの商は5c。
1273 * y/'3b' # -> 2a+c # 7ab/3bの商は2a。5bc/3bの商は1c。2c/3bの商は0となり表示されない。
1274 * x%'b' # -> 0 # 7ab/bの余りは0。5bc/bの余り0。
1275 * y%'3b' # -> ab+2bc+2c # 7ab/3bの余りはab。5bc/3bの余りは2bc。2c/3bの余りは2c。
1277 * ==== c. 2つ以上のアイテム集合による除算
1278 * 2つの重み付き積和集合x,yの除算x/yは次のように計算される。
1279 * 除数yの各項をT_iとしたときQ_i=x/T_iを全てのT_iについて得られたQ_i全て共通に含まれるアイテム集合(項)について、重みの絶対値が最小の項を商Qと定義する。
1280 * 通常の多項式とは異なることに注意する。
1281 * x.show # -> 2ab+4ac+ad-2bc+3bd
1283 * # (x,yが上記の通り定義されていたとする)
1284 * # Q_1=(x/'a')=2b +4c +d +0 +0 = 0 +2b +4c +d
1285 * # Q_2=(x/'b')=2a +0 +0 -2c +3d = 2a +0 -2c +3d
1286 * # Q_1,Q_2で共通のアイテム集合はcとdであり、それぞれで絶対値が最小の項は-2cとdである。よって求める商は以下の通りとなる。
1287 * (x/y).show # -> -2c+d
1288 * # x%yについてはx-(y*Q)を計算すればよい。
1289 * (x%y).show # -> 2ab+6ac+2bd
1291 * ====== 上記の例において出力結果を示したコメントでは、アイテムをアルファベット小文字1文字で表し、項における重みとアイテム間のスペースおよびアイテム間のスペースを省略して表記している。
1294 VALUE vsop_quotiment(int argc, VALUE *argv,VALUE self){
1297 Data_Get_Struct(self,Vsop_Ruby,rmod);
1298 rb_scan_args(argc, argv,\"10\",&v);
1299 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
1300 CtoI *ctoi_modc = value2ctoi(v);
1303 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
1304 rmod_rtn->cmod = ctoi_fin;
1305 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
1310 func['| expr MULTIPLY expr'] =<<'SCP_EOF'
1314 * zdd1 * zdd2 -> ZDD Object : 乗算演算子
1316 * zdd1,zdd2 : ZDD Object
1320 * 重み付き積和集合xに定数cを掛けるx*cでは、xの各項の重みをc倍する。
1322 * a=VSOP.itemset('a'); b=VSOP.itemset('b'); c=VSOP.itemset('c');
1323 * (a*3).show # -> 3a
1324 * (-2*a).show # -> -2a
1325 * ((a+2*b+3*c)*4).show # -> 4a+8b+12c
1327 * ==== b. 1つのアイテム集合の乗算
1328 * 重み付き積和集合xに1つのアイテム集合yを掛けるx*yでは、xの各項目にアイテム集合yを加える。
1329 * ただし、同じアイテム同士の掛け算 a*a=a となることに注意する。
1330 * x.show # -> a+2ab+3c (xが左記の通り定義されていたとする)
1331 * x*'d' # -> ad+2abd+3cd
1332 * x*'b' # -> ab+2ab+3bc
1333 * 4*x*'a' # -> 4a+8ab+12ac
1335 * ==== c. 2つ以上のアイテム集合の乗算
1336 * 2つの重み付き積和集合x,yの乗算x*yでは、xとyそれぞれの各項から一つずつ選ぶ組み合わせ全てについて上記a,bの乗算を付す。
1337 * 乗算の結果同じアイテム集合の項は加減算される。
1338 * a=VSOP.itemset('a'); b=VSOP.itemset('b');
1339 * c=VSOP.itemset('c'); d=VSOP.itemset('d');
1340 * ((a+b)*(c+d)).show # -> ac+ad+bc+bd
1341 * ((a+b)*(b+c)).show # -> ab+ac+b+bc
1342 * ((a+b)*(a+b)).show # -> a+2ab+b
1343 * ((a+b)*(a-b)).show # -> a-b
1345 * ====== 上記の例において出力結果を示したコメントでは、アイテムをアルファベット小文字1文字で表し、項における重みとアイテム間のスペースおよびアイテム間のスペースを省略して表記している。
1348 VALUE vsop_multiply(int argc, VALUE *argv,VALUE self){
1351 Data_Get_Struct(self,Vsop_Ruby,rmod);
1352 rb_scan_args(argc, argv,\"10\",&v);
1353 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
1354 CtoI *ctoi_modc = value2ctoi(v);
1357 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
1358 rmod_rtn->cmod = ctoi_fin;
1359 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
1364 func['| LCM LPAREN FNAME FNAME NUMBER FNAME RPAREN'] =<<'SCP_EOF'
1366 VALUE vsop_lcm_order(int argc, VALUE *argv, VALUE self){
1367 if(init_cnt==0){ BDDV_Init(256, env_nmax);}
1372 rb_scan_args(argc, argv,\"40\",&v1,&v2,&v3,&v4);
1373 if(TYPE(v1)!=T_STRING){
1374 rb_raise(rb_eRuntimeError,\"argument type error (1st argument must be STRING)\");
1376 if(TYPE(v2)!=T_STRING){
1377 rb_raise(rb_eRuntimeError,\"argument type error (1st argument must be STRING)\");
1379 if(TYPE(v3)!=T_FIXNUM){
1380 rb_raise(rb_eRuntimeError,\"argument type error (3rd argument must be FIXNUM)\");
1382 if(TYPE(v4)!=T_STRING){
1383 rb_raise(rb_eRuntimeError,\"argument type error (4th argument must be STRING)\");
1385 char *arg1 = RSTRING_PTR(v1);
1386 char *arg2 = RSTRING_PTR(v2);
1387 int arg3_fix = FIX2INT(v3);
1388 char *arg4 = RSTRING_PTR(v4);
1393 char *str_c = new char[len+3];
1394 sprintf(str_c,\"\\\"%s\\\"\",arg1);
1398 char *str_d = new char[len+3];
1399 sprintf(str_d,\"\\\"%s\\\"\",arg2);
1402 char *str_e = new char[64];
1403 sprintf(str_e,\"%d\",arg3_fix);
1406 char *str_f = new char[len+3];
1407 sprintf(str_f,\"\\\"%s\\\"\",arg4);
1412 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
1413 rmod_rtn->cmod = ctoi_fin;
1414 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
1421 func['| LCM LPAREN FNAME FNAME NUMBER RPAREN'] =<<'SCP_EOF'
1423 VALUE vsop_lcm_nomal(int argc, VALUE *argv, VALUE self){
1424 if(init_cnt==0){ BDDV_Init(256, env_nmax);}
1429 rb_scan_args(argc, argv,\"30\",&v1,&v2,&v3);
1430 if(TYPE(v1)!=T_STRING){
1431 rb_raise(rb_eRuntimeError,\"argument type error (1st argument must be STRING)\");
1433 if(TYPE(v2)!=T_STRING){
1434 rb_raise(rb_eRuntimeError,\"argument type error (1st argument must be STRING)\");
1436 if(TYPE(v3)!=T_FIXNUM){
1437 rb_raise(rb_eRuntimeError,\"argument type error (3rd argument must be FIXNUM)\");
1439 char *arg1 = RSTRING_PTR(v1);
1440 char *arg2 = RSTRING_PTR(v2);
1441 int arg3_fix = FIX2INT(v3);
1446 char *str_c = new char[len+3];
1447 sprintf(str_c,\"\\\"%s\\\"\",arg1);
1451 char *str_d = new char[len+3];
1452 sprintf(str_d,\"\\\"%s\\\"\",arg2);
1455 char *str_e = new char[64];
1456 sprintf(str_e,\"%d\",arg3_fix);
1458 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
1459 rmod_rtn->cmod = ctoi_fin;
1460 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
1465 func['| u_expr PERMIT LPAREN expr RPAREN']=<<'SCP_EOF'
1469 * zdd1.permit(zdd2) : permit演算子
1471 * zdd1,zdd2 : ZDD Object
1474 * zdd1に含まれる組合せの中から、zdd2中の少なくとも1つの組合せに包含される要素だけを抽出する。
1483 * # x,y,zが上記の通り定義されていたとする。
1485 * > x.permit(y).show
1487 * > x.permit(z).show
1489 * > x.permit(\"a\").show
1492 VALUE vsop_permit(int argc, VALUE *argv, VALUE self){
1495 Data_Get_Struct(self,Vsop_Ruby,rmod);
1496 rb_scan_args(argc, argv,\"10\",&v);
1497 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
1498 CtoI *ctoi_modd = value2ctoi(v);
1501 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
1502 rmod_rtn->cmod = ctoi_fin;
1503 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
1508 func[': print expr']=<<'SCP_EOF'
1514 VALUE vsop_print(VALUE self){
1516 Data_Get_Struct(self,Vsop_Ruby,rmod);
1517 CtoI *ctoi_modb =new CtoI(*rmod->cmod);
1524 func['| expr PLUS expr']=<<'SCP_EOF'
1528 * zdd1 + zdd2 -> ZDD Object : 加算演算子
1530 * zdd1,zdd2 : ZDD Object
1533 * zdd1とzdd2の対応するアイテム集合同士の重みの加算を行う。
1540 * # x,yが上記の通り定義されていたとする。
1546 VALUE vsop_plus(int argc, VALUE *argv,VALUE self){
1549 Data_Get_Struct(self,Vsop_Ruby,rmod);
1550 rb_scan_args(argc, argv,\"10\",&v);
1551 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
1552 CtoI *ctoi_modc = value2ctoi(v);
1555 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
1556 rmod_rtn->cmod = ctoi_fin;
1557 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
1562 func['| expr MINUS expr']=<<'SCP_EOF'
1566 * zdd1 - zdd2 -> ZDD Object : 減算演算子
1568 * zdd1,zdd2 : ZDD Object
1571 * zdd1とzdd2の対応するアイテム集合同士の重みの減算を行う。
1578 * # x,yが上記の通り定義されていたとする。
1586 VALUE vsop_minus(int argc, VALUE *argv,VALUE self){
1589 Data_Get_Struct(self,Vsop_Ruby,rmod);
1590 rb_scan_args(argc, argv,\"10\",&v);
1591 CtoI *ctoi_moda =new CtoI(*rmod->cmod);
1592 CtoI *ctoi_modc = value2ctoi(v);
1595 Vsop_Ruby *rmod_rtn = new Vsop_Ruby;
1596 rmod_rtn->cmod = ctoi_fin;
1597 return Data_Wrap_Struct(rb_class_of(self),0,free_rmod,rmod_rtn);
1605 def extract_pgm(src)
1613 if "#{line}" =~ /\{/ then
1614 if(start_char==0) then
1617 start_char= start_char + 1
1618 elsif "#{line}" =~ /\}/ then
1619 end_char = end_char + 1
1620 if(start_char==end_char) then
1621 pgmsrc =pgmsrc.gsub("$1.str", "str_a")
1622 pgmsrc =pgmsrc.gsub("$2.str", "str_b")
1623 pgmsrc =pgmsrc.gsub("$3.str", "str_c")
1624 pgmsrc =pgmsrc.gsub("$4.str", "str_d")
1625 pgmsrc =pgmsrc.gsub("$5.str", "str_e")
1626 pgmsrc =pgmsrc.gsub("$6.str", "str_f")
1627 pgmsrc =pgmsrc.gsub("$1.len", "len_a")
1628 pgmsrc =pgmsrc.gsub("$2.len", "len_b")
1629 pgmsrc =pgmsrc.gsub("$3.len", "len_c")
1630 pgmsrc =pgmsrc.gsub("$4.len", "len_d")
1631 pgmsrc =pgmsrc.gsub("$5.len", "len_e")
1632 pgmsrc =pgmsrc.gsub("$6.len", "len_f")
1633 pgmsrc =pgmsrc.gsub("$$", "ctoi_fin")
1634 pgmsrc =pgmsrc.gsub("$1", "ctoi_moda")
1635 pgmsrc =pgmsrc.gsub("$2", "ctoi_modb")
1636 pgmsrc =pgmsrc.gsub("$3", "ctoi_modc")
1637 pgmsrc =pgmsrc.gsub("$4", "ctoi_modd")
1638 pgmsrc =pgmsrc.gsub("$5", "ctoi_mode")
1639 pgmsrc =pgmsrc.gsub("$6", "ctoi_modf")
1643 if(writeflg == 1)then
1644 pgmsrc = pgmsrc + "#{line}"
1650 ##最初に%{から%}までint main以外をすべて抜き出す
1651 File.open("SAPPOROBDD/app/VSOP/vsopyacc.y++","r"){|src|
1657 if "#{line}" =~ /^%\{/ then
1659 elsif "#{line}" =~ /^%\}/ then
1661 elsif "#{line}" =~ /^int main/ then
1664 elsif "#{line}" =~ /\{|\}/ and mainflg == 1 then
1665 if "#{line}" =~ /\{/ then
1668 if "#{line}" =~ /\}/ then
1670 if main_s == main_e then
1677 File.open("zdd_so.cpp","a"){|file|
1685 File.open("SAPPOROBDD/app/VSOP/vsopyacc.y++","r"){|src|
1687 if not func[line.squeeze(" ").chomp.lstrip.rstrip].nil?then
1688 key = line.squeeze(" ").chomp.lstrip.rstrip
1689 pgm_src = extract_pgm(src)
1690 File.open("zdd_so.cpp","a"){|file|
1691 eval "file.puts " + func[key]
1699 if(File.exist?("zdd_so.cpp"))then
1700 File.delete("zdd_so.cpp")
1704 #zdd.cxxにsetfunc.cppを入れ込み、zdd_so.cppを作成
1705 File.open("zdd_so.cxx","r"){|src|
1707 if "#{line}" =~ /^#include \"setfunc\.cpp\"/ then
1710 File.open("zdd_so.cpp","a"){|file|