コード例 #1
0
        public void DifrentInsertionCosts2()
        {
            var removalCalculator = A.Fake <IInsertionCalculator <string> >();
            var correlater        = new LevenshteinCorrelater <string>(new BasicDistanceCalculator <string>(10), new BasicRemovalCalculator <string>(10), removalCalculator);

            A.CallTo(() => removalCalculator.InsertionCost(A <string> ._)).ReturnsLazily(
                (string s) =>
            {
                if (s == "A")
                {
                    return(1);
                }
                if (s == "B")
                {
                    return(2);
                }
                return((uint)3);
            });

            var array1 = new string[0];
            var array2 = new[] { "A", "B" };

            var expectedResult = new CorrelaterResult <string>(3, new string[] { null, null }, array2);

            correlater.AssertComparision(array1, array2, expectedResult);
        }
        [DataRow("1234", "5678", 0)]             // Diff eveywhere
        public void IContinuousCorrelaterTest_InnerCorrelaterIsContinuous(string string1, string string2, int extraTimesToCallOrResultUpdate)
        {
            var levenshteinCorrelater   = new LevenshteinCorrelater <char>(missmatchCost, removalInsertionCost, removalInsertionCost);
            var splitToChunksCorrelater = new SplitToChunksCorrelaterWrapper <char>(levenshteinCorrelater, 2);
            var correlater = new IgnoreIdenticalBeginningAndEndCorrelaterWrapper <char>(splitToChunksCorrelater);

            var match1        = new List <char>();
            var match2        = new List <char>();
            var totalDistance = 0L;
            var totalUpdates  = 0;
            var innerUpdates  = 0;

            correlater.OnResultUpdate += result =>
            {
                match1.AddRange(result.BestMatch1);
                match2.AddRange(result.BestMatch2);
                totalDistance += result.Distance;
                totalUpdates++;
            };
            splitToChunksCorrelater.OnResultUpdate += _ => innerUpdates++;

            var actualResult    = correlater.Correlate(string1, string2);
            var resultFromEvent = new CorrelaterResult <char>(totalDistance, match1.ToArray(), match2.ToArray());

            Assertions.AssertResultIsAsExpected(actualResult, resultFromEvent);
            Assert.AreEqual(extraTimesToCallOrResultUpdate + innerUpdates, totalUpdates, $"Got wrong number of {nameof(totalUpdates)}");
        }
コード例 #3
0
        public void DifrentDistnaceCosts()
        {
            var distanceCalculator = A.Fake <IDistanceCalculator <string> >();
            var correlater         = new LevenshteinCorrelater <string>(distanceCalculator, 2, 2);

            A.CallTo(() => distanceCalculator.Distance(A <string> ._, A <string> ._)).ReturnsLazily(
                (string s1, string s2) =>
            {
                if (s1 == s2)
                {
                    return(0);
                }
                if (s2 == "A" && s1 == "E")
                {
                    return(1);
                }
                return((uint)10);
            });


            var array1 = new[] { "V", "E" };
            var array2 = new[] { "T", "A" };

            var expectedResult = new CorrelaterResult <string>(5,
                                                               new[] { null, "V", "E" }, new[] { "T", null, "A" });

            correlater.AssertComparision(array1, array2, expectedResult);
        }
コード例 #4
0
        public CorrelaterResult <char> StringCorrelaterExsample()
        {
            uint removalCost = 1, insertionCost = 1;

            // You'll need to implement your own IDistanceCalculator<char>.
            // IDistanceCalculator defines the "distance" between any two elements.
            IDistanceCalculator <char> distanceCalculator = new MyDistanceCalculator <char>();

            // The library contains a number of ICorrelaters.
            // LevenshteinCorrelater uses dynamic programing to find the Levenshtein-distance between the two collections.
            // Since a string is actually an IEnumerable<char>, we need to use an ICorrelater<char>.
            ICorrelater <char> correlater =
                new LevenshteinCorrelater <char>(distanceCalculator, removalCost, insertionCost);

            string string1 = "ABC";
            string string2 = "ADC";

            // Correlate the strings.
            CorrelaterResult <char> result = correlater.Correlate(string1, string2);

            // Print some of the result
            Console.WriteLine(result.Distance);
            Console.WriteLine(result.BestMatch1);
            Console.WriteLine(result.BestMatch2);

            return(result);
        }
コード例 #5
0
        private void SetCorrelator()
        {
            ICorrelater <char> correlator;

            switch (selectCorrelatorComboBox.Text)
            {
            case nameof(DamerauLevenshteinCorrelater <char>):
                correlator = new DamerauLevenshteinCorrelater <char>(10, 12, 7, 7);
                break;

            case nameof(DynamicLcsCorrelater <char>):
                correlator = new DynamicLcsCorrelater <char>();
                break;

            case nameof(MyersAlgorithmCorrelater <char>):
                correlator = new MyersAlgorithmCorrelater <char>();
                break;

            case nameof(PatienceDiffCorrelater <char>):
                correlator = new PatienceDiffCorrelater <char>();
                break;

            case nameof(HuntSzymanskiCorrelater <char>):
                correlator = new HuntSzymanskiCorrelater <char>();
                break;

            case nameof(NullCorrelator <char>):
                correlator = new NullCorrelator <char>();
                break;

            case nameof(LevenshteinCorrelater <char>):
            default:
                correlator = new LevenshteinCorrelater <char>(10, 7, 7);
                break;
            }

            if (slowCompareCheclCheckBox.Checked)
            {
                correlator = new SlowCorrelater <char>(correlator, 500);
            }
            if (splitToChunksCheckBox.Checked)
            {
                correlator = new SplitToChunksCorrelaterWrapper <char>(correlator, 10);
            }
            if (IgnoreIdenticalBeginningAndEndCorrelaterWrapperCheckBox.Checked)
            {
                correlator = new IgnoreIdenticalBeginningAndEndCorrelaterWrapper <char>(correlator);
            }
            if (SplitByPatienceWrapperCheckBox.Checked)
            {
                correlator = new SplitByPatienceAlgorithmWrapper <char>(correlator);
            }

            stringCorrelatorUserControl1.Correlater = correlator;
        }
コード例 #6
0
        public void CorrelateString()
        {
            var string1 = "abc";
            var string2 = "ac";

            var expectedResult = new CorrelaterResult <char>(removalCost, string1.ToCharArray(), "a\0c".ToCharArray());

            var stringCorrelater = new LevenshteinCorrelater <char>(missmatchCost, removalCost, insertionCost);

            stringCorrelater.AssertComparision(string1, string2, expectedResult);
        }
コード例 #7
0
        public void OnProgressUpdate()
        {
            ICorrelater <string> correlater = new LevenshteinCorrelater <string>(10, 7, 7);

            correlater.OnProgressUpdate += (int currentProgress, int totalProgress) =>
            {
                // Do something with the progress update here
                myUi.UpdateProgress(currentProgress, totalProgress);
            };

            CorrelaterResult <string> result = correlater.Correlate(collection1, collection2);
        }
コード例 #8
0
        public void DifrentInsertionCosts1()
        {
            var removalCalculator = A.Fake <IInsertionCalculator <string> >();
            var correlater        = new LevenshteinCorrelater <string>(new BasicDistanceCalculator <string>(10), new BasicRemovalCalculator <string>(10), removalCalculator);

            A.CallTo(() => removalCalculator.InsertionCost(A <string> ._)).ReturnsLazily(
                (string s) => s == "A" ? (uint)1 : 40);

            var array1 = new[] { "C" };
            var array2 = new[] { "A", "E" };

            var expectedResult = new CorrelaterResult <string>(11, new[] { null, "C" }, array2);

            correlater.AssertComparision(array1, array2, expectedResult);
        }
コード例 #9
0
        public CorrelaterResult <char> SplitToChunksCorrelaterWrapper()
        {
            uint removalCost   = 7;
            uint insertionCost = 7;
            uint missmatchCost = 10;
            int  chunkSize     = 200; // Bigger chunks will result in a slower, albeit more accurate, correlations
            ICorrelater <char> innerCorrelater =
                new LevenshteinCorrelater <char>(missmatchCost, removalCost, insertionCost);

            // The SplitToChunksCorrelaterWrapper wraps an inner ICorrelater
            ICorrelater <char> splitToChunksCorrelaterWrapper =
                new SplitToChunksCorrelaterWrapper <char>(innerCorrelater, chunkSize);

            CorrelaterResult <char> result = splitToChunksCorrelaterWrapper.Correlate(collection1, collection2);

            return(result);
        }
コード例 #10
0
        public void OnProgressUpdatesHappensRightNumberOfTimes()
        {
            var correlater = new LevenshteinCorrelater <string>(missmatchCost, removalCost, insertionCost);

            correlater.AssertProgressUpdateWasCalledRightNumberOfTimes();
        }