Skip to content

Commit c5d3cb5

Browse files
committed
merge test case
1 parent 3058d82 commit c5d3cb5

File tree

2 files changed

+74
-10
lines changed

2 files changed

+74
-10
lines changed

include/recovery.h

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -33,11 +33,12 @@ class SparseRecovery {
3333
// TODO - see if we want to continue maintaining the deterministic bucket
3434
Bucket deterministic_bucket;
3535
public:
36-
Sketch cleanup_sketch;
37-
SparseRecovery(size_t universe_size, size_t max_recovery_size, double cleanup_sketch_support_factor, uint64_t seed):
36+
Sketch *cleanup_sketch;
37+
SparseRecovery(size_t universe_size, size_t max_recovery_size, double cleanup_sketch_support_factor, uint64_t seed)
3838
// TODO - ugly constructor
39-
cleanup_sketch(universe_size, seed, ceil(cleanup_sketch_support_factor * log2(universe_size)) * 2, 1)
39+
// cleanup_sketch(universe_size, seed, ceil(cleanup_sketch_support_factor * log2(universe_size)) * 2, 1)
4040
{
41+
cleanup_sketch = new Sketch(universe_size, seed, ceil(cleanup_sketch_support_factor * log2(universe_size)) * 2, 1);
4142
// TODO - define the seed better
4243
_checksum_seed = seed;
4344
seed = seed * seed + 13;
@@ -94,26 +95,27 @@ class SparseRecovery {
9495
Bucket &bucket = get_cfr_bucket(cfr_idx, bucket_idx);
9596
bucket ^= {update, checksum};
9697
}
97-
cleanup_sketch.update(update);
98+
cleanup_sketch->update(update);
9899
}
99100
void reset() {
100101
// zero contents of the CFRs
101102
deterministic_bucket = {0, 0};
102103
for (size_t i=0; i < recovery_buckets.size(); i++) {
103104
recovery_buckets[i] = {0, 0};
104105
}
105-
cleanup_sketch.zero_contents();
106+
cleanup_sketch->zero_contents();
106107
};
107108

108109

109110
// THIS IS A NON_DESTRUCTIVE OPERATION
110111
RecoveryResult recover() {
112+
// TODO - DYNAMIc allocation grossness
111113
std::vector<Bucket> recovered_indices;
112114
std::vector<vec_t> recovered_return_vals;
113115
Bucket working_det_bucket = {0, 0};
114116
for (size_t cfr_idx=0; cfr_idx < num_levels(); cfr_idx++) {
115117
auto cfr_size = get_cfr_size(cfr_idx);
116-
std::cout << "level " << cfr_idx << " size " << cfr_size << std::endl;
118+
// std::cout << "level " << cfr_idx << " size " << cfr_size << std::endl;
117119
// temporarily zero out already recovvered things:
118120
size_t previously_recovered = recovered_indices.size();
119121
for (size_t i=0; i < previously_recovered; i++) {
@@ -145,8 +147,8 @@ class SparseRecovery {
145147
this->update(idx);
146148
}
147149
size_t i=0;
148-
for (; i < cleanup_sketch.get_num_samples(); i++) {
149-
ExhaustiveSketchSample sample = cleanup_sketch.exhaustive_sample();
150+
for (; i < cleanup_sketch->get_num_samples(); i++) {
151+
ExhaustiveSketchSample sample = cleanup_sketch->exhaustive_sample();
150152
if (sample.result == ZERO) {
151153
for (auto idx: recovered_return_vals) {
152154
this->update(idx);
@@ -169,7 +171,7 @@ class SparseRecovery {
169171
for (size_t i=0; i < recovery_buckets.size(); i++) {
170172
recovery_buckets[i] ^= other.recovery_buckets[i];
171173
}
172-
cleanup_sketch.merge(other.cleanup_sketch);
174+
cleanup_sketch->merge(*other.cleanup_sketch);
173175
};
174176
~SparseRecovery() {
175177

test/recovery_test.cpp

Lines changed: 63 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -66,7 +66,7 @@ TEST(RecoveryTestSuite, RecoveryFailureCondition) {
6666
// inserted.clear();
6767
// remove all but the final few elements
6868
// TODO - figure out the right place to put sketch clearing
69-
recovery.cleanup_sketch.reset_sample_state();
69+
recovery.cleanup_sketch->reset_sample_state();
7070
for (vec_t i = 0; i < (1 << 14) - 1027; i++) {
7171
recovery.update(i);
7272
inserted.erase(i);
@@ -76,4 +76,66 @@ TEST(RecoveryTestSuite, RecoveryFailureCondition) {
7676
std::unordered_set<vec_t> recovered3(result3.recovered_indices.begin(), result3.recovered_indices.end());
7777
ASSERT_EQ(result3.result, SUCCESS);
7878
ASSERT_EQ(recovered3, inserted);
79+
}
80+
81+
TEST(RecoveryTestSuite, RecoveryForceSketchUse) {
82+
// TODO - IRON THIS OUT
83+
SparseRecovery recovery(1 << 20, 1 << 4, 1, get_seed());
84+
std::unordered_set<vec_t> inserted;
85+
for (vec_t i = 0; i < (1 << 4) * 2; i++) {
86+
recovery.update(i);
87+
inserted.insert(i);
88+
}
89+
auto result = recovery.recover();
90+
ASSERT_EQ(result.result, SUCCESS);
91+
}
92+
93+
TEST(RecoveryTestSuite, RecoveryMerge) {
94+
// TODO - IRON THIS OUT
95+
auto seed = get_seed();
96+
SparseRecovery recovery1(1 << 20, 1 << 10, 1, seed);
97+
SparseRecovery recovery2(1 << 20, 1 << 10, 1, seed);
98+
for (vec_t i = 0; i < (1 << 10) * 2; i++) {
99+
recovery1.update(i);
100+
}
101+
vec_t offset = 512;
102+
for (vec_t i = 0; i < (1 << 10) * 2; i++) {
103+
recovery1.update(i+512);
104+
}
105+
recovery1.merge(recovery2);
106+
auto result = recovery1.recover();
107+
ASSERT_EQ(result.result, SUCCESS);
108+
ASSERT_EQ(result.recovered_indices.size(), 1 << 10);
109+
for (auto idx: result.recovered_indices) {
110+
ASSERT_TRUE(idx < 512 || idx >= 1024);
111+
}
112+
}
113+
114+
TEST(RecoveryTestSuite, RecoveryManyFailureProbability) {
115+
// TODO - IRON THIS OUT
116+
auto vector_size = 1 << 20;
117+
auto recovery_size = 1 << 10;
118+
auto num_sketches = 1 << 15;
119+
double recovery_size_adjustment = 1;
120+
auto seed = get_seed();
121+
std::vector<SparseRecovery> recoveries;
122+
for (vec_t i = 0; i < num_sketches; i++) {
123+
recoveries.push_back(SparseRecovery(
124+
vector_size, ceill(recovery_size * recovery_size_adjustment), 1,
125+
seed));
126+
}
127+
for (size_t i = 0; i < num_sketches; i++) {
128+
for (vec_t j = recovery_size * i; j < recovery_size * (i+1); j++) {
129+
recoveries[i].update(j);
130+
}
131+
}
132+
for (size_t i = 0; i < num_sketches; i++) {
133+
auto result = recoveries[i].recover();
134+
ASSERT_EQ(result.result, SUCCESS);
135+
ASSERT_EQ(result.recovered_indices.size(), recovery_size);
136+
for (auto idx: result.recovered_indices) {
137+
ASSERT_TRUE(idx >= recovery_size * i && idx < recovery_size * (i+1));
138+
}
139+
}
140+
79141
}

0 commit comments

Comments
 (0)