Changeset 14880 for branches/HeuristicLab.ExpressionGenerator/HeuristicLab.ExpressionGenerator/3.4/ExpressionGenerator.cs
- Timestamp:
- 04/20/17 18:21:01 (7 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/HeuristicLab.ExpressionGenerator/HeuristicLab.ExpressionGenerator/3.4/ExpressionGenerator.cs
r14879 r14880 24 24 using System.Linq; 25 25 using HeuristicLab.Core; 26 using HeuristicLab.ExpressionGenerator.Interfaces; 26 27 using HeuristicLab.Random; 27 28 … … 32 33 } 33 34 34 public static Expression NonlinearExpression(IRandom uniformRandom, Expression[] variables, bool useLog, bool useExp) { 35 var scalingTemplate = ScaledExpression(uniformRandom, variables, varianceRandom: new UniformDistributedRandom(uniformRandom, 1, 10)); 36 var scaledVars = Instantiate(scalingTemplate, uniformRandom, 100, "scaledVar"); 37 38 var sumTemplate = new RandomArityTemplate(Sum, new UniformDistributedRandom(uniformRandom, 1, 3)) { Label = "+" }; 35 public static Expression RationalExpression(IRandom uniformRandom, Expression[] variables, bool useLog, bool useExp) { 36 var numerators = 37 Enumerable.Range(0, 20) 38 .Select( 39 i => 40 NonlinearExpressionTemplate(uniformRandom, variables, useLog, useExp, false) 41 .Instantiate("numerator" + i, uniformRandom, sampleWithRepetition: false)) 42 .ToArray(); 43 var denominators = 44 Enumerable.Range(0, 20) 45 .Select( 46 i => 47 NonlinearExpressionTemplate(uniformRandom, variables, useLog, useExp, false) 48 .Instantiate("denominator" + i, uniformRandom, sampleWithRepetition: false)) 49 .ToArray(); 50 51 52 var scaledNumeratorTemplate = new ScalingTemplate(new PointDistribution<double>(1.0)); 53 scaledNumeratorTemplate.AddArguments(numerators); 54 55 var scaledDenominatorTemplate = new RangeTemplate( 56 minValue: new DoublePrngDistribution(new UniformDistributedRandom(uniformRandom, 0.01, 1)), 57 valueRange: new DoublePrngDistribution(new UniformDistributedRandom(uniformRandom, 2, 10))); 58 scaledDenominatorTemplate.AddArguments(denominators); 59 60 61 var scaledNumerators = 62 Enumerable.Range(0, 20) 63 .Select(i => scaledNumeratorTemplate.Instantiate("scaledNumerator" + i, uniformRandom, false)); 64 65 var scaledDenominators = 66 Enumerable.Range(0, 20) 67 .Select(i => scaledDenominatorTemplate.Instantiate("scaledDenom" + i, uniformRandom, false)); 68 69 var template = new BinaryOperatorTemplate(Division) { Label = "/" }; 70 template.AddLeftArguments(scaledNumerators); 71 template.AddRightArguments(scaledDenominators); 72 73 return template.Instantiate("rational", uniformRandom, false); 74 } 75 76 public static Expression SumOfCompactNonlinearTerms(IRandom uniformRandom, Expression[] variables, bool useLog, 77 bool useExp, bool useFrac) { 78 var numInstances = 2 * variables.Length; 79 80 var scalingVarsTemplate = new ScalingTemplate(new DoublePrngDistribution(new GammaDistributedRandom(uniformRandom, 2, 2))); // exp(x) = 1, var(x) = 8 81 scalingVarsTemplate.AddArguments(variables); 82 var scaledVars = Instantiate(scalingVarsTemplate, uniformRandom, numInstances, "scaledVar"); 83 84 var sumOfScaledVarsTemplate = new RandomArityTemplate(Sum, new DiscreteUniformDistribution(uniformRandom, 1, 3)) { Label = "+" }; 85 sumOfScaledVarsTemplate.AddArguments(scaledVars); 86 var sumOfScaledVars = Instantiate(sumOfScaledVarsTemplate, uniformRandom, numInstances, "sumOfScaledVars"); 87 88 var prodTemplate = new RandomArityTemplate(Product, new DiscreteUniformDistribution(uniformRandom, 1, 3)) { Label = "*" }; 89 prodTemplate.AddArguments(variables); 90 91 var logTermsTemplate = LogOfScaledExpression(uniformRandom, sumOfScaledVars, 92 minValue: new DoublePrngDistribution(new UniformDistributedRandom(uniformRandom, 0.1, 2)), 93 valueRange: new DoublePrngDistribution(new UniformDistributedRandom(uniformRandom, 1, 10))); 94 var logTerms = Instantiate(logTermsTemplate, uniformRandom, numInstances, "log"); 95 96 var expTemplate = ExpOfScaledExpression(uniformRandom, Instantiate(prodTemplate, uniformRandom, numInstances, "prodOfVars"), 97 minValue: new PointDistribution<double>(-2.0), 98 valueRange: new DoublePrngDistribution(new UniformDistributedRandom(uniformRandom, 4, 6))); 99 var expTerms = Instantiate(expTemplate, uniformRandom, numInstances, "exp"); 100 101 var fracTemplate = new BinaryOperatorTemplate(Division) { Label = "/" }; 102 fracTemplate.AddLeftArgument(Expression.Constant("const", 1.0), variables.Length); 103 fracTemplate.AddLeftArguments(variables); 104 fracTemplate.AddRightArguments(sumOfScaledVars); 105 var fracTerms = Enumerable.Range(1, numInstances).Select(i => fracTemplate.Instantiate("frac" + i, uniformRandom, false)); 106 107 var prodOfFactorsTemplate = new RandomArityTemplate(Product, new DiscreteUniformDistribution(uniformRandom, 1, 4)) { Label = "*" }; 108 prodOfFactorsTemplate.AddArguments(variables, variables.Select(_ => 1.0)); 109 if (useLog) prodOfFactorsTemplate.AddArguments(logTerms, logTerms.Select(_ => .3)); 110 if (useExp) prodOfFactorsTemplate.AddArguments(expTerms, expTerms.Select(_ => .3)); 111 if (useFrac) prodOfFactorsTemplate.AddArguments(fracTerms, fracTerms.Select(_ => .3)); 112 var prodFactors = Instantiate(prodOfFactorsTemplate, uniformRandom, numInstances, "prod"); 113 114 var scaledTermsTemplate = 115 new ScalingTemplate(new DoublePrngDistribution(new GammaDistributedRandom(uniformRandom, 2, 2))); // exp(x) = 1, var(x) = 8 116 scaledTermsTemplate.AddArguments(variables, variables.Select(_ => 1.0)); 117 if (useLog) scaledTermsTemplate.AddArguments(logTerms, logTerms.Select(_ => 1.0)); 118 if (useExp) scaledTermsTemplate.AddArguments(expTerms, expTerms.Select(_ => 1.0)); 119 if (useFrac) scaledTermsTemplate.AddArguments(fracTerms, fracTerms.Select(_ => 1.0)); 120 scaledTermsTemplate.AddArguments(prodFactors, prodFactors.Select(_ => 4.0)); 121 122 var scaledTerms = Instantiate(scaledTermsTemplate, uniformRandom, 100, "scaledTerm"); 123 124 var sumTemplate = new RandomArityTemplate(Sum, arityDistribution: new DiscreteUniformDistribution(uniformRandom, 5, 25)) { Label = "+" }; 125 sumTemplate.AddArguments(scaledTerms); 126 127 return sumTemplate.Instantiate("sum", uniformRandom, false); 128 } 129 130 public static Expression NonlinearExpression(IRandom uniformRandom, Expression[] variables, bool useLog, bool useExp, bool useFrac) { 131 return NonlinearExpressionTemplate(uniformRandom, variables, useLog, useExp, useFrac) 132 .Instantiate("nonlinearexpr", uniformRandom, sampleWithRepetition: false); 133 } 134 135 public static ExpressionTemplate NonlinearExpressionTemplate(IRandom uniformRandom, Expression[] variables, bool useLog, bool useExp, bool useFrac) { 136 var scalingTemplate = ScaledExpression(uniformRandom, variables, varianceDistribution: new DoublePrngDistribution(new UniformDistributedRandom(uniformRandom, 1, 10))); 137 var scaledVars = Instantiate(scalingTemplate, uniformRandom, variables.Length, "scaledVar"); 138 139 var sumTemplate = new RandomArityTemplate(Sum, new DiscreteUniformDistribution(uniformRandom, 1, 3)) { Label = "+" }; 39 140 sumTemplate.AddArguments(scaledVars); 40 var prodTemplate = new RandomArityTemplate(Product, new UniformDistributedRandom(uniformRandom, 1, 3)) { Label = "*" };141 var prodTemplate = new RandomArityTemplate(Product, new DiscreteUniformDistribution(uniformRandom, 1, 3)) { Label = "*" }; 41 142 prodTemplate.AddArguments(variables); 42 143 43 var logTemplate = LogOfScaledExpression(uniformRandom, Instantiate(sumTemplate, uniformRandom, 100, "sumOfScaledVars"), 44 minValue: new UniformDistributedRandom(uniformRandom, 0.1, 2), 45 valueRange: new UniformDistributedRandom(uniformRandom, 1, 10)); 46 47 var expTemplate = ExpOfScaledExpression(uniformRandom, Instantiate(prodTemplate, uniformRandom, 100, "prodOfVars"), 48 minValue: new PointDistribution(-3), 49 valueRange: new UniformDistributedRandom(uniformRandom, 4, 6)); 50 51 var scaledExprTemplate = new ScalingTemplate(new UniformDistributedRandom(uniformRandom, 1, 10)) { Label = "*" }; 52 if (useLog) scaledExprTemplate.AddArguments(Instantiate(logTemplate, uniformRandom, 100, "log")); 53 if (useExp) scaledExprTemplate.AddArguments(Instantiate(expTemplate, uniformRandom, 100, "exp")); 54 55 var mainTemplate = new RandomArityTemplate(Sum, new UniformDistributedRandom(uniformRandom, 3, 5)); 144 var logTemplate = LogOfScaledExpression(uniformRandom, Instantiate(sumTemplate, uniformRandom, scaledVars.Count(), "sumOfScaledVars"), 145 minValue: new DoublePrngDistribution(new UniformDistributedRandom(uniformRandom, 0.1, 2)), 146 valueRange: new DoublePrngDistribution(new UniformDistributedRandom(uniformRandom, 1, 10))); 147 148 var expTemplate = ExpOfScaledExpression(uniformRandom, Instantiate(prodTemplate, uniformRandom, variables.Length, "prodOfVars"), 149 minValue: new PointDistribution<double>(-3.0), 150 valueRange: new DoublePrngDistribution(new UniformDistributedRandom(uniformRandom, 4, 6))); 151 152 var variableSumTemplate = new RandomArityTemplate(Sum, new DiscreteUniformDistribution(uniformRandom, 1, 4)) { Label = "+" }; 153 variableSumTemplate.AddArguments(variables); 154 var variableSums = Instantiate(variableSumTemplate, uniformRandom, variables.Length * 2, "varsum"); 155 156 var scaledVariableSumTemplate = 157 new RangeTemplate(minValue: new DoublePrngDistribution(new UniformDistributedRandom(uniformRandom, 0.1, 1)), 158 valueRange: new DoublePrngDistribution(new UniformDistributedRandom(uniformRandom, 1, 5))) { Label = "*" }; 159 scaledVariableSumTemplate.AddArguments(variableSums); 160 var scaledVariableSums = Instantiate(scaledVariableSumTemplate, uniformRandom, variables.Length * 2, 161 "scaledvarsum"); 162 163 var fracTemplate = new BinaryOperatorTemplate(Division) { Label = "/" }; 164 fracTemplate.AddLeftArguments(variables); 165 fracTemplate.AddRightArguments(scaledVariableSums); 166 167 var scaledExprTemplate = new ScalingTemplate(new DoublePrngDistribution(new UniformDistributedRandom(uniformRandom, 1, 10))) { Label = "*" }; 168 if (useLog) scaledExprTemplate.AddArguments(Instantiate(logTemplate, uniformRandom, scaledVars.Count(), "log")); 169 if (useExp) scaledExprTemplate.AddArguments(Instantiate(expTemplate, uniformRandom, variables.Length, "exp")); 170 if (useFrac) scaledExprTemplate.AddArguments(Enumerable.Range(0, 20).Select(i => fracTemplate.Instantiate("frac" + i, uniformRandom, false))); 171 172 var mainTemplate = new RandomArityTemplate(Sum, arityDistribution: new DiscreteUniformDistribution(uniformRandom, 3, 5)); 56 173 mainTemplate.AddArguments(scaledVars); 57 174 if (useLog || useExp) { 58 mainTemplate.AddArguments(Instantiate(scaledExprTemplate, uniformRandom, 100, "scaledExpr"));175 mainTemplate.AddArguments(Instantiate(scaledExprTemplate, uniformRandom, 20, "scaledExpr")); 59 176 } 60 177 mainTemplate.Label = "+"; 61 178 62 return mainTemplate .Instantiate("main", uniformRandom, false);179 return mainTemplate; 63 180 } 64 181 … … 67 184 int i = 1; 68 185 // the main template 69 var template = new RandomArityTemplate(Sum, new UniformDistributedRandom(uniformRandom, 2, count)) { Label = "+" };186 var template = new RandomArityTemplate(Sum, arityDistribution: new DiscreteUniformDistribution(uniformRandom, 2, count)) { Label = "+" }; 70 187 template.AddArguments(variables); 71 188 72 var sumTemplate = new RandomArityTemplate(Sum, new UniformDistributedRandom(uniformRandom, 1, variables.Length)) { Label = "+" };189 var sumTemplate = new RandomArityTemplate(Sum, arityDistribution: new DiscreteUniformDistribution(uniformRandom, 1, variables.Length)) { Label = "+" }; 73 190 sumTemplate.AddArguments(variables); 74 191 75 var productTemplate = new RandomArityTemplate(Product, new UniformDistributedRandom(uniformRandom, 1, variables.Length)) { Label = "*" };192 var productTemplate = new RandomArityTemplate(Product, arityDistribution: new DiscreteUniformDistribution(uniformRandom, 1, variables.Length)) { Label = "*" }; 76 193 productTemplate.AddArguments(variables); 77 194 … … 102 219 103 220 // variance random must have support only positive numbers 104 private static ExpressionTemplate ScaledExpression(IRandom uniformRandom, IEnumerable<Expression> arguments, I Random varianceRandom) {105 var scalingTemplate = new ScalingTemplate(scaledVariance: variance Random);221 private static ExpressionTemplate ScaledExpression(IRandom uniformRandom, IEnumerable<Expression> arguments, IDistribution<double> varianceDistribution) { 222 var scalingTemplate = new ScalingTemplate(scaledVariance: varianceDistribution); 106 223 scalingTemplate.AddArguments(arguments); 107 224 scalingTemplate.Label = "*"; … … 111 228 /// template scales and translates the argument expression first to guarantee positive values 112 229 private static ExpressionTemplate LogOfScaledExpression(IRandom uniformRandom, IEnumerable<Expression> arguments, 113 I Random minValue = null, IRandomvalueRange = null) {230 IDistribution<double> minValue = null, IDistribution<double> valueRange = null) { 114 231 var limitToRangeTemplate = new RangeTemplate(minValue, valueRange); 115 232 limitToRangeTemplate.AddArguments(arguments); 116 233 117 234 var logTemplate = new FixedArityTemplate(Log, 1) { Label = "log" }; 118 logTemplate.AddArguments(Enumerable.Range(1, 100).Select(i => limitToRangeTemplate.Instantiate(string.Format("log{0}", i), uniformRandom, false)));235 logTemplate.AddArguments(Enumerable.Range(1, arguments.Count()).Select(i => limitToRangeTemplate.Instantiate(string.Format("log{0}", i), uniformRandom, false))); 119 236 return logTemplate; 120 237 } … … 122 239 /// template scales the argument expression first to guarantee reasonable values 123 240 private static ExpressionTemplate ExpOfScaledExpression(IRandom uniformRandom, IEnumerable<Expression> arguments, 124 I RandomminValue = null,125 I RandomvalueRange = null) {241 IDistribution<double> minValue = null, 242 IDistribution<double> valueRange = null) { 126 243 var limitToRangeTemplate = new RangeTemplate(minValue, valueRange); 127 244 limitToRangeTemplate.AddArguments(arguments); 128 245 129 246 var expTemplate = new FixedArityTemplate(Exp, 1) { Label = "exp" }; 130 expTemplate.AddArguments(Enumerable.Range(1, 100).Select(i => limitToRangeTemplate.Instantiate(string.Format("exp{0}", i), uniformRandom, false)));247 expTemplate.AddArguments(Enumerable.Range(1, arguments.Count()).Select(i => limitToRangeTemplate.Instantiate(string.Format("exp{0}", i), uniformRandom, false))); 131 248 return expTemplate; 132 249 }
Note: See TracChangeset
for help on using the changeset viewer.