[BACK]Return to dp-supp.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / builtin

Diff for /OpenXM_contrib2/asir2000/builtin/dp-supp.c between version 1.41 and 1.42

version 1.41, 2007/08/21 23:53:00 version 1.42, 2007/09/06 02:23:40
Line 45 
Line 45 
  * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,   * DEVELOPER SHALL HAVE NO LIABILITY IN CONNECTION WITH THE USE,
  * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.   * PERFORMANCE OR NON-PERFORMANCE OF THE SOFTWARE.
  *   *
  * $OpenXM: OpenXM_contrib2/asir2000/builtin/dp-supp.c,v 1.40 2006/12/12 11:50:37 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/builtin/dp-supp.c,v 1.41 2007/08/21 23:53:00 noro Exp $
 */  */
 #include "ca.h"  #include "ca.h"
 #include "base.h"  #include "base.h"
Line 2446  int dpv_ht(DPV p,DP *h)
Line 2446  int dpv_ht(DPV p,DP *h)
                 MKDP(e[maxi]->nv,mr,*h); (*h)->sugar = mr->dl->td;  /* XXX */                  MKDP(e[maxi]->nv,mr,*h); (*h)->sugar = mr->dl->td;  /* XXX */
                 return maxi;                  return maxi;
         }          }
   }
   
   /* return 1 if 0 <_w1 v && v <_w2 0 */
   
   int in_c12(int n,int *v,int row1,int **w1,int row2, int **w2)
   {
           int t1,t2;
   
           t1 = compare_zero(n,v,row1,w1);
           t2 = compare_zero(n,v,row2,w2);
           if ( t1 > 0 && t2 < 0 ) return 1;
           else return 0;
   }
   
   /* 0 < u => 1, 0 > u => -1 */
   
   int compare_zero(int n,int *u,int row,int **w)
   {
           int i,j,t;
           int *wi;
   
           for ( i = 0; i < row; i++ ) {
                   wi = w[i];
                   for ( j = 0, t = 0; j < n; j++ ) t += u[j]*wi[j];
                   if ( t > 0 ) return 1;
                   else if ( t < 0 ) return -1;
           }
           return 0;
   }
   
   /* functions for generic groebner walk */
   /* u=0 means u=-infty */
   
   int compare_facet_preorder(int n,int *u,int *v,
           int row1,int **w1,int row2,int **w2)
   {
           int i,j,s,t,tu,tv;
           int *w2i,*uv;
   
           if ( !u ) return 1;
           uv = W_ALLOC(n);
           for ( i = 0; i < row2; i++ ) {
                   w2i = w2[i];
                   for ( j = 0, tu = tv = 0; j < n; j++ )
                           if ( s = w2i[j] ) {
                                   tu += s*u[j]; tv += s*v[j];
                           }
                   for ( j = 0; j < n; j++ ) uv[j] = u[j]*tv-v[j]*tu;
                   t = compare_zero(n,uv,row1,w1);
                   if ( t > 0 ) return 1;
                   else if ( t < 0 ) return 0;
           }
           return 1;
   }
   
   /* return 0 if last_w = infty */
   
   NODE compute_last_w(NODE g,NODE gh,int n,int **w,
           int row1,int **w1,int row2,int **w2)
   {
           DP d;
           MP f,m0,m;
           int *wt,*v,*h;
           NODE t,s,n0,tn,n1,r0,r;
           int i;
   
           wt = W_ALLOC(n);
           n0 = 0;
           for ( t = g, s = gh; t; t = NEXT(t), s = NEXT(s) ) {
                   f = BDY((DP)BDY(t));
                   h = BDY((DP)BDY(s))->dl->d;
                   for ( ; f; f = NEXT(f) ) {
                           for ( i = 0; i < n; i++ ) wt[i] = h[i]-f->dl->d[i];
                           for ( i = 0; i < n && !wt[i]; i++ );
                           if ( i == n ) continue;
   
                           if ( in_c12(n,wt,row1,w1,row2,w2) &&
                                   compare_facet_preorder(n,*w,wt,row1,w1,row2,w2) ) {
                                   v = (int *)MALLOC_ATOMIC(n*sizeof(int));
                                   for ( i = 0; i < n; i++ ) v[i] = wt[i];
                                   MKNODE(n1,v,n0); n0 = n1;
                           }
                   }
           }
           if ( !n0 ) return 0;
           for ( t = n0; t; t = NEXT(t) ) {
                   v = (int *)BDY(t);
                   for ( s = n0; s; s = NEXT(s) )
                           if ( !compare_facet_preorder(n,v,(int *)BDY(s),row1,w1,row2,w2) )
                                   break;
                   if ( !s ) {
                           *w = v;
                           break;
                   }
           }
           if ( !t )
                   error("compute_last_w : cannot happen");
           r0 = 0;
           for ( t = g, s = gh; t; t = NEXT(t), s = NEXT(s) ) {
                   f = BDY((DP)BDY(t));
                   h = BDY((DP)BDY(s))->dl->d;
                   for ( m0 = 0; f; f = NEXT(f) ) {
                           for ( i = 0; i < n; i++ ) wt[i] = h[i]-f->dl->d[i];
                           for ( i = 0; i < n && !wt[i]; i++ );
                           if ( i == n  ||
                                   (compare_facet_preorder(n,wt,*w,row1,w1,row2,w2)
                                   && compare_facet_preorder(n,*w,wt,row1,w1,row2,w2)) ) {
                                   NEXTMP(m0,m); m->c = f->c; m->dl = f->dl;
                           }
                           NEXT(m) = 0;
                   }
                   MKDP(((DP)BDY(t))->nv,m0,d);  d->sugar = ((DP)BDY(t))->sugar;
                   NEXTNODE(r0,r); BDY(r) = (pointer)d;
           }
           NEXT(r) = 0;
           return r0;
 }  }

Legend:
Removed from v.1.41  
changed lines
  Added in v.1.42

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>