/// <summary> /// Creates mirrored rules; useful if in1 and in2 are of the same type and can be given in any order/can be swapped, ie marks /// </summary> /// <param name="outVar"></param> /// <param name="outTermName"></param> /// <param name="op"></param> /// <param name="in1"></param> /// <param name="in1TermName1"></param> /// <param name="in2"></param> /// <param name="in2TermName"></param> public void AddRule(Linguistic outVar, string outTermName, FuzzyOperator op, Linguistic in1, string in1TermName, Linguistic in2, string in2TermName) { #region check for non-local references if (outVar.Name != OutVar.Name) { throw new KeyNotFoundException("Only the local output variable can be use; rule refers to " + outVar + "; local OutVar.Name = " + OutVar.Name); } if (InVars[in1.Name] == null) { throw new KeyNotFoundException("Only the local input variables can be use; rule refers to " + in1 + "; local InVars: " + InVars.Keys.ToArray().ToString()); } if (InVars[in2.Name] == null) { throw new KeyNotFoundException("Only the local input variables can be use; rule refers to " + in2 + "; local InVars: " + InVars.Keys.ToArray().ToString()); } if (InVars[in1.Name][in1TermName] == null) { throw new KeyNotFoundException("Only existing terms can be use; rule refers to " + in1TermName); } if (InVars[in2.Name][in2TermName] == null) { throw new KeyNotFoundException("Only existing terms can be use; rule refers to " + in2TermName); } #endregion Rules.Add(new FuzzyRule(OutVar, outTermName, InVars[in1.Name], in1TermName, op, InVars[in2.Name], in2TermName)); Rules.Add(new FuzzyRule(OutVar, outTermName, InVars[in2.Name], in2TermName, op, InVars[in1.Name], in1TermName)); }
public Reasoning(Linguistic Out, Linguistic In0, Linguistic In1) { OutVar = Out; InVars = new Dictionary <string, Linguistic>(); InVars[In0.Name] = In0; InVars[In1.Name] = In1; Rules = new List <FuzzyRule>(); }
public FuzzyRule(Linguistic outVar, string outTermName, Linguistic in1, string in1TermName) { this.outVar = outVar; this.inVars = new List <Linguistic>(); this.inVars.Add(in1); Operation = FuzzyOperator.OR; outTerm = outVar.FindTerm(outTermName); inTerms = new List <FuzzyTerm>(); inTerms.Add(in1.FindTerm(in1TermName)); Possibility = 0; }
/// <summary> /// Constructor for 4-point term /// </summary> /// <param name="lingVar">backreference to the hosting Linguistic</param> /// <param name="name">identifying name</param> /// <param name="x1">first x value with f(x) == 0; typical form: _/‾\_</param> /// <param name="x2">second x value with f(x) == 1; typical form: _/‾\_</param> /// <param name="x3">third x value with f(x) == 1; typical form: _/‾\_</param> /// <param name="x4">fourth x value with f(x) == 0; typical form: _/‾\_</param> public FuzzyTerm(Linguistic lingVar, string name, float x1, float x2, float x3, float x4) { if (lingVar == null) { throw new Exception("Error in constructor of FuzzyTerm"); } if (!(x1 <= x2 && x2 <= x3 && x3 <= x4)) { throw new Exception("Error in definition of FuzzyTerm, precondition violated: m1 <= m2 <= m3 <= m4"); } var = lingVar; Name = name; X1 = x1; X2 = x2; X3 = x3; X4 = x4; //lingVar.Add(this); RuleMax = 0; }
/// <summary> /// Predefined reasoning for four input variables /// </summary> /// <param name="Out"></param> /// <param name="In0"></param> /// <param name="In1"></param> /// <param name="In2"></param> /// <param name="In3"></param> public Reasoning(Linguistic Out, Linguistic In0, Linguistic In1, Linguistic In2, Linguistic In3) : this(Out, In0, In1) { InVars[In2.Name] = In2; InVars[In3.Name] = In3; }
/// <summary> /// Constructor for 3-point term /// </summary> /// <param name="lingVar">backreference to the hosting Linguistic</param> /// <param name="name">identifying name</param> /// <param name="x1">first x value with f(x) == 0; typical forms: _/\_, ‾\_, _/‾</param> /// <param name="x2">second x value with f(x) == 1; typical form: _/\_, ‾\_, _/‾</param> /// <param name="x3">third x value with f(x) == 0; typical form: _/\_, ‾\_, _/‾</param> public FuzzyTerm(Linguistic lingVar, string name, float x1, float x2, float x3) : this(lingVar, name, x1, x2, x2, x3) { }