/// <summary>
        /// Provides the list of parameter whose value is a place holder
        /// </summary>
        /// <returns></returns>
        public List <Parameter> PlaceHolders()
        {
            List <Parameter> retVal = new List <Parameter>();

            for (int i = Values.Count - 1; i >= 0; i--)
            {
                Variables.Actual actual = Values[i] as Variables.Actual;
                if (actual != null)
                {
                    if (actual.Value is Values.PlaceHolder)
                    {
                        // Insert if no other parameter with the same name is present in the result
                        bool found = false;
                        foreach (Parameter param2 in retVal)
                        {
                            if (param2 == actual.Parameter)
                            {
                                found = true;
                                break;
                            }
                        }

                        if (!found)
                        {
                            retVal.Add(actual.Parameter);
                        }
                    }
                }
            }

            return(retVal);
        }
        /// <summary>
        /// Provides the value of the function
        /// </summary>
        /// <param name="instance">the instance on which the function is evaluated</param>
        /// <param name="actuals">the actual parameters values</param>
        /// <param name="localScope">the values of local variables</param>
        /// <returns>The value for the function application</returns>
        public override Values.IValue Evaluate(Interpreter.InterpretationContext context, Dictionary <Variables.Actual, Values.IValue> actuals)
        {
            Values.IValue retVal = null;

            AssignParameters(context, actuals);
            Graph graph = createGraphForValue(context, context.findOnStack(FunctionA).Value);

            if (graph != null)
            {
                foreach (Graph.Segment segment in graph.Segments)
                {
                    if (segment.Expression.a == 0.0)
                    {
                        double speed = segment.Expression.v0;

                        Function function = context.findOnStack(FunctionB).Value as Function;
                        if (function.FormalParameters.Count > 0)
                        {
                            Parameter        functionParameter = function.FormalParameters[0] as Parameter;
                            Variables.Actual actual            = functionParameter.createActual();
                            actual.Value = new Values.DoubleValue(EFSSystem.DoubleType, speed);
                            Dictionary <Variables.Actual, Values.IValue> values = new Dictionary <Variables.Actual, Values.IValue>();
                            values[actual] = new Values.DoubleValue(EFSSystem.DoubleType, speed);
                            Values.IValue solution    = function.Evaluate(context, values);
                            double        doubleValue = getDoubleValue(solution);

                            if (doubleValue >= segment.Start && doubleValue <= segment.End)
                            {
                                retVal = new Values.DoubleValue(EFSSystem.DoubleType, doubleValue);
                                break;
                            }
                        }
                        else
                        {
                            Log.Error("The FunctionB doesn't have any parameter");
                            break;
                        }
                    }
                    else
                    {
                        Log.Error("The FunctionA is not a step function");
                        break;
                    }
                }
            }
            else
            {
                Log.Error("Cannot create graph for " + FunctionA.ToString());
            }

            if (retVal == null)
            {
                Log.Error("Cannot compute the intersection of " + FunctionA.ToString() + " and " + FunctionB.ToString());
            }

            return(retVal);
        }
Пример #3
0
        /// <summary>
        /// Creates an actual parameter based on this formal parameter and the value assigned to that parameter
        /// </summary>
        /// <returns></returns>
        public Variables.Actual createActual()
        {
            Variables.Actual retVal = new Variables.Actual();
            retVal.Name      = Name;
            retVal.Enclosing = Enclosing;
            retVal.Parameter = this;

            return(retVal);
        }
Пример #4
0
        /// <summary>
        /// Creates the parameter value associationg according to actual parameters
        /// </summary>
        /// <param name="context">The interpretation context</param>
        /// <param name="callable">The callable</param>
        /// <param name="log">Indicates whether errors should be logged</param>
        /// <returns></returns>
        public Dictionary <Variables.Actual, Values.IValue> AssignParameterValues(InterpretationContext context, ICallable callable, bool log)
        {
            // Compute the unnamed actual parameter values
            Dictionary <Variables.Actual, Values.IValue> retVal = new Dictionary <Variables.Actual, Values.IValue>();

            if (callable.FormalParameters.Count == NamedActualParameters.Count + ActualParameters.Count)
            {
                int i = 0;
                foreach (Expression expression in ActualParameters)
                {
                    Parameter     parameter = callable.FormalParameters[i] as Parameter;
                    Values.IValue val       = expression.GetValue(context);
                    if (val != null)
                    {
                        Variables.Actual actual = parameter.createActual();
                        val = val.RightSide(actual, false);
                        retVal.Add(actual, val);
                    }
                    else
                    {
                        AddError("Cannot evaluate value for parameter " + i + " (" + expression.ToString() + ") of function " + callable.Name);
                        return(new Dictionary <Variables.Actual, Values.IValue>());
                    }
                    i = i + 1;
                }

                foreach (KeyValuePair <string, Expression> pair in NamedActualParameters)
                {
                    Parameter     parameter = callable.getFormalParameter(pair.Key);
                    Values.IValue val       = pair.Value.GetValue(context);
                    if (val != null)
                    {
                        Variables.Actual actual = parameter.createActual();
                        val          = val.RightSide(actual, false);
                        actual.Value = val;
                        retVal.Add(actual, val);
                    }
                    else
                    {
                        AddError("Cannot evaluate value for parameter " + pair.Key + " of function " + callable.Name);
                        return(new Dictionary <Variables.Actual, Values.IValue>());
                    }
                }
            }

            return(retVal);
        }
Пример #5
0
        /// <summary>
        /// Creates the graph of the function on which the increment function has been added
        /// </summary>
        /// <param name="context">the context used to evaluate the function</param>
        /// <param name="increment">The increment function do add</param>
        /// <returns></returns>
        public Graph AddIncrement(Interpreter.InterpretationContext context, Functions.Function increment)
        {
            Graph retVal = new Graph();

            if (IsFlat() && increment.FormalParameters.Count == 1)
            {
                Parameter parameter = (Parameter)increment.FormalParameters[0];
                foreach (Segment segment in Segments)
                {
                    Dictionary <Variables.Actual, Values.IValue> actuals = new Dictionary <Variables.Actual, Values.IValue>();
                    Variables.Actual actual = parameter.createActual();
                    actuals[actual] = new Values.DoubleValue(increment.EFSSystem.DoubleType, segment.Expression.v0);
                    Values.IValue result     = increment.Evaluate(context, actuals);
                    Segment       newSegment = new Segment(segment);
                    newSegment.Expression.v0 = segment.Expression.v0 + Function.getDoubleValue(result);
                    retVal.addSegment(newSegment);
                }
            }

            return(retVal);
        }
Пример #6
0
        /// <summary>
        /// Provides the parameters whose value are place holders
        /// </summary>
        /// <param name="function">The function on which the call is performed</param>
        /// <param name="parameterValues">The actual parameter values</param>
        /// <returns></returns>
        private List <Parameter> GetPlaceHolders(Functions.Function function, Dictionary <Variables.Actual, Values.IValue> parameterValues)
        {
            List <Parameter> retVal = new List <Parameter>();

            foreach (KeyValuePair <Variables.Actual, Values.IValue> pair in parameterValues)
            {
                Variables.Actual actual = pair.Key;

                Values.PlaceHolder placeHolder = pair.Value as Values.PlaceHolder;
                if (placeHolder != null && actual.Parameter.Enclosing == function)
                {
                    retVal.Add(actual.Parameter);
                }
            }

            if (retVal.Count != parameterValues.Count || retVal.Count == 0)
            {
                retVal = null;
            }

            return(retVal);
        }
Пример #7
0
        /// <summary>
        /// Creates an actual parameter based on this formal parameter and the value assigned to that parameter
        /// </summary>
        /// <returns></returns>
        public Variables.Actual createActual()
        {
            Variables.Actual retVal = new Variables.Actual();
            retVal.Name = Name;
            retVal.Enclosing = Enclosing;
            retVal.Parameter = this;

            return retVal;
        }