瀏覽代碼

Minor tweaks to BST

sshsshy 1 年之前
父節點
當前提交
adad6f44ba
共有 2 個文件被更改,包括 28 次插入10 次删除
  1. 14 7
      bst.cpp
  2. 14 3
      bst.hpp

+ 14 - 7
bst.cpp

@@ -74,6 +74,13 @@ std::tuple<RegBS, RegBS> compare_keys(MPCTIO tio, yield_t &yield, Node n1, Node
     return {lteq, gt};
 }
 
+std::tuple<RegBS, RegBS> compare_keys(MPCTIO tio, yield_t &yield, RegAS k1, RegAS k2) {
+    CDPF cdpf = tio.cdpf(yield);
+    auto [lt, eq, gt] = cdpf.compare(tio, yield, k2 - k1, tio.aes_ops());
+    RegBS lteq = lt^eq;
+    return {lteq, gt};
+}
+
 // Assuming pointer of 64 bits is split as:
 // - 32 bits Left ptr
 // - 32 bits Right ptr
@@ -416,7 +423,6 @@ bool BST::del(MPCTIO &tio, yield_t &yield, RegXS ptr, RegAS del_key,
           ret_struct.F_r^=1;
         return success;
     } else {
-        bool player0 = tio.player()==0;
         Node node = A[ptr];
         // Compare key
 
@@ -510,7 +516,7 @@ bool BST::del(MPCTIO &tio, yield_t &yield, RegXS ptr, RegAS del_key,
 
         // Case 4: finding successor (fs) and node has no more left children (l0)
         // This is the successor node then.
-        // Go left (to end the traversal without triggering flags on the real path to the right.
+        // Go right (since no more left) 
         mpc_and(tio, yield, F_c4, fs, l0);
         mpc_select(tio, yield, c_prime, F_c4, c_prime, l0);
 
@@ -609,11 +615,7 @@ bool BST::del(MPCTIO &tio, yield_t &yield, RegAS del_key) {
             return 0;
         }
         else{
-            num_items--;
-            
-            //Add deleted (empty) location into the empty_locations vector for reuse in next insert()
-            empty_locations.emplace_back(ret_struct.N_d);
-
+            num_items--; 
             /*
             printf("In delete's swap portion\n");
             Node del_node = A.reconstruct(A[ret_struct.N_d]);
@@ -632,6 +634,11 @@ bool BST::del(MPCTIO &tio, yield_t &yield, RegAS del_key) {
             A[ret_struct.N_d].NODE_VALUE = del_node.value;
             A[ret_struct.N_s].NODE_KEY = zero_as;
             A[ret_struct.N_s].NODE_VALUE = zero_xs;
+
+            RegXS empty_loc;
+            mpc_select(tio, yield, empty_loc, ret_struct.F_ss, ret_struct.N_d, ret_struct.N_s);
+            //Add deleted (empty) location into the empty_locations vector for reuse in next insert()
+            empty_locations.emplace_back(empty_loc);
         }
 
       return 1;

+ 14 - 3
bst.hpp

@@ -7,6 +7,11 @@
 #include "mpcio.hpp"
 #include "options.hpp"
 
+// Some simple utility functions:
+bool reconstruct_RegBS(MPCTIO &tio, yield_t &yield, RegBS flag);
+size_t reconstruct_RegAS(MPCTIO &tio, yield_t &yield, RegAS variable);
+size_t reconstruct_RegXS(MPCTIO &tio, yield_t &yield, RegXS variable);
+
 struct Node {
     RegAS key;
     RegXS pointers;
@@ -114,6 +119,11 @@ struct Node {
     }
 };
 
+void newnode(Node &a);
+
+std::tuple<RegBS, RegBS> compare_keys(MPCTIO tio, yield_t &yield, Node n1, Node n2);
+std::tuple<RegBS, RegBS> compare_keys(MPCTIO tio, yield_t &yield, RegAS k1, RegAS k2);
+
 // I/O operations (for sending over the network)
 
 template <typename T>
@@ -177,6 +187,10 @@ class BST {
         delete oram;
     };
 
+    size_t numEmptyLocations(){
+      return(empty_locations.size());
+    };
+
     void initialize(int num_players, size_t size);
     void insert(MPCTIO &tio, yield_t &yield, Node &node);
 
@@ -194,9 +208,6 @@ class BST {
     std::tuple<bool, address_t> check_bst(const std::vector<Node> &R,
         value_t node, value_t min_key, value_t max_key);
     void print_oram(MPCTIO &tio, yield_t &yield);
-    size_t numEmptyLocations(){
-      return(empty_locations.size());
-    };
 };
 
 /*