Exemplo n.º 1
0
 public override void Run(ModelLoaderInterface loader)
 {
     parallelMode = ParallelMode.RealTime;
     Factory.SysLog.RegisterRealTime("RealTime", GetDefaultLogConfig());                       // This creates the config if not exists.
     Factory.SysLog.RegisterHistorical("Historical", HistoricalStarter.GetDefaultLogConfig()); // This creates the config if not exists.
     Factory.SysLog.ReconfigureForRealTime();
     base.Run(loader);
 }
Exemplo n.º 2
0
        public override void Run(ModelLoaderInterface loader)
        {
            Factory.Parallel.SetMode(parallelMode);
            Factory.SysLog.RegisterHistorical("Optimize", HistoricalStarter.GetDefaultLogConfig());
            try {
                if (loader.OptimizeOutput == null)
                {
                    Directory.CreateDirectory(Path.GetDirectoryName(FileName));
                    File.Delete(FileName);
                }
            } catch (Exception ex) {
                log.Error("Error while creating directory and deleting '" + FileName + "'.", ex);
                return;
            }
            this.loader           = loader;
            this.loader.QuietMode = true;
            startMillis           = Factory.TickCount;
            engineIterations      = new List <TickEngine>();

            loader.OnInitialize(ProjectProperties);

            totalTasks = 0;

            foreach (var num in RecursiveOptimize(0))
            {
                totalTasks++;
            }

            tasksRemaining = totalTasks;

            int tasksPerEngine   = CalculateTasksPerEngine(totalTasks);
            int totalEngineCount = totalTasks / tasksPerEngine;
            int iterations       = Math.Max(1, totalTasks / maxParallelPasses);
            int leftOverPasses   = Math.Max(0, totalTasks - (maxParallelPasses * iterations));

            if (totalTasks % maxParallelPasses > 0)
            {
                log.Notice("Planning " + iterations + " iterations with " + maxParallelPasses + " passes plus 1 pass with " + leftOverPasses + " iterations.");
                totalEngineCount++;
            }
            else
            {
                log.Notice("Planning " + iterations + " iterations with " + maxParallelPasses + " passes each.");
            }

            var engines = new Stack <TickEngine>();

            for (int i = 0; i < totalEngineCount; i++)
            {
                engines.Push(SetupEngine(true, "Iteration" + (i + 1)));
            }

            ModelInterface topModel = new Portfolio();

            passCount = 0;
            foreach (var num in RecursiveOptimize(0))
            {
                ModelInterface model = ProcessLoader(loader, passCount);
                topModel.Chain.Dependencies.Add(model.Chain);
                passCount++;
                if (passCount % tasksPerEngine == 0)
                {
                    var engine = engines.Pop();
                    engine.Model = topModel;
                    engine.QueueTask();
                    engineIterations.Add(engine);
                    topModel = new Portfolio();
                    if (engineIterations.Count >= Environment.ProcessorCount)
                    {
                        ProcessIteration();
                    }
                }
            }

            if (topModel.Chain.Dependencies.Count > 0)
            {
                var engine = ProcessHistorical(topModel, true, "Iteration" + (engineIterations.Count + 1));
                engine.QueueTask();
                engineIterations.Add(engine);
            }

            if (engineIterations.Count > 0)
            {
                ProcessIteration();
            }

            long elapsedMillis = Factory.TickCount - startMillis;

            log.Notice("Finished optimizing in " + elapsedMillis + "ms.");
        }