21#ifndef ABC__misc__vec__vecInt_h
22#define ABC__misc__vec__vecInt_h
54#define Vec_IntForEachEntry( vVec, Entry, i ) \
55 for ( i = 0; (i < Vec_IntSize(vVec)) && (((Entry) = Vec_IntEntry(vVec, i)), 1); i++ )
56#define Vec_IntForEachEntryStart( vVec, Entry, i, Start ) \
57 for ( i = Start; (i < Vec_IntSize(vVec)) && (((Entry) = Vec_IntEntry(vVec, i)), 1); i++ )
58#define Vec_IntForEachEntryStop( vVec, Entry, i, Stop ) \
59 for ( i = 0; (i < Stop) && (((Entry) = Vec_IntEntry(vVec, i)), 1); i++ )
60#define Vec_IntForEachEntryStartStop( vVec, Entry, i, Start, Stop ) \
61 for ( i = Start; (i < Stop) && (((Entry) = Vec_IntEntry(vVec, i)), 1); i++ )
62#define Vec_IntForEachEntryReverse( vVec, pEntry, i ) \
63 for ( i = Vec_IntSize(vVec) - 1; (i >= 0) && (((pEntry) = Vec_IntEntry(vVec, i)), 1); i-- )
64#define Vec_IntForEachEntryReverseStart( vVec, pEntry, i, Start ) \
65 for ( i = Start; (i >= 0) && (((pEntry) = Vec_IntEntry(vVec, i)), 1); i-- )
66#define Vec_IntForEachEntryTwo( vVec1, vVec2, Entry1, Entry2, i ) \
67 for ( i = 0; (i < Vec_IntSize(vVec1)) && (((Entry1) = Vec_IntEntry(vVec1, i)), 1) && (((Entry2) = Vec_IntEntry(vVec2, i)), 1); i++ )
68#define Vec_IntForEachEntryThree( vVec1, vVec2, vVec3, Entry1, Entry2, Entry3, i ) \
69 for ( i = 0; (i < Vec_IntSize(vVec1)) && (((Entry1) = Vec_IntEntry(vVec1, i)), 1) && (((Entry2) = Vec_IntEntry(vVec2, i)), 1) && (((Entry3) = Vec_IntEntry(vVec3, i)), 1); i++ )
70#define Vec_IntForEachEntryTwoStart( vVec1, vVec2, Entry1, Entry2, i, Start ) \
71 for ( i = Start; (i < Vec_IntSize(vVec1)) && (((Entry1) = Vec_IntEntry(vVec1, i)), 1) && (((Entry2) = Vec_IntEntry(vVec2, i)), 1); i++ )
72#define Vec_IntForEachEntryDouble( vVec, Entry1, Entry2, i ) \
73 for ( i = 0; (i+1 < Vec_IntSize(vVec)) && (((Entry1) = Vec_IntEntry(vVec, i)), 1) && (((Entry2) = Vec_IntEntry(vVec, i+1)), 1); i += 2 )
74#define Vec_IntForEachEntryDoubleStart( vVec, Entry1, Entry2, i, Start ) \
75 for ( i = Start; (i+1 < Vec_IntSize(vVec)) && (((Entry1) = Vec_IntEntry(vVec, i)), 1) && (((Entry2) = Vec_IntEntry(vVec, i+1)), 1); i += 2 )
76#define Vec_IntForEachEntryTriple( vVec, Entry1, Entry2, Entry3, i ) \
77 for ( i = 0; (i+2 < Vec_IntSize(vVec)) && (((Entry1) = Vec_IntEntry(vVec, i)), 1) && (((Entry2) = Vec_IntEntry(vVec, i+1)), 1) && (((Entry3) = Vec_IntEntry(vVec, i+2)), 1); i += 3 )
78#define Vec_IntForEachEntryThisNext( vVec, This, Next, i ) \
79 for ( i = 0, (This) = (Next) = (Vec_IntSize(vVec) ? Vec_IntEntry(vVec, 0) : -1); (i+1 < Vec_IntSize(vVec)) && (((Next) = Vec_IntEntry(vVec, i+1)), 1); i += 2, (This) = (Next) )
80#define Vec_IntForEachEntryInVec( vVec2, vVec, Entry, i ) \
81 for ( i = 0; (i < Vec_IntSize(vVec)) && (((Entry) = Vec_IntEntry(vVec2, Vec_IntEntry(vVec, i))), 1); i++ )
98static inline Vec_Int_t * Vec_IntAlloc(
int nCap )
102 if ( nCap > 0 && nCap < 16 )
109static inline Vec_Int_t * Vec_IntAllocExact(
int nCap )
131static inline Vec_Int_t * Vec_IntStart(
int nSize )
134 p = Vec_IntAlloc( nSize );
136 if (
p->pArray )
memset(
p->pArray, 0,
sizeof(
int) * (
size_t)nSize );
139static inline Vec_Int_t * Vec_IntStartFull(
int nSize )
142 p = Vec_IntAlloc( nSize );
144 if (
p->pArray )
memset(
p->pArray, 0xff,
sizeof(
int) * (
size_t)nSize );
147static inline Vec_Int_t * Vec_IntStartRange(
int First,
int Range )
151 p = Vec_IntAlloc( Range );
153 for ( i = 0; i < Range; i++ )
154 p->pArray[i] = First + i;
157static inline Vec_Int_t * Vec_IntStartRandomLimit(
int nSize,
int Upper,
int Lower )
160 int i, Gap = Upper - Lower + 1;
161 for ( i = 0; i <
p->nSize; i++ )
165static inline void Vec_IntRandomizeOrder(
Vec_Int_t *
p )
168 for ( v = 0; v <
p->nSize; v++ )
171 ABC_SWAP(
int,
p->pArray[vRand],
p->pArray[v] );
186static inline Vec_Int_t * Vec_IntStartNatural(
int nSize )
190 p = Vec_IntAlloc( nSize );
192 for ( i = 0; i < nSize; i++ )
208static inline Vec_Int_t * Vec_IntAllocArray(
int * pArray,
int nSize )
229static inline Vec_Int_t * Vec_IntAllocArrayCopy(
int * pArray,
int nSize )
236 memcpy(
p->pArray, pArray,
sizeof(
int) * (
size_t)nSize );
255 p->nSize = pVec->nSize;
256 p->nCap = pVec->nSize;
258 memcpy(
p->pArray, pVec->pArray,
sizeof(
int) * (
size_t)pVec->nSize );
277 p->nSize = pVec->nSize;
278 p->nCap = pVec->nCap;
279 p->pArray = pVec->pArray;
297static inline void Vec_IntZero(
Vec_Int_t *
p )
303static inline void Vec_IntErase(
Vec_Int_t *
p )
309static inline void Vec_IntFree(
Vec_Int_t *
p )
326static inline void Vec_IntFreeP(
Vec_Int_t **
p )
345static inline int * Vec_IntReleaseArray(
Vec_Int_t *
p )
347 int * pArray =
p->pArray;
353static inline int * Vec_IntReleaseNewArray(
Vec_Int_t *
p )
356 pArray[0] =
p->nSize+1;
357 memcpy( pArray+1,
p->pArray,
sizeof(
int)*(
size_t)
p->nSize );
372static inline int * Vec_IntArray(
Vec_Int_t *
p )
376static inline int ** Vec_IntArrayP(
Vec_Int_t *
p )
380static inline int * Vec_IntLimit(
Vec_Int_t *
p )
382 return p->pArray +
p->nSize;
428static inline double Vec_IntMemory(
Vec_Int_t *
p )
430 return !
p ? 0.0 : 1.0 *
sizeof(int) * (
size_t)
p->nCap +
sizeof(
Vec_Int_t) ;
444static inline int Vec_IntEntry(
Vec_Int_t *
p,
int i )
446 assert( i >= 0 && i < p->nSize );
461static inline int * Vec_IntEntryP(
Vec_Int_t *
p,
int i )
463 assert( i >= 0 && i < p->nSize );
464 return p->pArray + i;
478static inline void Vec_IntWriteEntry(
Vec_Int_t *
p,
int i,
int Entry )
480 assert( i >= 0 && i < p->nSize );
481 p->pArray[i] = Entry;
495static inline int Vec_IntAddToEntry(
Vec_Int_t *
p,
int i,
int Addition )
497 assert( i >= 0 && i < p->nSize );
498 return p->pArray[i] += Addition;
512static inline void Vec_IntUpdateEntry(
Vec_Int_t *
p,
int i,
int Value )
514 if ( Vec_IntEntry(
p, i ) < Value )
515 Vec_IntWriteEntry(
p, i, Value );
517static inline void Vec_IntDowndateEntry(
Vec_Int_t *
p,
int i,
int Value )
519 if ( Vec_IntEntry(
p, i ) > Value )
520 Vec_IntWriteEntry(
p, i, Value );
534static inline int Vec_IntEntryLast(
Vec_Int_t *
p )
537 return p->pArray[
p->nSize-1];
551static inline void Vec_IntGrow(
Vec_Int_t *
p,
int nCapMin )
553 if (
p->nCap >= nCapMin )
572static inline void Vec_IntGrowResize(
Vec_Int_t *
p,
int nCapMin )
575 if (
p->nCap >= nCapMin )
593static inline void Vec_IntFill(
Vec_Int_t *
p,
int nSize,
int Fill )
596 Vec_IntGrow(
p, nSize );
597 for ( i = 0; i < nSize; i++ )
601static inline void Vec_IntFillTwo(
Vec_Int_t *
p,
int nSize,
int FillEven,
int FillOdd )
604 Vec_IntGrow(
p, nSize );
605 for ( i = 0; i < nSize; i++ )
606 p->pArray[i] = (i & 1) ? FillOdd : FillEven;
609static inline void Vec_IntFillNatural(
Vec_Int_t *
p,
int nSize )
612 Vec_IntGrow(
p, nSize );
613 for ( i = 0; i < nSize; i++ )
629static inline void Vec_IntFillExtra(
Vec_Int_t *
p,
int nSize,
int Fill )
632 if ( nSize <= p->nSize )
634 if ( nSize > 2 *
p->nCap )
635 Vec_IntGrow(
p, nSize );
636 else if ( nSize >
p->nCap )
638 for ( i =
p->nSize; i < nSize; i++ )
654static inline int Vec_IntGetEntry(
Vec_Int_t *
p,
int i )
656 Vec_IntFillExtra(
p, i + 1, 0 );
657 return Vec_IntEntry(
p, i );
659static inline int Vec_IntGetEntryFull(
Vec_Int_t *
p,
int i )
661 Vec_IntFillExtra(
p, i + 1, -1 );
662 return Vec_IntEntry(
p, i );
676static inline int * Vec_IntGetEntryP(
Vec_Int_t *
p,
int i )
678 Vec_IntFillExtra(
p, i + 1, 0 );
679 return Vec_IntEntryP(
p, i );
693static inline void Vec_IntSetEntry(
Vec_Int_t *
p,
int i,
int Entry )
695 Vec_IntFillExtra(
p, i + 1, 0 );
696 Vec_IntWriteEntry(
p, i, Entry );
698static inline void Vec_IntSetEntryFull(
Vec_Int_t *
p,
int i,
int Entry )
700 Vec_IntFillExtra(
p, i + 1, -1 );
701 Vec_IntWriteEntry(
p, i, Entry );
715static inline void Vec_IntShrink(
Vec_Int_t *
p,
int nSizeNew )
717 assert(
p->nSize >= nSizeNew );
732static inline void Vec_IntClear(
Vec_Int_t *
p )
748static inline void Vec_IntPush(
Vec_Int_t *
p,
int Entry )
750 if (
p->nSize ==
p->nCap )
753 Vec_IntGrow(
p, 16 );
757 p->pArray[
p->nSize++] = Entry;
759static inline int Vec_IntPushReturn(
Vec_Int_t *
p,
int Entry )
761 Vec_IntPush(
p, Entry );
764static inline void Vec_IntPushTwo(
Vec_Int_t *
p,
int Entry1,
int Entry2 )
766 Vec_IntPush(
p, Entry1 );
767 Vec_IntPush(
p, Entry2 );
769static inline void Vec_IntPushThree(
Vec_Int_t *
p,
int Entry1,
int Entry2,
int Entry3 )
771 Vec_IntPush(
p, Entry1 );
772 Vec_IntPush(
p, Entry2 );
773 Vec_IntPush(
p, Entry3 );
775static inline void Vec_IntPushFour(
Vec_Int_t *
p,
int Entry1,
int Entry2,
int Entry3,
int Entry4 )
777 Vec_IntPush(
p, Entry1 );
778 Vec_IntPush(
p, Entry2 );
779 Vec_IntPush(
p, Entry3 );
780 Vec_IntPush(
p, Entry4 );
782static inline void Vec_IntPushArray(
Vec_Int_t *
p,
int * pEntries,
int nEntries )
785 for ( i = 0; i < nEntries; i++ )
786 Vec_IntPush(
p, pEntries[i] );
788static inline void Vec_IntShift(
Vec_Int_t *
p,
int Shift )
806static inline void Vec_IntPushFirst(
Vec_Int_t *
p,
int Entry )
809 if (
p->nSize ==
p->nCap )
812 Vec_IntGrow(
p, 16 );
817 for ( i =
p->nSize - 1; i >= 1; i-- )
818 p->pArray[i] =
p->pArray[i-1];
819 p->pArray[0] = Entry;
833static inline void Vec_IntPushOrder(
Vec_Int_t *
p,
int Entry )
836 if (
p->nSize ==
p->nCap )
839 Vec_IntGrow(
p, 16 );
844 for ( i =
p->nSize-2; i >= 0; i-- )
845 if (
p->pArray[i] > Entry )
846 p->pArray[i+1] =
p->pArray[i];
849 p->pArray[i+1] = Entry;
854 if (
p->nSize ==
p->nCap )
857 Vec_IntGrow(
p, 16 );
862 for ( i =
p->nSize-2; i >= 0; i-- )
863 if ( Vec_IntEntry(vCost,
p->pArray[i]) > Vec_IntEntry(vCost, Entry) )
864 p->pArray[i+1] =
p->pArray[i];
867 p->pArray[i+1] = Entry;
881static inline int Vec_IntIsOrdered(
Vec_Int_t *
p,
int fReverse )
886 for ( i = 1; i <
p->nSize; i++ )
887 if (
p->pArray[i-1] <
p->pArray[i] )
892 for ( i = 1; i <
p->nSize; i++ )
893 if (
p->pArray[i-1] >
p->pArray[i] )
903 for ( i = 1; i <
p->nSize; i++ )
904 if ( Vec_IntEntry(vCost,
p->pArray[i-1]) < Vec_IntEntry(vCost,
p->pArray[i]) )
909 for ( i = 1; i <
p->nSize; i++ )
910 if ( Vec_IntEntry(vCost,
p->pArray[i-1]) > Vec_IntEntry(vCost,
p->pArray[i]) )
927static inline void Vec_IntPushOrderReverse(
Vec_Int_t *
p,
int Entry )
930 if (
p->nSize ==
p->nCap )
933 Vec_IntGrow(
p, 16 );
938 for ( i =
p->nSize-2; i >= 0; i-- )
939 if (
p->pArray[i] < Entry )
940 p->pArray[i+1] =
p->pArray[i];
943 p->pArray[i+1] = Entry;
957static inline int Vec_IntPushUniqueOrder(
Vec_Int_t *
p,
int Entry )
960 for ( i = 0; i <
p->nSize; i++ )
961 if (
p->pArray[i] == Entry )
963 Vec_IntPushOrder(
p, Entry );
969 for ( i = 0; i <
p->nSize; i++ )
970 if (
p->pArray[i] == Entry )
972 Vec_IntPushOrderCost(
p, Entry, vCost );
987static inline int Vec_IntPushUnique(
Vec_Int_t *
p,
int Entry )
990 for ( i = 0; i <
p->nSize; i++ )
991 if (
p->pArray[i] == Entry )
993 Vec_IntPush(
p, Entry );
1014 if (
p->nSize >
p->nCap )
1019 return ((
unsigned *)
p->pArray) +
p->nSize -
nWords;
1036 return p->pArray[--
p->nSize];
1050static inline int Vec_IntFind(
Vec_Int_t *
p,
int Entry )
1053 for ( i = 0; i <
p->nSize; i++ )
1054 if (
p->pArray[i] == Entry )
1070static inline int Vec_IntRemove(
Vec_Int_t *
p,
int Entry )
1073 for ( i = 0; i <
p->nSize; i++ )
1074 if (
p->pArray[i] == Entry )
1076 if ( i ==
p->nSize )
1079 for ( i++; i <
p->nSize; i++ )
1080 p->pArray[i-1] =
p->pArray[i];
1084static inline int Vec_IntRemove1(
Vec_Int_t *
p,
int Entry )
1087 for ( i = 1; i <
p->nSize; i++ )
1088 if (
p->pArray[i] == Entry )
1090 if ( i >=
p->nSize )
1093 for ( i++; i <
p->nSize; i++ )
1094 p->pArray[i-1] =
p->pArray[i];
1110static inline void Vec_IntDrop(
Vec_Int_t *
p,
int i )
1113 assert( i >= 0 && i < Vec_IntSize(
p) );
1115 for ( k = i; k <
p->nSize; k++ )
1116 p->pArray[k] =
p->pArray[k+1];
1130static inline void Vec_IntInsert(
Vec_Int_t *
p,
int iHere,
int Entry )
1133 assert( iHere >= 0 && iHere <= p->nSize );
1134 Vec_IntPush(
p, 0 );
1135 for ( i =
p->nSize - 1; i > iHere; i-- )
1136 p->pArray[i] =
p->pArray[i-1];
1137 p->pArray[i] = Entry;
1151static inline int Vec_IntFindMax(
Vec_Int_t *
p )
1154 if (
p->nSize == 0 )
1156 Best =
p->pArray[0];
1157 for ( i = 1; i <
p->nSize; i++ )
1158 if ( Best < p->pArray[i] )
1159 Best =
p->pArray[i];
1162static inline int Vec_IntArgMax(
Vec_Int_t *
p )
1164 int i, Best, Arg = 0;
1165 if (
p->nSize == 0 )
1167 Best =
p->pArray[0];
1168 for ( i = 1; i <
p->nSize; i++ )
1169 if ( Best < p->pArray[i] )
1170 Best =
p->pArray[i], Arg = i;
1185static inline int Vec_IntFindMin(
Vec_Int_t *
p )
1188 if (
p->nSize == 0 )
1190 Best =
p->pArray[0];
1191 for ( i = 1; i <
p->nSize; i++ )
1192 if ( Best >
p->pArray[i] )
1193 Best =
p->pArray[i];
1196static inline int Vec_IntArgMin(
Vec_Int_t *
p )
1198 int i, Best, Arg = 0;
1199 if (
p->nSize == 0 )
1201 Best =
p->pArray[0];
1202 for ( i = 1; i <
p->nSize; i++ )
1203 if ( Best >
p->pArray[i] )
1204 Best =
p->pArray[i], Arg = i;
1219static inline void Vec_IntReverseOrder(
Vec_Int_t *
p )
1222 for ( i = 0; i <
p->nSize/2; i++ )
1224 Temp =
p->pArray[i];
1225 p->pArray[i] =
p->pArray[
p->nSize-1-i];
1226 p->pArray[
p->nSize-1-i] = Temp;
1241static inline void Vec_IntRemoveOdd(
Vec_Int_t *
p )
1244 assert( (
p->nSize & 1) == 0 );
1246 for ( i = 0; i <
p->nSize; i++ )
1247 p->pArray[i] =
p->pArray[2*i];
1249static inline void Vec_IntRemoveEven(
Vec_Int_t *
p )
1252 assert( (
p->nSize & 1) == 0 );
1254 for ( i = 0; i <
p->nSize; i++ )
1255 p->pArray[i] =
p->pArray[2*i+1];
1273 if ( Vec_IntSize(
p) == 0 )
1275 Vec_IntFill( vRes, Vec_IntFindMax(
p) + 1, Fill );
1277 if ( Entry != Fill )
1278 Vec_IntWriteEntry( vRes, Entry, i );
1296 Vec_Int_t * vRes = Vec_IntAlloc( Vec_IntSize(
p) );
1298 if ( Entry != Fill )
1299 Vec_IntPush( vRes, Entry );
1317 for ( i = 0; i <
p->nSize; i++ )
1318 Counter +=
p->pArray[i];
1333static inline int Vec_IntCountEntry(
Vec_Int_t *
p,
int Entry )
1336 for ( i = 0; i <
p->nSize; i++ )
1337 Counter += (
p->pArray[i] == Entry);
1340static inline int Vec_IntCountLarger(
Vec_Int_t *
p,
int Entry )
1343 for ( i = 0; i <
p->nSize; i++ )
1344 Counter += (
p->pArray[i] > Entry);
1347static inline int Vec_IntCountSmaller(
Vec_Int_t *
p,
int Entry )
1350 for ( i = 0; i <
p->nSize; i++ )
1351 Counter += (
p->pArray[i] < Entry);
1366static inline int Vec_IntCountPositive(
Vec_Int_t *
p )
1369 for ( i = 0; i <
p->nSize; i++ )
1370 Counter += (
p->pArray[i] > 0);
1373static inline int Vec_IntCountZero(
Vec_Int_t *
p )
1376 for ( i = 0; i <
p->nSize; i++ )
1377 Counter += (
p->pArray[i] == 0);
1392static inline int Vec_IntAddPositive(
Vec_Int_t *
p )
1395 for ( i = 0; i <
p->nSize; i++ )
1396 if (
p->pArray[i] > 0 )
1397 Counter +=
p->pArray[i];
1415 if ( p1->nSize != p2->nSize )
1417 for ( i = 0; i < p1->nSize; i++ )
1418 if ( p1->pArray[i] != p2->pArray[i] )
1425 for ( i = 0; i < pSmall->nSize; i++ )
1427 for ( k = 0; k < pLarge->nSize; k++ )
1428 if ( pSmall->pArray[i] == pLarge->pArray[k] )
1430 if ( k == pLarge->nSize )
1451 int Entry, i, Counter = 0;
1452 if ( Vec_IntSize(p1) < Vec_IntSize(p2) )
1453 vTemp = p1, p1 = p2, p2 = vTemp;
1454 assert( Vec_IntSize(p1) >= Vec_IntSize(p2) );
1455 vTemp = Vec_IntInvert( p2, -1 );
1456 Vec_IntFillExtra( vTemp, Vec_IntFindMax(p1) + 1, -1 );
1458 if ( Vec_IntEntry(vTemp, Entry) >= 0 )
1460 Vec_IntFree( vTemp );
1475static int Vec_IntSortCompare1(
int * pp1,
int * pp2 )
1496static int Vec_IntSortCompare2(
int * pp1,
int * pp2 )
1517static inline void Vec_IntSort(
Vec_Int_t *
p,
int fReverse )
1520 qsort( (
void *)
p->pArray, (
size_t)
p->nSize,
sizeof(
int),
1521 (int (*)(
const void *,
const void *)) Vec_IntSortCompare2 );
1523 qsort( (
void *)
p->pArray, (
size_t)
p->nSize,
sizeof(
int),
1524 (int (*)(
const void *,
const void *)) Vec_IntSortCompare1 );
1526static inline void Vec_IntSortMulti(
Vec_Int_t *
p,
int nMulti,
int fReverse )
1528 assert( Vec_IntSize(
p) % nMulti == 0 );
1530 qsort( (
void *)
p->pArray, (
size_t)(
p->nSize/nMulti), nMulti*
sizeof(
int),
1531 (int (*)(
const void *,
const void *)) Vec_IntSortCompare2 );
1533 qsort( (
void *)
p->pArray, (
size_t)(
p->nSize/nMulti), nMulti*
sizeof(
int),
1534 (int (*)(
const void *,
const void *)) Vec_IntSortCompare1 );
1536static inline int Vec_IntIsSorted(
Vec_Int_t *
p,
int fReverse )
1539 for ( i = 1; i <
p->nSize; i++ )
1540 if ( fReverse ? (
p->pArray[i-1] <
p->pArray[i]) : (
p->pArray[i-1] >
p->pArray[i]) )
1556static inline int Vec_IntUniqify(
Vec_Int_t *
p )
1561 Vec_IntSort(
p, 0 );
1562 for ( i = k = 1; i <
p->nSize; i++ )
1563 if (
p->pArray[i] !=
p->pArray[i-1] )
1564 p->pArray[k++] =
p->pArray[i];
1565 RetValue =
p->nSize - k;
1569static inline int Vec_IntCountDuplicates(
Vec_Int_t *
p )
1573 Vec_IntUniqify( pDup );
1574 RetValue = Vec_IntSize(
p) - Vec_IntSize(pDup);
1575 Vec_IntFree( pDup );
1578static inline int Vec_IntCheckUniqueSmall(
Vec_Int_t *
p )
1581 for ( i = 0; i <
p->nSize; i++ )
1582 for ( k = i+1; k <
p->nSize; k++ )
1583 if (
p->pArray[i] ==
p->pArray[k] )
1587static inline int Vec_IntCountUnique(
Vec_Int_t *
p )
1589 int i, Count = 0, Max = Vec_IntFindMax(
p);
1590 unsigned char * pPres =
ABC_CALLOC(
unsigned char, Max+1 );
1591 for ( i = 0; i <
p->nSize; i++ )
1592 if ( pPres[
p->pArray[i]] == 0 )
1593 pPres[
p->pArray[i]] = 1, Count++;
1609static inline int Vec_IntUniqifyPairs(
Vec_Int_t *
p )
1615 Vec_IntSortMulti(
p, 2, 0 );
1616 for ( i = k = 1; i <
p->nSize/2; i++ )
1617 if (
p->pArray[2*i] !=
p->pArray[2*(i-1)] ||
p->pArray[2*i+1] !=
p->pArray[2*(i-1)+1] )
1619 p->pArray[2*k] =
p->pArray[2*i];
1620 p->pArray[2*k+1] =
p->pArray[2*i+1];
1623 RetValue =
p->nSize/2 - k;
1639static inline unsigned Vec_IntUniqueHashKeyDebug(
unsigned char * pStr,
int nChars,
int TableMask )
1641 static unsigned s_BigPrimes[4] = {12582917, 25165843, 50331653, 100663319};
1642 unsigned Key = 0;
int c;
1643 for ( c = 0; c < nChars; c++ )
1645 Key += (unsigned)pStr[c] * s_BigPrimes[c & 3];
1646 printf(
"%d : ", c );
1647 printf(
"%3d ", pStr[c] );
1648 printf(
"%12u ", Key );
1649 printf(
"%12u ", Key&TableMask );
1654static inline void Vec_IntUniqueProfile(
Vec_Int_t * vData,
int * pTable,
int * pNexts,
int TableMask,
int nIntSize )
1656 int i, Key, Counter;
1657 for ( i = 0; i <= TableMask; i++ )
1660 for ( Key = pTable[i]; Key != -1; Key = pNexts[Key] )
1664 printf(
"%d\n", Counter );
1665 for ( Key = pTable[i]; Key != -1; Key = pNexts[Key] )
1674static inline unsigned Vec_IntUniqueHashKey2(
unsigned char * pStr,
int nChars )
1676 static unsigned s_BigPrimes[4] = {12582917, 25165843, 50331653, 100663319};
1677 unsigned Key = 0;
int c;
1678 for ( c = 0; c < nChars; c++ )
1679 Key += (
unsigned)pStr[c] * s_BigPrimes[c & 3];
1683static inline unsigned Vec_IntUniqueHashKey(
unsigned char * pStr,
int nChars )
1685 static unsigned s_BigPrimes[16] =
1687 0x984b6ad9,0x18a6eed3,0x950353e2,0x6222f6eb,0xdfbedd47,0xef0f9023,0xac932a26,0x590eaf55,
1688 0x97d0a034,0xdc36cd2e,0x22736b37,0xdc9066b0,0x2eb2f98b,0x5d9c7baf,0x85747c9e,0x8aca1055
1690 static unsigned s_BigPrimes2[16] =
1692 0x8d8a5ebe,0x1e6a15dc,0x197d49db,0x5bab9c89,0x4b55dea7,0x55dede49,0x9a6a8080,0xe5e51035,
1693 0xe148d658,0x8a17eb3b,0xe22e4b38,0xe5be2a9a,0xbe938cbb,0x3b981069,0x7f9c0c8e,0xf756df10
1695 unsigned Key = 0;
int c;
1696 for ( c = 0; c < nChars; c++ )
1697 Key += s_BigPrimes2[(2*c)&15] * s_BigPrimes[(unsigned)pStr[c] & 15] +
1698 s_BigPrimes2[(2*c+1)&15] * s_BigPrimes[(unsigned)pStr[c] >> 4];
1701static inline int * Vec_IntUniqueLookup(
Vec_Int_t * vData,
int i,
int nIntSize,
int * pNexts,
int * pStart )
1703 int * pData = Vec_IntEntryP( vData, i*nIntSize );
1704 for ( ; *pStart != -1; pStart = pNexts + *pStart )
1705 if ( !
memcmp( pData, Vec_IntEntryP(vData, *pStart*nIntSize),
sizeof(
int) * (
size_t)nIntSize ) )
1709static inline int Vec_IntUniqueCount(
Vec_Int_t * vData,
int nIntSize,
Vec_Int_t ** pvMap )
1711 int nEntries = Vec_IntSize(vData) / nIntSize;
1712 int TableMask = (1 << Abc_Base2Log(nEntries)) - 1;
1713 int * pTable =
ABC_FALLOC(
int, TableMask+1 );
1714 int * pNexts =
ABC_FALLOC(
int, TableMask+1 );
1715 int * pClass =
ABC_ALLOC(
int, nEntries );
1716 int i, Key, * pEnt, nUnique = 0;
1717 assert( nEntries * nIntSize == Vec_IntSize(vData) );
1718 for ( i = 0; i < nEntries; i++ )
1720 pEnt = Vec_IntEntryP( vData, i*nIntSize );
1721 Key = TableMask & Vec_IntUniqueHashKey( (
unsigned char *)pEnt, 4*nIntSize );
1722 pEnt = Vec_IntUniqueLookup( vData, i, nIntSize, pNexts, pTable+Key );
1724 *pEnt = i, nUnique++;
1731 *pvMap = Vec_IntAllocArray( pClass, nEntries );
1739 int i, Ent, nUnique = Vec_IntUniqueCount( vData, nIntSize, &vMap );
1740 vUnique = Vec_IntAlloc( nUnique * nIntSize );
1743 if ( Ent < i )
continue;
1745 Vec_IntPushArray( vUnique, Vec_IntEntryP(vData, i*nIntSize), nIntSize );
1747 assert( Vec_IntSize(vUnique) == nUnique * nIntSize );
1748 Vec_IntFree( vMap );
1763static inline int Vec_IntSortCompareUnsigned(
unsigned * pp1,
unsigned * pp2 )
1783static inline void Vec_IntSortUnsigned(
Vec_Int_t *
p )
1785 qsort( (
void *)
p->pArray, (
size_t)
p->nSize,
sizeof(
int),
1786 (int (*)(
const void *,
const void *)) Vec_IntSortCompareUnsigned );
1802 int * pBeg1 = vArr1->pArray;
1803 int * pBeg2 = vArr2->pArray;
1804 int * pEnd1 = vArr1->pArray + vArr1->nSize;
1805 int * pEnd2 = vArr2->pArray + vArr2->nSize;
1807 while ( pBeg1 < pEnd1 && pBeg2 < pEnd2 )
1809 if ( *pBeg1 == *pBeg2 )
1810 pBeg1++, pBeg2++, Counter++;
1811 else if ( *pBeg1 < *pBeg2 )
1832 int * pBeg1 = vArr1->pArray;
1833 int * pBeg2 = vArr2->pArray;
1834 int * pEnd1 = vArr1->pArray + vArr1->nSize;
1835 int * pEnd2 = vArr2->pArray + vArr2->nSize;
1836 Vec_IntClear( vArr );
1837 while ( pBeg1 < pEnd1 && pBeg2 < pEnd2 )
1839 if ( *pBeg1 == *pBeg2 )
1840 Vec_IntPush( vArr, *pBeg1 ), pBeg1++, pBeg2++;
1841 else if ( *pBeg1 < *pBeg2 )
1846 return Vec_IntSize(vArr);
1850 int * pBeg1 = vArr1->pArray;
1851 int * pBeg2 = vArr2->pArray;
1852 int * pEnd1 = vArr1->pArray + vArr1->nSize;
1853 int * pEnd2 = vArr2->pArray + vArr2->nSize;
1854 Vec_IntClear( vArr );
1855 while ( pBeg1 < pEnd1 && pBeg2 < pEnd2 )
1857 if ( *pBeg1 == *pBeg2 )
1858 Vec_IntPush( vArr, *pBeg1 ), pBeg1++, pBeg2++;
1859 else if ( *pBeg1 > *pBeg2 )
1864 return Vec_IntSize(vArr);
1880 int * pBeg1 = vArr1->pArray;
1881 int * pBeg2 = vArr2->pArray;
1882 int * pEnd1 = vArr1->pArray + vArr1->nSize;
1883 int * pEnd2 = vArr2->pArray + vArr2->nSize;
1884 int * pBeg1New = vArr1->pArray;
1885 int * pBeg2New = vArr2->pArray;
1886 Vec_IntClear( vArr );
1887 while ( pBeg1 < pEnd1 && pBeg2 < pEnd2 )
1889 if ( *pBeg1 == *pBeg2 )
1890 Vec_IntPush( vArr, *pBeg1 ), pBeg1++, pBeg2++;
1891 else if ( *pBeg1 < *pBeg2 )
1892 *pBeg1New++ = *pBeg1++;
1894 *pBeg2New++ = *pBeg2++;
1896 while ( pBeg1 < pEnd1 )
1897 *pBeg1New++ = *pBeg1++;
1898 while ( pBeg2 < pEnd2 )
1899 *pBeg2New++ = *pBeg2++;
1900 Vec_IntShrink( vArr1, pBeg1New - vArr1->pArray );
1901 Vec_IntShrink( vArr2, pBeg2New - vArr2->pArray );
1902 return Vec_IntSize(vArr);
1918 int * pBeg1 = vArr1->pArray;
1919 int * pBeg2 = vArr2->pArray;
1920 int * pEnd1 = vArr1->pArray + vArr1->nSize;
1921 int * pEnd2 = vArr2->pArray + vArr2->nSize;
1922 int * pBeg1New = vArr1->pArray;
1923 while ( pBeg1 < pEnd1 && pBeg2 < pEnd2 )
1925 if ( *pBeg1 == *pBeg2 )
1927 else if ( *pBeg1 < *pBeg2 )
1928 *pBeg1New++ = *pBeg1++;
1932 while ( pBeg1 < pEnd1 )
1933 *pBeg1New++ = *pBeg1++;
1934 Vec_IntShrink( vArr1, pBeg1New - vArr1->pArray );
1935 return Vec_IntSize(vArr1);
1951 int * pBeg = vArr1->pArray;
1952 int * pBeg1 = vArr1->pArray;
1953 int * pBeg2 = vArr2->pArray;
1954 int * pEnd1 = vArr1->pArray + vArr1->nSize;
1955 int * pEnd2 = vArr2->pArray + vArr2->nSize;
1956 while ( pBeg1 < pEnd1 && pBeg2 < pEnd2 )
1958 if ( *pBeg1 == *pBeg2 )
1959 *pBeg++ = *pBeg1++, pBeg2++;
1960 else if ( *pBeg1 < *pBeg2 )
1965 assert( vArr1->nSize >= pBeg - vArr1->pArray );
1966 vArr1->nSize = pBeg - vArr1->pArray;
1982 int * pBeg = vArr1->pArray;
1983 int * pBeg1 = vArr1->pArray;
1984 int * pBeg2 = vArr2->pArray;
1985 int * pEnd1 = vArr1->pArray + vArr1->nSize;
1986 int * pEnd2 = vArr2->pArray + vArr2->nSize;
1987 while ( pBeg1 < pEnd1 && pBeg2 < pEnd2 )
1989 if ( *pBeg1 == *pBeg2 )
1991 else if ( *pBeg1 < *pBeg2 )
1996 while ( pBeg1 < pEnd1 )
1998 assert( vArr1->nSize >= pBeg - vArr1->pArray );
1999 vArr1->nSize = pBeg - vArr1->pArray;
2015 int * pBeg = vArr->pArray;
2016 int * pBeg1 = vArr1->pArray;
2017 int * pBeg2 = vArr2->pArray;
2018 int * pEnd1 = vArr1->pArray + vArr1->nSize;
2019 int * pEnd2 = vArr2->pArray + vArr2->nSize;
2020 while ( pBeg1 < pEnd1 && pBeg2 < pEnd2 )
2022 if ( *pBeg1 == *pBeg2 )
2023 *pBeg++ = *pBeg1++, pBeg2++;
2024 else if ( *pBeg1 < *pBeg2 )
2029 while ( pBeg1 < pEnd1 )
2031 while ( pBeg2 < pEnd2 )
2033 vArr->nSize = pBeg - vArr->pArray;
2034 assert( vArr->nSize <= vArr->nCap );
2035 assert( vArr->nSize >= vArr1->nSize );
2036 assert( vArr->nSize >= vArr2->nSize );
2040 Vec_Int_t * vArr = Vec_IntAlloc( vArr1->nSize + vArr2->nSize );
2041 Vec_IntTwoMerge2Int( vArr1, vArr2, vArr );
2046 Vec_IntGrow( vArr, Vec_IntSize(vArr1) + Vec_IntSize(vArr2) );
2047 Vec_IntTwoMerge2Int( vArr1, vArr2, vArr );
2063 int * pBeg1 = vArr1->pArray;
2064 int * pBeg2 = vArr2->pArray;
2065 int * pEnd1 = vArr1->pArray + vArr1->nSize;
2066 int * pEnd2 = vArr2->pArray + vArr2->nSize;
2067 while ( pBeg1 < pEnd1 && pBeg2 < pEnd2 )
2069 if ( *pBeg1 == *pBeg2 )
2070 Vec_IntPush( vArr, *pBeg1++ ), pBeg2++;
2071 else if ( *pBeg1 < *pBeg2 )
2072 Vec_IntPush( vArr1n, *pBeg1++ );
2074 Vec_IntPush( vArr2n, *pBeg2++ );
2076 while ( pBeg1 < pEnd1 )
2077 Vec_IntPush( vArr1n, *pBeg1++ );
2078 while ( pBeg2 < pEnd2 )
2079 Vec_IntPush( vArr2n, *pBeg2++ );
2094static inline void Vec_IntSelectSort(
int * pArray,
int nSize )
2096 int temp, i, j, best_i;
2097 for ( i = 0; i < nSize-1; i++ )
2100 for ( j = i+1; j < nSize; j++ )
2101 if ( pArray[j] < pArray[best_i] )
2104 pArray[i] = pArray[best_i];
2105 pArray[best_i] = temp;
2108static inline void Vec_IntSelectSortReverse(
int * pArray,
int nSize )
2110 int temp, i, j, best_i;
2111 for ( i = 0; i < nSize-1; i++ )
2114 for ( j = i+1; j < nSize; j++ )
2115 if ( pArray[j] > pArray[best_i] )
2118 pArray[i] = pArray[best_i];
2119 pArray[best_i] = temp;
2134static inline void Vec_IntSelectSortCost(
int * pArray,
int nSize,
Vec_Int_t * vCosts )
2137 for ( i = 0; i < nSize-1; i++ )
2140 for ( j = i+1; j < nSize; j++ )
2141 if ( Vec_IntEntry(vCosts, pArray[j]) < Vec_IntEntry(vCosts, pArray[best_i]) )
2143 ABC_SWAP(
int, pArray[i], pArray[best_i] );
2146static inline void Vec_IntSelectSortCostReverse(
int * pArray,
int nSize,
Vec_Int_t * vCosts )
2149 for ( i = 0; i < nSize-1; i++ )
2152 for ( j = i+1; j < nSize; j++ )
2153 if ( Vec_IntEntry(vCosts, pArray[j]) > Vec_IntEntry(vCosts, pArray[best_i]) )
2155 ABC_SWAP(
int, pArray[i], pArray[best_i] );
2159static inline void Vec_IntSelectSortCost2(
int * pArray,
int nSize,
int * pCosts )
2162 for ( i = 0; i < nSize-1; i++ )
2165 for ( j = i+1; j < nSize; j++ )
2166 if ( pCosts[j] < pCosts[best_i] )
2168 ABC_SWAP(
int, pArray[i], pArray[best_i] );
2169 ABC_SWAP(
int, pCosts[i], pCosts[best_i] );
2172static inline void Vec_IntSelectSortCost2Reverse(
int * pArray,
int nSize,
int * pCosts )
2175 for ( i = 0; i < nSize-1; i++ )
2178 for ( j = i+1; j < nSize; j++ )
2179 if ( pCosts[j] > pCosts[best_i] )
2181 ABC_SWAP(
int, pArray[i], pArray[best_i] );
2182 ABC_SWAP(
int, pCosts[i], pCosts[best_i] );
2197static inline void Vec_IntPrint(
Vec_Int_t * vVec )
2200 printf(
"Vector has %d entries: {", Vec_IntSize(vVec) );
2202 printf(
" %d", Entry );
2205static inline void Vec_IntPrintBinary(
Vec_Int_t * vVec )
2209 printf(
"%d", (
int)(Entry != 0) );
2225 if ( p1 == NULL || p2 == NULL )
2226 return (p1 != NULL) - (p2 != NULL);
2227 if ( Vec_IntSize(p1) != Vec_IntSize(p2) )
2228 return Vec_IntSize(p1) - Vec_IntSize(p2);
2229 return memcmp( Vec_IntArray(p1), Vec_IntArray(p2),
sizeof(
int)*(
size_t)Vec_IntSize(p1) );
2246 Vec_IntClear( vVec1 );
2248 Vec_IntPush( vVec1, Entry );
2254 Vec_IntPush( vVec1, Entry );
2256static inline void Vec_IntAppendSkip(
Vec_Int_t * vVec1,
Vec_Int_t * vVec2,
int iVar )
2261 Vec_IntPush( vVec1, Entry );
2263static inline void Vec_IntAppendMinus(
Vec_Int_t * vVec1,
Vec_Int_t * vVec2,
int fMinus )
2266 Vec_IntClear( vVec1 );
2268 Vec_IntPush( vVec1, fMinus ? -Entry : Entry );
2285 if ( Vec_IntSize(vOld) == 0 )
2287 Vec_IntFill( vNew, nNew, 0 );
2289 if ( iNew > 0 && iNew < nNew && iOld < Vec_IntSize(vOld) && Vec_IntEntry(vOld, iOld) != 0 )
2290 Vec_IntWriteEntry( vNew, iNew, Vec_IntEntry(vOld, iOld) );
2304static inline void Vec_IntDumpBin(
char * pFileName,
Vec_Int_t *
p,
int fVerbose )
2307 FILE * pFile = fopen( pFileName,
"wb" );
2308 if ( pFile == NULL )
2310 printf(
"Cannot open file \"%s\" for writing.\n", pFileName );
2313 RetValue = fwrite( Vec_IntArray(
p), 1,
sizeof(
int)*Vec_IntSize(
p), pFile );
2315 if ( RetValue != (
int)
sizeof(
int)*Vec_IntSize(
p) )
2316 printf(
"Error reading data from file.\n" );
2318 printf(
"Written %d integers into file \"%s\".\n", Vec_IntSize(
p), pFileName );
2320static inline Vec_Int_t * Vec_IntReadBin(
char * pFileName,
int fVerbose )
2323 FILE * pFile = fopen( pFileName,
"rb" );
2324 if ( pFile == NULL )
2326 printf(
"Cannot open file \"%s\" for reading.\n", pFileName );
2330 nSize = ftell( pFile );
2333 printf(
"The input file is empty.\n" );
2337 if ( nSize %
sizeof(
int) > 0 )
2339 printf(
"Cannot read file with integers because it is not aligned at 4 bytes (remainder = %d).\n", (
int)(nSize %
sizeof(
int)) );
2344 p = Vec_IntStart( (
int)(nSize/
sizeof(
int)) );
2345 RetValue = fread( Vec_IntArray(
p), 1, nSize, pFile );
2347 if ( RetValue != nSize )
2348 printf(
"Error reading data from file.\n" );
2350 printf(
"Read %d integers from file \"%s\".\n", (
int)(nSize/
sizeof(
int)), pFileName );
#define ABC_SWAP(Type, a, b)
#define ABC_FALLOC(type, num)
#define ABC_ALLOC(type, num)
#define ABC_REALLOC(type, obj, num)
unsigned Abc_Random(int fReset)
#define ABC_CALLOC(type, num)
#define ABC_NAMESPACE_HEADER_END
#define ABC_NAMESPACE_HEADER_START
NAMESPACES ///.
typedefABC_NAMESPACE_IMPL_START struct Vec_Int_t_ Vec_Int_t
DECLARATIONS ///.
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.