/FuzzyLib/Object/FuzzyObject.cs

https://github.com/scottmccain/Fuzzy-Logic-Module · C# · 267 lines · 194 code · 52 blank · 21 comment · 9 complexity · 647e6bd9a3031c1be7cc1351ebd51c75 MD5 · raw file

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Linq.Expressions;
  5. using System.Reflection;
  6. using FuzzyLib.Decorator;
  7. using FuzzyLib.Infrastructure;
  8. using FuzzyLib.Interfaces;
  9. namespace FuzzyLib.Object
  10. {
  11. public class FuzzyObject
  12. {
  13. protected readonly FuzzyModule Module;
  14. protected readonly object WrappedObject;
  15. protected readonly Dictionary<string, FuzzyVariableReference> VariableReferences = new Dictionary<string, FuzzyVariableReference>();
  16. protected readonly Dictionary<string, FuzzyTermProxy> FuzzySets = new Dictionary<string, FuzzyTermProxy>();
  17. protected readonly Type ObjectType;
  18. public FuzzyObject(object obj, FuzzyModule module)
  19. {
  20. WrappedObject = obj;
  21. Module = module;
  22. ObjectType = obj.GetType();
  23. }
  24. public FuzzyObject AddRule(IFuzzyTerm antecedent, IFuzzyTerm consequence)
  25. {
  26. Module.AddRule(antecedent, consequence);
  27. return this;
  28. }
  29. public FuzzyObject AddRule<TAntecendent, TConsequence>(FuzzyTermDecorator<TAntecendent> antecedent, FuzzyTermDecorator<TConsequence> consequence) where TAntecendent : IFuzzyTerm where TConsequence : IFuzzyTerm
  30. {
  31. Module.AddRule(antecedent.Wrapped, consequence.Wrapped);
  32. return this;
  33. }
  34. public FuzzyTermDecorator<FuzzyTermProxy> WrapSet(string name)
  35. {
  36. return FuzzySets.ContainsKey(name) ? new FuzzyTermDecorator<FuzzyTermProxy>(FuzzySets[name]) : null;
  37. }
  38. public FuzzyObject AddFuzzySet<TProp, TFuzzy>(string name, Expression<Func<object, TProp>> expr, Func<double, double, double, TFuzzy> setfunc, int min, int peak, int max) where TFuzzy : IFuzzySetManifold
  39. {
  40. var pi = expr.GetPropertyInfo();
  41. if (VariableReferences.ContainsKey(pi.Name) && !FuzzySets.ContainsKey(name))
  42. {
  43. FuzzySets.Add(name, VariableReferences[pi.Name].Variable.AddFuzzyTerm(name, setfunc.Invoke(min, peak, max)));
  44. }
  45. return this;
  46. }
  47. public void AddFuzzySet(string setName, string variableName, IFuzzySetManifold set)
  48. {
  49. if (VariableReferences.ContainsKey(variableName))
  50. {
  51. VariableReferences[variableName].Variable.AddFuzzyTerm(setName, set);
  52. }
  53. }
  54. public FuzzyTermProxy this[string name]
  55. {
  56. get { return FuzzyTerm(name); }
  57. }
  58. public FuzzyTermProxy FuzzyTerm(string name)
  59. {
  60. return FuzzySets.ContainsKey(name) ? FuzzySets[name] : null;
  61. }
  62. /// <summary>
  63. /// Defines a variable for the property specified by the <paramref name="name"/> parameter
  64. /// </summary>
  65. /// <param name="name"></param>
  66. /// <returns>FuzzyVariable</returns>
  67. public FuzzyVariable DefineVariable(string name)
  68. {
  69. // defines a variable for the property named in 'name'
  70. //var type = typeof (T);
  71. var prop = ObjectType.GetProperties(BindingFlags.Public | BindingFlags.Instance).FirstOrDefault(p => p.Name == name);
  72. if(prop == null) throw new ArgumentException("Property does not exist.", "name");
  73. return VariableReferences.ContainsKey(name) ? VariableReferences[name].Variable : AddVariable(name, prop);
  74. }
  75. public FuzzyVariable DefineVariable<TProp>(Expression<Func<object, TProp>> func)
  76. {
  77. var propertyInfo = func.GetPropertyInfo();
  78. var name = propertyInfo.Name;
  79. return VariableReferences.ContainsKey(name) ? VariableReferences[name].Variable : AddVariable(name, propertyInfo);
  80. }
  81. private FuzzyVariable AddVariable(string name, PropertyInfo prop)
  82. {
  83. var variable = Module.CreateFLV(name);
  84. VariableReferences.Add(name, new FuzzyVariableReference {PropertyInfo = prop, Variable = variable});
  85. return variable;
  86. }
  87. public void Fuzzify<TProp>(Expression<Func<object, TProp>> func)
  88. {
  89. var pi = func.GetPropertyInfo();
  90. if (VariableReferences.ContainsKey(pi.Name))
  91. {
  92. double value;
  93. if (double.TryParse(pi.GetValue(WrappedObject, null).ToString(), out value))
  94. {
  95. Module.Fuzzify(pi.Name, value);
  96. }
  97. }
  98. }
  99. public void Fuzzify<TProp>(Expression<Func<object, TProp>> func, TProp value)
  100. {
  101. var pi = func.GetPropertyInfo();
  102. if (VariableReferences.ContainsKey(pi.Name))
  103. {
  104. pi.SetValue(WrappedObject, value, null);
  105. }
  106. }
  107. public void DeFuzzify<TProp>(Expression<Func<object, TProp>> func, Expression<Func<FuzzyVariable, double>> method)
  108. {
  109. var pi = func.GetPropertyInfo();
  110. var defuzzy = Module.DeFuzzify(pi.Name, method);
  111. pi.SetValue(WrappedObject, defuzzy, null);
  112. }
  113. public dynamic GetDynamic()
  114. {
  115. return new DynamicWrapper<FuzzyTermProxy>(FuzzySets);
  116. }
  117. #region Compile Overrides
  118. public FuzzyObject Compile<T1>(Expression<Func<object, T1>> func)
  119. {
  120. // fuzzfy
  121. Fuzzify(func);
  122. return this;
  123. }
  124. public FuzzyObject Compile<T1, T2>(Expression<Func<object, T1>> func, Expression<Func<object, T2>> func2)
  125. {
  126. // fuzzfy
  127. Fuzzify(func);
  128. Fuzzify(func2);
  129. return this;
  130. }
  131. public FuzzyObject Compile<T1, T2, T3>(Expression<Func<object, T1>> func, Expression<Func<object, T2>> func2, Expression<Func<object, T3>> func3)
  132. {
  133. // fuzzfy
  134. Fuzzify(func);
  135. Fuzzify(func2);
  136. Fuzzify(func3);
  137. return this;
  138. }
  139. public FuzzyObject Compile<T1, T2, T3, T4>(Expression<Func<object, T1>> func, Expression<Func<object, T2>> func2, Expression<Func<object, T3>> func3, Expression<Func<object, T4>> func4)
  140. {
  141. // fuzzfy
  142. Fuzzify(func);
  143. Fuzzify(func2);
  144. Fuzzify(func3);
  145. Fuzzify(func4);
  146. return this;
  147. }
  148. public FuzzyObject Compile<T1, T2, T3, T4, T5>(Expression<Func<object, T1>> func, Expression<Func<object, T2>> func2, Expression<Func<object, T3>> func3, Expression<Func<object, T4>> func4, Expression<Func<object, T5>> func5)
  149. {
  150. // fuzzfy
  151. Fuzzify(func);
  152. Fuzzify(func2);
  153. Fuzzify(func3);
  154. Fuzzify(func4);
  155. Fuzzify(func5);
  156. return this;
  157. }
  158. public FuzzyObject Compile<T1, T2, T3, T4, T5, T6>(Expression<Func<object, T1>> func, Expression<Func<object, T2>> func2, Expression<Func<object, T3>> func3, Expression<Func<object, T4>> func4, Expression<Func<object, T5>> func5, Expression<Func<object, T6>> func6)
  159. {
  160. // fuzzfy
  161. Fuzzify(func);
  162. Fuzzify(func2);
  163. Fuzzify(func3);
  164. Fuzzify(func4);
  165. Fuzzify(func5);
  166. Fuzzify(func6);
  167. return this;
  168. }
  169. public FuzzyObject Compile<T1, T2, T3, T4, T5, T6, T7>(Expression<Func<object, T1>> func, Expression<Func<object, T2>> func2, Expression<Func<object, T3>> func3, Expression<Func<object, T4>> func4, Expression<Func<object, T5>> func5, Expression<Func<object, T6>> func6, Expression<Func<object, T7>> func7)
  170. {
  171. // fuzzfy
  172. Fuzzify(func);
  173. Fuzzify(func2);
  174. Fuzzify(func3);
  175. Fuzzify(func4);
  176. Fuzzify(func5);
  177. Fuzzify(func6);
  178. Fuzzify(func7);
  179. return this;
  180. }
  181. public FuzzyObject Compile<T1, T2, T3, T4, T5, T6, T7, T8>(Expression<Func<object, T1>> func, Expression<Func<object, T2>> func2, Expression<Func<object, T3>> func3, Expression<Func<object, T4>> func4, Expression<Func<object, T5>> func5, Expression<Func<object, T6>> func6, Expression<Func<object, T7>> func7, Expression<Func<object, T8>> func8)
  182. {
  183. // fuzzfy
  184. Fuzzify(func);
  185. Fuzzify(func2);
  186. Fuzzify(func3);
  187. Fuzzify(func4);
  188. Fuzzify(func5);
  189. Fuzzify(func6);
  190. Fuzzify(func7);
  191. Fuzzify(func8);
  192. return this;
  193. }
  194. public FuzzyObject Compile<T1, T2, T3, T4, T5, T6, T7, T8, T9>(Expression<Func<object, T1>> func, Expression<Func<object, T2>> func2, Expression<Func<object, T3>> func3, Expression<Func<object, T4>> func4, Expression<Func<object, T5>> func5, Expression<Func<object, T6>> func6, Expression<Func<object, T7>> func7, Expression<Func<object, T8>> func8, Expression<Func<object, T9>> func9)
  195. {
  196. // fuzzfy
  197. Fuzzify(func);
  198. Fuzzify(func2);
  199. Fuzzify(func3);
  200. Fuzzify(func4);
  201. Fuzzify(func5);
  202. Fuzzify(func6);
  203. Fuzzify(func7);
  204. Fuzzify(func8);
  205. Fuzzify(func9);
  206. return this;
  207. }
  208. #endregion
  209. }
  210. //public class FuzzyVariableReference
  211. //{
  212. // public FuzzyVariable Variable { get; set; }
  213. // public PropertyInfo PropertyInfo { get; set; }
  214. //}
  215. }