53 p->nWeightLimit = 1 - fUse0;
55 vSingles = Vec_PtrAlloc( 10000 );
57 Fxu_MatrixComputeSinglesOneCollect(
p, pVar, vSingles );
58 p->nSingleTotal = Vec_PtrSize(vSingles) / 3;
60 if ( Vec_PtrSize(vSingles) > nSingleMax )
62 int * pWeigtCounts, nDivCount, Weight, i, c;;
63 assert( Vec_PtrSize(vSingles) % 3 == 0 );
66 memset( pWeigtCounts, 0,
sizeof(
int) * 1000 );
67 for ( i = 2; i < Vec_PtrSize(vSingles); i += 3 )
69 Weight = (int)(ABC_PTRUINT_T)Vec_PtrEntry(vSingles, i);
73 pWeigtCounts[Weight]++;
77 for ( c = 999; c >= 0; c-- )
79 nDivCount += pWeigtCounts[c];
80 if ( nDivCount >= nSingleMax )
86 for ( i = 2; i < Vec_PtrSize(vSingles); i += 3 )
88 Weight = (int)(ABC_PTRUINT_T)Vec_PtrEntry(vSingles, i);
91 Vec_PtrWriteEntry( vSingles, k++, Vec_PtrEntry(vSingles, i-2) );
92 Vec_PtrWriteEntry( vSingles, k++, Vec_PtrEntry(vSingles, i-1) );
93 Vec_PtrWriteEntry( vSingles, k++, Vec_PtrEntry(vSingles, i) );
94 if ( k/3 == nSingleMax )
97 Vec_PtrShrink( vSingles, k );
102 assert( Vec_PtrSize(vSingles) % 3 == 0 );
103 for ( i = 0; i < Vec_PtrSize(vSingles); i += 3 )
106 (
Fxu_Var *)Vec_PtrEntry(vSingles,i),
107 (
Fxu_Var *)Vec_PtrEntry(vSingles,i+1),
108 (
int)(ABC_PTRUINT_T)Vec_PtrEntry(vSingles,i+2) );
110 Vec_PtrFree( vSingles );