private void Initialize() { if (!_initialized) { lock (_initializationLock) if (!_initialized) { var swTotal = Stopwatch.StartNew(); var parsedConcepts = _dslParser.ParsedConcepts; var swFirstAdd = Stopwatch.StartNew(); _dslContainer.AddNewConceptsAndReplaceReferences(parsedConcepts); _performanceLogger.Write(swFirstAdd, $"DslModel.Initialize: First AddNewConceptsAndReplaceReferences ({_dslContainer.Concepts.Count()} concepts)."); ExpandMacroConcepts(); _dslContainer.ReportErrorForUnresolvedConcepts(); CheckSemantics(); _dslContainer.SortReferencesBeforeUsingConcept(); LogDslModel(); ReportObsoleteConcepts(); _dslModelFile.SaveConcepts(_dslContainer.Concepts); _performanceLogger.Write(swTotal, $"DslModel.Initialize ({_dslContainer.Concepts.Count()} concepts)."); _initialized = true; } } }
private DslContainer Initialize(DslContainer dslContainer) { var swTotal = Stopwatch.StartNew(); var nodes = _dslParser.GetConcepts(); var swConvert = Stopwatch.StartNew(); var parsedConcepts = ConceptInfoHelper.ConvertNodesToConceptInfos(nodes); _performanceLogger.Write(swConvert, nameof(ConceptInfoHelper.ConvertNodesToConceptInfos)); var alternativeInitializationGeneratedReferences = InitializeAlternativeInitializationConcepts(parsedConcepts); var swFirstAdd = Stopwatch.StartNew(); dslContainer.AddNewConceptsAndReplaceReferences(new[] { CreateInitializationConcept() }); dslContainer.AddNewConceptsAndReplaceReferences(parsedConcepts); dslContainer.AddNewConceptsAndReplaceReferences(alternativeInitializationGeneratedReferences); _performanceLogger.Write(swFirstAdd, $"Initialize: First AddNewConceptsAndReplaceReferences ({dslContainer.Concepts.Count()} concepts)."); ExpandMacroConcepts(dslContainer); CheckSemantics(dslContainer); dslContainer.SortReferencesBeforeUsingConcept(_buildOptions.InitialConceptsSort); ReportObsoleteConcepts(dslContainer); _dslModelFile.SaveConcepts(dslContainer.Concepts); _performanceLogger.Write(swTotal, $"Initialize ({dslContainer.Concepts.Count()} concepts)."); return(dslContainer); }
private void Initialize() { if (!_initialized) { lock (_initializationLock) if (!_initialized) { var sw = Stopwatch.StartNew(); var loadedConcepts = LoadConcepts(); _dslContainer.AddNewConceptsAndReplaceReferences(loadedConcepts); _performanceLogger.Write(sw, "Initialize (" + _dslContainer.Concepts.Count() + " concepts)."); _initialized = true; } } }
private DslContainer Initialize(DslContainer dslContainer) { var swTotal = Stopwatch.StartNew(); var parsedConcepts = _dslParser.ParsedConcepts; var swFirstAdd = Stopwatch.StartNew(); dslContainer.AddNewConceptsAndReplaceReferences(parsedConcepts); _performanceLogger.Write(swFirstAdd, $"Initialize: First AddNewConceptsAndReplaceReferences ({dslContainer.Concepts.Count()} concepts)."); ExpandMacroConcepts(dslContainer); CheckSemantics(dslContainer); dslContainer.SortReferencesBeforeUsingConcept(_buildOptions.InitialConceptsSort); ReportObsoleteConcepts(dslContainer); _dslModelFile.SaveConcepts(dslContainer.Concepts); _performanceLogger.Write(swTotal, $"Initialize ({dslContainer.Concepts.Count()} concepts)."); return(dslContainer); }
private void ExpandMacroConcepts(DslContainer dslContainer) { var swTotal = Stopwatch.StartNew(); var sw = Stopwatch.StartNew(); int iteration = 0; var iterationCreatedConcepts = new List <IConceptInfo>(); int lastNewConceptTime = 0; var lastNewConceptTimeByIteration = new List <int>(); var lastNewConceptTimeByMacro = new Dictionary <string, int>(); var recommendedMacroOrder = _macroOrderRepository.Load().ToDictionary(m => m.EvaluatorName, m => m.EvaluatorOrder); var macroEvaluators = ListMacroEvaluators(recommendedMacroOrder); var macroStopwatches = macroEvaluators.ToDictionary(macro => macro.Name, macro => new Stopwatch()); var createdTypesInIteration = new List <CreatedTypesInIteration>(dslContainer.Concepts.Count() * 5); _performanceLogger.Write(sw, "ExpandMacroConcepts initialization (" + macroEvaluators.Count + " evaluators, " + dslContainer.Concepts.Count() + " parsed concepts resolved, " + dslContainer.UnresolvedConceptsCount() + " unresolved)."); do { iteration++; if (iteration > MacroIterationLimit) { throw new DslSyntaxException(string.Format( "Possible infinite loop detected with recursive macro concept {1}. Iteration limit ({0}) exceeded while expanding macro.", MacroIterationLimit, iterationCreatedConcepts.First().GetShortDescription())); } iterationCreatedConcepts.Clear(); _logger.Trace("Expanding macro concepts, iteration {0}.", iteration); foreach (var macroEvaluator in macroEvaluators) { macroStopwatches[macroEvaluator.Name].Start(); foreach (var conceptInfo in dslContainer.FindByType(macroEvaluator.Implements, macroEvaluator.ImplementsDerivations).ToList()) { var macroCreatedConcepts = macroEvaluator.Evaluate(conceptInfo, dslContainer); CsUtility.Materialize(ref macroCreatedConcepts); if (macroCreatedConcepts != null && macroCreatedConcepts.Any()) { _logger.Trace(() => "Evaluating macro " + macroEvaluator.Name + " on " + conceptInfo.GetShortDescription() + "."); var aiCreatedConcepts = AlternativeInitialization.InitializeNonparsableProperties(macroCreatedConcepts, _logger); var newUniqueConcepts = dslContainer.AddNewConceptsAndReplaceReferences(aiCreatedConcepts); newUniqueConcepts.AddRange(dslContainer.AddNewConceptsAndReplaceReferences(macroCreatedConcepts)); _logger.Trace(() => LogCreatedConcepts(dslContainer, macroCreatedConcepts, newUniqueConcepts)); iterationCreatedConcepts.AddRange(newUniqueConcepts); // Optimization analysis: if (newUniqueConcepts.Count > 0) { lastNewConceptTimeByMacro[macroEvaluator.Name] = ++lastNewConceptTime; } createdTypesInIteration.AddRange(newUniqueConcepts.Select(nuc => new CreatedTypesInIteration { Macro = macroEvaluator.Name, Created = nuc.BaseConceptInfoType().Name, Iteration = iteration })); } } macroStopwatches[macroEvaluator.Name].Stop(); } lastNewConceptTimeByIteration.Add(lastNewConceptTime); _performanceLogger.Write(sw, "ExpandMacroConcepts iteration " + iteration + " (" + iterationCreatedConcepts.Count + " new concepts, " + dslContainer.UnresolvedConceptsCount() + " left unresolved)."); } while (iterationCreatedConcepts.Count > 0); _evaluatorsOrderLogger.Trace(() => swTotal.Elapsed + "\r\n" + ReportLastEvaluationOrder(lastNewConceptTimeByMacro, lastNewConceptTimeByIteration)); foreach (var macroStopwatch in macroStopwatches.OrderByDescending(msw => msw.Value.Elapsed.TotalSeconds).Take(5)) { _performanceLogger.Write(macroStopwatch.Value, () => "ExpandMacroConcepts total time for " + macroStopwatch.Key + "."); } _logger.Trace(() => LogCreatedTypesInIteration(createdTypesInIteration)); dslContainer.ReportErrorForUnresolvedConcepts(); SaveMacroEvaluationOrder(lastNewConceptTimeByMacro); _performanceLogger.Write(swTotal, "ExpandMacroConcepts."); }