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

Annotation of OpenXM_contrib2/asir2000/lib/weight, Revision 1.8

1.4       kimura      1: load("solve")$
                      2: load("gr")$
                      3:
1.8     ! kimura      4: def junban(A,B){
        !             5:
        !             6:        return (A<B ? 1:(A>B ? -1:0))$
        !             7: }
        !             8:
        !             9: def worder(A,B){
        !            10:
        !            11:        return (A[0]<B[0] ? 1:(A[0]>B[0] ? -1:0))$
        !            12: }
        !            13:
        !            14: def wsort(A,B,C){
        !            15:
        !            16:        D=newvect(length(B))$
        !            17:        for(I=0;I<length(B);I++)
        !            18:                D[I]=[A[I],B[I],C[I]]$
        !            19:
        !            20:        D=qsort(D,worder)$
        !            21:        E=[]$
        !            22:        for(I=0;I<length(B);I++)
        !            23:                E=cons(D[I][1],E)$
        !            24:        E=reverse(E)$
        !            25:        F=[]$
        !            26:        for(I=0;I<length(B);I++)
        !            27:                F=cons(D[I][2],F)$
        !            28:        F=reverse(F)$
        !            29:
        !            30:        return [E,F]$
        !            31: }
        !            32:
        !            33: def derase(A){
        !            34:
        !            35:        B=newvect(length(A),A)$
        !            36:        B=qsort(B,junban)$
        !            37:        C=[]$
        !            38:        for(I=0;I<size(B)[0];I++)
        !            39:                if(car(C)!=B[I])
        !            40:                        C=cons(B[I],C)$
        !            41:
        !            42:        return reverse(C)$
        !            43: }
        !            44:
1.4       kimura     45: def nonposdegchk(Res){
                     46:
                     47:        for(I=0;I<length(Res);I++)
                     48:                if(Res[I][1]<=0)
                     49:                        return 0$
                     50:
                     51:        return 1$
                     52: }
                     53:
1.8     ! kimura     54: def getgcd(A,B){
        !            55:
        !            56:        VarsNumA=length(A)$
        !            57:        VarsNumB=length(B)$
        !            58:
        !            59:        C=newvect(VarsNumB,B)$
        !            60:
        !            61:        for(I=0;I<VarsNumA;I++){
        !            62:
        !            63:                for(J=0;J<VarsNumB;J++)
        !            64:                        if(C[J]==A[I][0])
        !            65:                                break$
        !            66:
        !            67:                if(J<VarsNumB)
        !            68:                        C[J]=A[I][1]$
        !            69:        }
        !            70:
        !            71:        D=0$
        !            72:        for(I=0;I<VarsNumB;I++)
        !            73:                D=gcd(D,C[I])$
        !            74:
        !            75:        if(D!=0){
        !            76:                C=C/D$
        !            77:                C=map(red,C)$
        !            78:        }
1.6       kimura     79:
1.8     ! kimura     80:        for(L=1,D=0,I=0;I<VarsNumB;I++){
        !            81:                if(type(TMP=dn(C[I]))==1)
        !            82:                        L=ilcm(L,TMP)$
        !            83:
        !            84:                if(type(TMP=nm(C[I]))==1)
        !            85:                        D=igcd(D,TMP)$
        !            86:        }
        !            87:
        !            88:        C=C*L$
        !            89:        if(D!=0)
        !            90:                C=C/D$
1.6       kimura     91:
1.8     ! kimura     92:        RET=[]$
        !            93:        for(I=0;I<VarsNumB;I++)
        !            94:                RET=cons([B[I],C[I]],RET)$
1.6       kimura     95:
1.8     ! kimura     96:        return RET$
1.6       kimura     97: }
                     98:
1.4       kimura     99: def resvars(Res,Vars){
                    100:
                    101:        ResVars=newvect(length(Vars),Vars)$
                    102:        for(I=0;I<length(Res);I++){
                    103:
                    104:                for(J=0;J<size(ResVars)[0];J++)
                    105:                        if(Res[I][0]==ResVars[J])
                    106:                                break$
                    107:
                    108:                if(J<size(ResVars)[0])
                    109:                        ResVars[J]=Res[I][1]$
                    110:        }
                    111:        return(ResVars)$
                    112: }
                    113:
1.8     ! kimura    114: def makeret(Res,Vars){
1.4       kimura    115:
1.8     ! kimura    116:        ResNum=length(Res)$
1.4       kimura    117:        VarsNum=length(Vars)$
                    118:
1.8     ! kimura    119:        ResVec=newvect(ResNum)$
        !           120:        for(M=0,I=0;I<ResNum;I++){
        !           121:                if(member(Res[I][0],Vars)){
        !           122:                        ResVec[I]=Res[I][1]$
1.4       kimura    123:
1.8     ! kimura    124:                        if(type(ResVec[I])==1){
1.4       kimura    125:                                if(M==0)
1.8     ! kimura    126:                                        M=ResVec[I]$
1.4       kimura    127:                                else
1.8     ! kimura    128:                                        if(ResVec[I]<M)
        !           129:                                                M=ResVec[I]$
1.4       kimura    130:                        }
                    131:                }
1.8     ! kimura    132:        }
        !           133:
        !           134:        if(M!=0)
        !           135:                ResVec=ResVec/M;
1.4       kimura    136:
1.8     ! kimura    137:        RET=newvect(VarsNum,Vars)$
1.4       kimura    138:
1.8     ! kimura    139:        for(I=0;I<ResNum;I++){
        !           140:                for(J=0;J<VarsNum;J++)
        !           141:                        if(Vars[J]==Res[I][0])
        !           142:                                break$
1.4       kimura    143:
1.8     ! kimura    144:                if(J<VarsNum)
        !           145:                        RET[J]=ResVec[I]$
        !           146:        }
        !           147:
1.4       kimura    148:        for(I=0;I<VarsNum;I++)
1.8     ! kimura    149:                if(type(RET[I])!=1)
        !           150:                        return [1,RET]$
1.4       kimura    151:
1.8     ! kimura    152:        return [0,RET]$
1.4       kimura    153: }
                    154:
                    155: def roundret(V){
                    156:
1.8     ! kimura    157:        VN=size(V)[0]$
1.4       kimura    158:
1.8     ! kimura    159:        RET0=V$
1.4       kimura    160:        for(I=1;I<1000;I++){
                    161:                RET1=I*RET0$
                    162:                for(J=0;J<VN;J++){
                    163:                        X=drint(RET1[J])$
                    164:                        if(dabs(X-RET1[J])<0.2)
                    165:                                RET1[J]=X$
                    166:                        else
                    167:                                break$
                    168:                }
                    169:                if(J==VN)
                    170:                        break$
                    171:        }
                    172:
                    173:        if(I==1000)
                    174:                return []$
                    175:        else
                    176:                return RET1$
                    177: }
                    178:
                    179: def chkou(L,ExpMat,CHAGORD){
                    180:
1.8     ! kimura    181:        for(P=1,I=0;I<L;I++){
1.4       kimura    182:                Q=ExpMat[L][CHAGORD[I]]$
                    183:                for(J=0;J<size(ExpMat[0])[0];J++){
                    184:                        ExpMat[L][CHAGORD[J]]=red((ExpMat[I][CHAGORD[I]]
                    185:                                *ExpMat[L][CHAGORD[J]]-
                    186:                                        Q*ExpMat[I][CHAGORD[J]])/P)$
                    187:                }
                    188:
                    189:                P=ExpMat[I][CHAGORD[I]]$
                    190:        }
                    191:
                    192:        for(J=0;J<size(ExpMat[0])[0];J++)
                    193:                if(ExpMat[L][CHAGORD[J]]!=0)
                    194:                        break$
                    195:
                    196:        if(J==size(ExpMat[0])[0])
                    197:                return L$
                    198:        else{
                    199:                TMP=CHAGORD[L]$
                    200:                CHAGORD[L]=CHAGORD[J]$
                    201:                CHAGORD[J]=TMP$
                    202:                return (L+1)$
                    203:        }
                    204: }
                    205:
1.8     ! kimura    206: def qcheckmain(PolyList,Vars){
1.4       kimura    207:
                    208:        RET=[]$
                    209:        PolyListNum=length(PolyList)$
                    210:        VarsNum=length(Vars)$
                    211:
                    212:        ExpMat=newvect(VarsNum)$
                    213:        CHAGORD=newvect(VarsNum)$
                    214:        for(I=0;I<VarsNum;I++)
                    215:                CHAGORD[I]=I$
                    216:
                    217:        L=0$
                    218:        for(I=0;I<PolyListNum;I++){
                    219:                Poly=dp_ptod(PolyList[I],Vars)$
                    220:                BASE0=dp_etov(dp_ht(Poly))$
                    221:                Poly=dp_rest(Poly)$
                    222:                for(;Poly!=0;Poly=dp_rest(Poly)){
                    223:                        ExpMat[L]=dp_etov(dp_ht(Poly))-BASE0$
                    224:                        L=chkou(L,ExpMat,CHAGORD)$
1.8     ! kimura    225:                        if(L==VarsNum-1)
        !           226:                                return [L,CHAGORD,ExpMat]$
1.4       kimura    227:                }
                    228:        }
                    229:
1.8     ! kimura    230:        return [L,CHAGORD,ExpMat]$
1.4       kimura    231: }
                    232:
                    233: def inner(A,B){
                    234:
                    235:        SUM=0$
                    236:        for(I=0;I<size(A)[0];I++)
                    237:                SUM+=A[I]*B[I]$
                    238:
                    239:        return SUM$
                    240: }
                    241:
                    242: def checktd(PolyList,Vars,ResVars){
                    243:
                    244:        PolyListNum=length(PolyList)$
                    245:        VarsNum=length(Vars)$
                    246:
                    247:        L=0$
                    248:        for(I=0;I<PolyListNum;I++){
                    249:                Poly=dp_ptod(PolyList[I],Vars)$
                    250:                J0=inner(dp_etov(dp_ht(Poly)),ResVars)$
                    251:                Poly=dp_rest(Poly)$
                    252:                for(;Poly!=0;Poly=dp_rest(Poly))
                    253:                        if(J0!=inner(dp_etov(dp_ht(Poly)),ResVars))
                    254:                                return 0$
                    255:        }
                    256:
                    257:        return 1$
                    258: }
                    259:
                    260: def qcheck(PolyList,Vars){
                    261:
1.8     ! kimura    262:        Res=qcheckmain(PolyList,Vars)$
1.4       kimura    263:        VarsNum=length(Vars)$
                    264:
                    265:        IndNum=Res[0]$
                    266:        CHAGORD=Res[1]$
                    267:        ExpMat=Res[2]$
                    268:
                    269:        SolveList=[]$
                    270:        for(I=0;I<IndNum;I++){
                    271:                TMP=0$
                    272:                for(J=0;J<VarsNum;J++)
                    273:                        TMP+=ExpMat[I][CHAGORD[J]]*Vars[CHAGORD[J]]$
                    274:
                    275:                SolveList=cons(TMP,SolveList)$
                    276:        }
                    277:
1.8     ! kimura    278:        Rea=vars(SolveList)$
        !           279:
1.4       kimura    280:        VarsList=[]$
                    281:        for(I=0;I<VarsNum;I++)
1.8     ! kimura    282:                if(member(Vars[CHAGORD[I]],Rea))
        !           283:                        VarsList=cons(Vars[CHAGORD[I]],VarsList)$
1.4       kimura    284:
                    285:        Res=solve(reverse(SolveList),reverse(VarsList))$
1.8     ! kimura    286:        Res=getgcd(Res,Rea)$
1.4       kimura    287:
                    288:        if(nonposdegchk(Res)){
                    289:
                    290:                ResVars=resvars(Res,Vars)$
                    291:
                    292:                if(checktd(PolyList,Vars,ResVars)==1){
                    293:
                    294:                        for(J=0;J<length(Vars);J++)
                    295:                                ResVars=map(subst,ResVars,Vars[J],
                    296:                                        strtov(rtostr(Vars[J])+"_deg"))$
1.8     ! kimura    297:
        !           298:                        return [wsort(ResVars,Vars,ResVars)]$
1.4       kimura    299:                }
                    300:                else
1.8     ! kimura    301:                        return []$
1.4       kimura    302:        }
                    303:        else
1.8     ! kimura    304:                return []$
1.4       kimura    305:
                    306: }
                    307:
1.8     ! kimura    308: def leastsq(NormMat,ExpMat,Vars){
        !           309:
        !           310:        RET=[]$
1.4       kimura    311:
                    312:        ExpMatRowNum=size(ExpMat)[0]$
                    313:        ExpMatColNum=size(ExpMat[0])[0]$
                    314:
1.8     ! kimura    315:        if(NormMat==0){
        !           316:                NormMat=newmat(ExpMatColNum,ExpMatColNum)$
        !           317:
        !           318:                for(I=0;I<ExpMatColNum;I++)
        !           319:                        for(J=I;J<ExpMatColNum;J++)
        !           320:                                for(K=0;K<ExpMatRowNum;K++)
        !           321:                                        NormMat[I][J]+=
        !           322:                                                ExpMat[K][I]*ExpMat[K][J]$
        !           323:        }
1.4       kimura    324:
1.8     ! kimura    325:        BVec=newvect(ExpMatColNum)$
1.4       kimura    326:
                    327:        for(I=0;I<ExpMatColNum;I++)
                    328:                for(J=0;J<ExpMatRowNum;J++)
1.8     ! kimura    329:                        BVec[I]+=ExpMat[J][I]$
1.4       kimura    330:
                    331:        SolveList=[]$
                    332:        for(I=0;I<ExpMatColNum;I++){
                    333:                TMP=0$
1.8     ! kimura    334:                for(J=0;J<I;J++)
        !           335:                        TMP+=NormMat[J][I]*Vars[J]$
        !           336:
        !           337:                for(J=I;J<ExpMatColNum;J++)
1.4       kimura    338:                        TMP+=NormMat[I][J]*Vars[J]$
                    339:
1.8     ! kimura    340:                TMP-=BVec[I]$
1.4       kimura    341:                SolveList=cons(TMP,SolveList)$
                    342:        }
                    343:
                    344:        Rea=vars(SolveList)$
1.8     ! kimura    345:
        !           346:        VarsList=[]$
        !           347:        for(I=0;I<length(Vars);I++)
        !           348:                if(member(Vars[I],Rea))
        !           349:                        VarsList=cons(Vars[I],VarsList)$
        !           350:
        !           351:        Res=solve(SolveList,VarsList)$
        !           352:        Res=getgcd(Res,Rea)$
1.4       kimura    353:
                    354:        if(nonposdegchk(Res)){
1.8     ! kimura    355:                TMP1=makeret(Res,Vars)$
        !           356:                if(TMP1[0]==0){
        !           357:                        TMP=roundret(TMP1[1]*1.0)$
        !           358:                        if(TMP!=[])
        !           359:                                RET=cons(wsort(TMP1[1],Vars,TMP),RET)$
        !           360:
        !           361:                        RET=cons(wsort(TMP1[1],Vars,
        !           362:                                map(drint,TMP1[1]*1.0)),RET)$
        !           363:
        !           364:                        return RET$
        !           365:                }
        !           366:                else{
        !           367:                        RET=cons(wsort(TMP1[1],Vars,TMP1[1]*1.0),RET)$
        !           368:                        return RET$
        !           369:                }
        !           370:        }
        !           371:        else
        !           372:                return RET$
        !           373:
        !           374: }
        !           375:
        !           376: def weightr(ExpMat,Vars,PolyListNum,OneMat){
        !           377:
        !           378:        RET=[]$
        !           379:
        !           380:        ExpMatRowNum=size(ExpMat)[0]$
        !           381:        ExpMatColNum=size(ExpMat[0])[0]$
        !           382:        ExtMatColNum=ExpMatColNum+PolyListNum$
        !           383:
        !           384:        ExtVars=reverse(Vars)$
        !           385:        for(I=0;I<PolyListNum;I++)
        !           386:                ExtVars=cons(uc(),ExtVars)$
        !           387:
        !           388:        ExtVars=reverse(ExtVars)$
        !           389:
        !           390:        NormMat=newmat(ExpMatColNum,ExtMatColNum)$
        !           391:
        !           392:        for(I=0;I<ExpMatColNum;I++)
        !           393:                for(J=I;J<ExpMatColNum;J++)
        !           394:                        for(K=0;K<ExpMatRowNum;K++)
        !           395:                                NormMat[I][J]+=
        !           396:                                        ExpMat[K][I]*
        !           397:                                        ExpMat[K][J]$
        !           398:
        !           399:        for(I=0;I<ExpMatColNum;I++)
        !           400:                for(J=0;J<PolyListNum;J++)
        !           401:                        for(K=OneMat[J];K<OneMat[J+1];K++)
        !           402:                                NormMat[I][J+ExpMatColNum]-=
        !           403:                                        ExpMat[K][I]$
        !           404:
        !           405:        WVect=newvect(PolyListNum)$
        !           406:        for(I=0;I<PolyListNum;I++)
        !           407:                WVect[I]=OneMat[I+1]-OneMat[I]$
        !           408:
        !           409:        for(F=0;F<ExtMatColNum;F++){
        !           410:                SolveList=[]$
        !           411:                for(I=0;I<ExpMatColNum;I++){
        !           412:                        if (F==I)
        !           413:                                continue$
        !           414:
        !           415:                        TMP=0$
        !           416:
        !           417:                        for(J=0;J<I;J++)
        !           418:                                if(J!=F)
        !           419:                                        TMP+=NormMat[J][I]*ExtVars[J]$
        !           420:
        !           421:                        for(J=I;J<ExtMatColNum;J++)
        !           422:                                if(J!=F)
        !           423:                                        TMP+=NormMat[I][J]*ExtVars[J]$
        !           424:
        !           425:                        if(F<I)
        !           426:                                TMP+=NormMat[F][I]$
        !           427:                        else
        !           428:                                TMP+=NormMat[I][F]$
        !           429:
        !           430:                        SolveList=cons(TMP,SolveList)$
        !           431:                }
        !           432:
        !           433:                for(I=0;I<PolyListNum;I++){
        !           434:                        if(F==(I+ExpMatColNum))
        !           435:                                continue$
        !           436:
        !           437:                        TMP=0$
        !           438:                        for(J=0;J<ExpMatColNum;J++)
        !           439:                                if(J!=F)
        !           440:                                        TMP+=NormMat[J][I+ExpMatColNum]
        !           441:                                                *ExtVars[J]$
        !           442:
        !           443:                        TMP+=WVect[I]*ExtVars[I+ExpMatColNum]$
        !           444:
        !           445:                        if(F<ExpMatColNum)
        !           446:                                TMP+=NormMat[F][I+ExpMatColNum]$
        !           447:
        !           448:                        SolveList=cons(TMP,SolveList)$
        !           449:                }
        !           450:
        !           451:                Rea=vars(SolveList)$
        !           452:
        !           453:                SolVars=[]$
        !           454:                for(I=0;I<ExtMatColNum;I++)
        !           455:                        if(I!=F && member(ExtVars[I],Rea))
        !           456:                                SolVars=cons(ExtVars[I],SolVars)$
        !           457:
        !           458:                Res=solve(SolveList,SolVars)$
        !           459:                Res=cons([ExtVars[F],1],Res)$
        !           460:
        !           461:                Rea=cons(ExtVars[F],Rea)$
1.4       kimura    462:                Res=getgcd(Res,Rea)$
1.8     ! kimura    463:
        !           464:                if(nonposdegchk(Res)){
        !           465:
        !           466:                        TMP1=makeret(Res,Vars)$
        !           467:                        if(TMP1[0]==0){
        !           468:                                TMP=roundret(TMP1[1]*1.0)$
        !           469:                                if(TMP!=[])
        !           470:                                        RET=cons(wsort(TMP1[1],Vars,TMP),RET)$
        !           471:
        !           472:                                RET=cons(wsort(TMP1[1],Vars,
        !           473:                                        map(drint,TMP1[1]*1.0)),RET)$
        !           474:                        }
        !           475:                        else{
        !           476:                                RET=cons(wsort(TMP1[1],Vars,TMP1[1]*1.0),RET)$
        !           477:                        }
1.4       kimura    478:                }
1.8     ! kimura    479:
1.4       kimura    480:        }
                    481:
1.8     ! kimura    482:        return [NormMat,RET]$
1.6       kimura    483: }
                    484:
1.8     ! kimura    485: def weight(PolyList,Vars,FLAG){
1.6       kimura    486:
                    487:        Vars0=vars(PolyList)$
                    488:        Vars1=[]$
                    489:        for(I=0;I<length(Vars);I++)
                    490:                if(member(Vars[I],Vars0))
                    491:                        Vars1=cons(Vars[I],Vars1)$
                    492:
                    493:        Vars=reverse(Vars1)$
                    494:
                    495:        RET=[]$
                    496:
1.8     ! kimura    497: /* first */
        !           498:
1.6       kimura    499:        TMP=qcheck(PolyList,Vars)$
                    500:
1.8     ! kimura    501:        if(TMP!=[]){
        !           502:                RET=append(RET,TMP)$
        !           503:                return cons(1,RET)$
1.6       kimura    504:        }
1.4       kimura    505:
1.6       kimura    506:        dp_ord(2)$
1.4       kimura    507:
1.6       kimura    508:        PolyListNum=length(PolyList)$
1.4       kimura    509:
1.8     ! kimura    510:        OneMat=newvect(PolyListNum+1,[0])$
1.6       kimura    511:        ExpMat=[]$
1.8     ! kimura    512:        for(I=0;I<PolyListNum;I++){
        !           513:                for(Poly=dp_ptod(PolyList[I],Vars);
1.6       kimura    514:                        Poly!=0;Poly=dp_rest(Poly)){
1.8     ! kimura    515:                        ExpMat=cons(dp_etov(dp_ht(Poly)),ExpMat)$
        !           516:                }
        !           517:                OneMat[I+1]=length(ExpMat)$
        !           518:        }
1.4       kimura    519:
1.6       kimura    520:        ExpMat=reverse(ExpMat)$
                    521:        ExpMat=newvect(length(ExpMat),ExpMat)$
1.4       kimura    522:
1.8     ! kimura    523: /* second */
        !           524:
        !           525:        if(FLAG){
        !           526:                TMP=weightr(ExpMat,Vars,PolyListNum,OneMat)$
        !           527:                RET=append(RET,TMP[1])$
        !           528:        }
        !           529:
        !           530: /* third */
1.4       kimura    531:
1.8     ! kimura    532:        if(FLAG)
        !           533:                RET=append(RET,leastsq(TMP[0],ExpMat,Vars))$
        !           534:        else
        !           535:                RET=append(RET,leastsq(0,ExpMat,Vars))$
1.4       kimura    536:
1.8     ! kimura    537: /* forth */
1.4       kimura    538:
1.6       kimura    539:        ExpMat=qsort(ExpMat,junban)$
1.8     ! kimura    540:
1.6       kimura    541:        ExpMat2=[]$
                    542:        for(I=0;I<size(ExpMat)[0];I++)
                    543:                if(car(ExpMat2)!=ExpMat[I])
                    544:                        ExpMat2=cons(ExpMat[I],ExpMat2)$
1.4       kimura    545:
1.6       kimura    546:        if(size(ExpMat)[0]!=length(ExpMat2)){
                    547:                ExpMat=newvect(length(ExpMat2),ExpMat2)$
1.8     ! kimura    548:                RET=append(RET,leastsq(0,ExpMat,Vars))$
1.4       kimura    549:        }
                    550:
1.8     ! kimura    551:        RET=derase(RET)$
        !           552:        return cons(0,RET)$
1.4       kimura    553: }
                    554:
                    555: end$

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