package happy.research.pgp;
import java.util.List;
import java.util.Map.Entry;
public class ModifiedPGP extends AbstractPGP
{
protected Performance firePerformanceTest(final List<PGPNode> nodes)
{
int numNodes = nodes.size();
int coversCount[] = new int[numNodes];
double coverages[] = new double[numNodes];
double accuracies[] = new double[numNodes];
double distances[] = new double[numNodes];
for (int i = 0; i < numNodes; i++)
{
PGPNode entity = nodes.get(i);
int coverageCount = 0;
int accuracy_count = 0;
for (int j = 0; j < numNodes; j++)
{
if (j == i) continue;
double positiveSum = 0, negativeSum = 0;
int count = 0;
PGPNode target = nodes.get(j);
if (entity.getTns().containsKey(target)) continue;
for (Entry<PGPNode, CertificateType> entry : target.getSigners().entrySet())
{
PGPNode signer = entry.getKey();
CertificateType validity = entry.getValue();
if (target == signer) continue;
if (entity.getTns().containsKey(signer))
{
count++;
TrustType trustness = entity.getTns().get(signer);
if (validity == CertificateType.VALID)
{
positiveSum += trustness.getTrustValue() * validity.getInherentValue();
} else if (validity == CertificateType.INVALID)
{
negativeSum += trustness.getTrustValue() * validity.getInherentValue();
}
}
}
if (count > 0)
{
coverageCount++;
double validity = (Math.abs(positiveSum) - Math.abs(negativeSum))
/ (Math.abs(positiveSum) + Math.abs(negativeSum));
double distance = Math.abs(validity - target.getCertificate().getInherentValue());
distances[i] += distance;
if (distance <= ACCURACY_THRESHOLD) accuracy_count++;
}
}
// coverage and distance test
coversCount[i] = coverageCount;
int needsCoversCount = numNodes - 1 - entity.getTns().size();
coverages[i] = (coversCount[i] + 0.0) / needsCoversCount;
accuracies[i] = (accuracy_count + 0.0) / needsCoversCount;
if (coversCount[i] > 0)
distances[i] /= coversCount[i];
}
return calculatePerformance(AbstractPGP.MODIFIED_PGP, coversCount, coverages, distances, accuracies);
}
}