49 int lev1 = lev0 + 1, lev2 = lev0 + 2;
53 reo_unit * pNewPlane20 = NULL, * pNewPlane21 = NULL;
55 reo_unit * pUnitE, * pUnitER, * pUnitT;
57 reo_unit * pNew1E = NULL, * pNew1T = NULL, * pNew2E = NULL, * pNew2T = NULL;
58 reo_unit * pNew1ER = NULL, * pNew2ER = NULL;
60 reo_unit * pListOld0 =
p->pPlanes[lev0].pHead;
61 reo_unit * pListOld1 =
p->pPlanes[lev1].pHead;
63 reo_unit * pListNew0 = NULL, ** ppListNew0 = &pListNew0;
64 reo_unit * pListNew1 = NULL, ** ppListNew1 = &pListNew1;
65 reo_unit * pListTemp = NULL, ** ppListTemp = &pListTemp;
67 int fComp, fCompT, fFound, HKey, fInteract, temp, c;
70 int nNodesUpMovedDown = 0;
71 int nNodesDownMovedUp = 0;
72 int nNodesUnrefRemoved = 0;
73 int nNodesUnrefAdded = 0;
74 int nWidthReduction = 0;
75 double AplWeightTotalLev0 = 0.0;
76 double AplWeightTotalLev1 = 0.0;
77 double AplWeightHalf = 0.0;
78 double AplWeightPrev = 0.0;
79 double AplWeightAfter = 0.0;
83 assert( lev0 >= 0 && lev1 < p->nSupp );
84 pListOld0 =
p->pPlanes[lev0].pHead;
85 pListOld1 =
p->pPlanes[lev1].pHead;
88 assert(
p->pPlanes[lev0].statsNodes &&
p->pPlanes[lev1].statsNodes );
89 assert( pListOld0 && pListOld1 );
99 else if (
p->fMinApl )
101 AplWeightPrev =
p->nAplCur;
102 AplWeightAfter =
p->nAplCur;
103 AplWeightTotalLev0 = 0.0;
104 AplWeightTotalLev1 = 0.0;
109 for ( pUnit = pListOld0; pUnit; pUnit = pUnit->
Next )
132 for ( pUnit = pListOld1; pUnit; pUnit = pUnit->
Next )
137 if ( pUnitER->
TopRef > lev0 )
139 if ( pUnitER->
Sign !=
p->nSwaps )
141 if ( pUnitER->
TopRef == lev2 )
150 pUnitER->
Sign =
p->nSwaps;
155 if ( pUnitT->
TopRef > lev0 )
157 if ( pUnitT->
Sign !=
p->nSwaps )
159 if ( pUnitT->
TopRef == lev2 )
168 pUnitT->
Sign =
p->nSwaps;
175 for ( pUnit = pListOld0; pUnit; pUnit = pUnit->
Next )
180 if ( pUnitER->
TopRef > lev0 )
182 if ( pUnitER->
Sign !=
p->nSwaps )
186 pUnitER->
Sign =
p->nSwaps;
192 if ( pUnitT->
TopRef > lev0 )
194 if ( pUnitT->
Sign !=
p->nSwaps )
198 pUnitT->
Sign =
p->nSwaps;
208 for ( pUnit = pListOld1; pUnit; pUnit = pUnit->
Next )
213 pListNew0 = pListOld1;
214 pListNew1 = pListOld0;
218 AplWeightTotalLev0 =
p->pPlanes[lev1].statsCost;
219 AplWeightTotalLev1 =
p->pPlanes[lev0].statsCost;
223 nNodesUpMovedDown =
p->pPlanes[lev0].statsNodes;
224 nNodesDownMovedUp =
p->pPlanes[lev1].statsNodes;
243 for ( pLoop = pListOld0; pLoop; )
252 if ( pUnitER->
lev != lev1 && pUnitT->
lev != lev1 )
271 AplWeightTotalLev1 += pUnit->
Weight;
274 for ( HKey =
hashKey3(
p->Signature, pUnitE, pUnitT,
p->nTableSize);
275 p->HTable[HKey].Sign ==
p->Signature;
276 HKey = (HKey+1) %
p->nTableSize );
277 assert(
p->HTable[HKey].Sign !=
p->Signature );
278 p->HTable[HKey].Sign =
p->Signature;
279 p->HTable[HKey].Arg1 = pUnitE;
280 p->HTable[HKey].Arg2 = pUnitT;
281 p->HTable[HKey].Arg3 = pUnit;
288 if ( pUnitER->
TopRef > lev0 )
292 if ( pUnitER->
Sign !=
p->nSwaps )
294 pUnitER->
Sign =
p->nSwaps;
295 p->pWidthCofs[ nWidthCofs++ ] = pUnitER;
298 if ( pUnitT->
TopRef > lev0 )
302 if ( pUnitT->
Sign !=
p->nSwaps )
304 pUnitT->
Sign =
p->nSwaps;
305 p->pWidthCofs[ nWidthCofs++ ] = pUnitT;
320 for ( pLoop = pListTemp; pLoop; )
328 fComp = (int)(pUnitER != pUnitE);
332 AplWeightHalf = 0.5 * pUnit->
Weight;
335 if ( pUnitER->
lev == lev1 && pUnitT->
lev == lev1 )
386 pUnitER->
Weight -= AplWeightHalf;
387 pUnitT->
Weight -= AplWeightHalf;
388 AplWeightAfter -= pUnit->
Weight;
391 else if ( pUnitER->
lev == lev1 )
408 pNew1E = pUnitER->
pE;
411 pNew2E = pUnitER->
pT;
443 pUnitER->
Weight -= AplWeightHalf;
444 AplWeightAfter -= AplWeightHalf;
447 else if ( pUnitT->
lev == lev1 )
476 pUnitT->
Weight -= AplWeightHalf;
477 AplWeightAfter -= AplWeightHalf;
487 if ( pNew1E == pNew1T )
489 pNewPlane20 = pNew1T;
494 if ( pNew1T->TopRef > lev0 )
496 pNew1T->TopRefNew = lev1;
497 if ( pNew1T->Sign !=
p->nSwaps )
499 pNew1T->Sign =
p->nSwaps;
500 p->pWidthCofs[ nWidthCofs++ ] = pNew1T;
508 fCompT = Cudd_IsComplement(pNew1T);
517 for ( HKey =
hashKey3(
p->Signature, pNew1E, pNew1T,
p->nTableSize);
518 p->HTable[HKey].Sign ==
p->Signature;
519 HKey = (HKey+1) %
p->nTableSize )
520 if (
p->HTable[HKey].Arg1 == pNew1E &&
p->HTable[HKey].Arg2 == pNew1T )
523 pNewPlane20 =
p->HTable[HKey].Arg3;
533 pNewPlane20->
pE = pNew1E;
534 pNewPlane20->
pT = pNew1T;
536 pNewPlane20->
lev = lev1;
539 pNewPlane20->
TopRef = lev1;
540 pNewPlane20->
Sign = 0;
544 pNewPlane20->
Weight = 0.0;
555 assert(
p->HTable[HKey].Sign !=
p->Signature );
556 p->HTable[HKey].Sign =
p->Signature;
557 p->HTable[HKey].Arg1 = pNew1E;
558 p->HTable[HKey].Arg2 = pNew1T;
559 p->HTable[HKey].Arg3 = pNewPlane20;
566 if ( pNew1ER->
TopRef > lev0 )
568 if ( pNew1ER->
Sign !=
p->nSwaps )
571 if ( pNew1ER->
Sign !=
p->nSwaps )
573 pNew1ER->
Sign =
p->nSwaps;
574 p->pWidthCofs[ nWidthCofs++ ] = pNew1ER;
584 if ( pNew1T->TopRef > lev0 )
586 if ( pNew1T->Sign !=
p->nSwaps )
588 pNew1T->TopRefNew = lev2;
589 if ( pNew1T->Sign !=
p->nSwaps )
591 pNew1T->Sign =
p->nSwaps;
592 p->pWidthCofs[ nWidthCofs++ ] = pNew1T;
598 assert( pNew1T->TopRefNew == lev1 || pNew1T->TopRefNew == lev2 );
607 pNewPlane20->
Weight += AplWeightHalf;
609 AplWeightAfter += AplWeightHalf;
611 AplWeightTotalLev1 += AplWeightHalf;
615 pNewPlane20 =
Unit_Not(pNewPlane20);
618 if ( pNew2E == pNew2T )
620 pNewPlane21 = pNew2T;
625 if ( pNew2T->TopRef > lev0 )
627 pNew2T->TopRefNew = lev1;
628 if ( pNew2T->Sign !=
p->nSwaps )
630 pNew2T->Sign =
p->nSwaps;
631 p->pWidthCofs[ nWidthCofs++ ] = pNew2T;
638 assert( !Cudd_IsComplement(pNew2T) );
642 for ( HKey =
hashKey3(
p->Signature, pNew2E, pNew2T,
p->nTableSize);
643 p->HTable[HKey].Sign ==
p->Signature;
644 HKey = (HKey+1) %
p->nTableSize )
645 if (
p->HTable[HKey].Arg1 == pNew2E &&
p->HTable[HKey].Arg2 == pNew2T )
648 pNewPlane21 =
p->HTable[HKey].Arg3;
649 assert( pNewPlane21->lev == lev1 );
658 pNewPlane21->pE = pNew2E;
659 pNewPlane21->pT = pNew2T;
661 pNewPlane21->lev = lev1;
664 pNewPlane21->TopRef = lev1;
665 pNewPlane21->Sign = 0;
669 pNewPlane21->Weight = 0.0;
681 assert(
p->HTable[HKey].Sign !=
p->Signature );
682 p->HTable[HKey].Sign =
p->Signature;
683 p->HTable[HKey].Arg1 = pNew2E;
684 p->HTable[HKey].Arg2 = pNew2T;
685 p->HTable[HKey].Arg3 = pNewPlane21;
693 if ( pNew2ER->TopRef > lev0 )
695 if ( pNew2ER->Sign !=
p->nSwaps )
697 pNew2ER->TopRefNew = lev2;
698 if ( pNew2ER->Sign !=
p->nSwaps )
700 pNew2ER->Sign =
p->nSwaps;
701 p->pWidthCofs[ nWidthCofs++ ] = pNew2ER;
707 assert( pNew2ER->TopRefNew == lev1 || pNew2ER->TopRefNew == lev2 );
711 if ( pNew2T->TopRef > lev0 )
713 if ( pNew2T->Sign !=
p->nSwaps )
715 pNew2T->TopRefNew = lev2;
716 if ( pNew2T->Sign !=
p->nSwaps )
718 pNew2T->Sign =
p->nSwaps;
719 p->pWidthCofs[ nWidthCofs++ ] = pNew2T;
725 assert( pNew2T->TopRefNew == lev1 || pNew2T->TopRefNew == lev2 );
734 pNewPlane21->Weight += AplWeightHalf;
736 AplWeightAfter += AplWeightHalf;
738 AplWeightTotalLev1 += AplWeightHalf;
745 assert( !Cudd_IsComplement(pNewPlane21) );
748 pUnit->
pE = pNewPlane20;
749 pUnit->
pT = pNewPlane21;
761 AplWeightTotalLev0 += pUnit->
Weight;
766 for ( pLoop = pListOld1; pLoop; )
778 AplWeightTotalLev0 += pUnit->
Weight;
788 if ( pUnitER->
TopRef > lev0 )
791 if ( pUnitER->
Sign !=
p->nSwaps )
793 pUnitER->
Sign =
p->nSwaps;
794 p->pWidthCofs[ nWidthCofs++ ] = pUnitER;
797 if ( pUnitT->
TopRef > lev0 )
800 if ( pUnitT->
Sign !=
p->nSwaps )
802 pUnitT->
Sign =
p->nSwaps;
803 p->pWidthCofs[ nWidthCofs++ ] = pUnitT;
818 nNodesUnrefRemoved++;
825 p->pPlanes[lev0].pHead = pListNew0;
826 p->pPlanes[lev1].pHead = pListNew1;
829 temp =
p->pPlanes[lev0].fSifted;
830 p->pPlanes[lev0].fSifted =
p->pPlanes[lev1].fSifted;
831 p->pPlanes[lev1].fSifted = temp;
836 temp =
p->pOrderInt[lev0];
837 p->pOrderInt[lev0] =
p->pOrderInt[lev1];
838 p->pOrderInt[lev1] = temp;
842 p->pPlanes[lev0].statsNodes -= (nNodesUpMovedDown - nNodesDownMovedUp);
843 p->pPlanes[lev1].statsNodes -= (nNodesDownMovedUp - nNodesUpMovedDown) + nNodesUnrefRemoved - nNodesUnrefAdded;
844 p->nNodesCur -= nNodesUnrefRemoved - nNodesUnrefAdded;
849 for ( c = 0; c < nWidthCofs; c++ )
851 if (
p->pWidthCofs[c]->TopRefNew <
p->pWidthCofs[c]->TopRef )
853 p->pWidthCofs[c]->TopRef =
p->pWidthCofs[c]->TopRefNew;
856 else if (
p->pWidthCofs[c]->TopRefNew >
p->pWidthCofs[c]->TopRef )
858 p->pWidthCofs[c]->TopRef =
p->pWidthCofs[c]->TopRefNew;
867 nCostGain = (nNodesDownMovedUp - nNodesUpMovedDown + nNodesUnrefRemoved - nNodesUnrefAdded) + nWidthReduction;
869 p->pPlanes[lev1].statsWidth -= (int)nCostGain;
871 p->pPlanes[lev1].statsCost =
p->pPlanes[lev1].statsWidth;
873 else if (
p->fMinApl )
876 nCostGain = AplWeightPrev - AplWeightAfter;
881 p->pPlanes[lev0].statsApl = AplWeightTotalLev0;
882 p->pPlanes[lev1].statsApl = AplWeightTotalLev1;
884 p->pPlanes[lev0].statsCost =
p->pPlanes[lev0].statsApl;
885 p->pPlanes[lev1].statsCost =
p->pPlanes[lev1].statsApl;
890 nCostGain = nNodesUnrefRemoved - nNodesUnrefAdded;
893 p->pPlanes[lev0].statsCost =
p->pPlanes[lev0].statsNodes;
894 p->pPlanes[lev1].statsCost =
p->pPlanes[lev1].statsNodes;