|
@@ -9,11 +9,11 @@
|
|
|
|
|
|
void HEAP::initialize(int num_players, size_t size) {
|
|
|
this->MAX_SIZE = size;
|
|
|
- this->num_items = size;
|
|
|
+ this->num_items = 0;
|
|
|
oram = new Duoram<RegAS>(num_players, size);
|
|
|
}
|
|
|
|
|
|
-void reconstruct_AS(MPCTIO &tio, yield_t &yield, RegAS AS) {
|
|
|
+RegAS reconstruct_AS(MPCTIO &tio, yield_t &yield, RegAS AS) {
|
|
|
RegAS peer_AS;
|
|
|
RegAS reconstructed_AS = AS;
|
|
|
if (tio.player() == 1) {
|
|
@@ -34,14 +34,13 @@ void reconstruct_AS(MPCTIO &tio, yield_t &yield, RegAS AS) {
|
|
|
reconstructed_AS += peer_AS;
|
|
|
}
|
|
|
|
|
|
- printf("reconstructed_AS = ");
|
|
|
- reconstructed_AS.dump();
|
|
|
- printf("\n\n");
|
|
|
+
|
|
|
+ return reconstructed_AS;
|
|
|
}
|
|
|
|
|
|
bool reconstruct_flag(MPCTIO &tio, yield_t &yield, RegBS flag) {
|
|
|
RegBS peer_flag;
|
|
|
- RegBS reconstructed_flag;
|
|
|
+ RegBS reconstructed_flag = flag;
|
|
|
if (tio.player() == 1) {
|
|
|
tio.queue_peer(&flag, sizeof(flag));
|
|
|
} else {
|
|
@@ -50,6 +49,8 @@ bool reconstruct_flag(MPCTIO &tio, yield_t &yield, RegBS flag) {
|
|
|
reconstructed_flag ^= peer_flag;
|
|
|
}
|
|
|
|
|
|
+ yield();
|
|
|
+
|
|
|
if (tio.player() == 0) {
|
|
|
tio.queue_peer(&flag, sizeof(flag));
|
|
|
} else {
|
|
@@ -61,42 +62,147 @@ bool reconstruct_flag(MPCTIO &tio, yield_t &yield, RegBS flag) {
|
|
|
return reconstructed_flag.bshare;
|
|
|
}
|
|
|
|
|
|
-int HEAP::insert(MPCTIO tio, yield_t &yield, std::vector<RegAS>& A, RegAS val) {
|
|
|
-
|
|
|
- auto HeapArray = oram->flat(tio, yield);
|
|
|
- num_items++;
|
|
|
- //auto A = oram->flat(tio, yield);
|
|
|
- std::cout << "num_items = " << num_items << std::endl;
|
|
|
-
|
|
|
- val.randomize();
|
|
|
- size_t child = num_items-1;
|
|
|
- size_t parent = child/2;
|
|
|
- std::cout << "child = " << child << std::endl;
|
|
|
- HeapArray[num_items] = val;
|
|
|
- while(parent != 0)
|
|
|
- {
|
|
|
- CDPF cdpf = tio.cdpf(yield);
|
|
|
-
|
|
|
- auto [lt, eq, gt] = cdpf.compare(tio, yield, A[child]-A[parent], tio.aes_ops());
|
|
|
- std::cout << "child = " << child << std::endl;
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
- mpc_oswap(tio, yield, A[child], A[parent], lt, 64);
|
|
|
-
|
|
|
-
|
|
|
- child = parent;
|
|
|
- parent = parent/2;
|
|
|
+int HEAP::insert(MPCTIO tio, yield_t &yield, RegAS val) {
|
|
|
+ auto HeapArray = oram->flat(tio, yield);
|
|
|
+ num_items++;
|
|
|
+ std::cout << "num_items = " << num_items << std::endl;
|
|
|
+ val.randomize();
|
|
|
+ val.ashare = val.ashare/1000;
|
|
|
+ std::cout << "we are adding in: " << std::endl;
|
|
|
+ reconstruct_AS(tio, yield, val);
|
|
|
+ yield();
|
|
|
+ size_t child = num_items;
|
|
|
+ size_t parent = child/2;
|
|
|
+ std::cout << "child = " << child << std::endl;
|
|
|
+ std::cout << "parent = " << parent << std::endl;
|
|
|
+ HeapArray[num_items] = val;
|
|
|
+ RegAS tmp = HeapArray[num_items];
|
|
|
+ reconstruct_AS(tio, yield, tmp);
|
|
|
+ yield();
|
|
|
+ while(parent != 0) {
|
|
|
+ std::cout << "while loop\n";
|
|
|
+ RegAS sharechild = HeapArray[child];
|
|
|
+ RegAS shareparent = HeapArray[parent];
|
|
|
+ RegAS sharechildrec = reconstruct_AS(tio, yield, sharechild);
|
|
|
+ yield();
|
|
|
+ RegAS shareparentrec = reconstruct_AS(tio, yield, shareparent);
|
|
|
+ yield();
|
|
|
+ std::cout << "\nchild reconstruct_AS = \n";
|
|
|
+ sharechildrec.dump();
|
|
|
+ std::cout << "\nparent reconstruct_AS = \n";
|
|
|
+ shareparentrec.dump();
|
|
|
+ std::cout << "\n----\n";
|
|
|
+ CDPF cdpf = tio.cdpf(yield);
|
|
|
+ RegAS diff = sharechild-shareparent;
|
|
|
+ std::cout << "diff = " << std::endl;
|
|
|
+ RegAS diff_rec = reconstruct_AS(tio, yield, diff);
|
|
|
+ diff_rec.dump();
|
|
|
+ std::cout << std::endl << std::endl;
|
|
|
+ auto [lt, eq, gt] = cdpf.compare(tio, yield, diff, tio.aes_ops());
|
|
|
+ auto lteq = lt ^ eq;
|
|
|
+ bool lteq_rec = reconstruct_flag(tio, yield, lteq);
|
|
|
+ yield();
|
|
|
+ bool lt_rec = reconstruct_flag(tio, yield, lt);
|
|
|
+ yield();
|
|
|
+ std::cout <<"lt_rec = " << (int) lt_rec << std::endl;
|
|
|
+ std::cout << std::endl;
|
|
|
+ bool eq_rec = reconstruct_flag(tio, yield, eq);
|
|
|
+ yield();
|
|
|
+ std::cout <<"eq_rec = " << (int) eq_rec << std::endl;
|
|
|
+ std::cout << std::endl;
|
|
|
+ yield();
|
|
|
+ bool gt_rec = reconstruct_flag(tio, yield, gt);
|
|
|
+ yield();
|
|
|
+ std::cout <<"gt_rec = " << (int) gt_rec << std::endl;
|
|
|
+ std::cout << std::endl;
|
|
|
+ if(lteq_rec) {
|
|
|
+ if(sharechildrec.ashare > shareparentrec.ashare) {
|
|
|
+ std::cout << "\nchild reconstruct_AS = \n";
|
|
|
+ sharechildrec.dump();
|
|
|
+ std::cout << "\nchild reconstruct_AS = \n";
|
|
|
+ shareparentrec.dump();
|
|
|
+ std::cout << "\n----\n";
|
|
|
+ }
|
|
|
+ assert(sharechildrec.ashare <= shareparentrec.ashare);
|
|
|
+ }
|
|
|
+ if(gt_rec) {
|
|
|
+ if(sharechildrec.ashare < shareparentrec.ashare) {
|
|
|
+ std::cout << "\nchild reconstruct_AS = \n";
|
|
|
+ sharechildrec.dump();
|
|
|
+ std::cout << "\nchild reconstruct_AS = \n";
|
|
|
+ shareparentrec.dump();
|
|
|
+ std::cout << "\n----\n";
|
|
|
+ }
|
|
|
+ assert(sharechildrec.ashare > shareparentrec.ashare);
|
|
|
+ }
|
|
|
+
|
|
|
+ std::cout << "child = " << child << std::endl;
|
|
|
+ sharechildrec = reconstruct_AS(tio, yield, sharechild);
|
|
|
+ sharechildrec.dump();
|
|
|
+ yield();
|
|
|
+ std::cout << "parent = " << parent << std::endl;
|
|
|
+ shareparentrec = reconstruct_AS(tio, yield, shareparent);
|
|
|
+ shareparentrec.dump();
|
|
|
+ yield();
|
|
|
+
|
|
|
+ std::cout << "\n^^^ before mpc_oswap\n";
|
|
|
+ mpc_oswap(tio, yield, sharechild, shareparent, lt, 64);
|
|
|
+
|
|
|
+ HeapArray[child] = sharechild;
|
|
|
+ HeapArray[parent] = shareparent;
|
|
|
+
|
|
|
+ std::cout << "child = " << child << std::endl;
|
|
|
+ sharechildrec = reconstruct_AS(tio, yield, sharechild);
|
|
|
+ sharechildrec.dump();
|
|
|
+ yield();
|
|
|
+ std::cout << "parent = " << parent << std::endl;
|
|
|
+ shareparentrec = reconstruct_AS(tio, yield, shareparent);
|
|
|
+ shareparentrec.dump();
|
|
|
+ yield();
|
|
|
+ std::cout << "\n^^^after mpc_oswap\n";
|
|
|
+ assert(sharechildrec.ashare >= shareparentrec.ashare);
|
|
|
+
|
|
|
+ std::cout << "we asserted that: \n";
|
|
|
+ sharechildrec.dump();
|
|
|
+ std::cout << std::endl << " < " << std::endl;
|
|
|
+ shareparentrec.dump();
|
|
|
+ std::cout << "\n ----- \n";
|
|
|
+
|
|
|
+ child = parent;
|
|
|
+ parent = child/2;
|
|
|
}
|
|
|
+
|
|
|
return 1;
|
|
|
}
|
|
|
|
|
|
-int HEAP::verify_heap_property(MPCTIO tio, yield_t &yield, std::vector<RegAS> A) {
|
|
|
+int HEAP::verify_heap_property(MPCTIO tio, yield_t &yield) {
|
|
|
|
|
|
-for(size_t i = 0; i < num_items; ++i)
|
|
|
-{
|
|
|
+std::cout << std::endl << std::endl << "verify_heap_property \n\n\n";
|
|
|
+auto HeapArray = oram->flat(tio, yield);
|
|
|
+
|
|
|
+ RegAS heapreconstruction[num_items];
|
|
|
+ for(size_t j = 0; j <= num_items; ++j)
|
|
|
+ {
|
|
|
+ RegAS tmp = HeapArray[j];
|
|
|
+ heapreconstruction[j] = reconstruct_AS(tio, yield, tmp);
|
|
|
+ yield();
|
|
|
+ }
|
|
|
|
|
|
-}
|
|
|
+ for(size_t j = 1; j < num_items/2; ++j)
|
|
|
+ {
|
|
|
+ if(heapreconstruction[j].ashare > heapreconstruction[2*j].ashare)
|
|
|
+ {
|
|
|
+ std::cout << "j = " << j << std::endl;
|
|
|
+ heapreconstruction[j].dump();
|
|
|
+ std::cout << std::endl;
|
|
|
+ std::cout << "2*j = " << 2*j << std::endl;
|
|
|
+ heapreconstruction[2*j].dump();
|
|
|
+ std::cout << std::endl;
|
|
|
+
|
|
|
+ }
|
|
|
+ assert(heapreconstruction[j].ashare <= heapreconstruction[2*j].ashare);
|
|
|
+ }
|
|
|
+
|
|
|
|
|
|
return 1;
|
|
|
}
|
|
@@ -124,57 +230,57 @@ void restore_heap_property(MPCTIO tio, yield_t &yield, RegAS& parent, RegAS& lef
|
|
|
rightchild = (sum - smallerchild - smallest);
|
|
|
}
|
|
|
|
|
|
-RegAS HEAP::extract_min(MPCTIO tio, yield_t &yield, std::vector<RegAS> A) {
|
|
|
- // this->MAX_SIZE = size;
|
|
|
- // oram = new Duoram<RegXS>(num_players, size);
|
|
|
- std::cout << "extract_min" << std::endl;
|
|
|
- std::cout << "num_items = " << num_items << std::endl;
|
|
|
- // if(num_items==0)
|
|
|
- // return RegAS(0);
|
|
|
+// RegAS HEAP::extract_min(MPCTIO tio, yield_t &yield) {
|
|
|
+// // this->MAX_SIZE = size;
|
|
|
+// // oram = new Duoram<RegXS>(num_players, size);
|
|
|
+// std::cout << "extract_min" << std::endl;
|
|
|
+// std::cout << "num_items = " << num_items << std::endl;
|
|
|
+// // if(num_items==0)
|
|
|
+// // return RegAS(0);
|
|
|
|
|
|
|
|
|
- restore_heap_property(tio, yield, A[0], A[1], A[2]);
|
|
|
- RegAS minval = A[1];
|
|
|
- //A[1] = A[num_items-1];
|
|
|
- //if(num_items!=0)
|
|
|
- {
|
|
|
- //Delete root
|
|
|
+// // restore_heap_property(tio, yield, A[0], A[1], A[2]);
|
|
|
+// //RegAS minval = A[1];
|
|
|
+// //A[1] = A[num_items-1];
|
|
|
+// //if(num_items!=0)
|
|
|
+// {
|
|
|
+// //Delete root
|
|
|
|
|
|
- //Node zero;
|
|
|
- // for(size_t j = 0; j < num_items; ++j)
|
|
|
- // {
|
|
|
- // RegAS val;
|
|
|
- // val.set((0+j)*tio.player());
|
|
|
- // A[j] = val;
|
|
|
- // }
|
|
|
+// //Node zero;
|
|
|
+// // for(size_t j = 0; j < num_items; ++j)
|
|
|
+// // {
|
|
|
+// // RegAS val;
|
|
|
+// // val.set((0+j)*tio.player());
|
|
|
+// // A[j] = val;
|
|
|
+// // }
|
|
|
|
|
|
- // num_items--;
|
|
|
+// // num_items--;
|
|
|
|
|
|
- // CDPF cdpf = tio.cdpf(yield);
|
|
|
- // RegAS tmp = A[10];
|
|
|
- // RegAS tmp1 = A[12];
|
|
|
+// // CDPF cdpf = tio.cdpf(yield);
|
|
|
+// // RegAS tmp = A[10];
|
|
|
+// // RegAS tmp1 = A[12];
|
|
|
|
|
|
- // auto [lt, eq, gt] = cdpf.compare(tio, yield, tmp-tmp1, tio.aes_ops());
|
|
|
+// // auto [lt, eq, gt] = cdpf.compare(tio, yield, tmp-tmp1, tio.aes_ops());
|
|
|
|
|
|
- // // reconstruct_flag(tio, yield, lt);
|
|
|
- // RegAS selected_val;
|
|
|
- // mpc_select(tio, yield, selected_val, gt, tmp, tmp1, 64);
|
|
|
+// // // reconstruct_flag(tio, yield, lt);
|
|
|
+// // RegAS selected_val;
|
|
|
+// // mpc_select(tio, yield, selected_val, gt, tmp, tmp1, 64);
|
|
|
|
|
|
- // printf("selected_val is: \n");
|
|
|
- // reconstruct_AS(tio, yield, selected_val);
|
|
|
+// // printf("selected_val is: \n");
|
|
|
+// // reconstruct_AS(tio, yield, selected_val);
|
|
|
|
|
|
- // yield();
|
|
|
- // printf("first option is: \n");
|
|
|
- // reconstruct_AS(tio, yield, tmp);
|
|
|
- // yield();
|
|
|
- // printf("second option is: \n");
|
|
|
- // reconstruct_AS(tio, yield, tmp1);
|
|
|
+// // yield();
|
|
|
+// // printf("first option is: \n");
|
|
|
+// // reconstruct_AS(tio, yield, tmp);
|
|
|
+// // yield();
|
|
|
+// // printf("second option is: \n");
|
|
|
+// // reconstruct_AS(tio, yield, tmp1);
|
|
|
|
|
|
|
|
|
- //return 1;
|
|
|
- }
|
|
|
- return minval;
|
|
|
-}
|
|
|
+// //return 1;
|
|
|
+// }
|
|
|
+// return 1;
|
|
|
+// }
|
|
|
void Heap(MPCIO &mpcio, const PRACOptions &opts, char **args)
|
|
|
{
|
|
|
|
|
@@ -202,41 +308,20 @@ RegAS HEAP::extract_min(MPCTIO tio, yield_t &yield, std::vector<RegAS> A) {
|
|
|
|
|
|
|
|
|
|
|
|
- std::vector<RegAS> HeapArray;
|
|
|
- HeapArray.resize(size);
|
|
|
- for(size_t i = 0; i < size; ++i)
|
|
|
- {
|
|
|
- HeapArray[i].dump();
|
|
|
- std::cout << std::endl;
|
|
|
- }
|
|
|
-
|
|
|
+
|
|
|
HEAP tree(tio.player(), size);
|
|
|
- for(size_t i = 0; i < HeapArray.size(); ++i)
|
|
|
- {
|
|
|
- std::cout << i << " : \n";
|
|
|
- HeapArray[i].dump();
|
|
|
- std::cout << std::endl;
|
|
|
- }
|
|
|
-
|
|
|
- std::cout << "\n--------\n\n";
|
|
|
+
|
|
|
|
|
|
- for(size_t j = 0; j < 10; ++j)
|
|
|
+ for(size_t j = 0; j < 100; ++j)
|
|
|
{
|
|
|
RegAS inserted_val;
|
|
|
- tree.insert(tio, yield, HeapArray, inserted_val);
|
|
|
+ tree.insert(tio, yield, inserted_val);
|
|
|
+ tree.verify_heap_property(tio, yield);
|
|
|
}
|
|
|
|
|
|
- std::cout << "\n--------\n\n";
|
|
|
-
|
|
|
- for(size_t i = 0; i < HeapArray.size(); ++i)
|
|
|
- {
|
|
|
- std::cout << i << " : \n";
|
|
|
- reconstruct_AS(tio, yield, HeapArray[i]);
|
|
|
- yield();
|
|
|
- std::cout << std::endl;
|
|
|
- }
|
|
|
+
|
|
|
|
|
|
- tree.extract_min(tio, yield, HeapArray);
|
|
|
- // tree.verify_heap_property(tio, yield, HeapArray);
|
|
|
+ //tree.extract_min(tio, yield);
|
|
|
+
|
|
|
});
|
|
|
}
|