public override void Visit(BasicRule visitee)
        {
            PathBasedFieldSelector pathSelector = FindPathSelector(visitee.Selector);

            if (pathSelector == null)
            {
                //TODO: Allow other selectors if they are all equal.
                throw new InvalidOperationException("Self referencing selector requires a path based selector.");
            }

            if (SelectorPath == null)
            {
                SelectorPath = pathSelector.Path;
                Alias        = visitee.Alias;
                return;
            }

            if (SelectorPath != pathSelector.Path)
            {
                throw new InvalidOperationException("Json Rule Tree had multiple different selectors.");
            }

            if (Alias == null)
            {
                //Note: If Alias is null, we allow the next rule to provide one.
                Alias = visitee.Alias;
                return;
            }

            if (Alias != visitee.Alias)
            {
                //Note: If multiple aliases was found, we defer back to the selector.
                Alias = SelectorPath;
            }
        }
Exemple #2
0
        public Tuple <Dictionary <int, Rule>, string[]> ParseInput()
        {
            var lines = Input.Split("\n", StringSplitOptions.TrimEntries);
            var i     = 0;
            var rules = new Dictionary <int, Rule>();

            while (!string.IsNullOrEmpty(lines[i]))
            {
                var a = lines[i].Split(':', StringSplitOptions.TrimEntries);
                int r = int.Parse(a[0]);

                if (a[1].Contains('\"'))
                {
                    rules[r] = BasicRule.Parse(a[1]);
                }
                else if (a[1].Contains('|'))
                {
                    rules[r] = OrRule.Parse(a[1]);
                }
                else
                {
                    rules[r] = MultiRule.Parse(a[1]);
                }

                i++;
            }

            return(Tuple.Create(rules, lines.Skip(i + 1).ToArray()));
        }
Exemple #3
0
    private void AssertRuleDoesNotMatchCondtitional(
        string ruleText,
        int[] sourceSymbols        = null,
        float[][] sourceParameters = null,
        string axiom = null,
        int ruleParamMemoryStartIndex = 0,
        int matchIndex            = 0,
        int paramTempMemorySize   = 0,
        float[] globalParams      = null,
        string[] globalParamNames = null,
        string includedSymbols    = "[]ABCDE"
        )
    {
        var totalIncluded = new HashSet <int>(includedSymbols.Select(x => (int)x));

        globalParamNames  = globalParamNames ?? new string[0];
        using var symbols = new DependencyTracker <SymbolString <float> >(
                  axiom == null ?
                  new SymbolString <float>(sourceSymbols, sourceParameters)
            : SymbolString <float> .FromString(axiom, Allocator.Persistent)
                  );
        var ruleFromString = new BasicRule(
            RuleParser.ParseToRule(ruleText, x => x, globalParameters: globalParamNames),
            '[', ']');

        using var ruleNativeData = new SystemLevelRuleNativeData(new[] { ruleFromString });
        var nativeWriter = new SymbolSeriesMatcherNativeDataWriter();

        ruleFromString.WriteDataIntoMemory(ruleNativeData, nativeWriter);

        globalParams           = globalParams ?? new float[0];
        using var globalNative = new NativeArray <float>(globalParams, Allocator.Persistent);

        using var paramMemory = new NativeArray <float>(paramTempMemorySize, Allocator.Persistent);
        using var branchCache = new SymbolStringBranchingCache('[', ']', new[] { totalIncluded }, ruleNativeData);
        branchCache.BuildJumpIndexesFromSymbols(symbols);
        var random          = new Unity.Mathematics.Random();
        var matchSingleData = new LSystemSingleSymbolMatchData
        {
            isTrivial = false,
            tmpParameterMemorySpace = JaggedIndexing.GetWithNoLength(ruleParamMemoryStartIndex)
        };

        var potentialMatch = ruleFromString.AsBlittable().PreMatchCapturedParametersWithoutConditional(
            branchCache,
            symbols.Data,
            matchIndex,
            paramMemory,
            matchSingleData.tmpParameterMemorySpace.index,
            ref matchSingleData,
            new TmpNativeStack <SymbolStringBranchingCache.BranchEventData>(5),
            globalNative,
            ruleNativeData.dynamicOperatorMemory,
            ref random,
            ruleNativeData.ruleOutcomeMemorySpace
            );

        Assert.IsFalse(potentialMatch);
    }
        public override void Visit(RuleResult result)
        {
            BasicRule rule = result.Rule as BasicRule;

            if (rule != null)
            {
                WriteLine($"{rule.Alias}");
            }
            base.Visit(result);
        }
    public CellAutoWorld()
    {
        WorldRect = new IntRect()
        {
            left = 0, down = 0, top = 100, right = 100
        };
        oddGenerationMap  = new byte[WorldRect.length, WorldRect.height];
        evenGenerationMap = new byte[WorldRect.length, WorldRect.height];

        BasicRule r = new BasicRule();

        rule = r;
        InitRenderer();
        InitArea();
        InitGrid();
        InitMap();
        Debug.Log("World Init");
    }
Exemple #6
0
        public void DisplayOriginalPrice()
        {
            var basicDiscount = new BasicRule(ItemList);

            basicDiscount.TotalPriceCalculation();
        }
Exemple #7
0
    public void BasicRuleRejectsApplicationIfAnyParameters()
    {
        var ruleFromString = new BasicRule(
            RuleParser.ParseToRule("A -> AB", x => x),
            '[', ']');
        var totalIncluded = new HashSet <int>("[]AB".Select(x => (int)x));

        using var ruleNativeData = new SystemLevelRuleNativeData(new[] { ruleFromString });
        var nativeWriter = new SymbolSeriesMatcherNativeDataWriter();

        ruleFromString.WriteDataIntoMemory(ruleNativeData, nativeWriter);

        var symbols = new DependencyTracker <SymbolString <float> >(
            new SymbolString <float>(new int[] { 'A' }, new float[][] { new float[0] })
            );

        try
        {
            var globalParams = new float[0];
            using var globalNative = new NativeArray <float>(globalParams, Allocator.Persistent);
            using var paramMemory  = new NativeArray <float>(0, Allocator.Persistent);
            using var branchCache  = new SymbolStringBranchingCache('[', ']', new[] { totalIncluded }, ruleNativeData);
            branchCache.BuildJumpIndexesFromSymbols(symbols);
            var random          = new Unity.Mathematics.Random();
            var matchSingleData = new LSystemSingleSymbolMatchData
            {
                isTrivial = false,
                tmpParameterMemorySpace = JaggedIndexing.GetWithNoLength(0)
            };

            var preMatchSuccess = ruleFromString.AsBlittable().PreMatchCapturedParametersWithoutConditional(
                branchCache,
                symbols.Data,
                0,
                paramMemory,
                matchSingleData.tmpParameterMemorySpace.index,
                ref matchSingleData,
                new TmpNativeStack <SymbolStringBranchingCache.BranchEventData>(5),
                globalNative,
                ruleNativeData.dynamicOperatorMemory,
                ref random,
                ruleNativeData.ruleOutcomeMemorySpace
                );
            Assert.IsTrue(preMatchSuccess);
            Assert.AreEqual(0, matchSingleData.selectedReplacementPattern);
            Assert.AreEqual(0, matchSingleData.tmpParameterMemorySpace.length);
            Assert.AreEqual(2, matchSingleData.replacementSymbolIndexing.length);
            Assert.AreEqual(0, matchSingleData.replacementParameterIndexing.length);

            var symbolRawData = symbols.Data;
            symbolRawData.parameters[0] = new JaggedIndexing
            {
                index  = 0,
                length = 1
            };

            matchSingleData = new LSystemSingleSymbolMatchData
            {
                isTrivial = false,
                tmpParameterMemorySpace = JaggedIndexing.GetWithNoLength(0)
            };
            preMatchSuccess = ruleFromString.AsBlittable().PreMatchCapturedParametersWithoutConditional(
                branchCache,
                symbols.Data,
                0,
                paramMemory,
                matchSingleData.tmpParameterMemorySpace.index,
                ref matchSingleData,
                new TmpNativeStack <SymbolStringBranchingCache.BranchEventData>(5),
                globalNative,
                ruleNativeData.dynamicOperatorMemory,
                ref random,
                ruleNativeData.ruleOutcomeMemorySpace
                );
            Assert.IsFalse(preMatchSuccess);
        }
        finally
        {
            symbols.Dispose();
        }
    }
Exemple #8
0
 public virtual void Visit(BasicRule visitee) => visitee.Constraint.Accept(this);
 public virtual void Visit(BasicRule visitee) => Visit((Rule)visitee);