21#ifndef ABC__misc__vec__vecHsh_h
22#define ABC__misc__vec__vecHsh_h
102static inline unsigned * Hsh_IntData(
Hsh_IntMan_t *
p,
int iData ) {
return (
unsigned *)Vec_IntEntryP(
p->vData,
p->nSize * iData ); }
123static inline Hsh_Int1Man_t * Hsh_Int1ManStart(
int nEntries )
127 p->vData = Vec_IntAlloc( nEntries );
128 p->vNext = Vec_IntAlloc( nEntries );
129 p->vTable = Vec_IntStartFull( Abc_PrimeCudd(nEntries) );
134 Vec_IntFree(
p->vData );
135 Vec_IntFree(
p->vNext );
136 Vec_IntFree(
p->vTable );
141 return Vec_IntSize(
p->vData);
157static inline int Hsh_Int1ManHash(
int Data,
int nTableSize )
159 unsigned i, hash = 0;
160 unsigned char * pDataC = (
unsigned char *)&Data;
161 for ( i = 0; i < 4; i++ )
170 return (
int)(hash % nTableSize);
172static inline int * Hsh_Int1ManLookupInt(
Hsh_Int1Man_t *
p,
int Data )
174 int Item, * pPlace = Vec_IntEntryP(
p->vTable, Hsh_Int1ManHash(Data, Vec_IntSize(
p->vTable)) );
175 for ( Item = *pPlace; Item >= 0; Item = Vec_IntEntry(
p->vNext, Item) )
176 if ( Vec_IntEntry(
p->vData, Item) == (
int)Data )
183 return *Hsh_Int1ManLookupInt(
p, Data);
187 int i, Entry, * pPlace;
188 if ( Vec_IntSize(
p->vData) > Vec_IntSize(
p->vTable) )
190 Vec_IntFill(
p->vTable, Abc_PrimeCudd(2*Vec_IntSize(
p->vTable)), -1 );
193 pPlace = Vec_IntEntryP(
p->vTable, Hsh_Int1ManHash(Entry, Vec_IntSize(
p->vTable)) );
194 Vec_IntWriteEntry(
p->vNext, i, *pPlace ); *pPlace = i;
197 pPlace = Hsh_Int1ManLookupInt(
p, Data );
200 *pPlace = Vec_IntSize(
p->vData);
201 Vec_IntPush(
p->vData, Data );
202 Vec_IntPush(
p->vNext, -1 );
218static inline void Hsh_Int1ManHashArrayTest()
222 printf(
"Entry = %d. Hashed = %d.\n", 5, Hsh_Int1ManAdd(
p, 5 ) );
223 printf(
"Entry = %d. Hashed = %d.\n", 7, Hsh_Int1ManAdd(
p, 7 ) );
224 printf(
"Entry = %d. Hashed = %d.\n", 7, Hsh_Int1ManAdd(
p, 7 ) );
225 printf(
"Entry = %d. Hashed = %d.\n", 7, Hsh_Int1ManAdd(
p, 7 ) );
226 printf(
"Entry = %d. Hashed = %d.\n", 8, Hsh_Int1ManAdd(
p, 8 ) );
227 printf(
"Entry = %d. Hashed = %d.\n", 5, Hsh_Int1ManAdd(
p, 5 ) );
228 printf(
"Entry = %d. Hashed = %d.\n", 3, Hsh_Int1ManAdd(
p, 3 ) );
229 printf(
"Entry = %d. Hashed = %d.\n", 4, Hsh_Int1ManAdd(
p, 4 ) );
231 printf(
"Size = %d.\n", Hsh_Int1ManEntryNum(
p) );
233 Hsh_Int1ManStop(
p );
254 p->vTable = Vec_IntStartFull( Abc_PrimeCudd(nEntries) );
255 p->vObjs = Vec_WrdAlloc( nEntries );
260 Vec_IntFree(
p->vTable );
261 Vec_WrdFree(
p->vObjs );
266 return Vec_WrdSize(
p->vObjs);
281static inline int Hsh_IntManHash(
unsigned * pData,
int nSize,
int nTableSize )
283 int i = 0;
unsigned hash = 0;
284 unsigned char * pDataC = (
unsigned char *)pData;
295 return (
int)(hash % nTableSize);
297static inline int Hsh_IntManHash2(
unsigned * pData,
int nSize,
int nTableSize )
299 static int s_Primes[7] = { 4177, 5147, 5647, 6343, 7103, 7873, 8147 };
300 unsigned char * pDataC = (
unsigned char *)pData;
301 int c, nChars = nSize * 4;
303 for ( c = 0; c < nChars; c++ )
304 Key += pDataC[c] * s_Primes[c % 7];
305 return (
int)(Key % nTableSize);
307static inline int * Hsh_IntManLookup(
Hsh_IntMan_t *
p,
unsigned * pData )
310 int * pPlace = Vec_IntEntryP(
p->vTable, Hsh_IntManHash(pData,
p->nSize, Vec_IntSize(
p->vTable)) );
311 for ( ; (pObj = Hsh_IntObj(
p, *pPlace)); pPlace = &pObj->
iNext )
312 if ( !
memcmp( pData, Hsh_IntData(
p, pObj->
iData),
sizeof(
int) * (
size_t)
p->nSize ) )
317static inline int Hsh_IntManAdd(
Hsh_IntMan_t *
p,
int iData )
320 if ( Vec_WrdSize(
p->vObjs) > Vec_IntSize(
p->vTable) )
322 Vec_IntFill(
p->vTable, Abc_PrimeCudd(2*Vec_IntSize(
p->vTable)), -1 );
323 for ( i = 0; i < Vec_WrdSize(
p->vObjs); i++ )
325 pPlace = Vec_IntEntryP(
p->vTable, Hsh_IntManHash(Hsh_IntData(
p, Hsh_IntObj(
p, i)->iData),
p->nSize, Vec_IntSize(
p->vTable)) );
326 Hsh_IntObj(
p, i)->iNext = *pPlace; *pPlace = i;
329 pPlace = Hsh_IntManLookup(
p, Hsh_IntData(
p, iData) );
332 *pPlace = Vec_WrdSize(
p->vObjs);
333 Vec_WrdPush(
p->vObjs, Hsh_IntWord(iData, -1) );
334 return Vec_WrdSize(
p->vObjs) - 1;
336 return (
word *)Hsh_IntObj(
p, *pPlace) - Vec_WrdArray(
p->vObjs);
355 int i, nEntries = Vec_IntSize(vData) / nSize;
356 assert( Vec_IntSize(vData) % nSize == 0 );
357 p = Hsh_IntManStart( vData, nSize, nEntries );
358 for ( i = 0; i < nEntries; i++ )
359 Vec_IntPush( vRes, Hsh_IntManAdd(
p, i) );
366 Vec_Int_t Data = { 2*Vec_WrdCap(vDataW), 2*Vec_WrdSize(vDataW), (
int *)Vec_WrdArray(vDataW) };
369 int i, nEntries = Vec_IntSize(vData) / (2*nSize);
370 assert( Vec_IntSize(vData) % (2*nSize) == 0 );
371 p = Hsh_IntManStart( vData, (2*nSize), nEntries );
372 for ( i = 0; i < nEntries; i++ )
373 Vec_IntPush( vRes, Hsh_IntManAdd(
p, i) );
380 int i, nEntries = Vec_WrdSize(vDataW) / nSize;
381 Vec_Int_t * vData = Vec_IntAlloc( 2*Vec_WrdSize(vDataW) );
382 memcpy( Vec_IntArray(vData), Vec_WrdArray(vDataW),
sizeof(
word)*(
size_t)Vec_WrdSize(vDataW) );
383 vData->nSize = 2*Vec_WrdSize(vDataW);
392 assert( Vec_IntSize(vData) % (2*nSize) == 0 );
393 p = Hsh_IntManStart( vData, (2*nSize), nEntries );
394 for ( i = 0; i < nEntries; i++ )
395 Hsh_IntManAdd(
p, i );
396 assert( Vec_WrdSize(
p->vObjs) == nEntries );
411static inline void Hsh_IntManHashArrayTest()
415 Vec_IntPush( vData, 12 );
416 Vec_IntPush( vData, 17 );
417 Vec_IntPush( vData, 13 );
418 Vec_IntPush( vData, 12 );
419 Vec_IntPush( vData, 15 );
420 Vec_IntPush( vData, 3 );
421 Vec_IntPush( vData, 16 );
422 Vec_IntPush( vData, 16 );
423 Vec_IntPush( vData, 12 );
424 Vec_IntPush( vData, 17 );
425 Vec_IntPush( vData, 12 );
426 Vec_IntPush( vData, 12 );
428 vRes = Hsh_IntManHashArray( vData, 2 );
430 Vec_IntPrint( vData );
431 Vec_IntPrint( vRes );
433 Vec_IntFree( vData );
452static inline Hsh_VecMan_t * Hsh_VecManStart(
int nEntries )
456 p->vTable = Vec_IntStartFull( Abc_PrimeCudd(nEntries) );
457 p->vData = Vec_IntAlloc( nEntries * 4 );
458 p->vMap = Vec_IntAlloc( nEntries );
463 Vec_IntFree(
p->vTable );
464 Vec_IntFree(
p->vData );
465 Vec_IntFree(
p->vMap );
466 Vec_IntFreeP( &
p->vValue );
467 Vec_IntFreeP( &
p->vEntry );
470static inline int * Hsh_VecReadArray(
Hsh_VecMan_t *
p,
int i )
472 return (
int*)Hsh_VecObj(
p, i) + 2;
477 p->vTemp.nSize =
p->vTemp.nCap = pObj->
nSize;
478 p->vTemp.pArray = (
int*)pObj + 2;
484 p->vTemp1.nSize =
p->vTemp1.nCap = pObj->
nSize;
485 p->vTemp1.pArray = (
int*)pObj + 2;
491 p->vTemp2.nSize =
p->vTemp2.nCap = pObj->
nSize;
492 p->vTemp2.pArray = (
int*)pObj + 2;
497 return Vec_IntSize(
p->vMap);
501 return !
p ? 0.0 : Vec_IntMemory(
p->vTable) + Vec_IntMemory(
p->vData) + Vec_IntMemory(
p->vMap);
515static inline int Hsh_VecManHash(
Vec_Int_t * vVec,
int nTableSize )
517 static unsigned s_Primes[7] = {4177, 5147, 5647, 6343, 7103, 7873, 8147};
521 Key += (unsigned)Entry * s_Primes[i % 7];
522 return (
int)(Key % nTableSize);
527 int i, Ent, * pPlace;
528 if ( Vec_IntSize(
p->vMap) > Vec_IntSize(
p->vTable) )
530 Vec_IntFill(
p->vTable, Abc_PrimeCudd(2*Vec_IntSize(
p->vTable)), -1 );
531 for ( i = 0; i < Vec_IntSize(
p->vMap); i++ )
533 pPlace = Vec_IntEntryP(
p->vTable, Hsh_VecManHash(Hsh_VecReadEntry(
p, i), Vec_IntSize(
p->vTable)) );
534 Hsh_VecObj(
p, i)->iNext = *pPlace; *pPlace = i;
537 pPlace = Vec_IntEntryP(
p->vTable, Hsh_VecManHash(vVec, Vec_IntSize(
p->vTable)) );
538 for ( ; (pObj = Hsh_VecObj(
p, *pPlace)); pPlace = &pObj->
iNext )
539 if ( pObj->
nSize == Vec_IntSize(vVec) && !
memcmp( pObj->
pArray, Vec_IntArray(vVec),
sizeof(
int) * (
size_t)pObj->
nSize ) )
541 *pPlace = Vec_IntSize(
p->vMap);
542 assert( Vec_IntSize(
p->vData) % 2 == 0 );
543 Vec_IntPush(
p->vMap, Vec_IntSize(
p->vData) );
544 Vec_IntPush(
p->vData, Vec_IntSize(vVec) );
545 Vec_IntPush(
p->vData, -1 );
547 Vec_IntPush(
p->vData, Ent );
548 if ( Vec_IntSize(vVec) & 1 )
549 Vec_IntPush(
p->vData, -1 );
550 return Vec_IntSize(
p->vMap) - 1;
564static inline void Hsh_VecManHashTest()
571 p = Hsh_VecManStart( 5 );
572 for ( i = 0; i < 20; i++ )
574 vTemp = Vec_IntStartNatural( i );
575 Vec_IntPush( vRes, Hsh_VecManAdd(
p, vTemp ) );
576 Vec_IntFree( vTemp );
580 vTemp = Vec_IntStartNatural( i );
581 Vec_IntPush( vRes, Hsh_VecManAdd(
p, vTemp ) );
582 Vec_IntFree( vTemp );
584 Vec_IntPrint( vRes );
#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 ///.
unsigned __int64 word
DECLARATIONS ///.
struct Hsh_IntMan_t_ Hsh_IntMan_t
struct Hsh_IntObj_t_ Hsh_IntObj_t
struct Hsh_VecMan_t_ Hsh_VecMan_t
union Hsh_IntObjWord_t_ Hsh_IntObjWord_t
typedefABC_NAMESPACE_HEADER_START struct Hsh_Int1Man_t_ Hsh_Int1Man_t
INCLUDES ///.
struct Hsh_VecObj_t_ Hsh_VecObj_t
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Wrd_t_ Vec_Wrd_t
INCLUDES ///.