Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
04/20/17 18:21:01 (7 years ago)
Author:
gkronber
Message:

#2704: added more expression templates

File:
1 edited

Legend:

Unmodified
Added
Removed
  • branches/HeuristicLab.ExpressionGenerator/HeuristicLab.ExpressionGenerator/3.4/ExpressionGenerator.cs

    r14879 r14880  
    2424using System.Linq;
    2525using HeuristicLab.Core;
     26using HeuristicLab.ExpressionGenerator.Interfaces;
    2627using HeuristicLab.Random;
    2728
     
    3233    }
    3334
    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 = "+" };
    39140      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 = "*" };
    41142      prodTemplate.AddArguments(variables);
    42143
    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));
    56173      mainTemplate.AddArguments(scaledVars);
    57174      if (useLog || useExp) {
    58         mainTemplate.AddArguments(Instantiate(scaledExprTemplate, uniformRandom, 100, "scaledExpr"));
     175        mainTemplate.AddArguments(Instantiate(scaledExprTemplate, uniformRandom, 20, "scaledExpr"));
    59176      }
    60177      mainTemplate.Label = "+";
    61178
    62       return mainTemplate.Instantiate("main", uniformRandom, false);
     179      return mainTemplate;
    63180    }
    64181
     
    67184      int i = 1;
    68185      // 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 = "+" };
    70187      template.AddArguments(variables);
    71188
    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 = "+" };
    73190      sumTemplate.AddArguments(variables);
    74191
    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 = "*" };
    76193      productTemplate.AddArguments(variables);
    77194
     
    102219
    103220    // variance random must have support only positive numbers
    104     private static ExpressionTemplate ScaledExpression(IRandom uniformRandom, IEnumerable<Expression> arguments, IRandom varianceRandom) {
    105       var scalingTemplate = new ScalingTemplate(scaledVariance: varianceRandom);
     221    private static ExpressionTemplate ScaledExpression(IRandom uniformRandom, IEnumerable<Expression> arguments, IDistribution<double> varianceDistribution) {
     222      var scalingTemplate = new ScalingTemplate(scaledVariance: varianceDistribution);
    106223      scalingTemplate.AddArguments(arguments);
    107224      scalingTemplate.Label = "*";
     
    111228    /// template scales and translates the argument expression first to guarantee positive values
    112229    private static ExpressionTemplate LogOfScaledExpression(IRandom uniformRandom, IEnumerable<Expression> arguments,
    113       IRandom minValue = null, IRandom valueRange = null) {
     230      IDistribution<double> minValue = null, IDistribution<double> valueRange = null) {
    114231      var limitToRangeTemplate = new RangeTemplate(minValue, valueRange);
    115232      limitToRangeTemplate.AddArguments(arguments);
    116233
    117234      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)));
    119236      return logTemplate;
    120237    }
     
    122239    /// template scales the argument expression first to guarantee reasonable values
    123240    private static ExpressionTemplate ExpOfScaledExpression(IRandom uniformRandom, IEnumerable<Expression> arguments,
    124       IRandom minValue = null,
    125       IRandom valueRange = null) {
     241      IDistribution<double> minValue = null,
     242      IDistribution<double> valueRange = null) {
    126243      var limitToRangeTemplate = new RangeTemplate(minValue, valueRange);
    127244      limitToRangeTemplate.AddArguments(arguments);
    128245
    129246      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)));
    131248      return expTemplate;
    132249    }
Note: See TracChangeset for help on using the changeset viewer.