193{
194 int pXYZ[3][9][2] = {
195 { {3, 5}, {3,17}, {3,15}, {1, 6}, {1,16}, {1,14}, {2, 4}, {2,18}, {2,13} },
196 { {2,14}, {2,24}, {2,12}, {3,13}, {3,23}, {3,10}, {1,15}, {1,22}, {1,11} },
197 { {1,10}, {1, 7}, {1, 4}, {3,12}, {3, 9}, {3, 6}, {2,11}, {2, 8}, {2, 5} } };
198
199 Vec_Int_t * vData = Vec_IntStart( 6 * (1 << 22) );
201 int i, k, v, Beg, End, Counter = 0;
202 char * pPrev, * pState, pStart[24], pFirst[9][24];
204 printf( "Enumerating states of 2x2x2 cube.\n" );
205
206 for ( v = 0; v < 24; v++ )
207 pStart[v] = v;
208 Abc_StatePush( vData, pStart, Counter );
209 Abc_DataXorBit( pHash, Abc_CubeGenerateSign(pStart) );
210 Counter++;
211
212 for ( i = 0; i < 3; i++ )
213 {
214 memcpy( pFirst[i], pStart, 24 );
215 for ( v = 0; v < 9; v++ )
216 ABC_SWAP(
char, pFirst[i][pXYZ[i][v][0]-1], pFirst[i][pXYZ[i][v][1]-1] );
217 Abc_StatePush( vData, pFirst[i], Counter );
218 Abc_DataXorBit( pHash, Abc_CubeGenerateSign(pFirst[i]) );
219 Counter++;
220
221
222 memcpy( pFirst[3+i], pFirst[i], 24 );
223 for ( v = 0; v < 9; v++ )
224 ABC_SWAP(
char, pFirst[3+i][pXYZ[i][v][0]-1], pFirst[3+i][pXYZ[i][v][1]-1] );
225 Abc_StatePush( vData, pFirst[3+i], Counter );
226 Abc_DataXorBit( pHash, Abc_CubeGenerateSign(pFirst[3+i]) );
227 Counter++;
228
229
230 memcpy( pFirst[6+i], pFirst[3+i], 24 );
231 for ( v = 0; v < 9; v++ )
232 ABC_SWAP(
char, pFirst[6+i][pXYZ[i][v][0]-1], pFirst[6+i][pXYZ[i][v][1]-1] );
233 Abc_StatePush( vData, pFirst[6+i], Counter );
234 Abc_DataXorBit( pHash, Abc_CubeGenerateSign(pFirst[6+i]) );
235 Counter++;
236
237 }
238 printf( "Iter %2d -> %8d ", 0, 1 );
239 Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
240 printf( "Iter %2d -> %8d ", 1, Counter );
241 Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
242 Beg = 1; End = 10;
243 for ( i = 2; i <= 100; i++ )
244 {
245 if ( Beg == End )
246 break;
247 for ( k = Beg; k < End; k++ )
248 {
249 pPrev = (char *)Vec_IntEntryP(vData, 6*k);
250 for ( v = 0; v < 9; v++ )
251 {
252 pState = (char *)Vec_IntEntryP(vData, 6*Counter);
253 Abc_StatePerm( pPrev, pFirst[v], pState );
254 State = Abc_CubeGenerateSign( pState );
255 if ( !Abc_DataHasBit(pHash, State) )
256 Abc_DataXorBit(pHash, State), Counter++;
257 if ( Counter == (1<<22) )
258 {
259 printf( "Did not converge. " );
260 Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
261 return;
262 }
263 }
264 }
265 Beg = End; End = Counter;
266 printf( "Iter %2d -> %8d ", i, Counter );
267 Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
268 }
269 Vec_IntFree( vData );
271}
#define ABC_SWAP(Type, a, b)
#define ABC_CALLOC(type, num)
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
unsigned __int64 word
DECLARATIONS ///.