21#ifndef ABC__misc__vec__Queue_h
22#define ABC__misc__vec__Queue_h
50static inline float Vec_QuePrio(
Vec_Que_t *
p,
int v ) {
return *
p->pCostsFlt ? (*
p->pCostsFlt)[v] : v; }
71static inline Vec_Que_t * Vec_QueAlloc(
int nCap )
89static inline void Vec_QueFreeP(
Vec_Que_t **
p )
95static inline void Vec_QueSetPriority(
Vec_Que_t *
p,
float ** pCosts )
98 p->pCostsFlt = pCosts;
100static inline void Vec_QueGrow(
Vec_Que_t *
p,
int nCapMin )
102 if (
p->nCap >= nCapMin )
107 memset(
p->pHeap +
p->nCap, 0xff, (
size_t)(nCapMin -
p->nCap) *
sizeof(
int) );
108 memset(
p->pOrder +
p->nCap, 0xff, (
size_t)(nCapMin -
p->nCap) *
sizeof(
int) );
111static inline void Vec_QueClear(
Vec_Que_t *
p )
115 for ( i = 1; i <
p->nSize; i++ )
117 assert(
p->pHeap[i] >= 0 &&
p->pOrder[
p->pHeap[i]] == i );
118 p->pOrder[
p->pHeap[i]] = -1;
123static inline double Vec_QueMemory(
Vec_Que_t *
p )
125 return !
p ? 0.0 : 2.0 *
sizeof(int) * (
size_t)
p->nCap +
sizeof(
Vec_Que_t) ;
146 return Vec_QueSize(
p) > 0 ?
p->pHeap[1] : -1;
148static inline float Vec_QueTopPriority(
Vec_Que_t *
p )
150 return Vec_QueSize(
p) > 0 ? Vec_QuePrio(
p,
p->pHeap[1]) : -
ABC_INFINITY;
164static inline int Vec_QueMoveUp(
Vec_Que_t *
p,
int v )
166 float Cost = Vec_QuePrio(
p, v);
167 int i =
p->pOrder[v];
172 while ( i > 1 && Cost > Vec_QuePrio(
p,
p->pHeap[parent]) )
174 p->pHeap[i] =
p->pHeap[parent];
175 p->pOrder[
p->pHeap[i]] = i;
184static inline void Vec_QueMoveDown(
Vec_Que_t *
p,
int v )
186 float Cost = Vec_QuePrio(
p, v);
187 int i =
p->pOrder[v];
189 while ( child < p->nSize )
191 if ( child + 1 <
p->nSize && Vec_QuePrio(
p,
p->pHeap[child]) < Vec_QuePrio(
p,
p->pHeap[child+1]) )
193 assert( child < p->nSize );
194 if ( Cost >= Vec_QuePrio(
p,
p->pHeap[child]))
196 p->pHeap[i] =
p->pHeap[child];
197 p->pOrder[
p->pHeap[i]] = i;
204static inline void Vec_QueUpdate(
Vec_Que_t *
p,
int v )
206 if ( !Vec_QueMoveUp(
p, v ) )
207 Vec_QueMoveDown(
p, v );
221static inline int Vec_QueIsMember(
Vec_Que_t *
p,
int v )
224 return (
int)( v <
p->nCap &&
p->pOrder[v] >= 0 );
226static inline void Vec_QuePush(
Vec_Que_t *
p,
int v )
228 if (
p->nSize >=
p->nCap )
235 p->pOrder[v] =
p->nSize;
236 p->pHeap[
p->nSize++] = v;
237 Vec_QueMoveUp(
p, v );
243 Res =
p->pHeap[1];
p->pOrder[Res] = -1;
244 if ( --
p->nSize == 1 )
249 v =
p->pHeap[
p->nSize];
p->pHeap[
p->nSize] = -1;
250 p->pHeap[1] = v;
p->pOrder[v] = 1;
251 Vec_QueMoveDown(
p, v );
266static inline void Vec_QuePrint(
Vec_Que_t *
p )
269 for ( i = k = 1; i <
p->nSize; i += k, k *= 2 )
271 for ( m = 0; m < k; m++ )
272 if ( i+m < p->nSize )
273 printf(
"%-5d",
p->pHeap[i+m] );
275 for ( m = 0; m < k; m++ )
276 if ( i+m < p->nSize )
277 printf(
"%-5.0f", Vec_QuePrio(
p,
p->pHeap[i+m]) );
294static inline void Vec_QueCheck(
Vec_Que_t *
p )
300 for ( i = 0; i <
p->nSize-1; i++ )
302 for ( ; i <
p->nCap; i++ )
306 for ( i = 0; i <
p->nSize-1; i++ )
307 assert(
p->pHeap[
p->pOrder[i]] == i );
308 for ( i++; i <
p->nCap; i++ )
311 for ( i = 1; i <
p->nSize; i++ )
314 if ( child < p->nSize )
315 assert( Vec_QuePrio(
p,
p->pHeap[i]) >= Vec_QuePrio(
p,
p->pHeap[child]) );
317 if ( child < p->nSize )
318 assert( Vec_QuePrio(
p,
p->pHeap[i]) >= Vec_QuePrio(
p,
p->pHeap[child]) );
333static inline void Vec_QueTest(
Vec_Flt_t * vCosts )
340 p = Vec_QueAlloc( Vec_FltSize(vCosts) );
341 Vec_QueSetPriority(
p, Vec_FltArrayP(vCosts) );
342 for ( i = 0; i < Vec_FltSize(vCosts); i++ )
348 vTop = Vec_IntAlloc( Vec_FltSize(vCosts) / 10 );
349 while ( Vec_IntSize(vTop) < Vec_FltSize(vCosts) / 10 )
350 Vec_IntPush( vTop, Vec_QuePop(
p) );
356 Vec_QuePush(
p, Entry );
#define ABC_FALLOC(type, num)
#define ABC_REALLOC(type, obj, num)
#define ABC_INFINITY
MACRO DEFINITIONS ///.
#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 ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Flt_t_ Vec_Flt_t
INCLUDES ///.
#define Vec_IntForEachEntry(vVec, Entry, i)
MACRO DEFINITIONS ///.
typedefABC_NAMESPACE_HEADER_START struct Vec_Que_t_ Vec_Que_t
INCLUDES ///.