| 
					
				 | 
			
			
				@@ -38,6 +38,30 @@ RegAS reconstruct_AS(MPCTIO &tio, yield_t &yield, RegAS AS) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    return reconstructed_AS;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+RegXS reconstruct_XS(MPCTIO &tio, yield_t &yield, RegXS XS) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    RegXS peer_XS;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    RegXS reconstructed_XS = XS;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (tio.player() == 1) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tio.queue_peer(&XS, sizeof(XS));
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } else {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        RegXS peer_XS;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tio.recv_peer(&peer_XS, sizeof(peer_XS));
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+         reconstructed_XS ^= peer_XS;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    yield();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (tio.player() == 0) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tio.queue_peer(&XS, sizeof(XS));
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } else {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        RegXS peer_flag;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tio.recv_peer(&peer_XS, sizeof(peer_XS));
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        reconstructed_XS ^= peer_XS;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   return reconstructed_XS;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 bool reconstruct_flag(MPCTIO &tio, yield_t &yield, RegBS flag) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     RegBS peer_flag;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     RegBS reconstructed_flag = flag;
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -66,10 +90,10 @@ 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);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  val.dump();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   yield();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   size_t child  = num_items;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   size_t parent = child/2;
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -80,93 +104,93 @@ int HEAP::insert(MPCTIO tio, yield_t &yield, RegAS val) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   reconstruct_AS(tio, yield, tmp);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   yield();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   while(parent != 0) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    std::cout << "while loop\n";
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //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";
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // 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;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // 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";
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //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";
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      // 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;
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -176,105 +200,140 @@ int HEAP::insert(MPCTIO tio, yield_t &yield, RegAS val) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 int HEAP::verify_heap_property(MPCTIO tio, yield_t &yield) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-std::cout << std::endl << std::endl << "verify_heap_property \n\n\n";
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-auto HeapArray = oram->flat(tio, yield);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ std::cout << std::endl << std::endl << "verify_heap_property is being called " << std::endl;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 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();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 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;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ for(size_t j = 1; j < num_items/2; ++j)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if(heapreconstruction[j].ashare > heapreconstruction[2*j].ashare)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   std::cout << "heap property failure\n\n";
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+   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);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        assert(heapreconstruction[j].ashare <= heapreconstruction[2*j].ashare);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ return 1;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+}
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-return 1;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void verify_parent_children_heaps(MPCTIO tio, yield_t &yield, RegAS parent, RegAS leftchild, RegAS rightchild)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    RegAS parent_reconstruction = reconstruct_AS(tio, yield, parent);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    yield();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    RegAS leftchild_reconstruction = reconstruct_AS(tio, yield, leftchild);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    yield();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    RegAS rightchild_reconstruction = reconstruct_AS(tio, yield, rightchild);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    yield();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert(parent_reconstruction.ashare <= leftchild_reconstruction.ashare);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    assert(parent_reconstruction.ashare <= rightchild_reconstruction.ashare);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-RegAS HEAP::restore_heap_property(MPCTIO tio, yield_t &yield, RegAS index)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+//
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+RegXS HEAP::restore_heap_property(MPCTIO tio, yield_t &yield, RegXS index)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    auto HeapArray = oram->flat(tio, yield);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    RegAS parent = HeapArray[index];
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    RegAS leftchild = HeapArray[index + index];
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    RegAS rightchild = HeapArray[index + index];
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    RegAS sum = parent + leftchild + rightchild;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    CDPF cdpf = tio.cdpf(yield);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    auto [lt, eq, gt] = cdpf.compare(tio, yield, leftchild - rightchild, tio.aes_ops());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ RegAS smallest;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ auto HeapArray = oram->flat(tio, yield);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ RegAS parent = HeapArray[index];
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ RegXS leftchildindex = index;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ leftchildindex = index << 1;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    RegAS smallerchild;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    mpc_select(tio, yield, smallerchild, lt, leftchild, rightchild, 64); // smallerchild holds smaller of left and right child 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ RegXS rightchildindex;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ rightchildindex.xshare = leftchildindex.xshare ^ (tio.player());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    CDPF cdpf0 = tio.cdpf(yield);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    auto [lt0, eq0, gt0] = cdpf.compare(tio, yield, smallerchild - parent, tio.aes_ops());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ RegAS leftchild  = HeapArray[leftchildindex];
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ RegAS rightchild = HeapArray[rightchildindex];
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    RegAS smallest;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    mpc_select(tio, yield, smallest, lt0, smallerchild, parent, 64); // smallest holds smaller of left/right child and parent   
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ CDPF cdpf = tio.cdpf(yield);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ auto [lt, eq, gt] = cdpf.compare(tio, yield, leftchild - rightchild, tio.aes_ops());  
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ RegXS smallerindex; 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ mpc_select(tio, yield, smallerindex, lt, rightchildindex, leftchildindex, 64); 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ //smallerindex stores either the index of the left or child (whichever has the smaller value) 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ RegAS smallerchild;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ mpc_select(tio, yield, smallerchild, lt, rightchild, leftchild, 64); 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ // the value smallerchild holds smaller of left and right child 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ CDPF cdpf0 = tio.cdpf(yield);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ auto [lt0, eq0, gt0] = cdpf0.compare(tio, yield, smallerchild - parent, tio.aes_ops()); 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ //comparison between the smallerchild and the parent
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ mpc_select(tio, yield, smallest, lt0, parent, smallerchild, 64); 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ // smallest holds smaller of left/right child and parent
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    parent     = smallest;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    leftchild  = smallerchild;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    rightchild = (sum - smallerchild - smallest);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    HeapArray[index] = parent;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    HeapArray[index + index] = leftchild;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ RegAS otherchild;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ mpc_select(tio, yield, otherchild, gt0, parent, smallerchild, 64);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ // otherchild holds max(min(leftchild, rightchild), parent)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return smallest;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ HeapArray[index] = smallest;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ HeapArray[smallerindex] = otherchild; 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ //verify_parent_children_heaps(tio, yield, HeapArray[index], HeapArray[leftchildindex] , HeapArray[rightchildindex]);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ return smallerindex;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-RegAS HEAP::restore_heap_property_at_root(MPCTIO tio, yield_t &yield, size_t index)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+/*
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+*/
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+RegXS HEAP::restore_heap_property_at_root(MPCTIO tio, yield_t &yield, size_t index)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     auto HeapArray = oram->flat(tio, yield);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     RegAS parent = HeapArray[index];
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    RegAS leftchild  = HeapArray[2 * index];
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    RegAS leftchild = HeapArray[2 * index];
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     RegAS rightchild = HeapArray[2 * index + 1];
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    RegAS sum = parent + leftchild + rightchild;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     CDPF cdpf = tio.cdpf(yield);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    auto [lt, eq, gt] = cdpf.compare(tio, yield, leftchild - rightchild, tio.aes_ops());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    auto [lt, eq, gt] = cdpf.compare(tio, yield, leftchild - rightchild, tio.aes_ops()); // c_1 in the paper
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     RegAS smallerchild;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    mpc_select(tio, yield, smallerchild, lt, rightchild, leftchild,  64); // smallerchild holds smaller of left and right child 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    mpc_select(tio, yield, smallerchild, lt, rightchild, leftchild, 64); // smallerchild holds smaller of left and right child
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     CDPF cdpf0 = tio.cdpf(yield);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    auto [lt0, eq0, gt0] = cdpf.compare(tio, yield, smallerchild - parent, tio.aes_ops());
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    auto [lt0, eq0, gt0] = cdpf0.compare(tio, yield, smallerchild - parent, tio.aes_ops()); //c_0 in the paper
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     RegAS smallest;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    mpc_select(tio, yield, smallest, lt0, parent, smallerchild, 64); // smallest holds smaller of left/right child and parent   
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    parent     = smallest;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    leftchild  = smallerchild;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    rightchild = (sum - smallerchild - smallest);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    HeapArray[index] = parent;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    HeapArray[2*index] = leftchild;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    HeapArray[2*index + 1] = rightchild;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    RegAS parent_reconstruction = reconstruct_AS(tio, yield, parent);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    yield();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    RegAS leftchild_reconstruction = reconstruct_AS(tio, yield, leftchild);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    yield();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    RegAS rightchild_reconstruction = reconstruct_AS(tio, yield, rightchild);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    yield();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    assert(parent_reconstruction.ashare <= leftchild_reconstruction.ashare);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    assert(parent_reconstruction.ashare <= rightchild_reconstruction.ashare);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    return smallest;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    mpc_select(tio, yield, smallest, lt0, parent, smallerchild, 64); // smallest holds smaller of left/right child and parent
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    RegAS larger_p;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    mpc_select(tio, yield, larger_p, gt0, parent, smallerchild, 64); // smallest holds smaller of left/right child and parent
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    parent = smallest;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    leftchild = larger_p;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    HeapArray[index] = smallest;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //verify_parent_children_heaps(tio, yield, parent, leftchild, rightchild);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    //RegAS smallerindex;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    RegXS smallerindex(lt);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    uint64_t leftchildindex = (2 * index);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    uint64_t rightchildindex = (2 * index) + 1;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // smallerindex2 &= (leftchildindex ^ rightchildindex);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // smallerindex2.xshare ^= leftchildindex;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    smallerindex = (RegXS(lt) & leftchildindex) ^ (RegXS(gt) & rightchildindex);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // RegXS smallerindex_reconstruction2 = reconstruct_XS(tio, yield, smallerindex2);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // yield();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    HeapArray[smallerindex] = larger_p;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // std::cout << "smallerindex XOR (root) == \n";
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // smallerindex_reconstruction2.dump();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    // std::cout << "\n\n ---? \n";
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    return smallerindex;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 RegAS HEAP::extract_min(MPCTIO tio, yield_t &yield) {
 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -287,52 +346,57 @@ RegAS HEAP::extract_min(MPCTIO tio, yield_t &yield) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       return minval;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- void Heap(MPCIO &mpcio, const PRACOptions &opts, char **args)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-{
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void Heap(MPCIO &mpcio, const PRACOptions &opts, char **args)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+{
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     nbits_t depth=3;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (*args) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         depth = atoi(*args);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         ++args;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     size_t items = (size_t(1)<<depth)-1;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (*args) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         items = atoi(*args);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         ++args;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        MPCTIO tio(mpcio, 0, opts.num_threads);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    MPCTIO tio(mpcio, 0, opts.num_threads);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-       
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        run_coroutines(tio, [&tio, depth, items] (yield_t &yield) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    run_coroutines(tio, [&tio, depth, items](yield_t &yield) {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         size_t size = size_t(1)<<depth;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         std::cout << "size = " << size << std::endl;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         HEAP tree(tio.player(), size);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        for(size_t j = 0; j < 22; ++j)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for(size_t j = 0; j < 3; ++j)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         RegAS inserted_val;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         tree.insert(tio, yield, inserted_val);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-         tree.verify_heap_property(tio, yield);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            RegAS inserted_val;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            inserted_val.randomize();
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            inserted_val.ashare = inserted_val.ashare/1000;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            tree.insert(tio, yield, inserted_val);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				         }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-     
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        tree.extract_min(tio, yield);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        RegAS smaller =tree.restore_heap_property_at_root(tio, yield, 1);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        std::cout << std::endl << "=============[Insert Done]================" << std::endl << std::endl;
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        //tree.verify_heap_property(tio, yield);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // size_t height = std::log(tree.num_items);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        // for(size_t i = 0; i < height; ++i) smaller = tree.restore_heap_property(tio, yield, smaller);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-        //      tree.verify_heap_property(tio, yield);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        for(size_t j = 0; j < 2; ++j)
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            tree.extract_min(tio, yield);      
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            RegXS smaller = tree.restore_heap_property_at_root(tio, yield, 1);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            size_t height = std::log(tree.num_items);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            for(size_t i = 0; i < height ; ++i) 
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            {
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                smaller = tree.restore_heap_property(tio, yield, smaller);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+            
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        std::cout << std::endl << "=============[Extract Min Done]================" << std::endl << std::endl;    
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+        tree.verify_heap_property(tio, yield);
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     });
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 }
 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+
 
			 |