public void RunTrainingIteration(INetwork localNetwork, IOptimiser localOptimiser, IRegistry localRegistry, IComputationHandler handler) { if (localNetwork == null) { throw new ArgumentNullException(nameof(localNetwork)); } if (localOptimiser == null) { throw new ArgumentNullException(nameof(localOptimiser)); } if (localRegistry == null) { throw new ArgumentNullException(nameof(localRegistry)); } if (handler == null) { throw new ArgumentNullException(nameof(handler)); } CheckInitialised(); localOptimiser.PrepareRun(localNetwork, handler); localNetwork.Run(handler, trainingPass: true); localOptimiser.Run(localNetwork, handler); ApplyValueModifiers(localRegistry, handler); }
/// <summary> /// Deep copy this object. /// </summary> /// <returns>A deep copy of this object.</returns> public object DeepCopy() { IOptimiser copy = ShallowCopy(); copy.Registry.AddAll((IDictionary <string, object>)copy.Registry.DeepCopy()); return(copy); }
public HillClimber(int NeighbourHoodSize, int gPopSize, int Dim, OptimisationFunctionSet func, IOptimiser optimiser) { NeighbourhoodSize = NeighbourHoodSize; GuessedPopSize = gPopSize; Dimension = Dim; Functions = func; Optimiser = optimiser; }
/// <summary> /// Get a shallow copy of this optimiser with the same parameters (etc. learning / decay rates, filters). /// </summary> /// <returns>A shallow copy of this optimiser.</returns> public IOptimiser ShallowCopy() { IOptimiser copy = ShallowCopyParameters(); ISet <string> filterMasks = Registry.Get <ISet <string> >("filter_masks"); foreach (string filterMask in filterMasks) { copy.AddFilter(filterMask); } return(copy); }
/// <summary> /// Коллбек окончания процеса оптимизации /// </summary> /// <param name="obj">Оптимизатор</param> private void Optimiser_OptimisationProcessFinished(IOptimiser optimiser) { DirectoryInfo cachDir = optimiser.TerminalManager.TerminalChangeableDirectory .GetDirectory("Tester") .GetDirectory("cache", true); workingDirectory.Tester.GetDirectory("cache", true).GetFiles().ToList() .ForEach(x => { string path = Path.Combine(cachDir.FullName, x.Name); if (!File.Exists(path)) { x.MoveTo(path); } }); SaveOptimisations(optimiser); if (LoadingOptimisationTougle) { LoadSavedOptimisation(optimiser.OptimiserWorkingDirectory); } OptimisationStoped(); Optimiser.ClearOptimiser(); }
/// <summary> /// Метод созраняющий оптимизации в локальной директории /// </summary> /// <param name="optimiser">Оптимизатор</param> private void SaveOptimisations(IOptimiser optimiser) { // Проверка на существование имени директории с оптимизациями if (string.IsNullOrEmpty(optimiser.OptimiserWorkingDirectory) || string.IsNullOrWhiteSpace(optimiser.OptimiserWorkingDirectory)) { return; } // Создаем массивы с результатами оптимизации List <OptimisationResult> AllOptimisationResults = new List <OptimisationResult>(); List <OptimisationResult> ForwardOptimisations = new List <OptimisationResult>(); List <OptimisationResult> HistoryOptimisations = new List <OptimisationResult>(); // Получаем список всех файлов с расширением (*.xml) в локальной директории с оптимизациями List <FileInfo> files = Directory.GetFiles(optimiser.OptimiserWorkingDirectory, "*.xml").Select(x => new FileInfo(x)).ToList(); // Вложенная функция заполняющая созданные выше массивы ранее созраненными результатами оптимизации // Работает лишь если мы дополняем существующие, в случае когда мы перезаписываем старые результаты - не вызывается bool FillIn(List <OptimisationResult> results, IEnumerable <DateBorders> currentBorders, string fileName) { // Заполнение массива и получение имени эксперкта, депозита, валюты депозита и плеча results.AddRange(GetItems(files.Find(x => x.Name == fileName), out string expert, out double deposit, out string currency, out int laverage)); // Проверка имени эксперта, депозита, валюты депозита и плеча // на соответствие заданным при старте текущей оптимищации оптимизации if (expert != optimiser.PathToBot || deposit != optimiser.Balance || currency != optimiser.Currency || laverage != optimiser.Laverage) { System.Windows.MessageBox.Show("Can`t append data into files with different optimiser settings (path to bot / balance / currency / laverage)"); return(false); } // Отчищаем из старых массивов те резальтаты что соответствующи датам уже имеющимся в новой оптимизации foreach (var item in currentBorders) { results.RemoveAll(x => x.report.DateBorders == item); } return(true); } // Задаем шаг обновления Прогресс бара double step = 100.0 / 4; // Если существуют все 3 файла с оптимизациями в локальной директории с оптимизаациями // заполняем их через описанную выше локальную функцию if (files.Any(x => x.Name == "Report.xml") && files.Any(x => x.Name == "History.xml") && files.Any(x => x.Name == "Forward.xml")) { PBUpdate("Reading files", step); if (!FillIn(AllOptimisationResults, optimiser.AllOptimisationResults.Select(x => x.report.DateBorders).Distinct(), "Report.xml")) { return; } if (!FillIn(ForwardOptimisations, optimiser.ForwardOptimisations.Select(x => x.report.DateBorders).Distinct(), "Forward.xml")) { return; } if (!FillIn(HistoryOptimisations, optimiser.HistoryOptimisations.Select(x => x.report.DateBorders).Distinct(), "History.xml")) { return; } } else { PBUpdate("Saving files", step); } // Учаляем все (*xml) файлы из локальной директории с файлами оптимизациями files.ForEach(x => x.Delete()); // Копируем в локальные копии результатов оптимизации - все прооптимизированные результаты из оптимизатора AllOptimisationResults.AddRange(optimiser.AllOptimisationResults); HistoryOptimisations.AddRange(optimiser.HistoryOptimisations); ForwardOptimisations.AddRange(optimiser.ForwardOptimisations); // Локальная функция созраняющая результаты оптимизации в файл void WriteFile(List <OptimisationResult> results, string fileName) { results.ReportWriter(optimiser.PathToBot, optimiser.Currency, optimiser.Balance, optimiser.Laverage, Path.Combine(optimiser.OptimiserWorkingDirectory, fileName)); } PBUpdate("Save All optimisations", step * 2); // Проверяем список всех проведенных оптимизаций и созраняем их если таковые были найдены if (AllOptimisationResults.Count > 0) { WriteFile(AllOptimisationResults, "Report.xml"); } else { System.Windows.MessageBox.Show("There are no optimisation data to save"); return; } // Создаем пустую запись оптимизации - нужна для того что бы что то бы созранить что то в файл var emptyItem = new OptimisationResult { report = new ReportManager.ReportItem { BotParams = new Dictionary <string, string>(), DateBorders = new DateBorders(DTExtention.UnixEpoch, DTExtention.UnixEpoch.AddDays(1)), OptimisationCoefficients = new Coefficients { TradingDays = new Dictionary <DayOfWeek, DailyData> { { DayOfWeek.Monday, new DailyData() }, { DayOfWeek.Tuesday, new DailyData() }, { DayOfWeek.Wednesday, new DailyData() }, { DayOfWeek.Thursday, new DailyData() }, { DayOfWeek.Friday, new DailyData() } } } } }; // Созраняем пустую строку оптимизации если не было не одной оптимизации if (HistoryOptimisations.Count == 0) { HistoryOptimisations.Add(emptyItem); } if (ForwardOptimisations.Count == 0) { ForwardOptimisations.Add(emptyItem); } // Созраняем в файл рещультаты тестов форвардных и исторических PBUpdate("Save History tests", step * 3); WriteFile(HistoryOptimisations, "History.xml"); PBUpdate("Save Forward tests", step * 4); WriteFile(ForwardOptimisations, "Forward.xml"); }