Пример #1
0
        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);
        }
Пример #2
0
        private static ControllerGlassOpt GetOptimizationController(FormInputData inputData, SettingsOpt settings)
        {
            var optController = new ControllerGlassOpt(inputData, settings);

            optController.Initialize();
            return(optController);
        }
Пример #3
0
        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)}");
        }
Пример #4
0
 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);
     }
 }
Пример #5
0
        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);
        }
Пример #6
0
        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);
        }
Пример #7
0
        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);
        }
Пример #8
0
        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);
        }
Пример #9
0
        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);
            }
        }
Пример #10
0
        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);
        }
Пример #11
0
 public ControllerGlassOpt(FormInputData input, SettingsOpt settings)
 {
     this.inputData = input;
     this.settings  = settings;
 }
Пример #12
0
        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);
        }
Пример #13
0
        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);
        }
Пример #14
0
 public FitnessGlassUnit(FormInputData input, SettingsOpt settings)
 {
     this.inputData = input;
     this.settings  = settings;
 }