Sfoglia il codice sorgente

add routing in GCLib

Boyoung- 8 anni fa
parent
commit
efc5f4f724
4 ha cambiato i file con 147 aggiunte e 30 eliminazioni
  1. 111 21
      src/gc/GCLib.java
  2. 17 6
      src/protocols/MakeCycle.java
  3. 6 0
      src/protocols/PreData.java
  4. 13 3
      src/protocols/PrepareTarget.java

+ 111 - 21
src/gc/GCLib.java

@@ -7,8 +7,6 @@ import com.oblivm.backend.flexsc.CompEnv;
 
 public class GCLib<T> extends IntegerLib<T> {
 
-	// TODO: take root bucket width into account
-
 	private int d;
 	private int w;
 	private int logD;
@@ -59,13 +57,7 @@ public class GCLib<T> extends IntegerLib<T> {
 		return output;
 	}
 
-	public T[][] findDeepestAndEmpty(int i, T[] pathLabel, T[] E_feBits, T[] C_feBits, T[][] E_tupleLabels,
-			T[][] C_tupleLabels) {
-		T[] feBits = xor(E_feBits, C_feBits);
-		T[][] tupleLabels = env.newTArray(w, 0);
-		for (int j = 0; j < w; j++)
-			tupleLabels[j] = xor(E_tupleLabels[j], C_tupleLabels[j]);
-
+	public T[][] findDeepestAndEmpty(int i, T[] pathLabel, T[] feBits, T[][] tupleLabels) {
 		T[] l = padSignal(ones(d - 1 - i), d); // has sign bit
 		T[] j1 = zeros(logW); // no sign bit
 		T[] j2 = zeros(logW);
@@ -97,8 +89,7 @@ public class GCLib<T> extends IntegerLib<T> {
 		return output;
 	}
 
-	public T[][][] prepareDeepest(T[] Li, T[][] E_feBits, T[][] C_feBits, T[][][] E_tupleLabels,
-			T[][][] C_tupleLabels) {
+	public T[][][] prepareDeepest(T[] Li, T[][] feBits, T[][][] tupleLabels) {
 		T[] perpD = ones(logD + 1);
 		T[][][] output = env.newTArray(4, d, 0);
 
@@ -112,7 +103,7 @@ public class GCLib<T> extends IntegerLib<T> {
 			T[] index = toSignals(i, logD + 1);
 			deepest[i] = mux(deepest[i], src, geq(goal, index));
 
-			T[][] dae = findDeepestAndEmpty(i, Li, E_feBits[i], C_feBits[i], E_tupleLabels[i], C_tupleLabels[i]);
+			T[][] dae = findDeepestAndEmpty(i, Li, feBits[i], tupleLabels[i]);
 			T[] l = dae[0];
 			output[1][i] = dae[1];
 			output[2][i] = dae[2];
@@ -127,7 +118,7 @@ public class GCLib<T> extends IntegerLib<T> {
 		return output;
 	}
 
-	public T[][][] prepareTarget(T[][] deepest, T[][] j1, T[][] j2, T[][] et) {
+	public T[][][] prepareTargetAndIndex(T[][] deepest, T[][] j1, T[][] j2, T[][] et, T[][] delta) {
 		T[] ft = toSignals(w, logW + 1);
 		T[] perpD = ones(logD + 1);
 		T[] perpW = ones(logW + 1);
@@ -181,6 +172,8 @@ public class GCLib<T> extends IntegerLib<T> {
 
 			T nBotEqPerp = eq(nBot, perpD);
 			nBot = mux(nBot, index, and(fEqPerp, nBotEqPerp));
+
+			f[i] = xor(f[i], padSignal(delta[i], logW + 1));
 		}
 
 		output[0] = target;
@@ -192,12 +185,6 @@ public class GCLib<T> extends IntegerLib<T> {
 		return output;
 	}
 
-	public T[][][] combineDeepestAndTarget(T[] Li, T[][] E_feBits, T[][] C_feBits, T[][][] E_tupleLabels,
-			T[][][] C_tupleLabels) {
-		T[][][] out = prepareDeepest(Li, E_feBits, C_feBits, E_tupleLabels, C_tupleLabels);
-		return prepareTarget(out[0], out[1], out[2], out[3]);
-	}
-
 	public T[][] makeCycle(T[][] target, T[] nTop, T[] nBot, T[] eTop, T[] eBot) {
 		T[] perpD = ones(logD + 1);
 		T[] nPrev = perpD;
@@ -227,9 +214,112 @@ public class GCLib<T> extends IntegerLib<T> {
 		return target;
 	}
 
-	public T[][][] combineDeepestTargetCycle(T[] Li, T[][] E_feBits, T[][] C_feBits, T[][][] E_tupleLabels,
+	public T[][][] routing(T[] Li, T[][] E_feBits, T[][] C_feBits, T[][][] E_tupleLabels, T[][][] C_tupleLabels,
+			T[][] delta) {
+		T[][] feBits = env.newTArray(d, 0);
+		T[][][] tupleLabels = env.newTArray(d, w, 0);
+		for (int i = 0; i < d; i++) {
+			feBits[i] = xor(E_feBits[i], C_feBits[i]);
+			for (int j = 0; j < w; j++) {
+				tupleLabels[i][j] = xor(E_tupleLabels[i][j], C_tupleLabels[i][j]);
+			}
+		}
+
+		T[][][] pd = prepareDeepest(Li, feBits, tupleLabels);
+		T[][][] ptai = prepareTargetAndIndex(pd[0], pd[1], pd[2], pd[3], delta);
+		T[][] target = makeCycle(ptai[0], ptai[2][0], ptai[2][1], ptai[2][2], ptai[2][3]);
+
+		T[][][] output = env.newTArray(2, 0, 0);
+		output[0] = target;
+		output[1] = ptai[1];
+		return output;
+	}
+
+	//////////////////////////////////////////////////////////////////
+	//////////////////////////////////////////////////////////////////
+	//////////////////////////////////////////////////////////////////
+	///////////////////// belows are for testing /////////////////////
+	//////////////////////////////////////////////////////////////////
+	//////////////////////////////////////////////////////////////////
+	//////////////////////////////////////////////////////////////////
+
+	public T[][] findDeepestAndEmpty(int i, T[] pathLabel, T[] E_feBits, T[] C_feBits, T[][] E_tupleLabels,
+			T[][] C_tupleLabels) {
+		T[] feBits = xor(E_feBits, C_feBits);
+		T[][] tupleLabels = env.newTArray(w, 0);
+		for (int j = 0; j < w; j++)
+			tupleLabels[j] = xor(E_tupleLabels[j], C_tupleLabels[j]);
+
+		T[] l = padSignal(ones(d - 1 - i), d); // has sign bit
+		T[] j1 = zeros(logW); // no sign bit
+		T[] j2 = zeros(logW);
+		T[] et = zeros(1);
+
+		for (int j = 0; j < w; j++) {
+			T[] tupleIndex = toSignals(j, logW);
+			T[] lz = xor(pathLabel, tupleLabels[j]);
+			zerosFollowedByOnes(lz);
+			lz = padSignal(lz, d); // add sign bit
+
+			T firstIf = and(feBits[j], less(lz, l));
+			l = mux(l, lz, firstIf);
+			j1 = mux(j1, tupleIndex, firstIf);
+
+			et = mux(ones(1), et, feBits[j]);
+			j2 = mux(tupleIndex, j2, feBits[j]);
+		}
+
+		T[] l_p = numberOfOnes(not(Arrays.copyOfRange(l, 0, d - 1))); // has
+																		// sign
+																		// bit
+
+		T[][] output = env.newTArray(4, 0);
+		output[0] = l_p;
+		output[1] = padSignal(j1, logW + 1); // add sign bit
+		output[2] = padSignal(j2, logW + 1);
+		output[3] = et;
+		return output;
+	}
+
+	public T[][][] prepareDeepest(T[] Li, T[][] E_feBits, T[][] C_feBits, T[][][] E_tupleLabels,
 			T[][][] C_tupleLabels) {
-		T[][][] out = combineDeepestAndTarget(Li, E_feBits, C_feBits, E_tupleLabels, C_tupleLabels);
+		T[] perpD = ones(logD + 1);
+		T[][][] output = env.newTArray(4, d, 0);
+
+		T[][] deepest = env.newTArray(d, 0);
+		for (int j = 0; j < d; j++)
+			deepest[j] = perpD;
+		T[] src = perpD;
+		T[] goal = perpD; // \perp = -1 in 2's complement form
+
+		for (int i = 0; i < d; i++) {
+			T[] index = toSignals(i, logD + 1);
+			deepest[i] = mux(deepest[i], src, geq(goal, index));
+
+			T[][] dae = findDeepestAndEmpty(i, Li, E_feBits[i], C_feBits[i], E_tupleLabels[i], C_tupleLabels[i]);
+			T[] l = dae[0];
+			output[1][i] = dae[1];
+			output[2][i] = dae[2];
+			output[3][i] = dae[3];
+
+			T lGreaterGoal = greater(l, goal);
+			goal = mux(goal, l, lGreaterGoal);
+			src = mux(src, index, lGreaterGoal);
+		}
+
+		output[0] = deepest;
+		return output;
+	}
+
+	public T[][][] combineDeepestAndTarget(T[] Li, T[][] E_feBits, T[][] C_feBits, T[][][] E_tupleLabels,
+			T[][][] C_tupleLabels, T[][] delta) {
+		T[][][] out = prepareDeepest(Li, E_feBits, C_feBits, E_tupleLabels, C_tupleLabels);
+		return prepareTargetAndIndex(out[0], out[1], out[2], out[3], delta);
+	}
+
+	public T[][][] combineDeepestTargetCycle(T[] Li, T[][] E_feBits, T[][] C_feBits, T[][][] E_tupleLabels,
+			T[][][] C_tupleLabels, T[][] delta) {
+		T[][][] out = combineDeepestAndTarget(Li, E_feBits, C_feBits, E_tupleLabels, C_tupleLabels, delta);
 		makeCycle(out[0], out[2][0], out[2][1], out[2][2], out[2][3]);
 
 		T[][][] output = env.newTArray(2, 0, 0);

+ 17 - 6
src/protocols/MakeCycle.java

@@ -83,6 +83,7 @@ public class MakeCycle extends Protocol {
 	}
 
 	public void runE() {
+		int logW = (int) Math.ceil(Math.log(w + 1) / Math.log(2));
 		byte[] Li = Util.nextBytes((d - 1 + 7) / 8, Crypto.sr);
 
 		byte[][] feBits = new byte[d][];
@@ -92,6 +93,9 @@ public class MakeCycle extends Protocol {
 		GCSignal[] LiZeroKeys = getZeroKeys(LiKeyPairs);
 		GCSignal[] LiKeyInput = revSelectKeys(LiKeyPairs, Li);
 
+		GCSignal[][][] deltaKeyPairs = new GCSignal[d][][];
+		GCSignal[][] deltaZeroKeys = new GCSignal[d][];
+
 		GCSignal[][][] E_feKeyPairs = new GCSignal[d][][];
 		GCSignal[][][] C_feKeyPairs = new GCSignal[d][][];
 		GCSignal[][] E_feZeroKeys = new GCSignal[d][];
@@ -105,6 +109,9 @@ public class MakeCycle extends Protocol {
 		GCSignal[][][] E_labelKeyInput = new GCSignal[d][w][];
 
 		for (int i = 0; i < d; i++) {
+			deltaKeyPairs[i] = genKeyPairs(logW);
+			deltaZeroKeys[i] = getZeroKeys(deltaKeyPairs[i]);
+
 			feBits[i] = Util.nextBytes((w + 7) / 8, Crypto.sr);
 			// feBits[i] = new byte[(w + 7) / 8];
 			for (int j = 0; j < w; j++)
@@ -130,18 +137,19 @@ public class MakeCycle extends Protocol {
 		con1.write(C_feZeroKeys);
 		con1.write(E_labelKeyInput);
 		con1.write(C_labelZeroKeys);
+		con1.write(deltaZeroKeys);
 
 		Network channel = new Network(null, con1);
 
 		CompEnv<GCSignal> gen1 = new GCGen(channel);
 		GCSignal[][][] E_out1 = new GCLib<GCSignal>(gen1, d, w).combineDeepestAndTarget(LiZeroKeys, E_feZeroKeys,
-				C_feZeroKeys, E_labelZeroKeys, C_labelZeroKeys);
+				C_feZeroKeys, E_labelZeroKeys, C_labelZeroKeys, deltaZeroKeys);
 
 		GCSignal[][][] D_out1 = con1.readObject();
 
 		CompEnv<GCSignal> gen = new GCGen(channel);
 		GCSignal[][][] E_out = new GCLib<GCSignal>(gen, d, w).combineDeepestTargetCycle(LiZeroKeys, E_feZeroKeys,
-				C_feZeroKeys, E_labelZeroKeys, C_labelZeroKeys);
+				C_feZeroKeys, E_labelZeroKeys, C_labelZeroKeys, deltaZeroKeys);
 
 		GCSignal[][][] D_out = con1.readObject();
 
@@ -205,26 +213,29 @@ public class MakeCycle extends Protocol {
 		GCSignal[][] C_feZeroKeys = con1.readObject();
 		GCSignal[][][] E_labelKeyInput = con1.readObject();
 		GCSignal[][][] C_labelZeroKeys = con1.readObject();
+		GCSignal[][] deltaZeroKeys = con1.readObject();
 
 		Network channel = new Network(con1, null);
 
 		CompEnv<GCSignal> gen1 = new GCEva(channel);
 		GCLib<GCSignal> dae1 = new GCLib<GCSignal>(gen1, d, w);
-		dae1.combineDeepestAndTarget(LiKeyInput, E_feKeyInput, C_feZeroKeys, E_labelKeyInput, C_labelZeroKeys);
+		dae1.combineDeepestAndTarget(LiKeyInput, E_feKeyInput, C_feZeroKeys, E_labelKeyInput, C_labelZeroKeys,
+				deltaZeroKeys);
 
 		gen1.setEvaluate();
 		GCSignal[][][] D_out1 = dae1.combineDeepestAndTarget(LiKeyInput, E_feKeyInput, C_feZeroKeys, E_labelKeyInput,
-				C_labelZeroKeys);
+				C_labelZeroKeys, deltaZeroKeys);
 
 		con1.write(D_out1);
 
 		CompEnv<GCSignal> gen = new GCEva(channel);
 		GCLib<GCSignal> dae = new GCLib<GCSignal>(gen, d, w);
-		dae.combineDeepestTargetCycle(LiKeyInput, E_feKeyInput, C_feZeroKeys, E_labelKeyInput, C_labelZeroKeys);
+		dae.combineDeepestTargetCycle(LiKeyInput, E_feKeyInput, C_feZeroKeys, E_labelKeyInput, C_labelZeroKeys,
+				deltaZeroKeys);
 
 		gen.setEvaluate();
 		GCSignal[][][] D_out = dae.combineDeepestTargetCycle(LiKeyInput, E_feKeyInput, C_feZeroKeys, E_labelKeyInput,
-				C_labelZeroKeys);
+				C_labelZeroKeys, deltaZeroKeys);
 
 		con1.write(D_out);
 	}

+ 6 - 0
src/protocols/PreData.java

@@ -51,4 +51,10 @@ public class PreData {
 	public GCSignal[][][] ur_C_labelKeyPairs;
 	public BigInteger[][] ur_outKeyHashes;
 	public GCLib<GCSignal> ur_gc;
+
+	public GCSignal[][] evict_LiKeyPairs;
+	public GCSignal[][][] evict_E_feKeyPairs;
+	public GCSignal[][][] evict_C_feKeyPairs;
+	public GCSignal[][][][] evict_E_labelKeyPairs;
+	public GCSignal[][][][] evict_C_labelKeyPairs;
 }

+ 13 - 3
src/protocols/PrepareTarget.java

@@ -83,6 +83,7 @@ public class PrepareTarget extends Protocol {
 	}
 
 	public void runE() {
+		int logW = (int) Math.ceil(Math.log(w + 1) / Math.log(2));
 		byte[] Li = Util.nextBytes((d - 1 + 7) / 8, Crypto.sr);
 
 		byte[][] feBits = new byte[d][];
@@ -92,6 +93,9 @@ public class PrepareTarget extends Protocol {
 		GCSignal[] LiZeroKeys = getZeroKeys(LiKeyPairs);
 		GCSignal[] LiKeyInput = revSelectKeys(LiKeyPairs, Li);
 
+		GCSignal[][][] deltaKeyPairs = new GCSignal[d][][];
+		GCSignal[][] deltaZeroKeys = new GCSignal[d][];
+
 		GCSignal[][][] E_feKeyPairs = new GCSignal[d][][];
 		GCSignal[][][] C_feKeyPairs = new GCSignal[d][][];
 		GCSignal[][] E_feZeroKeys = new GCSignal[d][];
@@ -105,6 +109,9 @@ public class PrepareTarget extends Protocol {
 		GCSignal[][][] E_labelKeyInput = new GCSignal[d][w][];
 
 		for (int i = 0; i < d; i++) {
+			deltaKeyPairs[i] = genKeyPairs(logW);
+			deltaZeroKeys[i] = getZeroKeys(deltaKeyPairs[i]);
+
 			feBits[i] = Util.nextBytes((w + 7) / 8, Crypto.sr);
 			for (int j = 0; j < w; j++)
 				tupleLabels[i][j] = Util.nextBytes((d - 1 + 7) / 8, Crypto.sr);
@@ -129,6 +136,7 @@ public class PrepareTarget extends Protocol {
 		con1.write(C_feZeroKeys);
 		con1.write(E_labelKeyInput);
 		con1.write(C_labelZeroKeys);
+		con1.write(deltaZeroKeys);
 
 		Network channel = new Network(null, con1);
 
@@ -140,7 +148,7 @@ public class PrepareTarget extends Protocol {
 
 		CompEnv<GCSignal> gen1 = new GCGen(channel);
 		GCSignal[][][] E_out1 = new GCLib<GCSignal>(gen1, d, w).combineDeepestAndTarget(LiZeroKeys, E_feZeroKeys,
-				C_feZeroKeys, E_labelZeroKeys, C_labelZeroKeys);
+				C_feZeroKeys, E_labelZeroKeys, C_labelZeroKeys, deltaZeroKeys);
 
 		GCSignal[][][] D_out1 = con1.readObject();
 
@@ -211,6 +219,7 @@ public class PrepareTarget extends Protocol {
 		GCSignal[][] C_feZeroKeys = con1.readObject();
 		GCSignal[][][] E_labelKeyInput = con1.readObject();
 		GCSignal[][][] C_labelZeroKeys = con1.readObject();
+		GCSignal[][] deltaZeroKeys = con1.readObject();
 
 		Network channel = new Network(con1, null);
 
@@ -226,11 +235,12 @@ public class PrepareTarget extends Protocol {
 
 		CompEnv<GCSignal> gen1 = new GCEva(channel);
 		GCLib<GCSignal> dae1 = new GCLib<GCSignal>(gen1, d, w);
-		dae1.combineDeepestAndTarget(LiKeyInput, E_feKeyInput, C_feZeroKeys, E_labelKeyInput, C_labelZeroKeys);
+		dae1.combineDeepestAndTarget(LiKeyInput, E_feKeyInput, C_feZeroKeys, E_labelKeyInput, C_labelZeroKeys,
+				deltaZeroKeys);
 
 		gen1.setEvaluate();
 		GCSignal[][][] D_out1 = dae1.combineDeepestAndTarget(LiKeyInput, E_feKeyInput, C_feZeroKeys, E_labelKeyInput,
-				C_labelZeroKeys);
+				C_labelZeroKeys, deltaZeroKeys);
 
 		con1.write(D_out1);
 	}