private void Solve(double[] x, out Model model, out LinearAnalyzer childAnalyzer,
                               out Rod2DResults rodResults)
            {
                model = BuildModel(x);


                SkylineSolver solver   = new SkylineSolver.Builder().BuildSolver(model);
                var           provider = new ProblemStructural(model, solver);

                childAnalyzer = new LinearAnalyzer(model, solver, provider);
                var parentAnalyzer = new StaticAnalyzer(model, solver, provider, childAnalyzer);

                CreateLogs(model, childAnalyzer);
                rodResults = new Rod2DResults(model.SubdomainsDictionary[subdomainID], solver.LinearSystems[subdomainID]); // Let's hope this is the one!

                parentAnalyzer.Initialize();
                parentAnalyzer.Solve();
            }
            private double[] EvaluateConstraints(Model model, LinearAnalyzer childAnalyzer,
                                                 Rod2DResults rodResults)
            {
                var constraints = new LinkedList <double>();

                // Displacements
                const double maxDisplacement = 2;
                double       max             = 0;

                foreach (var displacement in ((DOFSLog)childAnalyzer.Logs[1][0]).DOFValues.Values)
                {
                    if (Math.Abs(displacement) > max)
                    {
                        max = Math.Abs(displacement);
                    }
                }
                constraints.AddLast(max / maxDisplacement - 1.0);

                // Stresses
                double[] minStresses = new double[10];
                minStresses = minStresses.Select(i => - 25.0).ToArray();
                double[] maxStresses = new double[10];
                maxStresses = maxStresses.Select(i => 25.0).ToArray();
                double[] stresses = new double[10];

                int counter = 0;

                foreach (var element in model.Elements)
                {
                    stresses[counter++] = rodResults.AxialRod2DStress(element);
                }

                for (int i = 0; i < stresses.Length; ++i)
                {
                    constraints.AddLast(stresses[i] / maxStresses[i] - 1.0);
                    constraints.AddLast(stresses[i] / minStresses[i] - 1.0);
                }

                return(constraints.ToArray());
            }