[BACK]Return to gr CVS log [TXT][DIR] Up to [local] / OpenXM_contrib2 / asir2000 / lib

Diff for /OpenXM_contrib2/asir2000/lib/gr between version 1.18 and 1.26

version 1.18, 2003/06/21 02:09:17 version 1.26, 2007/07/17 08:17:42
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/lib/gr,v 1.17 2002/09/03 09:57:51 noro Exp $   * $OpenXM: OpenXM_contrib2/asir2000/lib/gr,v 1.25 2007/01/18 08:09:02 noro Exp $
 */  */
   
   module gr $
     /* Empty for now.  It will be used in a future. */
   endmodule $
   
 extern INIT_COUNT,ITOR_FAIL$  extern INIT_COUNT,ITOR_FAIL$
 extern REMOTE_MATRIX,REMOTE_NF,REMOTE_VARS$  extern REMOTE_MATRIX,REMOTE_NF,REMOTE_VARS$
   
Line 148  def tolex(G0,V,O,W)
Line 153  def tolex(G0,V,O,W)
                                 TL = cons(dp_dtop(dp_vtoe(D),W),TL);                                  TL = cons(dp_dtop(dp_vtoe(D),W),TL);
                         while ( nextm(D,DL,N) );                          while ( nextm(D,DL,N) );
                 } else {                  } else {
                         GM = dp_gr_mod_main(G0,W,0,M,2);                          HVN = "h";
                           WN = map(rtostr,W);
                           while ( member(HVN,WN) ) HVN += "h";
                           HV = strtov(HVN);
                           G0H = map(homogenize,G0,W,HV);
                           GMH = nd_gr(G0H,append(W,[HV]),M,1);
                           GMH=map(subst,GMH,HV,1);
                           GM = nd_gr_postproc(GMH,W,M,2,0);
                         dp_ord(2);                          dp_ord(2);
                         for ( T = GM, S = 0; T != []; T = cdr(T) )                          for ( T = GM, S = 0; T != []; T = cdr(T) )
                                 for ( D = dp_ptod(car(T),V); D; D = dp_rest(D) )                                  for ( D = dp_ptod(car(T),V); D; D = dp_rest(D) )
Line 192  def tolex_gsl(G0,V,O,W)
Line 204  def tolex_gsl(G0,V,O,W)
                 while ( nextm(D,DL,N) );                  while ( nextm(D,DL,N) );
                 L = npos_check(DL); NPOSV = L[0]; DIM = L[1];                  L = npos_check(DL); NPOSV = L[0]; DIM = L[1];
                 if ( NPOSV >= 0 ) {                  if ( NPOSV >= 0 ) {
                           if ( dp_gr_print() ) print("shape base");
                         V0 = W[NPOSV];                          V0 = W[NPOSV];
                         T0 = time()[0]; NFL = gennf(G0,TL,V,O,V0,1);                          T0 = time()[0]; NFL = gennf(G0,TL,V,O,V0,1);
                         TNF += time()[0] - T0;                          TNF += time()[0] - T0;
Line 505  def minipoly(G0,V,O,P,V0)
Line 518  def minipoly(G0,V,O,P,V0)
   
 def gennf(G,TL,V,O,V0,FLAG)  def gennf(G,TL,V,O,V0,FLAG)
 {  {
           F = dp_gr_flags();
           for ( T = F; T != []; T = cdr(T) ) {
                   Key = car(T); T = cdr(T);
                   if ( Key == "Demand" ) {
                           Dir = car(T); break;
                   }
           }
           if ( Dir )
                   return gennf_demand(G,TL,V,O,V0,FLAG,Dir);
         N = length(V); Len = length(G); dp_ord(O); PS = newvect(Len);          N = length(V); Len = length(G); dp_ord(O); PS = newvect(Len);
         for ( I = 0, T = G, HL = []; T != []; T = cdr(T), I++ ) {          for ( I = 0, T = G, HL = []; T != []; T = cdr(T), I++ ) {
                 PS[I] = dp_ptod(car(T),V); HL = cons(dp_ht(PS[I]),HL);                  PS[I] = dp_ptod(car(T),V); HL = cons(dp_ht(PS[I]),HL);
Line 556  def gennf(G,TL,V,O,V0,FLAG)
Line 578  def gennf(G,TL,V,O,V0,FLAG)
         return [[map(adj_dn,H,LCM),LCM],PS,GI];          return [[map(adj_dn,H,LCM),LCM],PS,GI];
 }  }
   
   def gennf_demand(G,TL,V,O,V0,FLAG,Dir)
   {
           N = length(V); Len = length(G); dp_ord(O); PS = newvect(Len);
           NTL = length(TL);
           for ( I = 0, T = G, HL = []; T != []; T = cdr(T), I++ ) {
                   PS[I] = dp_ptod(car(T),V); HL = cons(dp_ht(PS[I]),HL);
           }
           for ( I = 0, DTL = []; TL != []; TL = cdr(TL) )
                   DTL = cons(dp_ptod(car(TL),V),DTL);
           for ( I = Len - 1, GI = []; I >= 0; I-- )
                   GI = cons(I,GI);
   
           USE_TAB = (FLAG != 0);
           if ( USE_TAB ) {
                   T0 = time()[0];
                   MB = dp_mbase(HL); DIM = length(MB);
                   U = dp_ptod(V0,V);
                   UTAB = newvect(DIM);
                   for ( I = 0; I < DIM; I++ ) {
                           UTAB[I] = [MB[I],remove_cont(dp_true_nf(GI,U*MB[I],PS,1))];
                           if ( dp_gr_print() )
                                   print(".",2);
                   }
                   if ( dp_gr_print() )
                           print("");
                   TTAB = time()[0]-T0;
           }
   
           T0 = time()[0];
           for ( LCM = 1, Index = 0, H = []; DTL != []; Index++ ) {
                   if ( dp_gr_print() )
                           print(".",2);
                   T = car(DTL); DTL = cdr(DTL);
                   if ( L = search_redble(T,H) ) {
                           L = nf_load(Dir,L[0]);
                           DD = dp_subd(T,L[1]);
                           if ( USE_TAB && (DD == U) ) {
                                   NF = nf_tab(L[0],UTAB);
                                   NF = [NF[0],dp_hc(L[1])*NF[1]*T];
                           } else
                                   NF = nf(GI,L[0]*dp_subd(T,L[1]),dp_hc(L[1])*T,PS);
                   } else
                           NF = nf(GI,T,T,PS);
                   NF = remove_cont(NF);
                   nf_save(NF,Dir,Index);
                   H = cons([Index,NF[1]],H);
                   LCM = ilcm(LCM,dp_hc(NF[1]));
           }
           TNF = time()[0]-T0;
           if ( dp_gr_print() )
                   print("gennf(TAB="+rtostr(TTAB)+" NF="+rtostr(TNF)+")");
   
           for ( I = 0; I < NTL; I++ ) {
                   NF = nf_load(Dir,I);
                   NF = adj_dn(NF,LCM);
                   nf_save(NF,Dir,I);
           }
           for ( H = [], I = NTL-1; I >= 0; I-- )
                   H = cons(nf_load(Dir,I),H);
           return [[H,LCM],PS,GI];
   }
   
   def nf_load(Dir,I)
   {
           return bload(Dir+"/nf"+rtostr(I));
   }
   
   def nf_save(NF,Dir,I)
   {
           bsave(NF,Dir+"/nf"+rtostr(I));
   }
   
 def adj_dn(P,D)  def adj_dn(P,D)
 {  {
         return [(idiv(D,dp_hc(P[1])))*P[0],dp_ht(P[1])];          return [(idiv(D,dp_hc(P[1])))*P[0],dp_ht(P[1])];
Line 1029  def p_nf(P,B,V,O) {
Line 1123  def p_nf(P,B,V,O) {
         N = length(B); DB = newvect(N);          N = length(B); DB = newvect(N);
         for ( I = N-1, IL = []; I >= 0; I-- ) {          for ( I = N-1, IL = []; I >= 0; I-- ) {
                 DB[I] = dp_ptod(B[I],V);                  DB[I] = dp_ptod(B[I],V);
                 IL = cons(I,IL);                  if ( DB[I] ) IL = cons(I,IL);
         }          }
         return dp_dtop(dp_nf(IL,DP,DB,1),V);          return dp_dtop(dp_nf(IL,DP,DB,1),V);
 }  }
Line 1039  def p_true_nf(P,B,V,O) {
Line 1133  def p_true_nf(P,B,V,O) {
         N = length(B); DB = newvect(N);          N = length(B); DB = newvect(N);
         for ( I = N-1, IL = []; I >= 0; I-- ) {          for ( I = N-1, IL = []; I >= 0; I-- ) {
                 DB[I] = dp_ptod(B[I],V);                  DB[I] = dp_ptod(B[I],V);
                 IL = cons(I,IL);                  if ( DB[I] ) IL = cons(I,IL);
         }          }
         L = dp_true_nf(IL,DP,DB,1);          L = dp_true_nf(IL,DP,DB,1);
         return [dp_dtop(L[0],V),L[1]];          return [dp_dtop(L[0],V),L[1]];
Line 1582  def check_trace(NF,NFIndex,HL)
Line 1676  def check_trace(NF,NFIndex,HL)
                 error("check_trace");                  error("check_trace");
 }  }
   
   /*
    * Trace = [Input,[[j1,[[c,i,m,d],...]],[j2,[[...],...]],...]]
    * if c != 0
    *   g = 0
    *   g = (c*g + m*gi)/d
    *   ...
    *   finally fj = g
    */
   
   def show_trace(Trace,V)
   {
           Input = Trace[0];
           for ( I = 0, T = Input; T != []; T = cdr(T), I++ ) {
                   print("F"+rtostr(I)+"=",0);
                   print(dp_dtop(car(T),V));
           }
           Trace = cdr(Trace);
           for ( T = Trace; T != []; T = cdr(T) ) {
                   HL = car(T);
                   J = car(HL); HL = HL[1];
                   L = length(HL);
                   print("F"+rtostr(J)+"=",0);
                   for ( I = 0; I < L; I++ ) print("(",0);
                   for ( First = 1, S = HL; S != []; S = cdr(S) ) {
                           H = car(S);
   
                           Coeff = H[0];
                           Index = H[1];
                           Monomial = H[2];
                           Denominator = H[3];
                           if ( First ) {
                                   if ( Monomial != 1 ) {
                                           print("(",0);
                                           print(type(Monomial)==9?dp_dtop(Monomial,V):Monomial,0);
                                           print(")*",0);
                                   }
                                   print("F"+rtostr(Index)+")",0);
                           } else {
                                   if ( Coeff != 1 ) {
                                           print("*(",0); print(Coeff,0); print(")",0);
                                   }
                                   print("+",0);
                                   if ( Monomial != 1 ) {
                                           print("(",0);
                                           print(type(Monomial)==9?dp_dtop(Monomial,V):Monomial,0);
                                           print(")*",0);
                                   }
                                   print("F"+rtostr(Index)+")",0);
                                   if ( Denominator != 1 ) {
                                           print("/",0); print(Denominator,0);
                                   }
                           }
                           if ( First ) First = 0;
                   }
                   print("");
           }
   }
   
   def generating_relation(Trace,V)
   {
           Trace = cdr(Trace);
           Tab = [];
           for ( T = Trace; T != []; T = cdr(T) ) {
                   HL = car(T);
                   J = car(HL); HL = HL[1];
                   L = length(HL);
                   LHS = strtov("f"+rtostr(J));
                   Dn = 1;
                   for ( First = 1, S = HL; S != []; S = cdr(S) ) {
                           H = car(S);
   
                           Coeff = H[0];
                           Index = H[1];
                           Monomial = type(H[2])==9?dp_dtop(H[2],V):H[2];
                           Denominator = H[3];
                           F = strtov("f"+rtostr(Index));
                           for ( Z = Tab; Z != []; Z = cdr(Z) )
                                   if ( Z[0][0] == F ) break;
                           if ( Z != [] ) Value = Z[0][1];
                           else Value = [F,1];
                           if ( First ) {
                                   RHS = Monomial*Value[0];
                                   Dn *= Value[1];
                           } else {
                                   RHS = RHS*Coeff*Value[1]+Dn*Value[0]*Monomial;
                                   Dn = Value[1]*Dn*Denominator;
                           }
                           VVVV = tttttttt;
                           P = ptozp(Dn*VVVV+RHS);
                           RHS = coef(P,0,VVVV);
                           Dn = coef(P,1,VVVV);
                           if ( First ) First = 0;
                   }
                   Tab = cons([LHS,[RHS,Dn]],Tab);
           }
           return Tab;
   }
   
   def generating_relation_mod(Trace,V,M)
   {
           Trace = cdr(Trace);
           Tab = [];
           for ( T = Trace; T != []; T = cdr(T) ) {
                   HL = car(T);
                   J = car(HL); HL = HL[1];
                   L = length(HL);
                   LHS = strtov("f"+rtostr(J));
                   Dn = 1;
                   for ( First = 1, S = HL; S != []; S = cdr(S) ) {
                           H = car(S);
   
                           Coeff = H[0];
                           Index = H[1];
                           Monomial = type(H[2])==9?dp_dtop(H[2],V):H[2];
                           F = strtov("f"+rtostr(Index));
                           for ( Z = Tab; Z != []; Z = cdr(Z) )
                                   if ( Z[0][0] == F ) break;
                           if ( Z != [] ) Value = Z[0][1];
                           else Value = F;
                           if ( First ) {
                                   RHS = (Monomial*Value)%M;
                           } else {
                                   RHS = ((RHS*Coeff+Value*Monomial)*inv(H[3],M))%M;
                           }
                           if ( First ) First = 0;
                   }
                   Tab = cons([LHS,RHS],Tab);
           }
           return Tab;
   }
 /*  /*
  * realloc NFArray so that it can hold * an element as NFArray[Ind].   * realloc NFArray so that it can hold * an element as NFArray[Ind].
  */   */

Legend:
Removed from v.1.18  
changed lines
  Added in v.1.26

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