internal void Build_WithComplexCondition_ReturnsExpectedFuzzyRule() { // Arrange var waterTemp = StubLinguisticVariableFactory.WaterTemp(); // Act var rule1 = new FuzzyRuleBuilder("Rule1") .If(ConditionBuilder .If(waterTemp.Is("cold")) .And(waterTemp.Not("freezing")) .Or(waterTemp.Not("frozen"))) .And(ConditionBuilder .If(waterTemp.Is("warm")) .And(waterTemp.Not("hot")) .Or(waterTemp.Not("boiling"))) .And(ConditionBuilder .If(waterTemp.Is("frozen")) .And(waterTemp.Is("warm"))) .Then(waterTemp.Not("frozen")) .Build(); var dataPoint = new DataPoint(waterTemp.Subject, 20); var data = new Dictionary <Label, DataPoint> { { dataPoint.Variable, dataPoint } }; var result = rule1.Evaluate(data, new FuzzyEvaluator()); var temp = waterTemp.GetState(2); // Assert //Assert.Equal(new FuzzyState("warm"), temp); //Assert.True(result); }
internal void Evaluate_ValidRuleAndConditions_ReturnsExpectedFuzzyOutput() { // Arrange var waterTemp = StubLinguisticVariableFactory.WaterTemp(); var fanSpeed = StubLinguisticVariableFactory.PumpSpeed(); var fuzzyRule = new FuzzyRuleBuilder(PumpSpeedRule.Rule0) .If(ConditionBuilder.If(waterTemp.Is(WaterTemp.Frozen))) .Or(ConditionBuilder.If(waterTemp.Is(WaterTemp.Freezing))) .Then(fanSpeed.Is(PumpSpeed.Off)) .Build(); var dataPoint = new DataPoint(waterTemp.Subject, 0); var data = new Dictionary <Label, DataPoint> { { dataPoint.Variable, dataPoint } }; // Act var result = fuzzyRule.Evaluate(data, new FuzzyEvaluator()); // Assert Assert.Equal(fanSpeed.Subject, result[0].Subject); Assert.Equal(fanSpeed.GetState(0), result[0].State); Assert.Equal(UnitInterval.One(), result[0].FiringStrength); Assert.Equal(fanSpeed.GetSet(PumpSpeed.Off), result[0].OutputFunction); }
/// <summary> /// Returns a stub <see cref="FuzzyRule"/>. /// </summary> /// <param name="label"> /// The rule label. /// </param> /// <returns> /// A <see cref="FuzzyRule"/>. /// </returns> public static FuzzyRule Create(string label) { var water = StubLinguisticVariableFactory.WaterTemp(); var waterTempIsWarm = ConditionBuilder.If(water.Is("warm")); return(new FuzzyRuleBuilder(label) .If(waterTempIsWarm) .Then(water.Is("warm")) .Build()); }
internal void Validate_WhenFirstConditionConnectiveNotIf_Throws() { // Arrange var waterTemp = StubLinguisticVariableFactory.WaterTemp(); var fanSpeed = StubLinguisticVariableFactory.PumpSpeed(); var fuzzyRule = new FuzzyRuleBuilder("Rule0") .And(ConditionBuilder.If(waterTemp.Is(WaterTemp.Frozen))) .Then(fanSpeed.Is(PumpSpeed.Off)); // Act // Assert var ex = Assert.Throws <InvalidOperationException>(() => fuzzyRule.Build()); this.output.WriteLine(ex.Message); }
internal void WithWeight_SetsWeightToExpectedValue() { // Arrange var waterTemp = StubLinguisticVariableFactory.WaterTemp(); var condition = ConditionBuilder .If(waterTemp.Is(WaterTemp.Boiling)) .WithWeight(0.5) .Build(); // Act condition.SetWeight(UnitInterval.Create(0.5)); // Assert Assert.Equal(0.5, condition.Weight.Value); }
internal void ToString_ReturnsExpectedString() { // Arrange var waterTemp = StubLinguisticVariableFactory.WaterTemp(); var condition = ConditionBuilder .If(waterTemp.Not(WaterTemp.Boiling)) .And(waterTemp.Not(WaterTemp.Freezing)) .And(waterTemp.Not(WaterTemp.Frozen)) .Build(); // Act var result = condition.ToString(); // Assert Assert.Equal("IF WaterTemp NOT boiling AND WaterTemp NOT freezing AND WaterTemp NOT frozen", result); }
internal void Evaluate_WhenInvalidData_Throws() { // Arrange var waterTemp = StubLinguisticVariableFactory.WaterTemp(); var condition = ConditionBuilder.If(waterTemp.Is(WaterTemp.Boiling)).Build(); var dataPoint = new DataPoint(Label.Create(InputVariable.Pressure), 3000); var data = new Dictionary <Label, DataPoint> { { dataPoint.Variable, dataPoint } }; // Act // Assert Assert.Throws <InvalidOperationException>(() => condition.Evaluate(data, new FuzzyEvaluator())); }
internal void Build_ValidConditionsAndConclusions_ReturnsExpectedFuzzyRule() { // Arrange var waterTemp = StubLinguisticVariableFactory.WaterTemp(); // Act var rule1 = new FuzzyRuleBuilder(PumpSpeedRule.Rule0) .If(ConditionBuilder .If(waterTemp.Not(WaterTemp.Cold)) .And(waterTemp.Not(WaterTemp.Freezing)) .And(waterTemp.Not(WaterTemp.Frozen))) .And(ConditionBuilder.If(waterTemp.Is(WaterTemp.Warm))) .Or(ConditionBuilder.If(waterTemp.Not(WaterTemp.Frozen)).And(waterTemp.Not(WaterTemp.Boiling))) .Then(waterTemp.Not(WaterTemp.Boiling)) .Then(waterTemp.Not(WaterTemp.Frozen)) .Build(); // Assert Assert.Equal(3, rule1.Conditions.Count); Assert.Equal(2, rule1.Conclusions.Count); }