Exemplo n.º 1
0
        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;
                    }
            }
        }
Exemplo n.º 2
0
        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);
        }
Exemplo n.º 3
0
        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;
                    }
            }
        }
Exemplo n.º 4
0
        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);
        }
Exemplo n.º 5
0
        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.");
        }