コード例 #1
0
        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();
        }
コード例 #2
0
        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);
                }
            }
        }
コード例 #3
0
        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);
        }
コード例 #4
0
ファイル: Circuit.cs プロジェクト: mahdiz/mpclib
        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;
        }
コード例 #5
0
 public GateConnection(OutputGateAddress from, InputGateAddress to)
 {
     FromAddr = from;
     ToAddr   = to;
 }
コード例 #6
0
ファイル: Gate.cs プロジェクト: mahdiz/mpclib
 public GateConnection(OutputGateAddress from, InputGateAddress to)
 {
     FromAddr = from;
     ToAddr = to;
 }