//#region License Information
///* HeuristicLab
// * Copyright (C) 2002-2008 Heuristic and Evolutionary Algorithms Laboratory (HEAL)
// *
// * This file is part of HeuristicLab.
// *
// * HeuristicLab is free software: you can redistribute it and/or modify
// * it under the terms of the GNU General Public License as published by
// * the Free Software Foundation, either version 3 of the License, or
// * (at your option) any later version.
// *
// * HeuristicLab is distributed in the hope that it will be useful,
// * but WITHOUT ANY WARRANTY; without even the implied warranty of
// * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// * GNU General Public License for more details.
// *
// * You should have received a copy of the GNU General Public License
// * along with HeuristicLab. If not, see .
// */
//#endregion
//using System;
//using System.Collections.Generic;
//using System.Text;
//using System.Linq;
//using HeuristicLab.Core;
//using HeuristicLab.Data;
//using HeuristicLab.Permutation;
//using HeuristicLab.Evolutionary;
//using HeuristicLab.Operators;
//using HeuristicLab.Routing.TSP;
//using HeuristicLab.Logging;
//using System.Diagnostics;
//using HeuristicLab.Selection;
//using System.Threading;
//namespace HeuristicLab.FixedOperators {
// class FixedSGAMain : FixedOperatorBase {
// public override string Description {
// get { return @"Implements the functionality of SGAMain with fixed control structures. Operators like selection, crossover, mutation and evaluation are delegated."; }
// }
// // Shared
// Sorter sorter;
// // CreateChildren
// Counter counter;
// IRandom random;
// DoubleData probability;
// ChildrenInitializer ci;
// OperatorBase crossover;
// OperatorBase mutator;
// OperatorBase evaluator;
// SubScopesRemover sr;
// StochasticBranch sb;
// // CreateReplacement
// LeftSelector ls;
// RightReducer rr;
// RightSelector rs;
// LeftReducer lr;
// MergingReducer mr;
// //long[] timesExecuteCreateChildren;
// public FixedSGAMain()
// : base() {
// AddVariableInfo(new VariableInfo("Selector", "Selection strategy for SGA", typeof(OperatorBase), VariableKind.In));
// AddVariableInfo(new VariableInfo("MaximumGenerations", "Maximum number of generations to create", typeof(IntData), VariableKind.In));
// AddVariableInfo(new VariableInfo("Generations", "Number of processed generations", typeof(IntData), VariableKind.In | VariableKind.Out));
// Name = "FixedSGAMain";
// sorter = new Sorter();
// sorter.GetVariableInfo("Descending").ActualName = "Maximization";
// sorter.GetVariableInfo("Value").ActualName = "Quality";
// InitVariablesForCreateChildren();
// InitVariablesForCreateReplacement();
// }
// private void InitVariablesForCreateReplacement() {
// ls = new LeftSelector();
// rr = new RightReducer();
// rs = new RightSelector();
// lr = new LeftReducer();
// mr = new MergingReducer();
// ls.GetVariableInfo("Selected").ActualName = "Elites";
// rs.GetVariableInfo("Selected").ActualName = "Elites";
// }
// protected void InitVariablesForCreateChildren() {
// // variables for create children
// ci = new ChildrenInitializer();
// // variables infos
// AddVariableInfo(new VariableInfo("Random", "Pseudo random number generator", typeof(IRandom), VariableKind.In));
// AddVariableInfo(new VariableInfo("MutationRate", "Probability to choose first branch", typeof(DoubleData), VariableKind.In));
// AddVariableInfo(new VariableInfo("Crossover", "Crossover strategy for SGA", typeof(OperatorBase), VariableKind.In));
// AddVariableInfo(new VariableInfo("Mutator", "Mutation strategy for SGA", typeof(OperatorBase), VariableKind.In));
// AddVariableInfo(new VariableInfo("Evaluator", "Evaluation strategy for SGA", typeof(OperatorBase), VariableKind.In));
// sr = new SubScopesRemover();
// sr.GetVariableInfo("SubScopeIndex").Local = true;
// counter = new Counter();
// counter.GetVariableInfo("Value").ActualName = "EvaluatedSolutions";
// }
// public override IOperation Apply(IScope scope) {
// base.Apply(scope);
// WorkerMethod(scope);
// if (Canceled) {
// return new AtomicOperation(this, scope);
// }
// return null;
// } // Apply
// //private void WorkerMethod(object o) {
// private void WorkerMethod(IScope scope) {
// try {
// //IScope scope = o as IScope;
// Stopwatch swApply = new Stopwatch();
// swApply.Start();
// for (int i = 0; i < SubOperators.Count; i++) {
// if (scope.GetVariable(SubOperators[i].Name) != null)
// scope.RemoveVariable(SubOperators[i].Name);
// scope.AddVariable(new Variable(SubOperators[i].Name, SubOperators[i]));
// }
// OperatorBase selector = (OperatorBase)GetVariableValue("Selector", scope, true);
// QualityLogger ql = new QualityLogger();
// BestAverageWorstQualityCalculator bawqc = new BestAverageWorstQualityCalculator();
// DataCollector dc = new DataCollector();
// ItemList names = dc.GetVariable("VariableNames").GetValue>();
// names.Add(new StringData("BestQuality"));
// names.Add(new StringData("AverageQuality"));
// names.Add(new StringData("WorstQuality"));
// LinechartInjector lci = new LinechartInjector();
// lci.GetVariableInfo("Linechart").ActualName = "Quality Linechart";
// lci.GetVariable("NumberOfLines").GetValue().Data = 3;
// LessThanComparator ltc = new LessThanComparator();
// ltc.GetVariableInfo("LeftSide").ActualName = "Generations";
// ltc.GetVariableInfo("RightSide").ActualName = "MaximumGenerations";
// ltc.GetVariableInfo("Result").ActualName = "GenerationsCondition";
// IntData maxGenerations = GetVariableValue("MaximumGenerations", scope, true);
// IntData nrOfGenerations = GetVariableValue("Generations", scope, true);
// nrOfGenerations.Data = 0;
// // fetch variables from scope for create children
// InitializeExecuteCreateChildren(scope);
// try {
// //for (int i = nrOfGenerations.Data; i < maxGenerations.Data; i++) {
// // Execute(selector, scope, false);
// // ExecuteCreateChildrenWithFixedControlStructures(scope.SubScopes[1]);
// // ExecuteCreateReplacementWithFixedConstrolStructures(scope);
// // ql.Execute(scope);
// // bawqc.Execute(scope);
// // dc.Execute(scope);
// // lci.Execute(scope);
// // nrOfGenerations.Data++;
// //} // for i
// if (!InExecution) {
// for (int i = 0; i < maxGenerations.Data; i++) {
// VirtualScope sd = new VirtualScope(scope);
// Execute(selector, sd);
// ExecuteCreateChildrenWithFixedControlStructures(new VirtualScope(scope, 1));
// ExecuteCreateReplacementWithFixedConstrolStructures(sd);
// Execute(ql, sd);
// Execute(bawqc, sd);
// Execute(dc, sd);
// Execute(lci, sd);
// nrOfGenerations.Data++;
// } // for i
// } // if
// Execute();
// } // try
// catch (CancelException) {
// Console.WriteLine("Micro engine aborted by cancel flag.");
// } // catch
// //for (int i = nrOfGenerations.Data; i < maxGenerations.Data && !Canceled; i++) {
// // if (Canceled) {
// // executionPointer.Data = -1;
// // continue;
// // }
// // if (executionPointer.Data < 0)
// // Execute(selector, scope);
// // if (Canceled) {
// // executionPointer.Data = 0;
// // continue;
// // }
// // if (executionPointer.Data < 1)
// // ExecuteCreateChildrenWithFixedControlStructures(scope.SubScopes[1]);
// // if (Canceled) {
// // executionPointer.Data = 1;
// // continue;
// // }
// // if (executionPointer.Data < 2)
// // ExecuteCreateReplacementWithFixedConstrolStructures(scope);
// // if (Canceled) {
// // executionPointer.Data = 2;
// // continue;
// // }
// // if (executionPointer.Data < 3) {
// // ql.Execute(scope);
// // bawqc.Execute(scope);
// // dc.Execute(scope);
// // lci.Execute(scope);
// // nrOfGenerations.Data++;
// // }
// // executionPointer.Data = -1;
// //} // for i
// //Stopwatch watch = new Stopwatch();
// //long[] times = new long[10];
// //timesExecuteCreateChildren = new long[10];
// //for (int i = nrOfGenerations.Data; i < maxGenerations.Data && !Canceled; i++) {
// // watch.Start();
// // selector.Execute(scope);
// // watch.Stop();
// // times[0] += watch.ElapsedTicks;
// // watch.Reset();
// // watch.Start();
// // ExecuteCreateChildrenWithFixedControlStructures(scope.SubScopes[1]);
// // watch.Stop();
// // times[1] += watch.ElapsedTicks;
// // watch.Reset();
// // watch.Start();
// // ExecuteCreateReplacementWithFixedConstrolStructures(scope);
// // watch.Stop();
// // times[2] += watch.ElapsedTicks;
// // watch.Reset();
// // watch.Start();
// // ql.Execute(scope);
// // watch.Stop();
// // times[3] += watch.ElapsedTicks;
// // watch.Reset();
// // watch.Start();
// // bawqc.Execute(scope);
// // watch.Stop();
// // times[4] += watch.ElapsedTicks;
// // watch.Reset();
// // watch.Start();
// // dc.Execute(scope);
// // watch.Stop();
// // times[5] += watch.ElapsedTicks;
// // watch.Reset();
// // watch.Start();
// // lci.Execute(scope);
// // watch.Stop();
// // times[6] += watch.ElapsedTicks;
// // watch.Reset();
// // watch.Start();
// // nrOfGenerations.Data++;
// //}
// swApply.Stop();
// Console.WriteLine("SGAMain.Apply(): {0}", swApply.Elapsed);
// //if (Canceled) {
// // return new AtomicOperation(this, scope);
// //}
// //return null;
// }
// catch (ThreadAbortException) {
// throw;
// }
// } // Apply
// ///
// /// Initializes some variables needed before the execution of create children
// ///
// ///
// private void InitializeExecuteCreateChildren(IScope scope) {
// crossover = (OperatorBase)GetVariableValue("Crossover", scope, true);
// mutator = (OperatorBase)GetVariableValue("Mutator", scope, true);
// evaluator = GetVariableValue("Evaluator", scope, true);
// random = GetVariableValue("Random", scope, true);
// probability = GetVariableValue("MutationRate", scope, true);
// ci = new ChildrenInitializer();
// sb = new StochasticBranch();
// sb.GetVariableInfo("Probability").ActualName = "MutationRate";
// sb.AddSubOperator(mutator);
// }
// ///
// ///
// ///
// ///
// protected void ExecuteCreateChildrenWithFixedControlStructures(VirtualScope scope) {
// //protected void ExecuteCreateChildrenWithFixedControlStructures(IScope scope) {
// //// ChildrenInitializer
// //ci.Apply(scope);
// //// UniformSequentialSubScopesProcessor
// //foreach (IScope s in scope.SubScopes) {
// // Execute(crossover, s, false);
// // // Stochastic Branch
// // if (random.NextDouble() < probability.Data)
// // Execute(mutator, s, false);
// // Execute(evaluator, s, false);
// // sr.Execute(s);
// // counter.Execute(s);
// //} // foreach
// //sorter.Execute(scope);
// //VirtualScope s;
// // ChildrenInitializer
// Execute(ci, scope);
// // UniformSequentialSubScopesProcessor
// //foreach (IScope s in scope.SubScopes) {
// // s = new VirtualScope(scope, i); //scope.SubScopes[i];
// // Execute(crossover, s);
// // // Stochastic Branch
// // //if (random.NextDouble() < probability.Data)
// // // Execute(mutator, s);
// // Execute(evaluator, s);
// // Execute(sr, s);
// // Execute(counter, s);
// //} // foreach
// SubScopesProcessor fl = new SubScopesProcessor(scope);
// fl.AddOperator(crossover);
// fl.AddOperator(sb);
// fl.AddOperator(evaluator);
// fl.AddOperator(sr);
// fl.AddOperator(counter);
// Execute(fl, scope);
// Execute(sorter, scope);
// } // ExecuteCreateChildrenHWCS
// private void ExecuteCreateReplacementWithFixedConstrolStructures(VirtualScope scope) {
// //private void ExecuteCreateReplacementWithFixedConstrolStructures(IScope scope) {
// //// SequentialSubScopesProcessor
// //ls.Execute(scope.SubScopes[0]);
// //rr.Execute(scope.SubScopes[0]);
// //rs.Execute(scope.SubScopes[1]);
// //lr.Execute(scope.SubScopes[1]);
// //mr.Execute(scope);
// //sorter.Execute(scope);
// //Execute(ls, scope.SubScopes[0], false);
// //Execute(rr, scope.SubScopes[0], false);
// //Execute(rs, scope.SubScopes[1], false);
// //Execute(lr, scope.SubScopes[1], false);
// //Execute(mr, scope, false);
// //Execute(sorter, scope, false);
// VirtualScope sd = new VirtualScope(scope, 0);
// Execute(ls, sd);
// Execute(rr, sd);
// sd = new VirtualScope(scope, 1);
// Execute(rs, sd);
// Execute(lr, sd);
// Execute(mr, scope);
// Execute(sorter, scope);
// } // ExecuteCreateReplacementWithFixedConstrolStructures
// //public override void Abort() {
// // base.Abort();
// // executionThread.Abort();
// //} // Abort
// } // class FixedSGAMain
//} // namespace HeuristicLab.FixedOperators