public void TestDistanceIncrease2() { var dimension = 5; var entropySketch = new EntropySketchFunction(dimension); var befVector = ArrayUtils.Init(-1.0, -2.0, -3.0, -4.0, -5.0).ToVector(); var afVector = ArrayUtils.Init(-3.0, -3.0, -3.0, -4.0, -5.0).ToVector(); var befEntropySketchValue = entropySketch.ComputeEntropySketch(befVector); var afEntropySketchValue = entropySketch.ComputeEntropySketch(afVector); var closestVector = IncreaseEntropySketch.l1IncreaseEntropySketchTo(befVector, dimension, afEntropySketchValue, Approximations.ApproximationEpsilon); var resultMSE = closestVector.DistL2FromVector()(afVector); Assert.AreEqual(resultMSE, 0.0, 0.00001); }
public void TestDistanceDecrease2() { var dimension = 5; var entropySketch = new EntropySketchFunction(dimension); var befVector = ArrayUtils.Init(-1.0, -2.0, -3.0, -4.0, -5.0).ToVector(); var afVector = ArrayUtils.Init(-0.5, -2.0, -3.0, -4.0, -5.0).ToVector(); var befEntropySketchValue = entropySketch.ComputeEntropySketch(befVector); var afEntropySketchValue = entropySketch.ComputeEntropySketch(afVector); var distL1 = (afVector - befVector).L1Norm(); var distance = DecreaseEntropySketch.l1DecreaseEntropySketchTo(befVector, dimension, afEntropySketchValue, Approximations.ApproximationEpsilon); var resultMSE = Math.Pow(distance - distL1, 2); Assert.AreEqual(resultMSE, 0.0, 0.00001); }
public static void RunRandomly(Random rnd, int numOfNodes, ApproximationType approximation, int vectorLength, int collapeDimension, int iterations, bool oneChanges, string resultDir) { var entropyResultPath = PathBuilder.Create(resultDir, "Entropy") .AddProperty("Dataset", "Random") .AddProperty("Nodes", numOfNodes.ToString()) .AddProperty("VectorLength", vectorLength.ToString()) .AddProperty("OneChanges", oneChanges.ToString()) .AddProperty("Iterations", iterations.ToString()) .AddProperty("Approximation", approximation.AsString()) .ToPath("csv"); var sketchEntropyResultPath = PathBuilder.Create(resultDir, "SketchEntropy") .AddProperty("Dataset", "Random") .AddProperty("Nodes", numOfNodes.ToString()) .AddProperty("VectorLength", collapeDimension.ToString()) .AddProperty("OneChanges", oneChanges.ToString()) .AddProperty("Iterations", iterations.ToString()) .AddProperty("Approximation", approximation.AsString()) .ToPath("csv"); using (var entropyResultCsvFile = AutoFlushedTextFile.Create(entropyResultPath, AccumaltedResult.Header(numOfNodes))) using (var sketchEntropyResultCsvFile = AutoFlushedTextFile.Create(sketchEntropyResultPath, AccumaltedResult.Header(numOfNodes))) { var sqrt = (int)Math.Sqrt(vectorLength); var entropyFunction = new EntropyFunction(vectorLength); var entropySketchFunction = new EntropySketchFunction(collapeDimension); Func <int, Vector> genVector = node => ArrayUtils.Init(vectorLength, rnd.NextDouble()) .ToVector().NormalizeInPlaceToSum(1.0); var initVectors = ArrayUtils.Init(numOfNodes, genVector); var sketchInitVectors = initVectors.Map(entropySketchFunction.CollapseProbabilityVector); var globalVector = Vector.AverageVector(initVectors); Vector getChangeVector(int node) { if (oneChanges && node >= 1) { return(new Vector()); } var someVector = genVector(node); Vector changeVector = someVector - globalVector; if (!oneChanges) { changeVector.DivideInPlace(numOfNodes); } globalVector.AddInPlace(changeVector / numOfNodes); return(changeVector); } var entropyMultiRunner = MultiRunner.InitAll(initVectors, numOfNodes, vectorLength, approximation, entropyFunction.MonitoredFunction); var sketchEntropyMultiRunner = MultiRunner.InitAll(sketchInitVectors, numOfNodes, vectorLength, approximation, entropySketchFunction.MonitoredFunction); var shouldStop = new StrongBox <bool>(false); for (int i = 0; i < iterations; i++) { var changes = ArrayUtils.Init(numOfNodes, getChangeVector); var sketchChanges = changes.Map(entropySketchFunction.CollapseProbabilityVector); //entropyMultiRunner.Run(changes, rnd, false) //.SideEffect(r => shouldStop.Value = shouldStop.Value || (r.MonitoringScheme is MonitoringScheme.Oracle && r.NumberOfFullSyncs >= 8)) //.Select(r => r.AsCsvString()) //.ForEach((Action<string>)entropyResultCsvFile.WriteLine); sketchEntropyMultiRunner.Run(sketchChanges, rnd, false) .SideEffect(r => shouldStop.Value = shouldStop.Value || (r.MonitoringScheme is MonitoringScheme.Oracle && r.NumberOfFullSyncs >= 8)) .Select(r => r.AsCsvString()) .ForEach((Action <string>)sketchEntropyResultCsvFile.WriteLine); if (shouldStop.Value) { break; } } } }