/// <summary> /// Convert the given Mathematica Expr object into a SymbolicExpr object /// </summary> /// <param name="expr"></param> /// <returns></returns> public static SteExpression ToTextExpressionTree(this Expr expr) { var isNumber = expr.NumberQ(); var isSymbol = expr.SymbolQ(); if (isNumber) { return(isSymbol ? SteExpressionUtils.CreateSymbolicNumber(expr.ToString()) : SteExpressionUtils.CreateLiteralNumber(expr.ToString())); } if (isSymbol) { return(SteExpressionUtils.CreateVariable(expr.ToString())); } if (expr.Args.Length == 0) { return(SteExpressionUtils.CreateFunction(expr.ToString())); } //return new SymbolicExpr(expr.ToString(), isSymbol, isNumber); var args = new SteExpression[expr.Args.Length]; for (var i = 0; i < expr.Args.Length; i++) { args[i] = ToTextExpressionTree(expr.Args[i]); } return(SteExpressionUtils.CreateFunction(expr.Head.ToString(), args)); }
private static SteExpression ConvertNumber(SteExpression numberExpr) { var rationalHeadIndex = numberExpr.HeadText.IndexOf(@"Rational[", StringComparison.Ordinal); //This is an ordinary number, return as-is if (rationalHeadIndex < 0) { return(numberExpr.CreateCopy()); } //This is a rational atomic number; for example Rational[1, 2]. //Extract components and convert to floating point var numberTextFull = numberExpr.HeadText.Substring(@"Rational[".Length); var commaIndex = numberTextFull.IndexOf(','); var bracketIndex = numberTextFull.IndexOf(']'); var num1Text = numberTextFull.Substring(0, commaIndex); var num2Text = numberTextFull.Substring(commaIndex + 1, bracketIndex - commaIndex - 1); return(SteExpressionUtils.CreateLiteralNumber( double.Parse(num1Text) / double.Parse(num2Text) )); }
/// <summary> /// Create a literal number expression like "2", "-1.7" and "3.56e-4" /// </summary> /// <param name="numberText"></param> /// <returns></returns> public SteExpression LiteralNumber(string numberText) { return(SteExpressionUtils.CreateLiteralNumber(numberText)); }
/// <summary> /// Create a literal number expression like "2", "-1.7" and "3.56e-4" /// </summary> /// <param name="number"></param> /// <returns></returns> public SteExpression LiteralNumber(float number) { return(SteExpressionUtils.CreateLiteralNumber(number)); }