public async Task <IActionResult> PerformPreGenerationChecks([FromBody] ScheduleCreatorDto scheduleCreator) { if (!ModelState.IsValid) { return(BadRequest()); } string assemblyPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase) .Substring(6) + Path.DirectorySeparatorChar + scheduleCreator.AssemblyDirName; if (!scheduleCreator.Date.HasValue) { return(BadRequest()); } ISpeciesOriginator speciesOriginator = DynamicFactory.GetSpeciesOriginator(assemblyPath, scheduleCreator.Date.Value, scheduleCreator.Args); List <Requirement> requirements = DynamicFactory.GetRequirements(assemblyPath, scheduleCreator.Date.Value, scheduleCreator.Args); await speciesOriginator.SetDataFromCustomApi(); var messenger = speciesOriginator.PerformPreGenerationChecks(); return(Ok(messenger.Messages)); }
public async Task <IActionResult> GetSchedule([FromBody] ScheduleCreatorDto scheduleCreator) { if (!ModelState.IsValid) { return(BadRequest()); } /*//string assemblyPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().GetName().CodeBase) * .Substring(6) + Path.DirectorySeparatorChar + scheduleCreator.AssemblyDirName;*/ string assemblyPath = Path.Combine(_environment.ContentRootPath, scheduleCreator.AssemblyDirName); if (!scheduleCreator.Date.HasValue) { return(BadRequest()); } ISpeciesOriginator speciesOriginator = DynamicFactory.GetSpeciesOriginator(assemblyPath, scheduleCreator.Date.Value, scheduleCreator.Args); List <Requirement> requirements = DynamicFactory.GetRequirements(assemblyPath, scheduleCreator.Date.Value, scheduleCreator.Args); await speciesOriginator.SetDataFromCustomApi(); foreach (var requirement in requirements) { await requirement.SetDataFromRemoteApi(); } Population population = new Population(new CostCalculator(requirements), speciesOriginator); population.Initialize(); population.CalculateGeneralCost(); do { population.PerformNaturalSelection(); population.CalculateGeneralCost(); } while (population.NumberOfGenerations < 100); IAllel[,] solution = population.BestSolution.Dna; Dictionary <DateTime, object> data = speciesOriginator.CustomFormatSolution(solution, scheduleCreator.Date.Value); Dictionary <string, object> dataToReturn = Converter.ConvertDateTimeToString(data); return(Ok(dataToReturn)); }
public static ISpeciesOriginator GetSpeciesOriginator(string assemblyPath, DateTime date, List <Object> arguments) { AppDomain.CurrentDomain.AssemblyResolve += (sender, args) => LoadAssemblyFromFile(sender, args, assemblyPath); if (!Directory.Exists(assemblyPath)) { throw new InvalidOperationException($"Could not find the assembly path {assemblyPath}"); } IEnumerable <string> assemblyFiles = Directory.EnumerateFiles(assemblyPath, "*.dll", SearchOption.TopDirectoryOnly); string assemblyFile = assemblyFiles.First(); Assembly assembly = Assembly.LoadFrom(assemblyFile); ISpeciesOriginator speciesOriginator = null; foreach (var type in assembly.ExportedTypes) { if (type.IsClass && typeof(ISpeciesOriginator).IsAssignableFrom(type)) { arguments.Add(date); Object[] args = arguments.ToArray(); // parametry w konstruktorach muszą mieć taką samą kolejność jak w talicy Object[] args; speciesOriginator = Activator.CreateInstance(type, args) as ISpeciesOriginator; arguments.Remove(date); break; } } return(speciesOriginator); }
public Population(CostCalculator costCalculator, ISpeciesOriginator speciesOriginatorOriginator) { this._costCalculator = costCalculator; this._speciesOriginator = speciesOriginatorOriginator; _costCalculator.BestSolutionFound += OnBestSolutionFound; }