| File src/hstr_history.c changed (mode: 100644) (index 922b4b0..e9b08c4) |
| ... |
... |
static const char *commandBlacklist[] = { |
| 28 |
28 |
"ls ", "pwd ", "cd ", "cd .. ", "hh ", "mc " |
"ls ", "pwd ", "cd ", "cd .. ", "hh ", "mc " |
| 29 |
29 |
}; |
}; |
| 30 |
30 |
|
|
|
31 |
|
#define DEBUG_RADIX |
| 31 |
32 |
#ifdef DEBUG_RADIX |
#ifdef DEBUG_RADIX |
| 32 |
|
#define DEBUG_RADIXSORT() radixsort_stat(&rs); exit(0) |
|
|
33 |
|
#define DEBUG_RADIXSORT() radixsort_stat(&rs, false); exit(0) |
| 33 |
34 |
#else |
#else |
| 34 |
35 |
#define DEBUG_RADIXSORT() |
#define DEBUG_RADIXSORT() |
| 35 |
36 |
#endif |
#endif |
| 36 |
37 |
|
|
| 37 |
38 |
unsigned history_ranking_function(unsigned rank, int newOccurenceOrder, size_t length) { |
unsigned history_ranking_function(unsigned rank, int newOccurenceOrder, size_t length) { |
| 38 |
|
// long metrics = rank+newOccurenceOrder/10+length; |
|
| 39 |
39 |
long metrics=rank+(log(newOccurenceOrder)*10.0)+length; |
long metrics=rank+(log(newOccurenceOrder)*10.0)+length; |
|
40 |
|
// alternative metrics: |
|
41 |
|
// rank+newOccurenceOrder/10+length |
| 40 |
42 |
assert(metrics<UINT_MAX); |
assert(metrics<UINT_MAX); |
| 41 |
43 |
return metrics; |
return metrics; |
| 42 |
44 |
} |
} |
| |
| ... |
... |
HistoryItems *get_prioritized_history() |
| 90 |
92 |
} |
} |
| 91 |
93 |
|
|
| 92 |
94 |
RadixSorter rs; |
RadixSorter rs; |
| 93 |
|
// TODO quick fix to enable loading of huge history files (2x800kB allocated) > malloc this |
|
| 94 |
|
// based on the expected max value (inferred from history file size, # of rows, row size) |
|
| 95 |
|
radixsort_init(&rs, 100000000); |
|
|
95 |
|
unsigned radixMaxKeyEstimate=historyState->size*1000; |
|
96 |
|
radixsort_init(&rs, (radixMaxKeyEstimate<100000?100000:radixMaxKeyEstimate)); |
|
97 |
|
rs.optFloorAndInsertBigKeys=true; |
| 96 |
98 |
|
|
| 97 |
99 |
RankedHistoryItem *r; |
RankedHistoryItem *r; |
| 98 |
100 |
RadixItem *radixItem; |
RadixItem *radixItem; |
| File src/include/radixsort.h changed (mode: 100644) (index 1b4b6bc..5b2b607) |
| ... |
... |
typedef struct { |
| 37 |
37 |
unsigned keyLimit; |
unsigned keyLimit; |
| 38 |
38 |
RadixItem ***topDigits; |
RadixItem ***topDigits; |
| 39 |
39 |
|
|
|
40 |
|
bool optFloorAndInsertBigKeys; |
|
41 |
|
bool optIgnoreBigKeys; |
|
42 |
|
|
| 40 |
43 |
RadixSlot **_slotDescriptors; |
RadixSlot **_slotDescriptors; |
| 41 |
44 |
unsigned _slotsCount; |
unsigned _slotsCount; |
| 42 |
45 |
unsigned _topIndexLimit; |
unsigned _topIndexLimit; |
| |
| ... |
... |
void radixsort_add(RadixSorter *rs, RadixItem *item); |
| 47 |
50 |
RadixItem *radix_cut(RadixSorter *rs, unsigned key, void *data); |
RadixItem *radix_cut(RadixSorter *rs, unsigned key, void *data); |
| 48 |
51 |
RadixItem **radixsort_dump(RadixSorter *rs); |
RadixItem **radixsort_dump(RadixSorter *rs); |
| 49 |
52 |
void radixsort_destroy(RadixSorter *rs); |
void radixsort_destroy(RadixSorter *rs); |
| 50 |
|
void radixsort_stat(RadixSorter *rs); |
|
|
53 |
|
void radixsort_stat(RadixSorter *rs, bool listing); |
| 51 |
54 |
|
|
| 52 |
55 |
#endif /* RADIXSORT_H_ */ |
#endif /* RADIXSORT_H_ */ |
| File src/radixsort.c changed (mode: 100644) (index 895cee4..fb11ec8) |
| 12 |
12 |
#define GET_TOP_INDEX(KEY) KEY/SLOT_SIZE |
#define GET_TOP_INDEX(KEY) KEY/SLOT_SIZE |
| 13 |
13 |
#define GET_LOW_INDEX(KEY) KEY%SLOT_SIZE |
#define GET_LOW_INDEX(KEY) KEY%SLOT_SIZE |
| 14 |
14 |
|
|
| 15 |
|
#define RADIX_DEBUG 0 |
|
| 16 |
|
#define RADIX_STRICT 0 |
|
|
15 |
|
#define RADIX_DEBUG 1 |
| 17 |
16 |
|
|
| 18 |
17 |
void radixsort_init(RadixSorter *rs, unsigned keyLimit) |
void radixsort_init(RadixSorter *rs, unsigned keyLimit) |
| 19 |
18 |
{ |
{ |
|
19 |
|
rs->optFloorAndInsertBigKeys=false; |
|
20 |
|
rs->optIgnoreBigKeys=false; |
|
21 |
|
|
| 20 |
22 |
rs->_topIndexLimit=GET_TOP_INDEX(keyLimit); |
rs->_topIndexLimit=GET_TOP_INDEX(keyLimit); |
| 21 |
23 |
rs->size=0; |
rs->size=0; |
| 22 |
24 |
rs->topDigits=malloc(rs->_topIndexLimit * sizeof(RadixItem ***)); |
rs->topDigits=malloc(rs->_topIndexLimit * sizeof(RadixItem ***)); |
| |
| ... |
... |
RadixItem **radixsort_get_slot(RadixSorter *rs, unsigned topIndex) |
| 46 |
48 |
void radixsort_add(RadixSorter *rs, RadixItem *item) |
void radixsort_add(RadixSorter *rs, RadixItem *item) |
| 47 |
49 |
{ |
{ |
| 48 |
50 |
if(item->key > rs->keyLimit) { |
if(item->key > rs->keyLimit) { |
| 49 |
|
if(RADIX_DEBUG) { |
|
| 50 |
|
fprintf(stderr, "ERROR: Radix sort overflow - value to be inserted in radix is too big: %i (limit: %i)\n", item->key, rs->keyLimit); |
|
| 51 |
|
} |
|
| 52 |
|
if(RADIX_STRICT) { |
|
| 53 |
|
exit(0); |
|
|
51 |
|
if(RADIX_DEBUG) fprintf(stderr, "ERROR: Radix sort overflow - inserted key is bigger than limit (%i): %i\n", rs->keyLimit, item->key); |
|
52 |
|
if(rs->optFloorAndInsertBigKeys) { |
|
53 |
|
item->key = rs->keyLimit; |
| 54 |
54 |
} else { |
} else { |
| 55 |
|
return; |
|
|
55 |
|
if(rs->optIgnoreBigKeys) { |
|
56 |
|
return; |
|
57 |
|
} else { |
|
58 |
|
exit(0); |
|
59 |
|
} |
| 56 |
60 |
} |
} |
| 57 |
61 |
} |
} |
| 58 |
62 |
|
|
| |
| ... |
... |
void radix_dec_slot_descriptor_size(RadixSorter *rs, RadixSlot *descriptor, unsi |
| 100 |
104 |
RadixItem *radix_cut(RadixSorter *rs, unsigned key, void *data) |
RadixItem *radix_cut(RadixSorter *rs, unsigned key, void *data) |
| 101 |
105 |
{ |
{ |
| 102 |
106 |
// TODO optimization: fix min/max on cut of a value |
// TODO optimization: fix min/max on cut of a value |
| 103 |
|
if(key<=rs->maxKey) { |
|
|
107 |
|
if(key <= rs->maxKey) { |
| 104 |
108 |
unsigned topIndex = GET_TOP_INDEX(key); |
unsigned topIndex = GET_TOP_INDEX(key); |
| 105 |
109 |
unsigned lowIndex = GET_LOW_INDEX(key); |
unsigned lowIndex = GET_LOW_INDEX(key); |
| 106 |
110 |
|
|
| |
| ... |
... |
RadixItem **radixsort_dump(RadixSorter *rs) |
| 165 |
169 |
return NULL; |
return NULL; |
| 166 |
170 |
} |
} |
| 167 |
171 |
|
|
| 168 |
|
void radixsort_stat(RadixSorter *rs) |
|
|
172 |
|
void radixsort_stat(RadixSorter *rs, bool listing) |
| 169 |
173 |
{ |
{ |
| 170 |
|
printf("\n Radixsort (size/max/limit): %u %u %u", rs->size, rs->maxKey, rs->keyLimit); |
|
| 171 |
|
if(rs->size>0) { |
|
|
174 |
|
printf("\n Radixsort (size/max/limit/slot count): %u %u %u %u", rs->size, rs->maxKey, rs->keyLimit, rs->_slotsCount); |
|
175 |
|
unsigned memory=rs->_topIndexLimit * sizeof(RadixItem ***); |
|
176 |
|
memory+=memory; |
|
177 |
|
memory+=rs->_slotsCount*(SLOT_SIZE * sizeof(RadixItem *)); |
|
178 |
|
printf("\n Memory: %u\n", memory); |
|
179 |
|
if(listing && rs->size>0) { |
| 172 |
180 |
int t = GET_TOP_INDEX(rs->maxKey); |
int t = GET_TOP_INDEX(rs->maxKey); |
| 173 |
181 |
int slotMin, slotSize, slotCount, l; |
int slotMin, slotSize, slotCount, l; |
| 174 |
182 |
unsigned items=0; |
unsigned items=0; |