=================================================================== RCS file: /home/cvs/OpenXM_contrib2/asir2000/builtin/dp.c,v retrieving revision 1.89 retrieving revision 1.92 diff -u -p -r1.89 -r1.92 --- OpenXM_contrib2/asir2000/builtin/dp.c 2013/09/09 07:29:25 1.89 +++ OpenXM_contrib2/asir2000/builtin/dp.c 2014/08/19 06:35:01 1.92 @@ -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.88 2013/06/14 04:47:17 ohara Exp $ + * $OpenXM: OpenXM_contrib2/asir2000/builtin/dp.c,v 1.91 2013/09/12 06:46:16 noro Exp $ */ #include "ca.h" #include "base.h" @@ -165,10 +165,8 @@ struct ftab dp_tab[] = { {"nd_gr_trace",Pnd_gr_trace,5}, {"nd_f4_trace",Pnd_f4_trace,5}, {"nd_gr_postproc",Pnd_gr_postproc,5}, -#if 0 {"nd_gr_recompute_trace",Pnd_gr_recompute_trace,5}, -#endif - {"nd_btog",Pnd_btog,5}, + {"nd_btog",Pnd_btog,-6}, {"nd_weyl_gr_postproc",Pnd_weyl_gr_postproc,5}, {"nd_weyl_gr",Pnd_weyl_gr,4}, {"nd_weyl_gr_trace",Pnd_weyl_gr_trace,5}, @@ -2211,7 +2209,6 @@ LIST *rp; nd_gr_postproc(f,v,m,ord,do_check,rp); } -#if 0 void Pnd_gr_recompute_trace(arg,rp) NODE arg; LIST *rp; @@ -2230,14 +2227,16 @@ LIST *rp; tlist = (LIST)ARG4(arg); nd_gr_recompute_trace(f,v,m,ord,tlist,rp); } -#endif +Obj nd_btog_one(LIST f,LIST v,int m,struct order_spec *ord,LIST tlist,int pos); +Obj nd_btog(LIST f,LIST v,int m,struct order_spec *ord,LIST tlist); + void Pnd_btog(arg,rp) NODE arg; -MAT *rp; +Obj *rp; { LIST f,v,tlist; - int m; + int m,ac,pos; struct order_spec *ord; do_weyl = 0; @@ -2248,7 +2247,14 @@ MAT *rp; m = QTOS((Q)ARG2(arg)); create_order_spec(0,ARG3(arg),&ord); tlist = (LIST)ARG4(arg); - *rp = nd_btog(f,v,m,ord,tlist); + if ( (ac = argc(arg)) == 6 ) { + asir_assert(ARG5(arg),O_N,"nd_btog"); + pos = QTOS((Q)ARG5(arg)); + *rp = nd_btog_one(f,v,m,ord,tlist,pos); + } else if ( ac == 5 ) + *rp = nd_btog(f,v,m,ord,tlist); + else + error("nd_btog : argument mismatch"); } void Pnd_weyl_gr_postproc(arg,rp) @@ -2630,44 +2636,52 @@ VECT *rp; } } -VECT current_top_weight_vector_obj; -N *current_top_weight_vector; +Obj current_top_weight; +extern Obj nd_top_weight; -void Pdp_set_top_weight(arg,rp) -NODE arg; -VECT *rp; +void Pdp_set_top_weight(NODE arg,Obj *rp) { VECT v; - int i,n; + MAT m; + Obj obj; + int i,j,n,id,row,col; + Q *mi; NODE node; if ( !arg ) - *rp = current_top_weight_vector_obj; + *rp = current_top_weight; else if ( !ARG0(arg) ) { - current_top_weight_vector = 0; - current_top_weight_vector_obj = 0; + nd_top_weight = 0; + current_top_weight = 0; *rp = 0; } else { - if ( OID(ARG0(arg)) != O_VECT && OID(ARG0(arg)) != O_LIST ) + id = OID(ARG0(arg)); + if ( id != O_VECT && id != O_MAT && id != O_LIST ) error("dp_set_top_weight : invalid argument"); - if ( OID(ARG0(arg)) == O_VECT ) - v = (VECT)ARG0(arg); - else { + if ( id == O_LIST ) { node = (NODE)BDY((LIST)ARG0(arg)); n = length(node); MKVECT(v,n); for ( i = 0; i < n; i++, node = NEXT(node) ) BDY(v)[i] = BDY(node); + obj = v; + } else + obj = ARG0(arg); + if ( OID(obj) == O_VECT ) { + v = (VECT)obj; + for ( i = 0; i < v->len; i++ ) + if ( !INT(BDY(v)[i]) || (BDY(v)[i] && SGN((Q)BDY(v)[i]) < 0) ) + error("dp_set_top_weight : each element must be a non-negative integer"); + } else { + m = (MAT)obj; row = m->row; col = m->col; + for ( i = 0; i < row; i++ ) + for ( j = 0, mi = (Q *)BDY(m)[i]; j < col; j++ ) + if ( !INT(mi[j]) || (mi[j] && SGN((Q)mi[j]) < 0) ) + error("dp_set_top_weight : each element must be a non-negative integer"); } - for ( i = 0; i < v->len; i++ ) - if ( !INT(BDY(v)[i]) || (BDY(v)[i] && SGN((Q)BDY(v)[i]) < 0) ) - error("dp_set_top_weight : each element must be a non-negative integer"); - current_top_weight_vector_obj = v; - current_top_weight_vector = (N *)MALLOC(v->len*sizeof(N)); - for ( i = 0; i < v->len; i++ ) { - current_top_weight_vector[i] = !BDY(v)[i]?0:NM((Q)BDY(v)[i]); - } - *rp = current_top_weight_vector_obj; + current_top_weight = obj; + nd_top_weight = obj; + *rp = current_top_weight; } } @@ -2962,4 +2976,3 @@ int get_opt(char *key0,Obj *r) { } return 0; } -