155static void NewRangeReset();
157static void NewRangeAdd();
161static void MarkSet();
162static void MarkRewind();
237static int s_fDistEnable2 = 1;
238static int s_fDistEnable3;
239static int s_fDistEnable4;
242static Cube* s_CubeGroup[5];
244static int s_fInserted[5];
250static int s_cEnquequed;
251static int s_cAttempts;
252static int s_cReshapes;
255static int s_nCubesBefore;
261static int s_GainTotal;
262static int s_GroupCounter;
263static int s_GroupBest;
264static Cube *s_pC1, *s_pC2;
288 s_fDistEnable2 = fDistEnable & 1;
289 s_fDistEnable3 = fDistEnable & 2;
290 s_fDistEnable4 = fDistEnable & 4;
351 s_CubeGroup[0]->q + s_CubeGroup[1]->q >= s_pC1->q + s_pC2->q :
352 s_CubeGroup[0]->a + s_CubeGroup[1]->a >= s_pC1->a + s_pC2->a )
389 printf(
"ExLink-%d", 2 );
390 printf(
": Que= %5d", s_cEnquequed );
391 printf(
" Att= %4d", s_cAttempts );
392 printf(
" Resh= %4d", s_cReshapes );
393 printf(
" NoResh= %4d", s_cAttempts - s_cReshapes );
395 printf(
" (%d)", s_nCubesBefore -
g_CoverInfo.nCubesInUse );
412 s_fDistEnable2 = fDistEnable & 1;
413 s_fDistEnable3 = fDistEnable & 2;
414 s_fDistEnable4 = fDistEnable & 4;
441 for ( c = 0; c < 3; c++ )
442 if ( !s_CubeGroup[c]->fMark )
451 s_CubeGroup[0]->q + s_CubeGroup[1]->q + s_CubeGroup[2]->q > s_pC1->q + s_pC2->q + s_ChangeStore.PrevQq :
452 s_CubeGroup[0]->a + s_CubeGroup[1]->a + s_CubeGroup[2]->a > s_pC1->a + s_pC2->a + s_ChangeStore.PrevQa
456 s_GroupBest = s_GroupCounter;
463 for ( d = 0; d < 3; d++ )
485 s_CubeGroup[c]->fMark = 1;
508 printf(
"ExLink-%d", 3 );
509 printf(
": Que= %5d", s_cEnquequed );
510 printf(
" Att= %4d", s_cAttempts );
511 printf(
" Resh= %4d", s_cReshapes );
512 printf(
" NoResh= %4d", s_cAttempts - s_cReshapes );
514 printf(
" (%d)", s_nCubesBefore -
g_CoverInfo.nCubesInUse );
531 s_fDistEnable2 = fDistEnable & 1;
532 s_fDistEnable3 = fDistEnable & 2;
533 s_fDistEnable4 = fDistEnable & 4;
560 for ( c = 0; c < 4; c++ )
561 if ( !s_CubeGroup[c]->fMark )
565 s_fInserted[c] = (int)(s_Gain>0);
567 s_GainTotal += s_Gain;
572 if ( s_GainTotal == 0 )
574 for ( c = 0; c < 4; c++ )
575 s_CubeGroup[c]->fMark = 1;
577 else if ( s_GainTotal == 1 )
582 for ( c = 0; c < 4; c++ )
583 s_CubeGroup[c]->fMark = !s_fInserted[c];
587 for ( c = 0; c < 4; c++ )
588 if ( !s_fInserted[c] )
619 printf(
"ExLink-%d", 4 );
620 printf(
": Que= %5d", s_cEnquequed );
621 printf(
" Att= %4d", s_cAttempts );
622 printf(
" Resh= %4d", s_cReshapes );
623 printf(
" NoResh= %4d", s_cAttempts - s_cReshapes );
625 printf(
" (%d)", s_nCubesBefore -
g_CoverInfo.nCubesInUse );
662 if ( s_fDistEnable4 )
667 if ( s_fDistEnable3 )
672 if ( s_fDistEnable2 )
682 s_ChangeStore.PrevQa =
s_q->a;
683 s_ChangeStore.PrevPa =
p->a;
684 s_ChangeStore.PrevQq =
s_q->q;
685 s_ChangeStore.PrevPq =
p->q;
686 s_ChangeStore.PrevPz =
p->z;
689 s_ChangeStore.PrevID =
s_q->ID;
704 p->pCubeDataOut[i] ^=
s_q->pCubeDataOut[i];
705 p->z += BIT_COUNT(
p->pCubeDataOut[i]);
756 q->
ID = s_ChangeStore.PrevID;
764 if ( s_ChangeStore.fInput )
767 p->a = s_ChangeStore.PrevPa;
768 p->q = s_ChangeStore.PrevPq;
776 p->z = s_ChangeStore.PrevPz;
800 memset( s_CubeGroup, 0,
sizeof(
void *) * 5 );
801 memset( s_fInserted, 0,
sizeof(
int) * 5 );
811 s_pC1 = s_pC2 = NULL;
827 assert(
p->Prev == NULL &&
p->Next == NULL );
830 if ( s_List == NULL )
857 p->Prev->Next =
p->Next;
860 p->Next->Prev =
p->Prev;
886 if ( s_List == NULL )
936 s_Que[0].PosMark = s_Que[0].PosIn;
937 s_Que[1].PosMark = s_Que[1].PosIn;
938 s_Que[2].PosMark = s_Que[2].PosIn;
944 s_Que[0].PosIn = s_Que[0].PosMark;
945 s_Que[1].PosIn = s_Que[1].PosMark;
946 s_Que[2].PosIn = s_Que[2].PosMark;
952 s_Que[0].PosCur = s_Que[0].PosIn;
953 s_Que[1].PosCur = s_Que[1].PosIn;
954 s_Que[2].PosCur = s_Que[2].PosIn;
960 s_Que[0].PosIn = s_Que[0].PosCur;
961 s_Que[1].PosIn = s_Que[1].PosCur;
962 s_Que[2].PosIn = s_Que[2].PosCur;
971 if (
p->fEmpty ||
Pos !=
p->PosOut )
975 p->ID1[
Pos] = p1->ID;
976 p->ID2[
Pos] = p2->ID;
1021static Cube *p1, *p2;
1030 assert( s_Iter.fStarted == 0 );
1031 assert( CubeDist >= 0 && CubeDist <= 2 );
1033 s_Iter.fStarted = 1;
1034 s_Iter.Dist = CubeDist;
1038 s_Iter.PosStop = s_Que[ CubeDist ].PosIn;
1042 s_Iter.CutValue = -1;
1046 for ( pQ = &s_Que[ CubeDist ]; pQ->PosOut != s_Iter.PosStop; pQ->PosOut = (pQ->PosOut+1)%
s_nPosAlloc )
1048 p1 = pQ->pC1[ pQ->PosOut ];
1049 p2 = pQ->pC2[ pQ->PosOut ];
1052 if ( p1->ID == pQ->ID1[ pQ->PosOut ] &&
1053 p2->ID == pQ->ID2[ pQ->PosOut ] )
1063 *
ppC1 = pQ->pC1[ pQ->PosOut ];
1064 *
ppC2 = pQ->pC2[ pQ->PosOut ];
1069 s_Iter.fStarted = 0;
1076 int fEntryFound = 0;
1077 assert( s_Iter.fStarted );
1080 for ( pQ = &s_Que[ s_Iter.Dist ]; pQ->PosOut != s_Iter.PosStop; pQ->PosOut = (pQ->PosOut+1)%
s_nPosAlloc )
1082 p1 = pQ->pC1[ pQ->PosOut ];
1083 p2 = pQ->pC2[ pQ->PosOut ];
1086 if ( p1->ID == pQ->ID1[ pQ->PosOut ] &&
1087 p2->ID == pQ->ID2[ pQ->PosOut ] )
1097 *(s_Iter.ppC1) = pQ->pC1[ pQ->PosOut ];
1098 *(s_Iter.ppC2) = pQ->pC2[ pQ->PosOut ];
1103 s_Iter.fStarted = 0;
1119 for ( i = 0; i < 3; i++ )
1126 s_Que[i].ID1 = (
byte*)
ABC_ALLOC(
byte, nPlaces );
1127 s_Que[i].ID2 = (
byte*)
ABC_ALLOC(
byte, nPlaces );
1129 if ( s_Que[i].pC1==NULL || s_Que[i].pC2==NULL || s_Que[i].ID1==NULL || s_Que[i].ID2==NULL )
1133 s_Que[i].fEmpty = 1;
1136 return nPlaces * (
sizeof(
Cube*) +
sizeof(
Cube*) + 2*
sizeof(
byte) );
1142 for ( i = 0; i < 3; i++ )
#define ABC_ALLOC(type, num)
#define ABC_NAMESPACE_IMPL_START
#define ABC_NAMESPACE_IMPL_END
int IteratorCubePairNext()
int IteratorCubePairStart(cubedist Dist, Cube **ppC1, Cube **ppC2)
int IterativelyApplyExorLink4(char fDistEnable)
int AllocateCubeSets(int nVarsIn, int nVarsOut)
CUBE SET MANIPULATION PROCEDURES ///.
int AllocateQueques(int nPlaces)
int GetQuequeStats(cubedist Dist)
int ExorLinkCubeIteratorNext(Cube **pGroup)
int s_nPosAlloc
EXPORTED VARIABLES /// /////////////////////////////////////////////////////////////////////`.
int ExorLinkCubeIteratorStart(Cube **pGroup, Cube *pC1, Cube *pC2, cubedist Dist)
ExorLink Functions.
int IterativelyApplyExorLink3(char fDistEnable)
int GetPosDiff(int PosBeg, int PosEnd)
int IterativelyApplyExorLink2(char fDistEnable)
FUNCTIONS OF THIS MODULE ///.
void ExorVar(Cube *pC, int Var, varvalue Val)
int CheckAndInsert(Cube *p)
Iterative ExorLink Operation ///.
int ExorLinkCubeIteratorPick(Cube **pGroup, int g)
Cube * s_pCubeLast
CUBE ITERATOR ///.
int GetDistance(Cube *pC1, Cube *pC2)
EXTERNAL FUNCTIONS ///.
int CheckForCloseCubes(Cube *p, int fAddCube)
Cube * CubeExtract(Cube *p)
void AddToFreeCubes(Cube *pC)
FREE CUBE LIST MANIPULATION FUNCTIONS ///.
Cube * IterCubeSetStart()
Cube Set Iterator ///.
void ExorLinkCubeIteratorCleanUp(int fTakeLastGroup)
void CubeInsert(Cube *p)
Insertion Operators ///.
int GetDistancePlus(Cube *pC1, Cube *pC2)
int ComputeQCostBits(Cube *p)
ABC_NAMESPACE_IMPL_START cinfo g_CoverInfo
GLOBAL VARIABLES ///.
int CountLiterals()
FUNCTION DECLARATIONS ///.
varvalue
VARVALUE and CUBEDIST enum typedefs ///.