コード例 #1
0
 public void ConstructMinMax_MaxIsLessThanMin_Throws()
 {
     var ex = Assert.Throws <ArgumentException>(() =>
     {
         var _ = new NaturalRange(3, 2);
     });
 }
コード例 #2
0
        public int[] FindIndicesOfFittestIndividuals(Array <Fitness> fitnesses)
        {
            var indices = NaturalRange
                          .CreateSorted(inclusiveStart: 0, exclusiveEnd: fitnesses.Length)
                          .ToArray();

            var fitnessArray = fitnesses.ToArray();

            Array.Sort(
                keys: fitnessArray,
                items: indices,
                comparer: _comparer);

            Array.Reverse(indices);

            var fittest = indices
                          .AsSpan()
                          .Slice(start: 0, length: _fittestCount)
                          .ToArray();

            return(fittest);
        }
コード例 #3
0
        public HyperRectangle?TryCreateLargestNonIntersectingRectangle(int seedIndex, Array <HyperRectangle> existingHyperRectangles, NaturalRange dimensionExpansionOrder)
        {
            if (dimensionExpansionOrder.Length != Dataset.FeatureCount)
            {
                throw new InvalidOperationException();
            }

            if (existingHyperRectangles.IsEmpty)
            {
                var tempBuilder    = HyperRectangleBuilder.InitializeWithLargestRectangle(Dataset);
                var hyperRectangle = tempBuilder.TryBuild();

                if (hyperRectangle is null)
                {
                    throw new InvalidOperationException();
                }
                else
                {
                    return(hyperRectangle);
                }
            }

            var builder = HyperRectangleBuilder.InitializeWithSeed(
                dataset: Dataset,
                seedIndex: seedIndex);

            var seed = Dataset.GetInstanceData(seedIndex);

            for (int i = 0; i < dimensionExpansionOrder.Length; i++)
            {
                var dimensionIndex = dimensionExpansionOrder[i];

                switch (Dataset.GetFeatureType(dimensionIndex))
                {
                case FeatureType.Continuous:
                    UpdateContinuousDimension(
                        builder: builder,
                        existingHyperRectangles: existingHyperRectangles,
                        dimensionIndex: dimensionIndex,
                        seed: seed);
                    break;

                default:
                    throw CommonExceptions.UnknownFeatureType;
                }
            }

            var largestHyperRectangle = builder.TryBuild();

            return(largestHyperRectangle);
        }
コード例 #4
0
        public void Max_ConstructMinMax_IsMax()
        {
            var underTest = new NaturalRange(_min, _max);

            Assert.Equal(_max, underTest.Max);
        }
コード例 #5
0
        public void Min_ConstructMax_IsZero()
        {
            var underTest = new NaturalRange(_max);

            Assert.Equal(0, underTest.Min);
        }
コード例 #6
0
 public void ConstructMinMax_MaxIsZero_Constructs()
 {
     // min must also be zero so that max >= min
     var _ = new NaturalRange(0, 0);
 }
コード例 #7
0
 public void Construct_MaxIsMin_Constructs()
 {
     var _ = new NaturalRange(_min, _min);
 }
コード例 #8
0
 public void ConstructMinMax_MinIsZero_Constructs()
 {
     var _ = new NaturalRange(0, _max);
 }
コード例 #9
0
 public void ConstructMinMax_ValidArgs_Constructs()
 {
     var _ = new NaturalRange(_min, _max);
 }
コード例 #10
0
 public void ConstructMax_MaxIsZero_Constructs()
 {
     var _ = new NaturalRange(0);
 }
コード例 #11
0
        public void Includes_ValueIsGreaterThanMax_True()
        {
            var underTest = new NaturalRange(_min, _max);

            Assert.False(underTest.Includes(_max + 1));
        }
コード例 #12
0
        public void Includes_ValueIsMax_True()
        {
            var underTest = new NaturalRange(_min, _max);

            Assert.True(underTest.Includes(_max));
        }
コード例 #13
0
        public void Includes_ValueIsLessThanMin_False()
        {
            var underTest = new NaturalRange(_min, _max);

            Assert.False(underTest.Includes(_min - 1));
        }
コード例 #14
0
        public Rule?TryCreateRule(ReadOnlySpan <Rule> existingRules)
        {
            var seedsIndices = _seedSelector.FindSeedsIndices(existingRules);

            if (seedsIndices.IsEmpty)
            {
                return(null);
            }

            var seedIndex = Random.Choice(seedsIndices);
            var seed      = _dataset.GetInstanceData(seedIndex);

            var boxes = _boxConverter.FromRules(existingRules);

            if (_runExpensiveSanityChecks)
            {
                for (int i = 0; i < boxes.Length; i++)
                {
                    var box = boxes[i];
                    if (box.Contains(seed))
                    {
                        throw new InvalidOperationException();
                    }
                }
            }

            var dimensionExpansionOrder = NaturalRange.CreateShuffled(
                inclusiveStart: 0,
                exclusiveEnd: _dataset.FeatureCount);

            var secureRectangle = _boxCreator.TryCreateLargestNonIntersectingRectangle(
                seedIndex: seedIndex,
                existingHyperRectangles: boxes,
                dimensionExpansionOrder: dimensionExpansionOrder);

            if (secureRectangle is null)
            {
                return(null);
            }

            if (_runExpensiveSanityChecks)
            {
                for (int i = 0; i < boxes.Length; i++)
                {
                    var box = boxes[i];
                    if (_rectangleIntersector.IntersectsInAllDimension(secureRectangle, box))
                    {
                        throw new InvalidOperationException();
                    }
                }
            }

            var secureRectangleCoverage = _coverageComputer.ComputeCoverage(secureRectangle);
            var coveredInstancesIndices = secureRectangleCoverage.IndicesOfCoveredInstances.ToArray();

            if (coveredInstancesIndices.Length == 0)
            {
                return(null);
            }

            var coveredInstancesDistancesToSeed = _dataset.ComputeDistances(
                targetInstanceIndex: seedIndex,
                otherInstancesIndices: coveredInstancesIndices);

            Array.Sort(
                keys: coveredInstancesDistancesToSeed,
                items: coveredInstancesIndices);

            var instancesToCover  = Math.Min(_targetNumberOfInstancesToCover, coveredInstancesIndices.Length);
            var relevantInstances = coveredInstancesIndices
                                    .AsSpan()
                                    .Slice(start: 0, length: instancesToCover);

            var ruleAntecedent = _antecedentCreator.CreateAntecedent(
                seedIndex: seedIndex,
                nearestInstancesIndices: relevantInstances);

            if (ruleAntecedent is null)
            {
                return(null);
            }

            var ruleConsequent = _consequentCreator.CreateConsequent(relevantInstances);

            return(new Rule(
                       antecedent: ruleAntecedent,
                       consequent: ruleConsequent));
        }