- Timestamp:
- 09/25/19 17:18:41 (5 years ago)
- Location:
- branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture
- Files:
-
- 2 added
- 1 deleted
- 10 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/Extensions/TypeExtensions.cs
r17266 r17269 4 4 using System.Text; 5 5 using System.Threading.Tasks; 6 using HeuristicLab.Core; 6 7 7 8 namespace HeuristicLab.Manufacture { … … 9 10 public static int GetInterfaceDistance(this Type type, Type interfaceType) { 10 11 if (!interfaceType.IsInterface) return -1; 11 int distance = 0;12 int distance = int.MaxValue; 12 13 Type baseType = type; 13 14 while (baseType != typeof(object)) { 14 15 var interfaces = baseType.GetInterfaces(); 15 16 var minimalInterfaces = interfaces.Except(interfaces.SelectMany(i => i.GetInterfaces())); 16 if (baseType == interfaceType && minimalInterfaces.Any(i => i == interfaceType)) 17 ++distance; 17 if (minimalInterfaces.Any(i => { 18 if (i.IsGenericType) 19 return i.GetGenericTypeDefinition() == interfaceType; 20 return i == interfaceType; 21 })) --distance; 18 22 baseType = baseType.BaseType; 19 23 } 20 24 return distance; 21 25 } 26 22 27 public static bool IsEqualTo(this Type type, Type other) { 23 28 if (other == null) throw new ArgumentNullException("other"); … … 30 35 .Any(i => i.GetGenericTypeDefinition() == other); 31 36 else if (other.IsInterface) { 32 /*33 Type baseType = type;34 while (baseType != typeof(object)) {35 var interfaces = baseType.GetInterfaces();36 var minimalInterfaces = interfaces.Except(interfaces.SelectMany(i => i.GetInterfaces()));37 if (baseType == other && minimalInterfaces.Any(i => i == other))38 return true;39 baseType = baseType.BaseType;40 }41 */42 37 return type.GetInterfaces().Any(i => i == other); 43 38 } -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/HeuristicLab.Manufacture.csproj
r17266 r17269 51 51 </ItemGroup> 52 52 <ItemGroup> 53 <Compile Include="Extensions\IItemExtensions.cs" />54 53 <Compile Include="Extensions\ObjectExtensions.cs" /> 55 54 <Compile Include="Extensions\TypeExtensions.cs" /> … … 58 57 <Compile Include="ParameterTransformer\ConstrainedValueParameterTransformer.cs" /> 59 58 <Compile Include="ParameterTransformer\ParameterBaseTransformer.cs" /> 59 <Compile Include="ParameterTransformer\ParameterizedItemTransformer.cs" /> 60 60 <Compile Include="ParameterTransformer\ValueParameterTransformer.cs" /> 61 61 <Compile Include="TypeTransformer\EnumTypeTransformer.cs" /> 62 62 <Compile Include="TypeTransformer\DummyTransformer.cs" /> 63 63 <Compile Include="ParameterTransformer\LookupParameterTransformer.cs" /> 64 <Compile Include="TypeTransformer\MultiCheckedOperatorTransformer.cs" /> 64 65 <Compile Include="TypeTransformer\StringValueTransformer.cs" /> 65 66 <Compile Include="TypeTransformer\ValueTypeArrayTransformer.cs" /> -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/JCGenerator.cs
r17266 r17269 16 16 17 17 public class CustomWriter : JsonTextWriter { 18 private const int ArrayFlatterLvl = 1; 18 19 private Stack<Formatting> formattings = new Stack<Formatting>(); 19 20 private int lvl = 0; 20 21 public override void WriteStartArray() { 21 22 base.WriteStartArray(); 22 if(lvl > 1) {23 if(lvl > ArrayFlatterLvl) { 23 24 formattings.Push(base.Formatting); 24 25 base.Formatting = Formatting.None; … … 30 31 base.WriteEndArray(); 31 32 lvl--; 32 if (lvl > 1)33 if (lvl > ArrayFlatterLvl) 33 34 base.Formatting = formattings.Pop(); 34 35 } … … 49 50 50 51 private JObject template = JObject.Parse(@"{ 51 'Metadata': {}, 52 'FreeParameters': {}, 53 'StaticParameters': { 54 'Algorithm':{}, 55 'Problem':{}, 56 'TypeList':{} 57 } 52 'Metadata': { 53 'Algorithm':'', 54 'Problem':'' 55 }, 56 'Objects': [] 58 57 }"); 59 58 60 59 61 60 private Dictionary<string, string> TypeList = new Dictionary<string, string>(); 62 61 63 62 public string GenerateTemplate(IAlgorithm algorithm, IProblem problem, params string[] freeParameters) { 64 63 algorithm.Problem = problem; 65 IList<JCObject> items = BJCO(algorithm); 64 ParameterData algorithmData = Transformer.Extract(algorithm); 65 ParameterData problemData = Transformer.Extract(problem); 66 IList<ParameterData> items = algorithmData.ParameterizedItems; 67 foreach (var pItem in problemData.ParameterizedItems) items.Add(pItem); 66 68 JArray jsonItems = new JArray(); 67 69 68 foreach(var item in items ) {70 foreach(var item in items.Distinct()) { 69 71 JToken token = JObject.FromObject(item, Settings()); 70 72 token["StaticParameters"] = token["Parameters"]; 73 token["FreeParameters"] = token["Parameters"]; 74 token.Cast<JObject>().Property("Parameters")?.Remove(); 71 75 RefactorFreeParameters(token, freeParameters); 72 76 RefactorStaticParameters(token); 73 77 if(token["StaticParameters"].HasValues || token["FreeParameters"].HasValues) 74 78 jsonItems.Add(token); 75 } 76 return CustomWriter.Serialize(jsonItems); 79 } 80 81 template["Metadata"]["Algorithm"] = algorithm.Name; 82 template["Metadata"]["Problem"] = problem.Name; 83 template["Objects"] = jsonItems; 84 85 return CustomWriter.Serialize(template); 77 86 } 78 87 88 #region Helper 79 89 private void RefactorFreeParameters(JToken token, string[] freeParameters) { 80 90 81 token["FreeParameters"] = token["StaticParameters"];91 //token["FreeParameters"] = token["StaticParameters"]; 82 92 83 93 IList<JObject> objToRemove = new List<JObject>(); … … 98 108 }, token["FreeParameters"]); 99 109 foreach (var x in objToRemove) x.Remove(); 100 110 101 111 } 102 112 … … 110 120 foreach (var x in objToRemove) x.Remove(); 111 121 } 112 113 114 115 #region Helper116 private IList<JCObject> BJCO(IParameterizedItem item) {117 List<JCObject> list = new List<JCObject>();118 JCObject obj = new JCObject();119 obj.Name = item.ItemName;120 obj.Type = item.GetType().AssemblyQualifiedName;121 obj.StaticParameters = new List<ParameterData>();122 list.Add(obj);123 124 foreach (var param in item.Parameters) {125 if(!param.Hidden) {126 obj.StaticParameters.Add(Transformer.Extract(param));127 128 if (param is IParameterizedItem)129 list.AddRange(BJCO(param.Cast<IParameterizedItem>()));130 131 if (param.GetType().IsEqualTo(typeof(IConstrainedValueParameter<>)))132 foreach (var validValue in param.Cast<dynamic>().ValidValues)133 if (validValue is IParameterizedItem &&134 ((IParameterizedItem)validValue).Parameters.Any(p => !p.Hidden))135 list.AddRange(BJCO((IParameterizedItem)validValue));136 }137 }138 return list;139 }140 141 122 142 123 private JsonSerializer Settings() => new JsonSerializer() { … … 152 133 } 153 134 #endregion 154 155 /*156 private void ExtractOperatorInfo(IItem item, ParameterData obj) {157 if (item is IMultiOperator) {158 foreach (var op in ((IMultiOperator)item).Operators) {159 ParameterData newOperator = BuildJCParameter(op);160 if (obj.Operators == null)161 obj.Operators = new List<ParameterData>();162 obj.Operators.Add(newOperator);163 newOperator.Name = op.GetType().Name;164 165 newOperator.Path = obj.Path + ".Operators." + op.Name;166 MultiPermutationManipulator manipulator = new MultiPermutationManipulator();167 }168 }169 }*/170 135 } 171 136 } -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/JCInstantiator.cs
r17266 r17269 16 16 17 17 public class JCInstantiator { 18 //private Dictionary<string, JCProperty> Properties = new Dictionary<string, JCProperty>();19 private Dictionary<string, string> TypeList = new Dictionary<string, string>();20 18 21 #region Constants 22 private const string SParametersID = "StaticParameters"; 23 private const string FParametersID = "FreeParameters"; 24 private const string TListID = "TypeList"; 25 private const string AlgorithmID = "Algorithm"; 26 private const string ProblemID = "Problem"; 27 #endregion 19 private JToken Config { get; set; } 28 20 29 21 public IAlgorithm Instantiate(string configFile) { 30 JArray config = JArray.Parse(File.ReadAllText(configFile)); 31 JCObject obj = config[0].ToObject<JCObject>(); 32 IAlgorithm algorithm = CreateObject<IAlgorithm>(obj); 22 Config = JToken.Parse(File.ReadAllText(configFile)); 33 23 34 foreach(var sp in obj.StaticParameters) { 35 if(algorithm.Parameters.TryGetValue(sp.Name, out IParameter param)) { 36 Transformer.Inject(param, sp); 24 ParameterData algorithmData = GetData(Config["Metadata"]["Algorithm"].ToString()); 25 ResolveReferences(algorithmData); 26 IAlgorithm algorithm = CreateObject<IAlgorithm>(algorithmData); 27 28 ParameterData problemData = GetData(Config["Metadata"]["Problem"].ToString()); 29 ResolveReferences(problemData); 30 IProblem problem = CreateObject<IProblem>(problemData); 31 algorithm.Problem = problem; 32 33 Transformer.Inject(algorithm, algorithmData); 34 Transformer.Inject(algorithm, problemData); 35 36 return algorithm; 37 } 38 39 /* 40 * resolve references 41 */ 42 43 private void ResolveReferences(ParameterData data) { 44 foreach (var p in data.Parameters) { 45 if (p.Default is string && p.Reference == null) { 46 p.Reference = GetData(p.Default.Cast<string>()); 37 47 } 38 48 } 49 } 39 50 40 foreach (var sp in obj.FreeParameters) { 41 if (algorithm.Parameters.TryGetValue(sp.Name, out IParameter param)) { 42 if(IsInRangeList(sp.Range, sp.Default) || 43 IsInNumericRange<long>(sp.Default, sp.Range[0], sp.Range[1]) || 44 IsInNumericRange<double>(sp.Default, sp.Range[0], sp.Range[1])) 45 Transformer.Inject(param, sp); 46 } 51 private ParameterData GetData(string key) 52 { 53 foreach(JObject item in Config["Objects"]) 54 { 55 ParameterData data = BuildDataFromJObject(item); 56 if (data.Name == key) return data; 57 } 58 return null; 59 } 60 61 private ParameterData BuildDataFromJObject(JObject obj) { 62 ParameterData data = new ParameterData() { 63 Name = obj["Name"]?.ToString(), 64 Default = obj["Default"]?.ToObject<object>(), 65 Range = obj["Range"]?.ToObject<object[]>(), 66 Type = obj["Type"]?.ToObject<string>() 67 }; 68 69 if(obj["StaticParameters"] != null) 70 foreach (JObject sp in obj["StaticParameters"]) 71 data[sp["Name"].ToString()] = BuildDataFromJObject(sp); 72 73 if (obj["FreeParameters"] != null) 74 foreach (JObject sp in obj["FreeParameters"]) 75 data[sp["Name"].ToString()] = BuildDataFromJObject(sp); 76 77 if (obj["Operators"] != null) { 78 data.Operators = new List<ParameterData>(); 79 foreach (JObject sp in obj["Operators"]) 80 data.Operators.Add(BuildDataFromJObject(sp)); 47 81 } 48 82 49 50 return algorithm; 51 52 53 /* 54 TypeList = config[SParametersID][TListID].ToObject<Dictionary<string, string>>(); 55 56 JCObject algorithmData = config[SParametersID][AlgorithmID].ToObject<JCObject>(); 57 JCObject problemData = config[SParametersID][ProblemID].ToObject<JCObject>(); 58 59 IAlgorithm algorithm = CreateTypeListObject<IAlgorithm>(algorithmData.Name); 60 algorithm.Problem = CreateTypeListObject<IProblem>(problemData.Name); 61 62 ProcessParameters(algorithmData, algorithm); 63 ProcessParameters(problemData, algorithm.Problem); 64 65 ParameterData[] freeAlgorithmParameters = config[FParametersID][algorithmData.Name].ToObject<ParameterData[]>(); 66 ParameterData[] freeProblemParameters = config[FParametersID][problemData.Name].ToObject<ParameterData[]>(); 67 UseFreeParams(algorithmData.Name, freeAlgorithmParameters, algorithm); 68 UseFreeParams(problemData.Name, freeProblemParameters, algorithm.Problem); 69 return algorithm; 70 */ 83 return data; 71 84 } 72 85 73 private T CreateObject<T>( JCObject obj) {74 Type type = Type.GetType( obj.Type);86 private T CreateObject<T>(ParameterData data) { 87 Type type = Type.GetType(data.Type); 75 88 return (T)Activator.CreateInstance(type); 76 89 } 77 90 78 private T CreateTypeListObject<T>(string key) {79 if (TypeList.TryGetValue(key, out string value)) {80 Type type = Type.GetType(value);81 return (T)Activator.CreateInstance(type);82 } else throw new TypeLoadException($"The type '{key}' does not exists in TypeList.");83 }84 85 private void ProcessParameters(JCObject obj, IParameterizedItem instance) {86 foreach (var param in obj.StaticParameters)87 if (param.Default != null)88 SetParameterValue(FindPropertyByKey(instance, param.Name), param.Default);89 }90 91 private void SetParameterValue (IParameter parameter, object value) {92 if (Util.IsTypeOf(parameter, typeof(IFixedValueParameter<>))) return;93 if (Util.IsTypeOf(parameter, typeof(IConstrainedValueParameter<>)))94 SetCVParameter(parameter, value);95 else if (Util.IsTypeOf(parameter.ActualValue, typeof(ValueTypeMatrix<>)))96 SetVTMatrix(parameter, value);97 else if (Util.IsTypeOf(parameter.ActualValue, typeof(ValueTypeArray<>)))98 SetVTArray(parameter, value);99 else if (Util.IsTypeOf(parameter.ActualValue, typeof(EnumValue<>)))100 SetEnum(parameter, value);101 else if (!(value is string))102 SetValue(parameter, value);103 else104 SetNewInstance(parameter, value);105 }106 #region Helper for SetParameterValue107 private void SetCVParameter(IParameter parameter, object value) {108 foreach (var x in ((dynamic)parameter).ValidValues)109 if (x.GetType().Name == (string)value)110 parameter.ActualValue = x;111 }112 113 private void SetVTMatrix(IParameter parameter, object value) {114 var matrixType = ((dynamic)parameter.ActualValue).CloneAsMatrix().GetType();115 var data = ((JToken)value).ToObject(matrixType);116 parameter.ActualValue = (IItem)Activator.CreateInstance(parameter.ActualValue.GetType(), new object[] { data });117 }118 119 private void SetVTArray(IParameter parameter, object value) {120 var arrayType = ((dynamic)parameter.ActualValue).CloneAsArray().GetType();121 var data = ((JToken)value).ToObject(arrayType);122 parameter.ActualValue = (IItem)Activator.CreateInstance(parameter.ActualValue.GetType(), new object[] { data });123 }124 125 private void SetEnum(IParameter parameter, object value) {126 var enumType = ((dynamic)parameter.ActualValue).Value.GetType();127 var data = Enum.Parse(enumType, (string)value);128 ((dynamic)parameter.ActualValue).Value = data;129 }130 131 private void SetValue(IParameter parameter, object value) {132 var x = (dynamic)parameter.ActualValue;133 if (value is IConvertible)134 x.Value = Convert.ChangeType(value, x.Value.GetType());135 else136 x.Value = value;137 }138 139 private void SetNewInstance(IParameter parameter, object value) =>140 parameter.ActualValue = (IItem)Activator.CreateInstance(Type.GetType(TypeList[(string)value]));141 #endregion142 143 private IParameter FindPropertyByKey(IParameterizedItem item, string key) {144 if (item.Parameters.TryGetValue(key, out IParameter param))145 return param;146 else throw new KeyNotFoundException();147 }148 149 150 /*151 JCProperty property = FindPropertyByPath(instance, param.Path);152 property.Value = param.Default;153 Properties.Add(obj.Name + "." + param.Name, property);154 155 private JCProperty FindPropertyByPath(object start, string path) {156 string[] parts = path.Split('.');157 object instance = start;158 for (int i = 0; i < parts.Length - 1; ++i) {159 if (parts[i].StartsWith("Parameters['")) {160 IParameterizedItem pItem = (IParameterizedItem)instance;161 string tmp = parts[i].Replace("Parameters['", "").Replace("']", "");162 if (pItem.Parameters.ContainsKey(tmp))163 instance = pItem.Parameters[tmp];164 } else {165 PropertyInfo propInfo = instance.GetType().GetProperty(parts[i]);166 instance = propInfo.GetValue(instance);167 }168 }169 return new JCProperty(instance.GetType().GetProperty(parts[parts.Length - 1]), instance, TypeList);170 }171 */172 private bool IsInRangeList(IEnumerable<object> list, object value) {173 foreach (var x in list)174 if (x.Equals(value)) return true;175 return false;176 }177 178 private void UseFreeParams(string root, ParameterData[] parameters, IParameterizedItem instance) {179 foreach (var param in parameters) {180 string key = $"{root}.{param.Name}";181 if((param.Range == null && param.Default != null) ||182 (param.Range != null && IsInRangeList(param.Range, param.Default)) ||183 IsInNumericRange<long>(param.Default, param.Range[0], param.Range[1]) ||184 IsInNumericRange<double>(param.Default, param.Range[0], param.Range[1]))185 SetParameterValue(FindPropertyByKey(instance, param.Name), param.Default);186 //Properties[key].Value = param.Default;187 else188 throw new ArgumentOutOfRangeException(key);189 }190 }191 192 private bool IsInNumericRange<T>(object value, object min, object max) where T : IComparable =>193 (value != null && min != null && max != null && value is T && min is T && max is T &&194 (((T)min).CompareTo(value) == -1 || ((T)min).CompareTo(value) == 0) &&195 (((T)max).CompareTo(value) == 1 || ((T)max).CompareTo(value) == 0));196 91 } 197 92 } -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/ParameterTransformer/ConstrainedValueParameterTransformer.cs
r17266 r17269 12 12 if (x.GetType().Name == CastValue<string>(data.Default)) 13 13 parameter.ActualValue = x; 14 15 if (parameter.ActualValue is IParameterizedItem && data.Reference != null) 16 Transformer.Inject(parameter.ActualValue, data.Reference); 14 17 } 15 18 16 19 public override ParameterData ExtractData(IParameter value) { 20 17 21 return new ParameterData() { 18 22 Name = value.Name, 19 23 Default = value.ActualValue?.GetType().Name, 20 Range = GetValidValues(value) 24 Range = GetValidValues(value), 25 ParameterizedItems = GetParameterizedChilds(value) 21 26 }; 22 27 } … … 26 31 List<object> list = new List<object>(); 27 32 var values = value.Cast<dynamic>().ValidValues; 28 foreach (var x in values) list.Add(x); 29 return list.Select(x => x.GetType().Name).ToArray(); 33 foreach (var x in values) list.Add(x.GetType().Name); 34 return list.ToArray(); 35 } 36 37 private IList<ParameterData> GetParameterizedChilds(IParameter value) { 38 List<ParameterData> list = new List<ParameterData>(); 39 var values = value.Cast<dynamic>().ValidValues; 40 foreach(var x in values) { 41 if (x is IParameterizedItem && 42 ((IParameterizedItem)x).Parameters.Any(p => !p.Hidden)) { 43 ParameterData tmp = Transformer.Extract(x); 44 if (tmp.ParameterizedItems != null) 45 list.AddRange(tmp.ParameterizedItems); 46 else 47 list.Add(tmp); 48 } 49 } 50 return list.Count == 0 ? null : list; 30 51 } 31 52 #endregion -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/ParameterTransformer/ValueParameterTransformer.cs
r17266 r17269 13 13 14 14 public override ParameterData ExtractData(IParameter value) { 15 ParameterData data = Transformer.Extract(value.ActualValue); 15 ParameterData data = null; 16 if (value.ActualValue == null) 17 data = new ParameterData(); 18 else 19 data = Transformer.Extract(value.ActualValue); 16 20 data.Name = value.Name; 17 21 return data; -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/Program.cs
r17266 r17269 31 31 public class Program { 32 32 static void Main(string[] args) { 33 //GeneticAlgorithm ga = new GeneticAlgorithm();34 33 GeneticAlgorithm alg = new GeneticAlgorithm(); 35 34 TravelingSalesmanProblem tsp = new TravelingSalesmanProblem(); 36 35 37 36 JCGenerator gen = new JCGenerator(); 38 File.WriteAllText(@"C:\Workspace\TemplateProto10.json", gen.GenerateTemplate(alg, tsp));37 //File.WriteAllText(@"C:\Workspace\TemplateProto10.json", gen.GenerateTemplate(alg, tsp)); 39 38 40 39 JCInstantiator configurator = new JCInstantiator(); 41 40 configurator.Instantiate(@"C:\Workspace\TemplateProto10.json"); 42 //Configure(@"C:\Workspace\TemplateProto9.json");43 //Console.WriteLine(Optimizer);44 41 45 42 //Console.ReadLine(); -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/Template.cs
r17266 r17269 8 8 9 9 namespace HeuristicLab.Manufacture { 10 public class JCObject { //Blueprint, Component, ? 10 /* 11 public class ParameterData { //Blueprint, Component, ? 11 12 public string Name { get; set; } 12 13 public string Type { get; set; } … … 14 15 public IList<ParameterData> StaticParameters { get; set; } 15 16 16 public override string ToString() { 17 StringBuilder sb = new StringBuilder(); 18 sb.Append($"{Name}: ["); 19 foreach(var x in StaticParameters) { 20 sb.Append(x?.ToString()); 21 } 22 sb.Append($"\n]"); 23 return sb.ToString(); 24 } 25 } 17 }*/ 26 18 27 19 public class ParameterData { 28 20 public string Name { get; set; } 29 [JsonIgnore]30 21 public string Type { get; set; } 31 22 public object Default { get; set; } 32 //[JsonIgnore]33 23 public string Path { get; set; } 34 24 public IList<object> Range { get; set; } 25 35 26 public IList<ParameterData> Parameters { get; set; } 36 27 public IList<ParameterData> Operators { get; set; } 37 28 38 public ParameterData() { } 39 /* 40 public ParameterData(ParameterData original) { 41 this.Name = original.Name; 42 this.Type = original.Type; 43 this.Default = original.Default; 44 this.Path = original.Path; 45 this.Name = original.Name; 46 this.Name = original.Name; 47 }*/ 48 public override string ToString() { 49 StringBuilder sb = new StringBuilder(); 50 sb.Append($"\n{Name}, {Default}, Range["); 51 if(Range != null) { 52 foreach (var x in Range) { 53 sb.Append(x.ToString() + ", "); 54 } 29 [JsonIgnore] 30 public ParameterData this[string index] { 31 get { 32 if (Parameters == null) return null; 33 foreach (var p in Parameters) 34 if (p.Name == index) return p; 35 return null; 55 36 } 56 sb.Append($"],"); 57 return sb.ToString(); 37 set { 38 if (Parameters == null) 39 Parameters = new List<ParameterData>(); 40 ParameterData data = this[index]; 41 if (data != null && CheckConstraints(value)) 42 Merge(data, value); 43 else 44 Parameters.Add(value); 45 } 58 46 } 47 48 public override bool Equals(object obj) { 49 if (!(obj is ParameterData)) 50 return false; 51 else 52 return obj.Cast<ParameterData>().Name == this.Name; 53 } 54 55 public override int GetHashCode() { 56 return Name.GetHashCode(); 57 } 58 59 [JsonIgnore] 60 public IList<ParameterData> ParameterizedItems { get; set; } 61 62 [JsonIgnore] 63 public ParameterData Reference { get; set; } 64 65 #region Helper 66 public static void Merge(ParameterData target, ParameterData from) { 67 target.Name = from.Name ?? target.Name; 68 target.Type = from.Type ?? target.Type; 69 target.Range = from.Range ?? target.Range; 70 target.Path = from.Path ?? target.Path; 71 target.Default = from.Default ?? target.Default; 72 target.Reference = from.Reference ?? target.Reference; 73 target.Parameters = from.Parameters ?? target.Parameters; 74 target.ParameterizedItems = from.ParameterizedItems ?? target.ParameterizedItems; 75 } 76 77 private bool CheckConstraints(ParameterData data) => 78 data.Range != null && data.Default != null && ( 79 IsInRangeList(data.Range, data.Default) || 80 IsInNumericRange<long>(data.Default, data.Range[0], data.Range[1]) || 81 IsInNumericRange<double>(data.Default, data.Range[0], data.Range[1])); 82 83 private bool IsInRangeList(IEnumerable<object> list, object value) { 84 foreach (var x in list) 85 if (x.Equals(value)) return true; 86 return false; 87 } 88 89 private bool IsInNumericRange<T>(object value, object min, object max) where T : IComparable => 90 (value != null && min != null && max != null && value is T && min is T && max is T && 91 (((T)min).CompareTo(value) == -1 || ((T)min).CompareTo(value) == 0) && 92 (((T)max).CompareTo(value) == 1 || ((T)max).CompareTo(value) == 0)); 93 #endregion 59 94 } 60 61 62 95 } -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/Transformer.cs
r17266 r17269 19 19 public static void Register<T>(ITypeTransformer transformer) => Register(typeof(T), transformer); 20 20 21 public static I TypeTransformerGet(Type type) {21 public static IEnumerable<ITypeTransformer> Get(Type type) { 22 22 IList<KeyValuePair<Type, ITypeTransformer>> possibleTransformers = new List<KeyValuePair<Type, ITypeTransformer>>(); 23 24 23 25 foreach (var x in transformers) { 24 26 if (type.IsEqualTo(x.Key)) 25 27 possibleTransformers.Add(x); 26 28 } 29 27 30 28 31 if(possibleTransformers.Count > 0) { … … 36 39 } 37 40 } 38 return nearest; 41 return new ITypeTransformer[] { nearest }; 42 /* 43 return possibleTransformers.OrderBy(x => { 44 return type.GetInterfaceDistance(x.Key); 45 }).Select(x => x.Value); 46 */ 39 47 } 40 return new DummyTransformer();48 return new ITypeTransformer[] { new DummyTransformer() }; 41 49 } 42 50 43 51 internal static void Inject(IItem item, ParameterData data) { 44 Get(item.GetType()).Inject(item, data); 52 IEnumerable<ITypeTransformer> arr = Get(item.GetType()); 53 foreach (var transformer in arr) 54 transformer.Inject(item, data); 45 55 } 46 56 47 57 internal static ParameterData Extract(IItem item) { 48 return Get(item.GetType()).Extract(item); 58 IEnumerable<ITypeTransformer> arr = Get(item.GetType()); 59 ParameterData data = new ParameterData(); 60 foreach (var transformer in arr) 61 ParameterData.Merge(data, transformer.Extract(item)); 62 return data; 49 63 } 50 64 … … 71 85 Register(typeof(ILookupParameter), new LookupParameterTransformer()); 72 86 Register(typeof(IValueParameter), new ValueParameterTransformer()); 87 Register(typeof(IParameterizedItem), new ParameterizedItemTransformer()); 88 Register(typeof(ICheckedMultiOperator<>), new MultiCheckedOperatorTransformer()); 73 89 } 74 90 -
branches/3026_IntegrationIntoSymSpace/HeuristicLab.Manufacture/TypeTransformer/DummyTransformer.cs
r17266 r17269 13 13 } 14 14 15 public override ParameterData ExtractData(IItem value) => new ParameterData(); 15 public override ParameterData ExtractData(IItem value) => 16 new ParameterData() { Default = value.GetType().Name }; 16 17 } 17 18 }
Note: See TracChangeset
for help on using the changeset viewer.