public static async Task <FormResultsData> FullPredictionProcess(FormInputData inputFormData) { var validationErrors = InputDataValidation.MachineLearningSpecificValidation(inputFormData); if (validationErrors.Any()) { InputDataValidation.ThrowValidationErrors(validationErrors); return(null); } var glassUnitList = GlassUnit.CreateGlassUnitsWithAllInterlayerStiffness(inputFormData).ToList(); var loadCombinations = inputFormData.LoadCombinations; var loadSettings = new LoadSettings(inputFormData); var externalLoads = LoadGenerationExternal.GenerateExternalLoadsAllUnits(loadSettings, glassUnitList, new ObjectsStore(), true); var climateLoads = LoadGenerationClimate.GenerateClimaticLoadsAllUnits(loadSettings, glassUnitList); glassUnitList .Where(x => x.IsUnitWithCavity) .ForEach(x => x.SetDeflectedVolumeEmpiricCalculation(externalLoads)); var transferredLoads = LoadTransferThroughCavity.GenerateTransferredLoads(glassUnitList); var allLoads = externalLoads.Merge(climateLoads).Merge(transferredLoads); var machineLearningObjects = CreateAllPredictionObjects(glassUnitList, loadCombinations, allLoads); var resultsFormData = await GetPredictionsAndResultsOutput(inputFormData, machineLearningObjects, glassUnitList); return(resultsFormData); }
private static ControllerGlassOpt GetOptimizationController(FormInputData inputData, SettingsOpt settings) { var optController = new ControllerGlassOpt(inputData, settings); optController.Initialize(); return(optController); }
private static void OutputGenerationResults(OptimizeWindowViewModel viewModel, GeneticAlgorithm ga, FormInputData inputData) { var bestChromosome = (ChromosomeGlass)ga.Population.BestChromosome; var bestThickness = GetBestThicknessMm(bestChromosome); FitnessGlassUnit.UpdateInputDataFromChromosome(bestChromosome, inputData); LogLine(viewModel, $"Generation: {ga.Population.GenerationsNumber} | Total thickness: {bestThickness}"); LogLine(viewModel, $"Time: {ga.TimeEvolving:mm\\:ss\\.f} | Buildup: {FormInputData.GetBuildupDescriptionString(inputData)}"); }
private static FormInputData RunOptimization(FormInputData inputData, OptimizeWindowViewModel viewModel, GeneticAlgorithm ga) { try { LogLine(viewModel, "Optimization Started!"); ga.Start(); LogLine(viewModel, "Optimization stopped!"); FitnessGlassUnit.UpdateInputDataFromChromosome((ChromosomeGlass)ga.BestChromosome, inputData); return(inputData); } catch (Exception ex) { LogLine(viewModel, $"Error: {ex.Message}"); return(inputData); } }
private bool IsInputDataInAllowedRange(FormInputData inputDataFromChromosome) { var isCavitiesAcceptable = IsTotalCavitySizeWithinBounds(inputDataFromChromosome); var isExternalPaneStifferThanInternal = IsExternalPaneStifferThanInternal(inputDataFromChromosome); if (this.settings.IsExternalPlaneStifferThanInternal && !isExternalPaneStifferThanInternal) { return(false); } if (!isCavitiesAcceptable) { return(false); } return(true); }
private static async Task <FormResultsData> GetPredictionsAndResultsOutput(FormInputData inputFormData, List <PredictionInput> machineLearningObjects, List <GlassUnit> glassUnitList) { var deflectionPredictionInput = machineLearningObjects.Where(x => x.LimitStateForChecks == LimitState.SLS); var stressPredictionInput = machineLearningObjects.Where(x => x.LimitStateForChecks == LimitState.ULS); var deflectionResultTask = PredictionInput.GetDeflectionPredictions(deflectionPredictionInput.ToList()); var stressResultTask = PredictionInput.GetStressPredictions(stressPredictionInput.ToList()); var taskList = new List <Task>() { deflectionResultTask, stressResultTask }; await Task.WhenAll(taskList); var results = new Results(inputFormData, glassUnitList, CalculationType.MachineLearning); var resultsFormData = results.GetOutputOfResults(deflectionResultTask.Result, stressResultTask.Result); return(resultsFormData); }
private static double CalculateTotalGlassThickness(FormInputData inputData) { double totalThickness = 0; if (inputData.ExternalIsMonolithic) { totalThickness += inputData.ExternalLayer1Thickness; } else { totalThickness += inputData.ExternalLayer1Thickness; totalThickness += inputData.ExternalLayer2Thickness; } if (inputData.UnitType != GlassUnitType.Single && inputData.UnitType != GlassUnitType.Balustrade) { if (inputData.InternalIsMonolithic) { totalThickness += inputData.InternalLayer1Thickness; } else { totalThickness += inputData.InternalLayer1Thickness; totalThickness += inputData.InternalLayer2Thickness; } } if (inputData.UnitType == GlassUnitType.Triple) { if (inputData.MiddleIsMonolithic) { totalThickness += inputData.MiddleLayer1Thickness; } else { totalThickness += inputData.MiddleLayer1Thickness; totalThickness += inputData.MiddleLayer2Thickness; } } return(totalThickness); }
public static FormInputData Run(FormInputData inputData, SettingsOpt settings, OptimizeWindowViewModel viewModel, CancellationToken token) { var optController = GetOptimizationController(inputData, settings); var geneticAlgorithm = SetGeneticAlgorithmSettings(settings, optController); geneticAlgorithm.GenerationRan += delegate { OutputGenerationResults(viewModel, geneticAlgorithm, inputData); if (token.IsCancellationRequested) { geneticAlgorithm.Stop(); LogLine(viewModel, "Optimization stopped by user!"); } }; var optimizedInputData = RunOptimization(inputData, viewModel, geneticAlgorithm); return(optimizedInputData); }
private bool IsExternalPaneStifferThanInternal(FormInputData inputDataFromChromosome) { var externalThickness = inputDataFromChromosome.ExternalIsMonolithic ? inputDataFromChromosome.ExternalLayer1Thickness : inputDataFromChromosome.ExternalLayer1Thickness + inputDataFromChromosome.ExternalLayer2Thickness; var internalThickness = inputDataFromChromosome.InternalIsMonolithic ? inputDataFromChromosome.InternalLayer1Thickness : inputDataFromChromosome.InternalLayer1Thickness + inputDataFromChromosome.InternalLayer2Thickness; if (externalThickness > internalThickness || (externalThickness == internalThickness && ( inputDataFromChromosome.ExternalIsMonolithic && !inputDataFromChromosome.InternalIsMonolithic))) { return(true); } else { return(false); } }
private bool IsTotalCavitySizeWithinBounds(FormInputData inputDataFromChromosome) { var cavity1 = inputDataFromChromosome.Cavity1Thickness; var cavity2 = inputDataFromChromosome.Cavity2Thickness; if (inputDataFromChromosome.UnitType == Enums.GlassUnitType.Triple) { if (cavity1 + cavity2 > this.settings.MaxCavityThickness || cavity1 + cavity2 < this.settings.MinCavityThickness) { return(false); } } else { if (cavity1 > this.settings.MaxCavityThickness || cavity1 < this.settings.MinCavityThickness) { return(false); } } return(true); }
public ControllerGlassOpt(FormInputData input, SettingsOpt settings) { this.inputData = input; this.settings = settings; }
private static double pointLoadSize = 0.1; // [m] public static List <FormInputValidationMessage> MachineLearningSpecificValidation(FormInputData inputData) { var validationEntries = new List <FormInputValidationEntry>() { new FormInputValidationEntry(nameof(FormInputData.Width), ComparisonType.Lesser, minUnitWidth, ErrorLevel.Red, $"Glass unit width is smaller than {minUnitWidth}m."), new FormInputValidationEntry(nameof(FormInputData.Height), ComparisonType.Lesser, minUnitHeight, ErrorLevel.Red, $"Glass unit height is smaller than {minUnitHeight}m."), new FormInputValidationEntry(nameof(FormInputData.Width), ComparisonType.Greater, maxUnitWidth, ErrorLevel.Red, $"Manufacturer \"Stiklu centrs\" produces maximum unit width {maxUnitWidth}m."), new FormInputValidationEntry(nameof(FormInputData.Height), ComparisonType.Greater, maxUnitHeight, ErrorLevel.Red, $"Manufacturer \"Stiklu centrs\" produces maximum unit height {maxUnitHeight}m."), new FormInputValidationEntry(nameof(FormInputData.ExternalLayer1Thickness), ComparisonType.Lesser, minSingleLayerThickness, ErrorLevel.Red, $"One of External pane layers has thickness smaller than {minSingleLayerThickness * Conversion.MtoMm}mm"), new FormInputValidationEntry(nameof(FormInputData.ExternalLayer2Thickness), ComparisonType.Lesser, minSingleLayerThickness, ErrorLevel.Red, $"One of External pane layers has thickness smaller than {minSingleLayerThickness * Conversion.MtoMm}mm"), new FormInputValidationEntry(nameof(FormInputData.ExternalLayer1Thickness), ComparisonType.Greater, maxSingleLayerThickness, ErrorLevel.Red, $"One of External pane layers has thickness larger than {maxSingleLayerThickness * Conversion.MtoMm}mm"), new FormInputValidationEntry(nameof(FormInputData.ExternalLayer2Thickness), ComparisonType.Greater, maxSingleLayerThickness, ErrorLevel.Red, $"One of External pane layers has thickness larger than {maxSingleLayerThickness * Conversion.MtoMm}mm"), new FormInputValidationEntry(nameof(FormInputData.InternalLayer1Thickness), ComparisonType.Lesser, minSingleLayerThickness, ErrorLevel.Red, $"One of Internal pane layers has thickness smaller than {minSingleLayerThickness * Conversion.MtoMm}mm"), new FormInputValidationEntry(nameof(FormInputData.InternalLayer2Thickness), ComparisonType.Lesser, minSingleLayerThickness, ErrorLevel.Red, $"One of Internal pane layers has thickness smaller than {minSingleLayerThickness * Conversion.MtoMm}mm"), new FormInputValidationEntry(nameof(FormInputData.InternalLayer1Thickness), ComparisonType.Greater, maxSingleLayerThickness, ErrorLevel.Red, $"One of Internal pane layers has thickness larger than {maxSingleLayerThickness * Conversion.MtoMm}mm"), new FormInputValidationEntry(nameof(FormInputData.InternalLayer2Thickness), ComparisonType.Greater, maxSingleLayerThickness, ErrorLevel.Red, $"One of Internal pane layers has thickness larger than {maxSingleLayerThickness * Conversion.MtoMm}mm"), new FormInputValidationEntry(nameof(FormInputData.MiddleLayer1Thickness), ComparisonType.Lesser, minSingleLayerThickness, ErrorLevel.Red, $"One of Middle pane layers has thickness smaller than {minSingleLayerThickness * Conversion.MtoMm}mm"), new FormInputValidationEntry(nameof(FormInputData.MiddleLayer2Thickness), ComparisonType.Lesser, minSingleLayerThickness, ErrorLevel.Red, $"One of Middle pane layers has thickness smaller than {minSingleLayerThickness * Conversion.MtoMm}mm"), new FormInputValidationEntry(nameof(FormInputData.MiddleLayer1Thickness), ComparisonType.Greater, maxSingleLayerThickness, ErrorLevel.Red, $"One of Middle pane layers has thickness larger than {maxSingleLayerThickness * Conversion.MtoMm}mm"), new FormInputValidationEntry(nameof(FormInputData.MiddleLayer2Thickness), ComparisonType.Greater, maxSingleLayerThickness, ErrorLevel.Red, $"One of Middle pane layers has thickness larger than {maxSingleLayerThickness * Conversion.MtoMm}mm"), new FormInputValidationEntry(nameof(FormInputData.LineLoadMagnitude), ComparisonType.Greater, maxLineLoadMagnitude, ErrorLevel.Red, $"Line load is larger than {maxLineLoadMagnitude * Conversion.NtoKn}kN/m"), new FormInputValidationEntry(nameof(FormInputData.PointLoadMagnitude), ComparisonType.Greater, maxPointLoadMagnitude, ErrorLevel.Red, $"Point load magnitude is larger than {maxPointLoadMagnitude * Conversion.NtoKn}kN"), }; var validationMessages = validationEntries.Where(x => x.IsEntryInvalid(inputData)) .Select(x => x.GetMessage()).ToList(); if (inputData.UnitType == GlassUnitType.Balustrade) { var msg = "Machine learning can't be used for calculation of balustrades."; validationMessages.Add(new FormInputValidationMessage(msg, ErrorLevel.Red)); } if (Math.Abs(inputData.PointLoadSize - pointLoadSize) > GlobalConstants.FloatingPointTolerance && inputData.PointLoadSize != 0) { var msg = $"Machine learning only processes point load with size {pointLoadSize}m "; validationMessages.Add(new FormInputValidationMessage(msg, ErrorLevel.Red)); } if (Math.Abs(inputData.PointLoadHeight - (inputData.Height / 2)) > GlobalConstants.FloatingPointTolerance && inputData.PointLoadHeight != 0) { var msg = "Point load must be located in the centre of unit for machine learning predictions!"; validationMessages.Add(new FormInputValidationMessage(msg, ErrorLevel.Red)); } return(validationMessages); }
public static FormInputData UpdateInputDataFromChromosome(ChromosomeGlass chromosome, FormInputData inputData) { var updatedInput = inputData; var genes = chromosome.GetGenes(); updatedInput.ExternalLayer1Thickness = ((GlassThickness)genes[ConstantsOpt.ExtThk1GeneNo].Value).GetThicknessInMeters(); updatedInput.ExternalLayer2Thickness = ((GlassThickness)genes[ConstantsOpt.ExtThk2GeneNo].Value).GetThicknessInMeters(); updatedInput.MiddleLayer1Thickness = ((GlassThickness)genes[ConstantsOpt.MiddleThk1GeneNo].Value).GetThicknessInMeters(); updatedInput.MiddleLayer2Thickness = ((GlassThickness)genes[ConstantsOpt.MiddleThk2GeneNo].Value).GetThicknessInMeters(); updatedInput.InternalLayer1Thickness = ((GlassThickness)genes[ConstantsOpt.IntThk1GeneNo].Value).GetThicknessInMeters(); updatedInput.InternalLayer2Thickness = ((GlassThickness)genes[ConstantsOpt.IntThk2GeneNo].Value).GetThicknessInMeters(); updatedInput.ExternalIsMonolithic = ((GlassPaneType)genes[ConstantsOpt.ExtMonolithGeneNo].Value) == GlassPaneType.Monolithic; updatedInput.InternalIsMonolithic = ((GlassPaneType)genes[ConstantsOpt.IntMonolithGeneNo].Value) == GlassPaneType.Monolithic; updatedInput.MiddleIsMonolithic = ((GlassPaneType)genes[ConstantsOpt.MiddleMonolithGeneNo].Value) == GlassPaneType.Monolithic; updatedInput.Cavity1Thickness = ((CavityThickness)genes[ConstantsOpt.Cavity1GeneNo].Value).GetCavityInMeters(); updatedInput.Cavity2Thickness = ((CavityThickness)genes[ConstantsOpt.Cavity2GeneNo].Value).GetCavityInMeters(); return(updatedInput); }
public FitnessGlassUnit(FormInputData input, SettingsOpt settings) { this.inputData = input; this.settings = settings; }