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

Diff for /OpenXM_contrib2/asir2018/engine/nd.c between version 1.24 and 1.25

version 1.24, 2020/06/19 10:18:13 version 1.25, 2020/06/19 22:58:48
Line 1 
Line 1 
 /* $OpenXM: OpenXM_contrib2/asir2018/engine/nd.c,v 1.23 2020/02/05 04:56:10 noro Exp $ */  /* $OpenXM: OpenXM_contrib2/asir2018/engine/nd.c,v 1.24 2020/06/19 10:18:13 noro Exp $ */
   
 #include "nd.h"  #include "nd.h"
   
Line 1914  int nd_nf_pbucket(int mod,ND g,NDV *ps,int full,ND *rp
Line 1914  int nd_nf_pbucket(int mod,ND g,NDV *ps,int full,ND *rp
     }      }
 }  }
   
   int nd_nf_pbucket_s(int mod,ND g,NDV *ps,int full,ND *rp)
   {
     int hindex,index;
     NDV p;
     ND u,d,red;
     NODE l;
     NM mul,m,mrd,tail;
     int sugar,psugar,n,h_reducible;
     PGeoBucket bucket;
     int c,c1,c2;
     Z cg,cred,gcd,zzz;
     RHist h;
     double hmag,gmag;
     int count = 0;
     int hcount = 0;
     SIG sig;
   
     if ( !g ) {
       *rp = 0;
       return 1;
     }
     sugar = SG(g);
     n = NV(g);
     if ( !mod ) hmag = ((double)p_mag((P)HCZ(g)))*nd_scale;
     bucket = create_pbucket();
     add_pbucket(mod,bucket,g);
     d = 0;
     mul = (NM)MALLOC(sizeof(struct oNM)+(nd_wpd-1)*sizeof(UINT));
     sig = g->sig;
     while ( 1 ) {
       if ( mod > 0 || mod == -1 )
         hindex = head_pbucket(mod,bucket);
       else if ( mod == -2 )
         hindex = head_pbucket_lf(bucket);
       else
         hindex = head_pbucket_q(bucket);
       if ( hindex < 0 ) {
         if ( DP_Print > 3 ) printf("(%d %d)",count,hcount);
         if ( d ) {
           SG(d) = sugar;
           d->sig = sig;
         }
         *rp = d;
         return 1;
       }
       g = bucket->body[hindex];
       index = ndl_find_reducer_s(HDL(g),sig);
       if ( index >= 0 && index < nd_psn ) {
         count++;
         if ( !d ) hcount++;
         h = nd_psh[index];
         ndl_sub(HDL(g),DL(h),DL(mul));
         if ( ndl_check_bound2(index,DL(mul)) ) {
           nd_free(d);
           free_pbucket(bucket);
           *rp = 0;
           return 0;
         }
         p = ps[index];
         if ( mod == -1 )
           CM(mul) = _mulsf(_invsf(HCM(p)),_chsgnsf(HCM(g)));
         else if ( mod == -2 ) {
           Z inv,t;
           divlf(ONE,HCZ(p),&inv);
           chsgnlf(HCZ(g),&t);
           mullf(inv,t,&CZ(mul));
         } else if ( mod ) {
           c1 = invm(HCM(p),mod); c2 = mod-HCM(g);
           DMAR(c1,c2,0,mod,c); CM(mul) = c;
         } else {
           igcd_cofactor(HCZ(g),HCZ(p),&gcd,&cg,&cred);
           chsgnz(cg,&CZ(mul));
           nd_mul_c_q(d,(P)cred);
           mulq_pbucket(bucket,cred);
           g = bucket->body[hindex];
           gmag = (double)p_mag((P)HCZ(g));
         }
         red = ndv_mul_nm(mod,mul,p);
         bucket->body[hindex] = nd_remove_head(g);
         red = nd_remove_head(red);
         add_pbucket(mod,bucket,red);
         psugar = SG(p)+TD(DL(mul));
         sugar = MAX(sugar,psugar);
         if ( !mod && hmag && (gmag > hmag) ) {
            g = normalize_pbucket(mod,bucket);
            if ( !g ) {
              if ( d ) {
                SG(d) = sugar;
                d->sig = sig;
              }
              *rp = d;
              return 1;
            }
            nd_removecont2(d,g);
            hmag = ((double)p_mag((P)HCZ(g)))*nd_scale;
            add_pbucket(mod,bucket,g);
         }
       } else if ( index == -1 ) {
         // singular top reducible
         return -1;
       } else if ( !full ) {
         g = normalize_pbucket(mod,bucket);
         if ( g ) {
           SG(g) = sugar;
           g->sig = sig;
         }
         *rp = g;
         return 1;
       } else {
         m = BDY(g);
         if ( NEXT(m) ) {
           BDY(g) = NEXT(m); NEXT(m) = 0; LEN(g)--;
         } else {
           FREEND(g); g = 0;
         }
         bucket->body[hindex] = g;
         NEXT(m) = 0;
         if ( d ) {
           NEXT(tail)=m; tail=m; LEN(d)++;
         } else {
           MKND(n,m,1,d); tail = BDY(d);
         }
       }
     }
   }
   
 /* input : list of NDV, cand : list of NDV */  /* input : list of NDV, cand : list of NDV */
   
 int ndv_check_membership(int m,NODE input,int obpe,int oadv,EPOS oepos,NODE cand)  int ndv_check_membership(int m,NODE input,int obpe,int oadv,EPOS oepos,NODE cand)
Line 2587  again:
Line 2713  again:
       d = nd_reconstruct(0,d);        d = nd_reconstruct(0,d);
       goto again;        goto again;
     }      }
 #if 0 && USE_GEOBUCKET  #if USE_GEOBUCKET
     stat = m?nd_nf_pbucket_s(m,h,nd_ps,!Top,&nf):nd_nf_s(m,0,h,nd_ps,!Top,&nf);      stat = m?nd_nf_pbucket_s(m,h,nd_ps,!Top,&nf):nd_nf_s(m,0,h,nd_ps,!Top,&nf);
 #else  #else
     stat = nd_nf_s(m,0,h,nd_ps,!Top,&nf);      stat = nd_nf_s(m,0,h,nd_ps,!Top,&nf);
Line 4140  void nd_sba(LIST f,LIST v,int m,int homo,int retdp,str
Line 4266  void nd_sba(LIST f,LIST v,int m,int homo,int retdp,str
       max = MAX(e,max);        max = MAX(e,max);
     }      }
   }    }
 //  nd_setup_parameters(nvar,max);    nd_setup_parameters(nvar,max);
   nd_setup_parameters(nvar,16);  
   obpe = nd_bpe; oadv = nmv_adv; oepos = nd_epos; ompos = nd_mpos;    obpe = nd_bpe; oadv = nmv_adv; oepos = nd_epos; ompos = nd_mpos;
   ishomo = 1;    ishomo = 1;
   for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) {    for ( fd0 = 0, t = BDY(f); t; t = NEXT(t) ) {

Legend:
Removed from v.1.24  
changed lines
  Added in v.1.25

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