public void CollapsePermutationGates() { // unwind input and output addresses until we find an address on a non-permutation gate for (int i = 0; i < WireCount; i++) { InputGateAddress inAddr = FirstGateForWire[i]; while (inAddr != null && inAddr.Gate is PermutationGate) { var pgate = (PermutationGate)inAddr.Gate; var permuteOut = pgate.GetLocalOutputAddress(pgate.Permute(inAddr.Port)); Circuit.OutputConnectionCounterparties.TryGetValue(permuteOut, out inAddr); } FirstGateForWire[i] = inAddr; } for (int i = 0; i < WireCount; i++) { OutputGateAddress outAddr = LastGateForWire[i]; while (outAddr != null && outAddr.Gate is PermutationGate) { var pgate = (PermutationGate)outAddr.Gate; var permuteIn = pgate.GetLocalInputAddress(pgate.Unpermute(outAddr.Port)); Circuit.InputConnectionCounterparties.TryGetValue(permuteIn, out outAddr); } LastGateForWire[i] = outAddr; } Circuit.CollapsePermutationGates(); }
public void CollapsePermutationGates() { foreach (var gate in Gates.ToList()) { if (gate is PermutationGate) { PermutationGate pgate = (PermutationGate)gate; for (int i = 0; i < pgate.Count; i++) { OutputGateAddress inputCounterparty = InputConnectionCounterparties[pgate.GetLocalInputAddress(i)]; InputGateAddress outputCounterparty = OutputConnectionCounterparties[pgate.GetLocalOutputAddress(pgate.Permute(i))]; AddConnection(new GateConnection(inputCounterparty, outputCounterparty)); } RemoveGate(pgate); } } }
public object Clone(out Dictionary <Gate, Gate> mapping) { var clone = new Circuit(); mapping = new Dictionary <Gate, Gate>(); // add all of the gates and connections that I have foreach (var gate in Gates) { var gateClone = gate.Copy() as Gate; clone.Gates.Add(gateClone); mapping.Add(gate, gateClone); } foreach (var input in InputAddrs) { clone.InputAddrs.Add(new InputGateAddress(mapping[input.Gate], input.Port)); } foreach (var output in OutputAddrs) { clone.OutputAddrs.Add(new OutputGateAddress(mapping[output.Gate], output.Port)); } foreach (var oldInputGate in InputConnectionCounterparties.Keys) { var newInputGate = new InputGateAddress(mapping[oldInputGate.Gate], oldInputGate.Port); var oldOutputGate = InputConnectionCounterparties[oldInputGate]; var newOutputGate = new OutputGateAddress(mapping[oldOutputGate.Gate], oldOutputGate.Port); clone.InputConnectionCounterparties[newInputGate] = newOutputGate; clone.OutputConnectionCounterparties[newOutputGate] = newInputGate; } return(clone); }
public object Clone(out Dictionary<Gate, Gate> mapping) { var clone = new Circuit(); mapping = new Dictionary<Gate, Gate>(); // add all of the gates and connections that I have foreach (var gate in Gates) { var gateClone = gate.Copy() as Gate; clone.Gates.Add(gateClone); mapping.Add(gate, gateClone); } foreach (var input in InputAddrs) { clone.InputAddrs.Add(new InputGateAddress(mapping[input.Gate], input.Port)); } foreach (var output in OutputAddrs) { clone.OutputAddrs.Add(new OutputGateAddress(mapping[output.Gate], output.Port)); } foreach (var oldInputGate in InputConnectionCounterparties.Keys) { var newInputGate = new InputGateAddress(mapping[oldInputGate.Gate], oldInputGate.Port); var oldOutputGate = InputConnectionCounterparties[oldInputGate]; var newOutputGate = new OutputGateAddress(mapping[oldOutputGate.Gate], oldOutputGate.Port); clone.InputConnectionCounterparties[newInputGate] = newOutputGate; clone.OutputConnectionCounterparties[newOutputGate] = newInputGate; } return clone; }
public static void ReconstructDictionary(Quorum q, OutputGateAddress[] ordering, int qSize) { List<BigZp> result = new List<BigZp>(); foreach (OutputGateAddress outAddr in ordering) { if (outAddr == null) continue; BigZp[] shares = new BigZp[qSize]; int j = 0; foreach (var id in q.Members) { Protocol<IDictionary<OutputGateAddress, Share<BigZp>>> p = (NetSimulator.GetParty(id) as TestParty<IDictionary<OutputGateAddress, Share<BigZp>>>).UnderTest; if (p.Result.ContainsKey(outAddr)) shares[j++] = p.Result[outAddr].Value; } result.Add(BigShamirSharing.Recombine(new List<BigZp>(shares), (int)Math.Ceiling(qSize / 3.0) - 1, prime)); } Console.WriteLine("Result: " + string.Join(" ", result)); }
public GateConnection(OutputGateAddress from, InputGateAddress to) { FromAddr = from; ToAddr = to; }