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; }