Esempio n. 1
0
        public async Task <ActionResult> ComputeFunctionValues([FromBody] ComputeFunctionRequestModel request)
        {
            var result = await _mathParserService.ComputeFunctionValues(request);

            if (!result.IsSuccessfulComputed)
            {
                return(StatusCode(500, new
                {
                    Message = result.ErrorMessage
                }));
            }

            return(Ok(result));
        }
        public async Task <Compute2DIntervalPlotResponseModel> Compute2DIntervalPlot(Compute2DIntervalPlotRequestModel request)
        {
            var errorMessage = MathParserServiceParametersChecker.CheckForCompute2DIntervalPlot(request);

            if (!string.IsNullOrEmpty(errorMessage))
            {
                return(new Compute2DIntervalPlotResponseModel(false, errorMessage));
            }

            var computeFunctionRequest = new ComputeFunctionRequestModel()
            {
                Expression      = request.Expression,
                ParametersTable = new List <List <Parameter> >()
            };

            for (var i = request.Min; i < request.Max; i += request.Step)
            {
                computeFunctionRequest.ParametersTable.Add(new List <Parameter>()
                {
                    new Parameter("x", i)
                });
            }

            computeFunctionRequest.ParametersTable.Add(new List <Parameter>()
            {
                new Parameter("x", request.Max)
            });

            var computeResult = await ComputeFunctionValues(computeFunctionRequest);

            if (!computeResult.IsSuccessfulComputed)
            {
                return(new Compute2DIntervalPlotResponseModel(false, computeResult.ErrorMessage));
            }

            var mappedComputeResult = computeResult
                                      .Result
                                      .Select(p => new Point2D
            {
                X = p.Parameters.First().Value,
                Y = p.Value
            })
                                      .ToList();

            return(new Compute2DIntervalPlotResponseModel(true)
            {
                Result = mappedComputeResult,
                Expression = computeResult.Expression
            });
        }
        //эта функция ничего не пишет в базу, так как в ней мало места,
        //а данных для сохранения у этой функции больше, чем у ComputeExpression
        public async Task <ComputeFunctionValuesResponseModel> ComputeFunctionValues(ComputeFunctionRequestModel request)
        {
            var functionDimensionCount = request.ParametersTable.FirstOrDefault()?.Count;

            var variables = request.ParametersTable
                            .SelectMany(p => p)
                            .Select(p => p.GetVariable())
                            .Distinct()
                            .ToList();

            var errorMessage = MathParserServiceParametersChecker.CheckForComputeFunctionValues(request, functionDimensionCount, variables);

            if (!string.IsNullOrEmpty(errorMessage))
            {
                return(new ComputeFunctionValuesResponseModel(false, errorMessage));
            }

            //parse
            var parseResult = _mathParser.TryParse(request.Expression, variables);

            if (!parseResult.IsSuccessfulCreated)
            {
                return(new ComputeFunctionValuesResponseModel(false, parseResult.ErrorMessage));
            }

            var parsedExpression = parseResult.Expression;

            //compute
            var result = request.ParametersTable
                         .Select(parameters => new ComputeFunctionValueResult
            {
                Value      = parsedExpression.ComputeValue(parameters),
                Parameters = parameters
            })
                         .ToList();

            return(new ComputeFunctionValuesResponseModel(true)
            {
                Result = result,
                Expression = parsedExpression
            });
        }