[BACK]Return to nd.c CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / engine

Diff for /OpenXM_contrib2/asir2000/engine/nd.c between version 1.90 and 1.93

version 1.90, 2004/03/13 06:49:15 version 1.93, 2004/03/13 07:48:30
Line 1 
Line 1 
 /* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.89 2004/02/03 23:31:57 noro Exp $ */  /* $OpenXM: OpenXM_contrib2/asir2000/engine/nd.c,v 1.92 2004/03/13 07:43:24 noro Exp $ */
   
 #include "ca.h"  #include "ca.h"
 #include "parse.h"  #include "parse.h"
Line 1764  ND normalize_pbucket(int mod,PGeoBucket g)
Line 1764  ND normalize_pbucket(int mod,PGeoBucket g)
         return r;          return r;
 }  }
   
   void do_diagonalize(int sugar,int m)
   {
           int i,nh,stat;
           NODE r,g,t;
           ND h,nf,s,head;
           NDV nfv;
           Q q,num,den;
           union oNDC dn;
   
           for ( i = nd_psn-1; i >= 0 && SG(nd_psh[i]) == sugar; i-- ) {
                   if ( nd_demand )
                           nfv = ndv_load(i);
                   else
                           nfv = nd_ps[i];
                   s = ndvtond(m,nfv);
                   s = nd_separate_head(s,&head);
                   nd_nf(m,s,nd_ps,1,&dn,&nf);
                   if ( !m ) {
                           NTOQ(NM(dn.z),SGN(dn.z),num);
                           mulq(HCQ(head),num,&q); HCQ(head) = q;
                           if ( DN(dn.z) ) {
                                   NTOQ(DN(dn.z),1,den);
                                   nd_mul_c_q(nf,den);
                           }
                   }
                   nf = nd_add(m,head,nf);
                   ndv_free(nfv);
                   nd_removecont(m,nf);
                   nfv = ndtondv(m,nf);
                   nd_free(nf);
                   nd_bound[i] = ndv_compute_bound(nfv);
                   if ( nd_demand ) {
                           ndv_save(nfv,i);
                           ndv_free(nfv);
                   } else
                           nd_ps[i] = nfv;
           }
   }
   
 /* return value = 0 => input is not a GB */  /* return value = 0 => input is not a GB */
   
 NODE nd_gb(int m,int ishomo,int checkonly)  NODE nd_gb(int m,int ishomo,int checkonly)
Line 1787  NODE nd_gb(int m,int ishomo,int checkonly)
Line 1826  NODE nd_gb(int m,int ishomo,int checkonly)
 again:  again:
                 l = nd_minp(d,&d);                  l = nd_minp(d,&d);
                 if ( SG(l) != sugar ) {                  if ( SG(l) != sugar ) {
                         if ( ishomo ) {                          if ( ishomo ) do_diagonalize(sugar,m);
                                 for ( i = nd_psn-1; i >= 0 && SG(nd_psh[i]) == sugar; i-- ) {  
                                         if ( nd_demand )  
                                                 nfv = ndv_load(i);  
                                         else  
                                                 nfv = nd_ps[i];  
                                         s = ndvtond(m,nfv);  
                                         s = nd_separate_head(s,&head);  
                                         nd_nf(m,s,nd_ps,1,&dn,&nf);  
                                         if ( !m ) {  
                                                 NTOQ(NM(dn.z),SGN(dn.z),num);  
                                                 mulq(HCQ(head),num,&q); HCQ(head) = q;  
                                                 if ( DN(dn.z) ) {  
                                                         NTOQ(DN(dn.z),1,den);  
                                                         nd_mul_c_q(nf,den);  
                                                 }  
                                         }  
                                         nf = nd_add(m,head,nf);  
                                         ndv_free(nfv);  
                                         nd_removecont(m,nf);  
                                         nfv = ndtondv(m,nf);  
                                         nd_free(nf);  
                                         nd_bound[i] = ndv_compute_bound(nfv);  
                                         if ( nd_demand ) {  
                                                 ndv_save(nfv,i);  
                                                 ndv_free(nfv);  
                                         } else  
                                                 nd_ps[i] = nfv;  
                                 }  
                         }  
                         sugar = SG(l);                          sugar = SG(l);
                         if ( DP_Print ) fprintf(asir_out,"%d",sugar);                          if ( DP_Print ) fprintf(asir_out,"%d",sugar);
                 }                  }
Line 1858  again:
Line 1869  again:
         return g;          return g;
 }  }
   
   void do_diagonalize_trace(int sugar,int m)
   {
           int i,nh,stat;
           NODE r,g,t;
           ND h,nf,nfq,s,head;
           NDV nfv,nfqv;
           Q q,den,num;
           union oNDC dn;
   
           for ( i = nd_psn-1; i >= 0 && SG(nd_psh[i]) == sugar; i-- ) {
                   /* for nd_ps */
                   s = ndvtond(m,nd_ps[i]);
                   s = nd_separate_head(s,&head);
                   nd_nf_pbucket(m,s,nd_ps,1,&nf);
                   nf = nd_add(m,head,nf);
                   ndv_free(nd_ps[i]);
                   nd_ps[i] = ndtondv(m,nf);
                   nd_free(nf);
   
                   /* for nd_ps_trace */
                   if ( nd_demand )
                           nfv = ndv_load(i);
                   else
                           nfv = nd_ps_trace[i];
                   s = ndvtond(0,nfv);
                   s = nd_separate_head(s,&head);
                   nd_nf(0,s,nd_ps_trace,1,&dn,&nf);
                   NTOQ(NM(dn.z),SGN(dn.z),num);
                   mulq(HCQ(head),num,&q); HCQ(head) = q;
                   if ( DN(dn.z) ) {
                           NTOQ(DN(dn.z),1,den);
                           nd_mul_c_q(nf,den);
                   }
                   nf = nd_add(0,head,nf);
                   ndv_free(nfv);
                   nd_removecont(0,nf);
                   nfv = ndtondv(0,nf);
                   nd_free(nf);
                   nd_bound[i] = ndv_compute_bound(nfv);
                   if ( nd_demand ) {
                           ndv_save(nfv,i);
                           ndv_free(nfv);
                   } else
                           nd_ps_trace[i] = nfv;
           }
   }
   
 NODE nd_gb_trace(int m,int ishomo)  NODE nd_gb_trace(int m,int ishomo)
 {  {
         int i,nh,sugar,stat;          int i,nh,sugar,stat;
Line 1879  NODE nd_gb_trace(int m,int ishomo)
Line 1937  NODE nd_gb_trace(int m,int ishomo)
 again:  again:
                 l = nd_minp(d,&d);                  l = nd_minp(d,&d);
                 if ( SG(l) != sugar ) {                  if ( SG(l) != sugar ) {
                         if ( ishomo ) {                          if ( ishomo ) do_diagonalize_trace(sugar,m);
                                 for ( i = nd_psn-1; i >= 0 && SG(nd_psh[i]) == sugar; i-- ) {  
                                         /* for nd_ps */  
                                         s = ndvtond(m,nd_ps[i]);  
                                         s = nd_separate_head(s,&head);  
                                         nd_nf_pbucket(m,s,nd_ps,1,&nf);  
                                         nf = nd_add(m,head,nf);  
                                         ndv_free(nd_ps[i]);  
                                         nd_ps[i] = ndtondv(m,nf);  
                                         nd_free(nf);  
   
                                         /* for nd_ps_trace */  
                                         if ( nd_demand )  
                                                 nfv = ndv_load(i);  
                                         else  
                                                 nfv = nd_ps_trace[i];  
                                         s = ndvtond(0,nfv);  
                                         s = nd_separate_head(s,&head);  
                                         nd_nf(0,s,nd_ps_trace,1,&dn,&nf);  
                                         NTOQ(NM(dn.z),SGN(dn.z),num);  
                                         mulq(HCQ(head),num,&q); HCQ(head) = q;  
                                         if ( DN(dn.z) ) {  
                                                 NTOQ(DN(dn.z),1,den);  
                                                 nd_mul_c_q(nf,den);  
                                         }  
                                         nf = nd_add(0,head,nf);  
                                         ndv_free(nfv);  
                                         nd_removecont(0,nf);  
                                         nfv = ndtondv(0,nf);  
                                         nd_free(nf);  
                                         nd_bound[i] = ndv_compute_bound(nfv);  
                                         if ( nd_demand ) {  
                                                 ndv_save(nfv,i);  
                                                 ndv_free(nfv);  
                                         } else  
                                                 nd_ps_trace[i] = nfv;  
                                 }  
                         }  
                         sugar = SG(l);                          sugar = SG(l);
                         if ( DP_Print ) fprintf(asir_out,"%d",sugar);                          if ( DP_Print ) fprintf(asir_out,"%d",sugar);
                 }                  }

Legend:
Removed from v.1.90  
changed lines
  Added in v.1.93

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