Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
12/08/18 08:11:48 (6 years ago)
Author:
gkronber
Message:

#2915: merged all changes from branch to trunk

Location:
trunk
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk

  • trunk/HeuristicLab.Problems.DataAnalysis.Symbolic

  • trunk/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Importer/InfixExpressionParser.cs

    r15583 r16356  
    4242  /// Expr          = ['-' | '+'] Term { '+' Term | '-' Term }
    4343  /// Term          = Fact { '*' Fact | '/' Fact }
    44   /// Fact          = '(' Expr ')'
    45   ///                 | 'LAG' '(' varId ',' ['+' | '-' ] number ')'
    46   ///                 | funcId '(' ArgList ')'
    47   ///                 | VarExpr | number
     44  /// Fact          = SimpleFact [ '^' SimpleFact ]
     45  /// SimpleFact    = '(' Expr ')'
     46  ///                 | '{' Expr '}'
     47  ///                 | 'LAG' '(' varId ',' ['+' | '-' ] number ')
     48  ///                 | funcId '(' ArgList ')'
     49  ///                 | VarExpr
     50  ///                 | number
    4851  /// ArgList       = Expr { ',' Expr }
    4952  /// VarExpr       = varId OptFactorPart
     
    9598        { "*", new Multiplication()},
    9699        { "-", new Subtraction()},
     100        { "^", new Power() },
     101        { "ABS", new Absolute() },
    97102        { "EXP", new Exponential()},
    98103        { "LOG", new Logarithm()},
     
    101106        { "SQR", new Square() },
    102107        { "SQRT", new SquareRoot() },
     108        { "CUBE", new Cube() },
     109        { "CUBEROOT", new CubeRoot() },
    103110        { "SIN",new Sine()},
    104111        { "COS", new Cosine()},
     
    119126        { "DAWSON", new Dawson()},
    120127        { "EXPINT", new ExponentialIntegralEi()},
     128        { "AQ", new AnalyticalQuotient() },
    121129        { "MEAN", new Average()},
    122130        { "IF", new IfThenElse()},
     
    167175            && str[pos] != '*'
    168176            && str[pos] != '/'
     177            && str[pos] != '^'
    169178            && str[pos] != ')'
    170179            && str[pos] != ']'
     180            && str[pos] != '}'
    171181            && str[pos] != ',') {
    172182            sb.Append(str[pos]);
     
    227237          pos++;
    228238          yield return new Token { TokenType = TokenType.Operator, strVal = "*" };
     239        } else if (str[pos] == '^') {
     240          pos++;
     241          yield return new Token { TokenType = TokenType.Operator, strVal = "^" };
    229242        } else if (str[pos] == '(') {
    230243          pos++;
     
    239252          pos++;
    240253          yield return new Token { TokenType = TokenType.RightBracket, strVal = "]" };
     254        } else if (str[pos] == '{') {
     255          pos++;
     256          yield return new Token { TokenType = TokenType.LeftPar, strVal = "{" };
     257        } else if (str[pos] == '}') {
     258          pos++;
     259          yield return new Token { TokenType = TokenType.RightPar, strVal = "}" };
    241260        } else if (str[pos] == '=') {
    242261          pos++;
     
    360379    }
    361380
    362     /// Fact          = '(' Expr ')'
    363     ///                 | 'LAG' '(' varId ',' ['+' | '-' ] number ')'
    364     ///                 | funcId '(' ArgList ')'
    365     ///                 | VarExpr | number
     381    // Fact = SimpleFact ['^' SimpleFact]
     382    private ISymbolicExpressionTreeNode ParseFact(Queue<Token> tokens) {
     383      var expr = ParseSimpleFact(tokens);
     384      var next = tokens.Peek();
     385      if (next.TokenType == TokenType.Operator && next.strVal == "^") {
     386        tokens.Dequeue(); // skip;
     387
     388        var p = GetSymbol("^").CreateTreeNode();
     389        p.AddSubtree(expr);
     390        p.AddSubtree(ParseSimpleFact(tokens));
     391        expr = p;
     392      }
     393      return expr;
     394    }
     395
     396
     397    /// SimpleFact   = '(' Expr ')'
     398    ///                 | '{' Expr '}'
     399    ///                 | 'LAG' '(' varId ',' ['+' | '-' ] number ')'
     400    ///                 | funcId '(' ArgList ')
     401    ///                 | VarExpr
     402    ///                 | number
    366403    /// ArgList       = Expr { ',' Expr }
    367404    /// VarExpr       = varId OptFactorPart
     
    370407    /// varVal        =  ident | ' ident ' | " ident "
    371408    /// ident         =  '_' | letter { '_' | letter | digit }
    372     private ISymbolicExpressionTreeNode ParseFact(Queue<Token> tokens) {
     409    private ISymbolicExpressionTreeNode ParseSimpleFact(Queue<Token> tokens) {
    373410      var next = tokens.Peek();
    374411      if (next.TokenType == TokenType.LeftPar) {
    375         tokens.Dequeue();
     412        var initPar = tokens.Dequeue(); // match par type
    376413        var expr = ParseExpr(tokens);
    377414        var rPar = tokens.Dequeue();
    378415        if (rPar.TokenType != TokenType.RightPar)
    379           throw new ArgumentException("expected )");
     416          throw new ArgumentException("expected closing parenthesis");
     417        if (initPar.strVal == "(" && rPar.strVal == "}")
     418          throw new ArgumentException("expected closing )");
     419        if (initPar.strVal == "{" && rPar.strVal == ")")
     420          throw new ArgumentException("expected closing }");
    380421        return expr;
    381422      } else if (next.TokenType == TokenType.Identifier) {
     
    424465          if (rPar.TokenType != TokenType.RightPar)
    425466            throw new ArgumentException("expected )");
     467
    426468
    427469          return funcNode;
  • trunk/HeuristicLab.Problems.DataAnalysis.Symbolic/3.4/Importer/SymbolicExpressionImporter.cs

    r15583 r16356  
    4141        {"*", new Multiplication()},
    4242        {"-", new Subtraction()},
     43        {"ABS", new Absolute() },
    4344        {"EXP", new Exponential()},
    4445        {"LOG", new Logarithm()},
     
    4748        {"SQR", new Square()},
    4849        {"SQRT", new SquareRoot()},
     50        {"CUBE", new Cube()},
     51        {"CUBEROOT", new CubeRoot()},
    4952        {"SIN",new Sine()},
    5053        {"COS", new Cosine()},
     
    6568        {"DAWSON", new Dawson()},
    6669        {"EXPINT", new ExponentialIntegralEi()},
     70        {"AQ", new AnalyticalQuotient() },
    6771        {"MEAN", new Average()},
    6872        {"IF", new IfThenElse()},
Note: See TracChangeset for help on using the changeset viewer.