[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.44 and 1.45

version 1.44, 2007/09/15 10:17:08 version 1.45, 2007/09/16 09:08:25
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.43 2007/09/07 00:45:50 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/builtin/dp-supp.c,v 1.44 2007/09/15 10:17:08 noro Exp $
 */  */
 #include "ca.h"  #include "ca.h"
 #include "base.h"  #include "base.h"
Line 2708  NODE compute_last_w(NODE g,NODE gh,int n,int **w,
Line 2708  NODE compute_last_w(NODE g,NODE gh,int n,int **w,
 }  }
   
 /* compute a sufficient set of d(f)=u-v */  /* compute a sufficient set of d(f)=u-v */
 static int comp_vector_lex_nv;  
   
 int comp_vector_lex(int **a,int **b)  
 {  
         int i;  
         int *pa,*pb;  
   
         pa = *a; pb = *b;  
         for ( i = 0; i < comp_vector_lex_nv; i++ )  
                 if ( pa[i] < pb[i] ) return -1;  
                 else if ( pa[i] > pb[i] ) return 1;  
         return 0;  
 }  
   
 NODE compute_essential_df(DP *g,DP *gh,int ng)  NODE compute_essential_df(DP *g,DP *gh,int ng)
 {  {
         VECT v;          int nv,i,j,k,t,lj;
         Q q;          NODE r,r1,ri,rt,r0;
         MP m;          MP m;
         NODE r,r1;          MP *mj;
         int nv,len,i,j,k;          DL di,hj,dl,dlt;
         int *p,*dm,*mi,*mj,*h;          int *d,*dt;
         int **mat;          LIST l;
           Q q;
   
         nv = comp_vector_lex_nv = g[0]->nv;          nv = g[0]->nv;
         for ( len = 0, j = 0; j < ng; j++ ) {          r = 0;
                 for ( m = BDY(g[j]); m; m = NEXT(m), len++ );          for ( j = 0; j < ng; j++ ) {
         }                  for ( m = BDY(g[j]), lj = 0; m; m = NEXT(m), lj++ );
         mat = almat(len,nv);                  mj = (MP *)ALLOCA(lj*sizeof(MP));
         for ( i = 0, j = 0; j < ng; j++ ) {                  for ( m = BDY(g[j]), k = 0; m; m = NEXT(m), k++ )
                 h = BDY(gh[j])->dl->d;                          mj[k] = m;
                 for ( m = BDY(g[j]); m; m = NEXT(m) ) {                  for ( i = 0; i < lj; i++ ) {
                         dm = m->dl->d;                          for ( di = mj[i]->dl, k = i+1; k < lj; k++ )
                         for ( k = 0; k < nv; k++ )                                  if ( _dl_redble(di,mj[k]->dl,nv) ) break;
                                 if ( dm[k] ) break;                          if ( k < lj ) mj[i] = 0;
                         if ( k == nv ) continue;                  }
                         else {                  hj = BDY(gh[j])->dl;
                                 p = mat[i];                  _NEWDL(dl,nv); d = dl->d;
                                 for ( k = 0; k < nv; k++ )                  r0 = r;
                                         p[k] = h[k]-dm[k];                  for ( i = 0; i < lj; i++ ) {
                                 i++;                          if ( mj[i] && !dl_equal(nv,di=mj[i]->dl,hj) ) {
                                   for ( k = 0, t = 0; k < nv; k++ ) {
                                           d[k] = hj->d[k]-di->d[k];
                                           t += d[k];
                                   }
                                   dl->td = t;
   #if 1
                                   for ( rt = r0; rt; rt = NEXT(rt) ) {
                                           dlt = (DL)BDY(rt);
                                           if ( dlt->td != dl->td ) continue;
                                           for ( dt = dlt->d, k = 0; k < nv; k++ )
                                                   if ( d[k] != dt[k] ) break;
                                           if ( k == nv ) break;
                                   }
   #else
                                   rt = 0;
   #endif
                                   if ( !rt ) {
                                           MKNODE(r1,dl,r); r = r1;
                                           _NEWDL(dl,nv); d = dl->d;
                                   }
                         }                          }
                 }                  }
         }          }
         len = i;          for ( rt = r; rt; rt = NEXT(rt) ) {
         qsort(mat,len,sizeof(int *),                  dl = (DL)BDY(rt); d = dl->d;
                 (int (*)(const void *,const void *))comp_vector_lex);                  ri = 0;
         for ( i = 0; i < len; i++ ) {                  for ( k = nv-1; k >= 0; k-- ) {
                 for ( j = 0; j < nv; j++ )                          STOQ(d[k],q);
                         printf("%d ",mat[i][j]);                          MKNODE(r1,q,ri); ri = r1;
                 printf("\n");  
         }  
         for ( i = 0; i < len; i++ ) {  
                 mi = mat[i];  
                 if ( !mi ) continue;  
                 for ( j = i+1; j < len; j++ ) {  
                         mj = mat[j];  
                         if ( !mj ) continue;  
                         for ( k = 0; k < nv; k++ )  
                                 if ( mi[k] > mj[k] )  break;  
                         if ( k == nv ) mat[j] = 0;  
                 }                  }
         }                  MKNODE(r1,0,ri); MKLIST(l,r1);
         for ( i = 0; i < len; i++ ) {                  BDY(rt) = (pointer)l;
                 if ( mat[i] ) {  
                         for ( j = 0; j < nv; j++ )  
                                 printf("%d ",mat[i][j]);  
                         printf("\n");  
                 }  
         }  
         r = 0;  
         for ( i = 0; i < len; i++ ) {  
                 if ( mi = mat[i] ) {  
                         MKVECT(v,nv);  
                         for ( k = 0; k < nv; k++ ) {  
                                 STOQ(mi[k],q);  
                                 v->body[k] = (pointer)q;  
                         }  
                         MKNODE(r1,v,r); r = r1;  
                 }  
         }          }
         return r;          return r;
 }  }

Legend:
Removed from v.1.44  
changed lines
  Added in v.1.45

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