Exemple #1
0
        public static Matrix map(Matrix m, LambdaExpression mapper, VariableContext vc)
        {
            ExpressionEvaluator evaluator = new MathyLanguageService().CreateEvaluator();

            List <List <double> > result = new List <List <double> >();

            double[] row = new double[m.ColumnCount];

            for (int i = 0; i <= m.RowCount - 1; i++)
            {
                for (int j = 0; j <= m.ColumnCount - 1; j++)
                {
                    row[j] = m[i, j];
                }

                vc.Set(mapper.VariableNames[0], row.Where(c => !double.IsNaN(c)).ToArray());

                if (mapper.VariableNames.Length > 1)
                {
                    vc.Set(mapper.VariableNames[1], i);
                }

                double[] mappedRow;
                var      obj = evaluator.Evaluate(mapper.Body, vc);
                try
                {
                    mappedRow = (double[])obj;
                }
                catch (Exception ex)
                {
                    var a = (object[])obj;
                    mappedRow = (double[])a[0];
                }


                result.Add(new List <double>());

                for (int j = 0; j <= mappedRow.Length - 1; j++)
                {
                    result[i].Add(mappedRow[j]);
                }
            }

            vc.Remove(mapper.VariableNames[0]);


            List <double> cells = new List <double>();

            foreach (List <double> resultRow in result)
            {
                foreach (double cell in resultRow)
                {
                    cells.Add(cell);
                }
            }

            return(new Matrix(m.RowCount, result[0].Count, cells.ToArray()));
        }
Exemple #2
0
        private static object[] map(object[] items, LambdaExpression mapper, VariableContext vc)
        {
            ExpressionEvaluator evaluator = new MathyLanguageService().CreateEvaluator();

            object[] result = new object[items.Length];

            for (int i = 0; i <= items.Length - 1; i++)
            {
                vc.Set(mapper.VariableNames[0], items[i]);
                result[i] = evaluator.Evaluate(mapper.Body, vc);
            }

            vc.Remove(mapper.VariableNames[0]);
            return(result);
        }
        public static object eval(Expression expression, Dictionary <string, object> variables, VariableContext vc)
        {
            foreach (string variableName in variables.Keys)
            {
                vc.Set(variableName, variables[variableName]);
            }

            object result = new MathyLanguageService().CreateEvaluator().Evaluate(expression is VariableContextExpression ? (expression as VariableContextExpression).Expression : expression, vc);

            foreach (string variableName in variables.Keys)
            {
                vc.Remove(variableName);
            }


            return(result);
        }
Exemple #4
0
        public static Expression Diff(Expression e, string x, Dictionary <string, object> variables)
        {
            VariableContext c    = Funcs.CreateVariableContext(variables);
            Expression      diff = new Differ(e, x).Calculate(c);

            foreach (string variableName in variables.Keys)
            {
                c.Set(variableName, variables[variableName]);
            }

            new MathyLanguageService().CreateTypeChecker().PerformTypeChecking(diff, new MathyLanguageService().CreateTypeCheckingContext(c));
            diff = new Cherimoya.Reduction.ExpressionReductor(new MathyLanguageService()).Reduce(diff);

            foreach (string variableName in variables.Keys)
            {
                c.Remove(variableName);
            }


            return(diff);
        }
        private object EvaluateIterationSumExpression(IterationSumExpression e, VariableContext context)
        {
            int[] values     = new int[e.Variables.Length];
            int[] fromValues = new int[e.Variables.Length];
            int[] toValues   = new int[e.Variables.Length];

            int index = 0;

            foreach (IterationSumVariable variable in e.Variables)
            {
                if (context.HasVariable(variable.Name))
                {
                    throw new Exception(string.Format("Iteration variable {0} is already in use.", variable.Name));
                }


                fromValues[index] = Types.ConvertValue <int>(Evaluate(variable.From, context));
                toValues[index]   = Types.ConvertValue <int>(Evaluate(variable.To, context));

                context.Set(variable.Name, fromValues[index]);
                values[index] = fromValues[index];


                index++;
            }


            double sum = 0;

            while (true)
            {
                double value = Types.ConvertValue <double>(Evaluate(e.Body, context));;

                if (!double.IsNaN(value))
                {
                    sum += value;
                }


                if (!IncreaseIterationValues(values, fromValues, toValues))
                {
                    break;
                }
                else
                {
                    for (int i = 0; i <= e.Variables.Length - 1; i++)
                    {
                        context.Set(e.Variables[i].Name, values[i]);
                    }
                }
            }


            foreach (IterationSumVariable variable in e.Variables)
            {
                context.Remove(variable.Name);
            }


            return(sum);
        }