public void EvaluatesBasicExpressionWithConstantAndParameter()
    {
        using var inputParams  = new NativeArray <float>(new float[] { 2f }, Allocator.Persistent);
        using var operatorData = new NativeArray <OperatorDefinition>(new OperatorDefinition[]
        {
            new OperatorDefinition
            {
                operatorType = OperatorType.MULTIPLY,
                rhs          = 1,
                lhs          = 2
            },
            new OperatorDefinition
            {
                operatorType = OperatorType.CONSTANT_VALUE,
                nodeValue    = 1.5f
            },
            new OperatorDefinition
            {
                operatorType   = OperatorType.PARAMETER_VALUE,
                parameterIndex = 0
            },
        }, Allocator.Persistent);

        var expression = new StructExpression
        {
            operationDataSlice = new JaggedIndexing
            {
                index  = 0,
                length = 3
            }
        };

        var result = expression.EvaluateExpression(
            inputParams,
            new JaggedIndexing
        {
            index  = 0,
            length = 1
        },
            operatorData);

        Assert.AreEqual(3f, result);
    }
        public float DynamicInvoke(params float[] input)
        {
            using var inputParams = new NativeArray <float>(input, Allocator.Temp);
            using var opDefs      = new NativeArray <OperatorDefinition>(definitionList.ToArray(), Allocator.Temp);

            var structExp = new StructExpression
            {
                operationDataSlice = new JaggedIndexing
                {
                    index  = 0,
                    length = (ushort)opDefs.Length
                }
            };

            return(structExp.EvaluateExpression(
                       inputParams,
                       new JaggedIndexing
            {
                index = 0,
                length = (ushort)inputParams.Length
            },
                       opDefs));
        }
Example #3
0
            public bool PreMatchCapturedParametersWithoutConditional(
                SymbolStringBranchingCache branchingCache,
                SymbolString <float> source,
                int indexInSymbols,
                NativeArray <float> parameterMemory,
                int startIndexInParameterMemory,
                ref LSystemSingleSymbolMatchData matchSingletonData,
                TmpNativeStack <SymbolStringBranchingCache.BranchEventData> helperStack,
                NativeArray <float> globalParams,
                NativeArray <OperatorDefinition> globalOperatorData,
                ref Unity.Mathematics.Random random,
                NativeArray <RuleOutcome.Blittable> outcomes)
            {
                var target = targetSymbolWithParameters;

                // parameters
                byte matchedParameterNum = 0;

                // context match
                if (contextPrefix.IsValid && contextPrefix.graphNodeMemSpace.length > 0)
                {
                    var backwardsMatchMatches = branchingCache.MatchesBackwards(
                        branchingCache.includeSymbols[ruleGroupIndex],
                        indexInSymbols,
                        contextPrefix,
                        source,
                        startIndexInParameterMemory + matchedParameterNum,
                        parameterMemory,
                        out var copiedParameters
                        );
                    if (!backwardsMatchMatches)
                    {
                        return(false);
                    }
                    matchedParameterNum += copiedParameters;
                }

                var coreParametersIndexing = source.parameters[indexInSymbols];

                if (coreParametersIndexing.length != target.parameterLength)
                {
                    return(false);
                }
                if (coreParametersIndexing.length > 0)
                {
                    for (int i = 0; i < coreParametersIndexing.length; i++)
                    {
                        var paramValue = source.parameters[coreParametersIndexing, i];

                        parameterMemory[startIndexInParameterMemory + matchedParameterNum] = paramValue;
                        matchedParameterNum++;
                    }
                }

                if (contextSuffix.IsCreated && contextSuffix.graphNodeMemSpace.length > 0)
                {
                    var forwardMatch = branchingCache.MatchesForward(
                        branchingCache.includeSymbols[ruleGroupIndex],
                        indexInSymbols,
                        contextSuffix,
                        source,
                        startIndexInParameterMemory + matchedParameterNum,
                        parameterMemory,
                        out var copiedParameters,
                        helperStack);
                    if (!forwardMatch)
                    {
                        return(false);
                    }
                    matchedParameterNum += copiedParameters;
                }

                matchSingletonData.tmpParameterMemorySpace = new JaggedIndexing
                {
                    index  = startIndexInParameterMemory,
                    length = matchedParameterNum
                };
                if (conditional.IsValid)
                {
                    var conditionalMatch = conditional.EvaluateExpression(
                        globalParams,
                        new JaggedIndexing {
                        index = 0, length = (ushort)globalParams.Length
                    },
                        parameterMemory,
                        matchSingletonData.tmpParameterMemorySpace,
                        globalOperatorData) > 0;
                    if (!conditionalMatch)
                    {
                        return(false);
                    }
                }

                matchSingletonData.selectedReplacementPattern = SelectOutcomeIndex(ref random, outcomes, possibleOutcomeIndexing);
                var outcomeObject = outcomes[matchSingletonData.selectedReplacementPattern + possibleOutcomeIndexing.index];


                matchSingletonData.replacementSymbolIndexing    = JaggedIndexing.GetWithOnlyLength(outcomeObject.replacementSymbolSize);
                matchSingletonData.replacementParameterIndexing = JaggedIndexing.GetWithOnlyLength(outcomeObject.replacementParameterCount);


                return(true);
            }