Commit 6fdb52ca by Alan Mishchenko

Experiments with permutations.

parent 81077d8a
...@@ -863,16 +863,16 @@ void Abc_EnumerateCubeStatesZdd() ...@@ -863,16 +863,16 @@ void Abc_EnumerateCubeStatesZdd()
{ {1,10}, {1, 7}, {1, 4}, {3,12}, {3, 9}, {3, 6}, {2,11}, {2, 8}, {2, 5} } }; { {1,10}, {1, 7}, {1, 4}, {3,12}, {3, 9}, {3, 6}, {2,11}, {2, 8}, {2, 5} } };
Abc_ZddMan * p; Abc_ZddMan * p;
int i, k, pComb[9], pPerm[24], nSize; int i, k, pComb[9], pPerm[24], nSize;
int ZddTurn1, ZddTurn2, ZddTurn3, ZddTurns9, ZddAll, ZddReached, ZddNew; int ZddTurn1, ZddTurn2, ZddTurn3, ZddTurns, ZddAll;
abctime clk = Abc_Clock(); abctime clk = Abc_Clock();
printf( "Enumerating states of 2x2x2 cube.\n" ); printf( "Enumerating states of 2x2x2 cube.\n" );
p = Abc_ZddManAlloc( 24 * 23 / 2, 1 << 27 ); p = Abc_ZddManAlloc( 24 * 23 / 2, 1 << 27 ); // finished with 2^27 (4 GB)
Abc_ZddManCreatePerms( p, 24 ); Abc_ZddManCreatePerms( p, 24 );
// init state // init state
printf( "Iter %2d -> %8d ", 0, 1 ); printf( "Iter %2d -> %8d ", 0, 1 );
Abc_PrintTime( 1, "Time", Abc_Clock() - clk ); Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
// first 9 states // first 9 states
ZddTurns9 = 0; ZddTurns = 1;
for ( i = 0; i < 3; i++ ) for ( i = 0; i < 3; i++ )
{ {
for ( k = 0; k < 24; k++ ) for ( k = 0; k < 24; k++ )
...@@ -885,32 +885,30 @@ void Abc_EnumerateCubeStatesZdd() ...@@ -885,32 +885,30 @@ void Abc_EnumerateCubeStatesZdd()
pComb[k] = Abc_ZddVarIJ( p, pComb[k] >> 16, pComb[k] & 0xffff ); pComb[k] = Abc_ZddVarIJ( p, pComb[k] >> 16, pComb[k] & 0xffff );
// add first turn // add first turn
ZddTurn1 = Abc_ZddBuildSet( p, pComb, 9 ); ZddTurn1 = Abc_ZddBuildSet( p, pComb, 9 );
ZddTurns9 = Abc_ZddUnion( p, ZddTurns9, ZddTurn1 ); ZddTurns = Abc_ZddUnion( p, ZddTurns, ZddTurn1 );
//Abc_ZddPrint( p, ZddTurn1 ); //Abc_ZddPrint( p, ZddTurn1 );
// add second turn // add second turn
ZddTurn2 = Abc_ZddPermProduct( p, ZddTurn1, ZddTurn1 ); ZddTurn2 = Abc_ZddPermProduct( p, ZddTurn1, ZddTurn1 );
ZddTurns9 = Abc_ZddUnion( p, ZddTurns9, ZddTurn2 ); ZddTurns = Abc_ZddUnion( p, ZddTurns, ZddTurn2 );
//Abc_ZddPrint( p, ZddTurn2 ); //Abc_ZddPrint( p, ZddTurn2 );
// add third turn // add third turn
ZddTurn3 = Abc_ZddPermProduct( p, ZddTurn2, ZddTurn1 ); ZddTurn3 = Abc_ZddPermProduct( p, ZddTurn2, ZddTurn1 );
ZddTurns9 = Abc_ZddUnion( p, ZddTurns9, ZddTurn3 ); ZddTurns = Abc_ZddUnion( p, ZddTurns, ZddTurn3 );
//Abc_ZddPrint( p, ZddTurn3 ); //Abc_ZddPrint( p, ZddTurn3 );
//printf( "\n" ); //printf( "\n" );
} }
//Abc_ZddPrint( p, ZddTurns9 ); //Abc_ZddPrint( p, ZddTurns );
printf( "Iter %2d -> %8d ", 1, Abc_ZddCountPaths(p, ZddTurns9) ); printf( "Iter %2d -> %8d ", 1, Abc_ZddCountPaths(p, ZddTurns) );
Abc_PrintTime( 1, "Time", Abc_Clock() - clk ); Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
// other states // other states
ZddNew = ZddTurns9; ZddAll = ZddTurns;
ZddAll = Abc_ZddUnion( p, 1, ZddTurns9 );
for ( i = 2; i <= 100; i++ ) for ( i = 2; i <= 100; i++ )
{ {
ZddReached = Abc_ZddPermProduct( p, ZddNew, ZddTurns9 ); int ZddAllPrev = ZddAll;
ZddNew = Abc_ZddDiff( p, ZddReached, ZddAll ); ZddAll = Abc_ZddPermProduct( p, ZddAll, ZddTurns );
ZddAll = Abc_ZddUnion( p, ZddAll, ZddNew ); printf( "Iter %2d -> %8d ", i, Abc_ZddCountPaths(p, ZddAll) );
printf( "Iter %2d -> %8d ", i, Abc_ZddCountPaths(p, ZddNew) );
Abc_PrintTime( 1, "Time", Abc_Clock() - clk ); Abc_PrintTime( 1, "Time", Abc_Clock() - clk );
if ( ZddNew == 0 ) if ( ZddAllPrev == ZddAll )
break; break;
} }
Abc_ZddManFree( p ); Abc_ZddManFree( p );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment