/*
public static void SetupSimpleCircuitEvaluation(Quorum quorum)
{
int n = quorum.Size;
var polyDeg = (int)Math.Ceiling(n / 3.0) - 1;
Debug.Assert((n & (n - 1)) == 0); // is power of 2
network = new LPSortingNetwork(n);
IList<BigZp>[] shares = new IList<BigZp>[n];
for (int i = 0; i < n; i++)
shares[i] = BigShamirSharing.Share(new BigZp(prime, 500 - 2*i), n, polyDeg);
foreach (var id in quorum.Members)
{
Dictionary<InputGateAddress, Share<BigZp>> inShares = new Dictionary<InputGateAddress, Share<BigZp>>();
int i = 0;
foreach (var inAddr in network.Circuit.InputAddrs)
{
inShares[inAddr] = new Share<BigZp>(shares[i][id]);
i++;
}
TestParty<IDictionary<OutputGateAddress, Share<BigZp>>> party = new TestParty<IDictionary<OutputGateAddress, Share<BigZp>>>();
party.UnderTest = new SecureGroupCircuitEvaluation(party, quorum.Clone() as Quorum, network.Circuit, inShares);
NetSimulator.RegisterParty(party);
}
}
*/
public static void SetupMultiQuorumCircuitEvaluation(Quorum bigQuorum)
{
int n = bigQuorum.Size;
int qSize = n / 2;
var polyDeg = (int)Math.Ceiling(qSize / 3.0) - 1;
var quorums = new List<Quorum>();
quorums.Add(new Quorum(0, 0, qSize));
quorums.Add(new Quorum(1, qSize, 2*qSize));
Debug.Assert((n & (n - 1)) == 0); // is power of 2
network = new LPSortingNetwork(n);
//network = SortingNetworkFactory.CreateButterflyTournamentRound(n);
network.CollapsePermutationGates();
IList<BigZp>[] shares = new IList<BigZp>[n];
for (int i = 0; i < n; i++)
shares[i] = BigShamirSharing.Share(new BigZp(prime, 500 - 2 * i), qSize, polyDeg);
Dictionary<Gate, Quorum> gqmapping = new Dictionary<Gate, Quorum>();
for (int i = 0; i < network.Circuit.TopologicalOrder.Count; i++)
gqmapping[network.Circuit.TopologicalOrder[i]] = quorums[i];
foreach (var id in bigQuorum.Members)
{
Dictionary<InputGateAddress, Share<BigZp>> inShares = new Dictionary<InputGateAddress, Share<BigZp>>();
int i = 0;
foreach (var inAddr in network.Circuit.InputAddrs)
{
inShares[inAddr] = new Share<BigZp>(shares[i][id % 4]);
i++;
}
TestParty<IDictionary<OutputGateAddress, Share<BigZp>>> party = new TestParty<IDictionary<OutputGateAddress, Share<BigZp>>>();
Quorum[] quorumsClone = quorums.Select(a => a.Clone() as Quorum).ToArray();
party.UnderTest =
new SecureMultiQuorumCircuitEvaluation<Share<BigZp>>(party, quorumsClone[id / qSize], quorumsClone,
ProtocolIdGenerator.GenericIdentifier(0), network.Circuit, inShares, new BigZpShareGateEvaluationFactory(prime), gqmapping, prime);
NetSimulator.RegisterParty(party);
}
}