=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/dp.c,v retrieving revision 1.98 retrieving revision 1.100 diff -u -p -r1.98 -r1.100 --- OpenXM_contrib2/asir2000/builtin/dp.c 2016/03/31 08:43:25 1.98 +++ OpenXM_contrib2/asir2000/builtin/dp.c 2017/02/27 05:14:53 1.100 @@ -44,7 +44,7 @@ * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE, * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE. * - * $OpenXM: OpenXM_contrib2/asir2000/builtin/dp.c,v 1.97 2016/03/31 07:33:32 noro Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/builtin/dp.c,v 1.99 2016/12/02 02:12:00 noro Exp $ */ #include "ca.h" #include "base.h" @@ -2103,6 +2103,8 @@ void Pnd_f4(NODE arg,LIST *rp) LIST f,v; int m,homo,retdp; Obj val; + Q mq; + NODE node; struct order_spec *ord; do_weyl = 0; @@ -2115,7 +2117,12 @@ void Pnd_f4(NODE arg,LIST *rp) if ( !BDY(f) ) { *rp = f; return; } - m = QTOS((Q)ARG2(arg)); + mq = (Q)ARG2(arg); + if ( PL(NM(mq)) > 1 || BD(NM(mq))[0] >= (1<<30) ) { + node = mknode(1,mq); + Psetmod_ff(node,&val); + m = -2; + } create_order_spec(0,ARG3(arg),&ord); homo = retdp = 0; if ( get_opt("homo",&val) && val ) homo = 1; @@ -2129,6 +2136,8 @@ void Pnd_gr(NODE arg,LIST *rp) LIST f,v; int m,homo,retdp; Obj val; + Q mq; + NODE node; struct order_spec *ord; do_weyl = 0; @@ -2140,7 +2149,12 @@ void Pnd_gr(NODE arg,LIST *rp) if ( !BDY(f) ) { *rp = f; return; } - m = QTOS((Q)ARG2(arg)); + mq = (Q)ARG2(arg); + if ( PL(NM(mq)) > 1 || BD(NM(mq))[0] >= (1<<30) ) { + node = mknode(1,mq); + Psetmod_ff(node,&val); + m = -2; + } create_order_spec(0,ARG3(arg),&ord); homo = retdp = 0; if ( get_opt("homo",&val) && val ) homo = 1; @@ -2498,6 +2512,7 @@ void Pdp_weyl_gr_mod_main(NODE arg,LIST *rp) VECT current_dl_weight_vector_obj; int *current_dl_weight_vector; +int dp_negative_weight; void Pdp_set_weight(NODE arg,VECT *rp) { @@ -2510,6 +2525,7 @@ void Pdp_set_weight(NODE arg,VECT *rp) else if ( !ARG0(arg) ) { current_dl_weight_vector_obj = 0; current_dl_weight_vector = 0; + dp_negative_weight = 0; *rp = 0; } else { if ( OID(ARG0(arg)) != O_VECT && OID(ARG0(arg)) != O_LIST ) @@ -2528,6 +2544,12 @@ void Pdp_set_weight(NODE arg,VECT *rp) current_dl_weight_vector = (int *)CALLOC(n,sizeof(int)); for ( i = 0; i < n; i++ ) current_dl_weight_vector[i] = QTOS((Q)v->body[i]); + for ( i = 0; i < n; i++ ) + if ( current_dl_weight_vector[i] < 0 ) break; + if ( i < n ) + dp_negative_weight = 1; + else + dp_negative_weight = 0; *rp = v; } }