Пример #1
0
        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);
        }
Пример #2
0
        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);
        }
Пример #3
0
        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;
                        }
                    }
                }
        }