36#ifndef __EMPQ_ADAPTIVE_IMPL_H
37#define __EMPQ_ADAPTIVE_IMPL_H
58template <
class T,
class Key>
62 EMPQAD_DEBUG cout <<
"EMPQUEUEADAPTIVE: starting in-memory pqueue" << endl;
69 EMPQAD_DEBUG cout <<
"EMPQUEUEADAPTIVE: desired memory: "
77template <
class T,
class Key>
81 EMPQAD_DEBUG cout <<
"EMPQUEUEADAPTIVE: starting in-memory pqueue" << endl;
88 EMPQAD_DEBUG cout <<
"EMPQUEUEADAPTIVE: available memory: "
97template <
class T,
class Key>
101 EMPQAD_DEBUG cout <<
"EMPQUEUEADAPTIVE: desired memory: "
115 cerr <<
"EMPQueueAdaptive constr: failing to get stream_usage\n";
120 unsigned short max_nbuf = 2;
131 <<
" buf_arity: " << buf_arity
133 <<
" mm_avail: " <<
initMem <<
".\n";
135 EMPQAD_DEBUG cout <<
"EMPQUEUEADAPTIVE: memory overhead set to "
138 cerr <<
"overhead bigger than available memory (" <<
initMem <<
"); "
139 <<
"increase -m and try again\n";
145 long pqsize =
initMem /
sizeof(T);
146 EMPQAD_DEBUG cout <<
"EMPQUEUEADAPTIVE: pqsize set to " << pqsize << endl;
154template <
class T,
class Key>
172template <
class T,
class Key>
179 m = im->get_maxsize();
193template <
class T,
class Key>
207 assert(dim->empty() == em->is_empty());
215template <
class T,
class Key>
218 cerr <<
"EMPQueueAdaptive::is_full(): sorry not implemented\n";
224template <
class T,
class Key>
243 cerr <<
"------------------------------" << endl;
245 cerr <<
"------------------------------" << endl;
247 cerr <<
"------------------------------" << endl;
248 cerr <<
"tmp=" << tmp << endl;
249 cerr <<
"elt=" << elt << endl;
250 cerr <<
"------------------------------" << endl;
251 dim->destructiveVerify();
261template <
class T,
class Key>
277template <
class T,
class Key>
293template <
class T,
class Key>
301 v = im->extract_all_min(elt);
305 v = em->extract_all_min(elt);
308 v1 = dim->extract_all_min(tmp);
309 v = em->extract_all_min(elt);
310 assert(dim->size() == em->size());
319template <
class T,
class Key>
342template <
class T,
class Key>
350 v = im->extract_min(elt);
354 v = em->extract_min(elt);
357 v1 = dim->extract_min(tmp);
358 v = em->extract_min(elt);
361 assert(dim->size() == em->size());
372template <
class T,
class Key>
393 assert(dim->size() == em->size());
399template <
class T,
class Key>
422 return (
x < y ? -1 : (
x > y ? 1 : 0));
427template <
class T,
class Key>
440 <<
"EMPQUEUEADAPTIVE: memory full: "
441 <<
"switching to external-memory pqueue " << endl;
447 unsigned long pqsize = im->size();
450 for (
unsigned long i = 0; i < pqsize / 2; i++) {
451 int z = im->extract_max(
x);
459 cout <<
"written " << pqsize / 2 <<
" elts to stream\n";
463 assert(im->size() == pqsize / 2 + (pqsize % 2));
474 cout <<
"sorted the stream\n";
486 cout <<
"empq initialized from im\n";
AMI_err AMI_sort(AMI_STREAM< T > *instream, AMI_STREAM< T > **outstream, Compare *cmp, int deleteInputStream=0)
static AMI_err main_memory_usage(size_t *usage, MM_stream_usage usage_type=MM_STREAM_USAGE_OVERHEAD)
AMI_err write_item(const T &elt)
bool extract_all_min(T &elt)
bool insert(const T &elt)
static int compare(const T &x, const T &y)
#define assert(condition)
@ MM_STREAM_USAGE_MAXIMUM
size_t getAvailableMemory()