[BACK]Return to ecart.c CVS log [TXT][DIR] Up to [local] / OpenXM / src / kan96xx / Kan

Diff for /OpenXM/src/kan96xx/Kan/ecart.c between version 1.19 and 1.20

version 1.19, 2003/09/20 09:57:29 version 1.20, 2003/09/21 02:19:43
Line 1 
Line 1 
 /* $OpenXM: OpenXM/src/kan96xx/Kan/ecart.c,v 1.18 2003/09/12 02:52:50 takayama Exp $ */  /* $OpenXM: OpenXM/src/kan96xx/Kan/ecart.c,v 1.19 2003/09/20 09:57:29 takayama Exp $ */
 #include <stdio.h>  #include <stdio.h>
 #include "datatype.h"  #include "datatype.h"
 #include "extern2.h"  #include "extern2.h"
Line 165  static struct ecartPolyArray *ecartPutPolyInG(POLY g,s
Line 165  static struct ecartPolyArray *ecartPutPolyInG(POLY g,s
   return eparray;    return eparray;
 }  }
   
   #ifndef EXPERIMENT
 static struct ecartReducer ecartFindReducer(POLY r,struct gradedPolySet *gset,  static struct ecartReducer ecartFindReducer(POLY r,struct gradedPolySet *gset,
                                             struct ecartPolyArray *epa)                                              struct ecartPolyArray *epa)
 {  {
Line 213  static struct ecartReducer ecartFindReducer(POLY r,str
Line 214  static struct ecartReducer ecartFindReducer(POLY r,str
   if ((DebugReductionRed&1) || (DebugReductionEcart&1)) {    if ((DebugReductionRed&1) || (DebugReductionEcart&1)) {
     printf("ecartFindReducer(): ell1=%d, ell2=%d, minGrade=%d, minGseti=%d, minGgi=%d\n",ell1,ell2,minGrade,minGseti,minGgi);      printf("ecartFindReducer(): ell1=%d, ell2=%d, minGrade=%d, minGseti=%d, minGgi=%d\n",ell1,ell2,minGrade,minGseti,minGgi);
   }    }
   if (Sugar) {  /* experimental */  
         if (ell1 <= ell2) {  
           if (ell1 == LARGE) {  
                 er.ell = -1;  
                 return er;  
           }else{  
                 int new_s;  
                 er.ell = ell1;  
                 er.first = 1;  
                 er.grade = minGrade;  
                 er.gseti = minGseti;  
                 /* reduce if and only if Ecart_sugarGrade does not increase. */  
                 new_s = grade_gen(r)-grade_gen(gset->polys[minGrade]->gh[minGseti]);  
                 if (new_s + minGrade <= Ecart_sugarGrade) {  
                   return er;  
                 }else{  
                   printf("new_s=%d, minGrade=%d, sugarGrade=%d\n",new_s,minGrade,  
                                  Ecart_sugarGrade);  
                   er.ell = -1;  
                   return er;  
                 }  
           }  
         }else{  
       er.ell = ell2;  
       er.first = 0;  
       er.ggi = minGgi;  
           return er;  
         }  
   }  
   
   if (ell1 <= ell2) {    if (ell1 <= ell2) {
     if (ell1 == LARGE) {      if (ell1 == LARGE) {
Line 261  static struct ecartReducer ecartFindReducer(POLY r,str
Line 233  static struct ecartReducer ecartFindReducer(POLY r,str
       return er;        return er;
   }    }
 }  }
   #endif
   
 static POLY  ecartCheckSyz0(POLY cf,POLY r_0,POLY syz,  static POLY  ecartCheckSyz0(POLY cf,POLY r_0,POLY syz,
                            struct gradedPolySet *gg,POLY r)                             struct gradedPolySet *gg,POLY r)
Line 396  static POLY reduction_ecart0(r,gset,needSyz,syzp)
Line 369  static POLY reduction_ecart0(r,gset,needSyz,syzp)
   
   if (DoCancel && (r != POLYNULL)) shouldReduceContent(r,1);    if (DoCancel && (r != POLYNULL)) shouldReduceContent(r,1);
   
   if (DebugReductionEcart&1) printf("--------------------------------------\n");    if (DebugReductionEcart&1) printf("reduction_ecart0--------------------------------------\n");
   do {    do {
     if (DebugReductionRed&1) printf("r=%s\n",POLYToString(r,'*',1));      if (DebugReductionRed&1) printf("r=%s\n",POLYToString(r,'*',1));
     if (DebugReductionEcart & 1) printf("r=%s+...\n",POLYToString(head(r),'*',1));      if (DebugReductionEcart & 1) printf("r=%s+...\n",POLYToString(head(r),'*',1));
Line 541  static POLY reduction_ecart1(r,gset,needSyz,syzp)
Line 514  static POLY reduction_ecart1(r,gset,needSyz,syzp)
   /* 1 means homogenize only s */    /* 1 means homogenize only s */
   if (DoCancel && (r != POLYNULL)) shouldReduceContent(r,1);    if (DoCancel && (r != POLYNULL)) shouldReduceContent(r,1);
   
   if (DebugReductionEcart&1) printf("=======================================\n");    if (DebugReductionEcart&1) printf("reduction_ecart1=======================================\n");
   do {    do {
     if (DebugReductionRed & 1) printf("(ecart1(d)) r=%s\n",POLYToString(r,'*',1));      if (DebugReductionRed & 1) printf("(ecart1(d)) r=%s\n",POLYToString(r,'*',1));
     if (DebugReductionEcart & 1) printf("r=%s+,,,\n",POLYToString(head(r),'*',1));      if (DebugReductionEcart & 1) printf("r=%s+,,,\n",POLYToString(head(r),'*',1));
Line 843  static POLY reduction_ecart1_mod(r,gset)
Line 816  static POLY reduction_ecart1_mod(r,gset)
   
   return(r);    return(r);
 }  }
   
   #ifdef EXPERIMENT
   static struct ecartReducer ecartFindReducer(POLY r,struct gradedPolySet *gset,
                                               struct ecartPolyArray *epa)
   {
     int grd;
     struct polySet *set;
     int minGrade = 0;
     int minGseti = 0;
     int minGgi   = 0;
     int ell1 = LARGE;
     int ell2 = LARGE;
     int ell;
     int i;
     struct ecartReducer er;
     int ellmin ;
     ell1 = ell2 = ellmin = LARGE;
     /* Try to find a reducer in gset; */
     grd = 0;
     while (grd < gset->maxGrade) {
       set = gset->polys[grd];
       for (i=0; i<set->size; i++) {
         if (set->gh[i] == POLYNULL) {
           /* goHomogenize set->gh[i] */
             if (EcartAutomaticHomogenization) {
                 set->gh[i] = goHomogenize11(set->g[i],DegreeShifto_vec,DegreeShifto_size,-1,1);
             }else{
                 set->gh[i] = set->g[i];
             }
         }
         ell = ecartGetEll(r,set->gh[i]);
         if ((ell>=0) && (ell < ell1)) {
           ell1 = ell;
           minGrade = grd; minGseti=i;
         }
       }
       grd++;
     }
     if (epa != NULL) {
       /* Try to find in the second group. */
       for (i=0; i< epa->size; i++) {
         ell = ecartGetEll(r,(epa->pa)[i]);
         if ((ell>=0) && (ell < ell2)) {
           ell2 = ell;
           minGgi = i;
         }
       }
     }
   
     if ((DebugReductionRed&1) || (DebugReductionEcart&1)) {
       printf("ecartFindReducer(): ell1=%d, ell2=%d, minGrade=%d, minGseti=%d, minGgi=%d\n",ell1,ell2,minGrade,minGseti,minGgi);
     }
   
   #ifdef EXPERIMENTAL1
     if (Sugar) {  /* experimental */
           if (ell1 <= ell2) {
             if (ell1 == LARGE) {
                   er.ell = -1;
                   return er;
             }else{
                   int new_s;
                   er.ell = ell1;
                   er.first = 1;
                   er.grade = minGrade;
                   er.gseti = minGseti;
                   /* reduce if and only if Ecart_sugarGrade does not increase. */
                   new_s = grade_gen(r)-grade_gen(gset->polys[minGrade]->gh[minGseti]);
                   if (new_s + minGrade <= Ecart_sugarGrade+1) {
                     return er;
                   }else{
                     printf("new_s=%d, minGrade=%d, sugarGrade=%d\n",new_s,minGrade,
                                    Ecart_sugarGrade);
                     er.ell = -1;
                     return er;
                   }
             }
           }else{
         er.ell = ell2;
         er.first = 0;
         er.ggi = minGgi;
             return er;
           }
     }
   #endif
   
     if ((ell1 == LARGE) &&  (ell2 == LARGE)) {
           er.ell = -1;
           return er;
     }
   
     if (ell1 < ell2) {
           ellmin = ell1;
     }else{
           ellmin = ell2;
     }
     {
   #define M 100
           int aminGrade[M];
           int aminGseti[M];
           int aminGgi[M];
           int sp1,sp2;
           int i;
           int gmin;
           int gtmp;
           sp1 = sp2 = 0;
   
           if (ell1 == ellmin) {
             grd = 0;
             while (grd < gset->maxGrade) {
                   set = gset->polys[grd];
                   for (i=0; i<set->size; i++) {
                     ell = ecartGetEll(r,set->gh[i]);
                     if (ell == ellmin) {
                           aminGrade[sp1] = grd; aminGseti[sp1]=i;
                           sp1++;
                           if (sp1 >= M) {
                             fprintf(stderr,"aminGrade, buffer overflow. sp1 is set to 1.\n");
                             sp1 = 1;
                           }
                     }
                   }
                   grd++;
             }
           }
           if (ell2 == ellmin) {
             if (epa != NULL) {
                   for (i=0; i< epa->size; i++) {
                     ell = ecartGetEll(r,(epa->pa)[i]);
                     if (ell == ellmin) {
                           aminGgi[sp2] = i;
                           sp2++;
                           if (sp2 >= M) {
                             fprintf(stderr,"aminGgi, buffer overflow. sp2 is set to 1.\n");
                             sp2 = 1;
                           }
                     }
                   }
             }
           }
           /* print summary */
           printf("summary -----------------------\n");
           for (i=0; i<sp1; i++) {
             printf("i=%d: minGrade=%d, minGseti=%d,",i,aminGrade[i],aminGseti[i]);
             printf("grade=%d\n",grade_gen(gset->polys[aminGrade[i]]->gh[aminGseti[i]]));
           }
           gmin = LARGE;
           for (i=0; i<sp2; i++) {
             printf("i=%d: minGgi=%d,",i,aminGgi[i]);
             gtmp = grade_gen((epa->pa)[aminGgi[i]]);
             printf("grade=%d\n",gtmp);
             if (gtmp < gmin) {
                   gmin = gtmp;
                   minGgi = aminGgi[i];
             }
           }
   
           if (ell1 <= ell2) {
         er.ell = ell1;
         er.first = 1;
         er.grade = minGrade;
         er.gseti = minGseti;
         return er;
           }else{
         er.ell = ell2;
         er.first = 0;
         er.ggi = minGgi;
         return er;
           }
   
     }
   
     if (ell1 <= ell2) {
         er.ell = ell1;
         er.first = 1;
         er.grade = minGrade;
         er.gseti = minGseti;
         return er;
     }else{
         er.ell = ell2;
         er.first = 0;
         er.ggi = minGgi;
         return er;
     }
   }
   #endif
   

Legend:
Removed from v.1.19  
changed lines
  Added in v.1.20

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