Example #1
0
        public LSystemStepper(
            IEnumerable <BasicRule> rules,
            SystemLevelRuleNativeData nativeRuleData,
            CustomRuleSymbols customSymbols,
            int expectedGlobalParameters = 0,
            ISet <int>[] includedContextualCharactersByRuleIndex = null)
        {
            GlobalParameters = expectedGlobalParameters;

            this.customSymbols = customSymbols;

            includedCharacters = includedContextualCharactersByRuleIndex == null ? new HashSet <int> [0] : includedContextualCharactersByRuleIndex;

            rulesByTargetSymbol = new Dictionary <int, IList <BasicRule> >();
            foreach (var rule in rules)
            {
                var targetSymbols = rule.TargetSymbol;
                if (!rulesByTargetSymbol.TryGetValue(targetSymbols, out var ruleList))
                {
                    rulesByTargetSymbol[targetSymbols] = ruleList = new List <BasicRule>();
                }
                ruleList.Add(rule);
            }

            var maxMemoryRequirementsPerSymbol = new NativeHashMap <int, MaxMatchMemoryRequirements>(rulesByTargetSymbol.Keys.Count(), Allocator.Persistent);

            foreach (var symbol in rulesByTargetSymbol.Keys.ToList())
            {
                rulesByTargetSymbol[symbol] = rulesByTargetSymbol[symbol]
                                              .OrderByDescending(x =>
                                                                 (x.ContextPrefix.IsValid ? x.ContextPrefix.graphNodeMemSpace.length : 0) +
                                                                 (x.ContextSuffix.IsCreated ? x.ContextSuffix.graphNodeMemSpace.length : 0))
                                              .ToList();

                var maxParamCapturedByAnyRule = rulesByTargetSymbol[symbol]
                                                .Select(x => x.CapturedLocalParameterCount)
                                                .DefaultIfEmpty().Max();
                // Greedy estimate for maximum possible parameter match.
                //  there need to be enough space for any rule's parameters to fit, since we don't know which ones will match.
                var maximumPossibleParameterMatch = maxParamCapturedByAnyRule;
                if (maximumPossibleParameterMatch > ushort.MaxValue)
                {
                    throw new LSystemRuntimeException($"Rules with more than {ushort.MaxValue} captured local parameters over all conditional options");
                }
                maxMemoryRequirementsPerSymbol[symbol] = new MaxMatchMemoryRequirements
                {
                    maxParameters = maximumPossibleParameterMatch
                };
            }

            nativeRuleData.blittableRulesByTargetSymbol = NativeOrderedMultiDictionary <BasicRule.Blittable> .WithMapFunction(
                rulesByTargetSymbol,
                rule => rule.AsBlittable(),
                Allocator.Persistent);

            nativeRuleData.maxParameterMemoryRequirementsPerSymbol = maxMemoryRequirementsPerSymbol;
            this.nativeRuleData = new DependencyTracker <SystemLevelRuleNativeData>(nativeRuleData);
        }
        public SystemLevelRuleNativeData(RuleDataRequirements memReqs)
        {
            prefixMatcherSymbols           = new NativeArray <InputSymbol.Blittable>(memReqs.prefixNodes, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);
            suffixMatcherGraphNodeData     = new NativeArray <SymbolMatcherGraphNode>(memReqs.suffixGraphNodes, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);
            suffixMatcherChildrenDataArray = new NativeArray <int>(memReqs.suffixChildren, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);
            ruleOutcomeMemorySpace         = new NativeArray <RuleOutcome.Blittable>(memReqs.ruleOutcomes, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);

            replacementsSymbolMemorySpace = new NativeArray <ReplacementSymbolGenerator.Blittable>(memReqs.replacementSymbolsMemory, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);
            structExpressionMemorySpace   = new NativeArray <StructExpression>(memReqs.structExpressionMemory, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);
            dynamicOperatorMemory         = new NativeArray <OperatorDefinition>(memReqs.operatorMemory, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);

            blittableRulesByTargetSymbol            = default;
            maxParameterMemoryRequirementsPerSymbol = default;
            immaturityMarkerSymbols = default;
        }
        public SystemLevelRuleNativeData(IEnumerable <BasicRule> rulesToWrite)
        {
            var allData = rulesToWrite.ToArray();
            var memReqs = allData.Aggregate(new RuleDataRequirements(), (agg, curr) => agg + curr.RequiredMemorySpace);

            prefixMatcherSymbols           = new NativeArray <InputSymbol.Blittable>(memReqs.prefixNodes, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);
            suffixMatcherGraphNodeData     = new NativeArray <SymbolMatcherGraphNode>(memReqs.suffixGraphNodes, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);
            suffixMatcherChildrenDataArray = new NativeArray <int>(memReqs.suffixChildren, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);
            ruleOutcomeMemorySpace         = new NativeArray <RuleOutcome.Blittable>(memReqs.ruleOutcomes, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);

            replacementsSymbolMemorySpace = new NativeArray <ReplacementSymbolGenerator.Blittable>(memReqs.replacementSymbolsMemory, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);
            structExpressionMemorySpace   = new NativeArray <StructExpression>(memReqs.structExpressionMemory, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);
            dynamicOperatorMemory         = new NativeArray <OperatorDefinition>(memReqs.operatorMemory, Allocator.Persistent, NativeArrayOptions.UninitializedMemory);

            blittableRulesByTargetSymbol            = default;
            maxParameterMemoryRequirementsPerSymbol = default;
            immaturityMarkerSymbols = default;
        }