コード例 #1
0
        public static void WriteSolutionIntoFile(FullSolution solution, string filename)
        {
            var text = "Optimal value: " + solution.SolutionWithoutChange.FunctionValue + V + V;

            text += "A: " + solution.A + V;
            text += "B: " + solution.B + V;
            text += "L: " + solution.L + V;
            text += "Alphas: " + solution.SolutionWithoutChange.Alpha + V;

            if (solution.SolutionWithoutChange.Alpha != solution.SolutionWithoutChange.AlphaChanged)
            {
                text += "Alphas: " + solution.SolutionWithoutChange.AlphaChanged + V;
            }
            text += "\nOptimal X:\n";
            text += solution.SolutionWithoutChange.OptimalX + V + V;

            for (var i = 0; i < solution.SolutionWithoutChange.Cs.Length; i++)
            {
                text += $"Matrix C[{i + 1}]:\n";
                text += solution.SolutionWithoutChange.Cs[i] + V;
                text += $"Solution for matrix C[{i + 1}]:\n";
                text += solution.SolutionWithoutChange.Xs[i] + V;
                text += "F = " + solution.SolutionWithoutChange.FsForX[i] + V;
                text += "F (with optimal Xs) = " + solution.SolutionWithoutChange.FsForXs[i] + V;
                text += "Delta = " + solution.SolutionWithoutChange.Deltas[i] + V;
                text += "Y = " + solution.SolutionWithoutChange.Ys[i] + V;
                text += "Distance = " + solution.SolutionWithoutChange.Distances[i] + V + V + V;
            }

            text += $"After changes ({solution.PersentOfChange}%) " +
                    $"Optimal Value:\t{solution.SolutionWithChange.FunctionValue}" + V + V;
            if (solution.SolutionWithoutChange.AlphaChanged != solution.SolutionWithChange.AlphaChanged)
            {
                text += "Alpha changed: " + solution.SolutionWithChange.AlphaChanged + V + V;
            }
            text += "Optimal X changed:\n";
            text += solution.SolutionWithChange.OptimalX + V + V;

            for (var i = 0; i < solution.SolutionWithChange.Cs.Length; i++)
            {
                text += $"Matrix C[{i + 1}] after changes:\n";
                text += solution.SolutionWithChange.Cs[i] + V;
                text += $"Solution for matrix C[{i + 1}] after changes:\n";
                text += solution.SolutionWithChange.Xs[i] + V;
                text += "F = " + solution.SolutionWithChange.FsForX[i] + V;
                text += "F (with optimal Xs) = " + solution.SolutionWithChange.FsForXs[i] + V;
                text += "Delta = " + solution.SolutionWithChange.Deltas[i] + V;
                text += "Y = " + solution.SolutionWithChange.Ys[i] + V;
                text += "Distance = " + solution.SolutionWithChange.Distances[i] + V + V + V;
            }

            File.WriteAllText(filename, text);
        }
コード例 #2
0
        public static FullSolution SolveEquation(Polynomial f, Polynomial g, Polynomial c)
        {
            FullSolution solution = new FullSolution();

            //f=0; g=0; c=0 | c!=0
            if (f.IsNull() && g.IsNull())
            {
                if (c.IsNull())
                {
                    solution.zeroSolution        = new Solution(new Polynomial(), new Polynomial());
                    solution.solutionStep        = new Solution(null, null);
                    solution.areCoefsIndependent = true;
                }
                else
                {
                    solution.isDefined = false;
                }
                return(solution);
            }

            if (c.IsNull() && f.IsNull() != g.IsNull())
            {
                solution.zeroSolution = new Solution(new Polynomial(), new Polynomial());
                if (f.IsNull() && !g.IsNull())
                {
                    solution.solutionStep = new Solution(null, new Polynomial());
                }
                else if (!f.IsNull() && g.IsNull())
                {
                    solution.solutionStep = new Solution(new Polynomial(), null);
                }
                return(solution);
            }
            else if (f.IsNull() != g.IsNull())
            {
                if (f.IsNull())
                {
                    DividionResult divres = c / g;
                    if (!divres.Reminder.IsNull())
                    {
                        solution.isDefined = false;
                        return(solution);
                    }

                    solution.solutionStep = new Solution(null, new Polynomial {
                        0
                    });
                    solution.zeroSolution = new Solution(new Polynomial {
                        0
                    }, divres.Quotient);
                }
                else
                {
                    DividionResult divres = c / f;
                    if (!divres.Reminder.IsNull())
                    {
                        solution.isDefined = false;
                        return(solution);
                    }
                    solution.solutionStep = new Solution(new Polynomial {
                        0
                    }, null);
                    solution.zeroSolution = new Solution(divres.Quotient, new Polynomial {
                        0
                    });
                }

                return(solution);
            }

            Polynomial     gcd      = new Polynomial();
            GCDResult      expCoefs = GCD(f, g, out gcd);
            DividionResult tempX0   = (expCoefs.Coef1 * c / gcd);
            DividionResult tempY0   = (expCoefs.Coef2 * c / gcd);

            // К этому моменту f и g  не нулевые (ветвление для c)
            if (c.IsNull())
            {
                solution.zeroSolution = new Solution(new Polynomial(), new Polynomial());
                solution.solutionStep = new Solution((g / gcd).Quotient, -(f / gcd).Quotient);
            }
            else
            {
                if (tempX0.Reminder.IsNull() && tempY0.Reminder.IsNull())
                {
                    solution.zeroSolution = new Solution(tempX0.Quotient, tempY0.Quotient);
                    solution.solutionStep = new Solution((g / gcd).Quotient, -(f / gcd).Quotient);
                }
                else
                {
                    return(new FullSolution()
                    {
                        isDefined = false
                    });
                }
            }

            return(solution);
        }
        public SolutionWindow(FullSolution solution, Problem data)
        {
            _data         = data;
            _fullSolution = solution;
            InitializeComponent();
            SaveInputButton.Margin = new Thickness(Width - 100, 77, 0, 0);

            OptimalValueBlock.Text   = solution.SolutionWithoutChange.FunctionValue;
            OptimalValueBlock.Margin = new Thickness(13 + ValueLabel.Content.ToString().Length * 9, 13, 0, 0);
            AlphaBlock.Text          = solution.SolutionWithoutChange.Alpha;
            if (solution.SolutionWithoutChange.Alpha != solution.SolutionWithoutChange.AlphaChanged)
            {
                AlphaBlockChanged.Text = solution.SolutionWithoutChange.AlphaChanged;
            }
            else
            {
                AlphaBlockChangedLable.Content = "";
            }
            ABlock.Text      = solution.A;
            BBlock.Text      = solution.B;
            LBlock.Text      = solution.L;
            OutputBlock.Text = solution.SolutionWithoutChange.OptimalX;
            OutputBlock.VerticalAlignment   = VerticalAlignment.Top;
            OutputBlock.HorizontalAlignment = HorizontalAlignment.Left;

            SaveInputButton.Margin   = new Thickness(23, 77, 0, 0);
            SaveInputButton.Width    = 200;
            SaveResult.Margin        = new Thickness(23, 135, 0, 0);
            SaveResult.Width         = 200;
            AccuracyLabel.Margin     = new Thickness(23, 199, 0, 0);
            AccuracyComboBox.Margin  = new Thickness(275, 204, 0, 0);
            FindPercentButton.Margin = new Thickness(275, 241, 0, 0);

            var startHeight = 80;

            OptimalXsLabel.Margin = new Thickness(23, FindPercentButton.Margin.Top + 40, 0, 0);
            OutputBlock.Margin    = new Thickness(23, FindPercentButton.Margin.Top + startHeight, 0, 0);

            //OutputBlock.Width = 65 * solution.SolutionWithoutChange.N;
            //OutputBlock.Height = 35 * solution.SolutionWithoutChange.N;

            MatrixesCLabel.VerticalAlignment   = VerticalAlignment.Top;
            MatrixesCLabel.HorizontalAlignment = HorizontalAlignment.Left;
            var labelsHeight = FindPercentButton.Margin.Top + startHeight + 24 * solution.SolutionWithoutChange.N + 20;

            MatrixesCLabel.Margin = new Thickness(23, labelsHeight, 0, 0);

            var XsLabel = new Label
            {
                HorizontalAlignment = HorizontalAlignment.Left,
                VerticalAlignment   = VerticalAlignment.Top,
                Margin = new Thickness(50 + 65 * solution.SolutionWithoutChange.N,
                                       labelsHeight, 0, 0),
                Content = Properties.Resources.SolutionsXLabel
            };


            CoolGrid.Children.Add(XsLabel);


            for (var i = 0; i < solution.SolutionWithoutChange.Cs.Length; i++)
            {
                var newTxtBlock = new TextBlock
                {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment   = VerticalAlignment.Top,
                    Height = 24 * solution.SolutionWithoutChange.N,
                    Width  = 65 * solution.SolutionWithoutChange.N,
                    Text   = solution.SolutionWithoutChange.Cs[i],
                    Margin = new Thickness(23, labelsHeight + 50 +
                                           (i * 24 * (solution.SolutionWithoutChange.N)), 0, 0)
                };
                var newXBlock = new TextBlock
                {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment   = VerticalAlignment.Top,
                    Height = 24 * solution.SolutionWithoutChange.N,
                    Width  = 65 * solution.SolutionWithoutChange.N,
                    Text   = solution.SolutionWithoutChange.Xs[i],
                    Margin = new Thickness(50 + 65 * solution.SolutionWithoutChange.N,
                                           labelsHeight + 50 +
                                           (i * 24 * (solution.SolutionWithoutChange.N)), 0, 0)
                };
                var FsForXLabel = new Label
                {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment   = VerticalAlignment.Top,
                    Margin = new Thickness(75 + 2 * 65 * solution.SolutionWithoutChange.N,
                                           labelsHeight + 50 +
                                           (i * 24 * (solution.SolutionWithoutChange.N)), 0, 0),
                    Content = "F:"
                };
                var FsForXValues = new TextBlock
                {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment   = VerticalAlignment.Top,
                    Margin = new Thickness(150 + 2 * 65 * solution.SolutionWithoutChange.N,
                                           labelsHeight + 50 +
                                           (i * 24 * (solution.SolutionWithoutChange.N)), 0, 0),
                    Text = solution.SolutionWithoutChange.FsForX[i]
                };
                var FsForXsLabel = new Label
                {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment   = VerticalAlignment.Top,
                    Margin = new Thickness(75 + 2 * 65 * solution.SolutionWithoutChange.N,
                                           labelsHeight + 67 +
                                           (i * 24 * (solution.SolutionWithoutChange.N)), 0, 0),
                    Content = "F':"
                };
                var FsForXsValues = new TextBlock
                {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment   = VerticalAlignment.Top,
                    Margin = new Thickness(150 + 2 * 65 * solution.SolutionWithoutChange.N,
                                           labelsHeight + 70 +
                                           (i * 24 * (solution.SolutionWithoutChange.N)), 0, 0),
                    Text = solution.SolutionWithoutChange.FsForXs[i]
                };
                var DeltasLabel = new Label
                {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment   = VerticalAlignment.Top,
                    Margin = new Thickness(75 + 2 * 65 * solution.SolutionWithoutChange.N,
                                           labelsHeight + 85 +
                                           (i * 24 * (solution.SolutionWithoutChange.N)), 0, 0),
                    Content = "Δ:"
                };
                var DeltasValues = new TextBlock
                {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment   = VerticalAlignment.Top,
                    Margin = new Thickness(150 + 2 * 65 * solution.SolutionWithoutChange.N,
                                           labelsHeight + 90 +
                                           (i * 24 * (solution.SolutionWithoutChange.N)), 0, 0),
                    Text = solution.SolutionWithoutChange.Deltas[i]
                };
                var YsLabel = new Label
                {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment   = VerticalAlignment.Top,
                    Margin = new Thickness(75 + 2 * 65 * solution.SolutionWithoutChange.N,
                                           labelsHeight + 105 +
                                           (i * 24 * (solution.SolutionWithoutChange.N)), 0, 0),
                    Content = "Y:"
                };
                var YsValues = new TextBlock
                {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment   = VerticalAlignment.Top,
                    Margin = new Thickness(150 + 2 * 65 * solution.SolutionWithoutChange.N,
                                           labelsHeight + 110 +
                                           (i * 24 * (solution.SolutionWithoutChange.N)), 0, 0),
                    Text = solution.SolutionWithoutChange.Ys[i]
                };
                var DistancesLabel = new Label
                {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment   = VerticalAlignment.Top,
                    Margin = new Thickness(75 + 2 * 65 * solution.SolutionWithoutChange.N,
                                           labelsHeight + 125 +
                                           (i * 24 * (solution.SolutionWithoutChange.N)), 0, 0),
                    Content = Properties.Resources.DistanceLabel
                };
                var DistancesValues = new TextBlock
                {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment   = VerticalAlignment.Top,
                    Margin = new Thickness(150 + 2 * 65 * solution.SolutionWithoutChange.N,
                                           labelsHeight + 130 +
                                           (i * 24 * (solution.SolutionWithoutChange.N)), 0, 0),
                    Text = solution.SolutionWithoutChange.Distances[i]
                };
                labelsHeight += 40;
                CoolGrid.Children.Add(newTxtBlock);
                CoolGrid.Children.Add(newXBlock);
                CoolGrid.Children.Add(FsForXLabel);
                CoolGrid.Children.Add(FsForXValues);
                CoolGrid.Children.Add(FsForXsLabel);
                CoolGrid.Children.Add(FsForXsValues);
                CoolGrid.Children.Add(DeltasLabel);
                CoolGrid.Children.Add(DeltasValues);
                CoolGrid.Children.Add(YsLabel);
                CoolGrid.Children.Add(YsValues);
                CoolGrid.Children.Add(DistancesLabel);
                CoolGrid.Children.Add(DistancesValues);
            }

            var height = labelsHeight + 60 +
                         (solution.SolutionWithoutChange.Cs.Length *
                          24 * (solution.SolutionWithoutChange.N));

            var ChangesLabel = new Label
            {
                HorizontalAlignment = HorizontalAlignment.Left,
                VerticalAlignment   = VerticalAlignment.Top,
                Margin = new Thickness(23, height
                                       , 0, 0),
                Content = $"{Properties.Resources.AfterChanges} ({solution.PersentOfChange}%) {Properties.Resources.OptimalValueLabel}\t{solution.SolutionWithChange.FunctionValue}"
            };

            CoolGrid.Children.Add(ChangesLabel);


            var optimalXLabel = new Label()
            {
                HorizontalAlignment = HorizontalAlignment.Left,
                VerticalAlignment   = VerticalAlignment.Top,
                Height  = 24 * solution.SolutionWithChange.N,
                Width   = 65 * solution.SolutionWithChange.N,
                Content = Properties.Resources.OptimalXLabel,
                Margin  = new Thickness(23, height + 45, 0, 0)
            };

            CoolGrid.Children.Add(optimalXLabel);
            var alphaChangedLabel = new Label
            {
                HorizontalAlignment = HorizontalAlignment.Left,
                VerticalAlignment   = VerticalAlignment.Top,
                Height  = 24 * solution.SolutionWithChange.N,
                Width   = 65 * solution.SolutionWithChange.N,
                Content = Properties.Resources.AlphaChangedLabel,
                Margin  = new Thickness(50 + 65 * solution.SolutionWithChange.N,
                                        height + 45, 0, 0)
            };

            CoolGrid.Children.Add(alphaChangedLabel);
            var changedOtimalX = new TextBlock()
            {
                HorizontalAlignment = HorizontalAlignment.Left,
                VerticalAlignment   = VerticalAlignment.Top,
                Height = 24 * solution.SolutionWithChange.N,
                Width  = 65 * solution.SolutionWithChange.N,
                Text   = solution.SolutionWithChange.OptimalX,
                Margin = new Thickness(23, height + 90, 0, 0)
            };

            CoolGrid.Children.Add(changedOtimalX);


            var alphaChanged = new TextBlock()
            {
                HorizontalAlignment = HorizontalAlignment.Left,
                VerticalAlignment   = VerticalAlignment.Top,
                Height = 24 * solution.SolutionWithChange.N,
                Width  = 65 * solution.SolutionWithChange.N,
                Text   = solution.SolutionWithChange.AlphaChanged,
                Margin = new Thickness(200 + 65 * solution.SolutionWithChange.N,
                                       height + 50, 0, 0)
            };

            if (solution.SolutionWithoutChange.AlphaChanged == solution.SolutionWithChange.AlphaChanged)
            {
                alphaChanged.Text         = "";
                alphaChangedLabel.Content = "";
            }
            CoolGrid.Children.Add(alphaChanged);
            height += 50;
            var CsMatrixesChanged = new Label
            {
                HorizontalAlignment = HorizontalAlignment.Left,
                VerticalAlignment   = VerticalAlignment.Top,
                Margin = new Thickness(23,
                                       height + 50 + 24 * solution.SolutionWithChange.N, 0, 0),
                Content = Properties.Resources.MatrixesCLabel
            };

            CoolGrid.Children.Add(CsMatrixesChanged);
            var XsChangedLabel = new Label
            {
                HorizontalAlignment = HorizontalAlignment.Left,
                VerticalAlignment   = VerticalAlignment.Top,
                Margin = new Thickness(50 + 65 * solution.SolutionWithoutChange.N,
                                       height + 50 + 24 * solution.SolutionWithChange.N, 0, 0),
                Content = Properties.Resources.OptimalXLabel
            };

            CoolGrid.Children.Add(XsChangedLabel);

            for (var i = 0; i < solution.SolutionWithChange.Cs.Length; i++)
            {
                var newTxtBlock = new TextBlock
                {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment   = VerticalAlignment.Top,
                    Height = 24 * solution.SolutionWithChange.N,
                    Width  = 65 * solution.SolutionWithChange.N,
                    Text   = solution.SolutionWithChange.Cs[i],
                    Margin = new Thickness(23, height + 100 + 24 * solution.SolutionWithChange.N +
                                           (i * 24 * (solution.SolutionWithChange.N)), 0, 0)
                };
                var newXBlock = new TextBlock
                {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment   = VerticalAlignment.Top,
                    Height = 24 * solution.SolutionWithChange.N,
                    Width  = 65 * solution.SolutionWithChange.N,
                    Text   = solution.SolutionWithChange.Xs[i],
                    Margin = new Thickness(50 + 65 * solution.SolutionWithChange.N,
                                           height + 100 + 24 * solution.SolutionWithChange.N +
                                           (i * 24 * (solution.SolutionWithChange.N)), 0, 0)
                };


                var FsForXLabel = new Label
                {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment   = VerticalAlignment.Top,
                    Margin = new Thickness(75 + 2 * 65 * solution.SolutionWithChange.N,
                                           height + 95 + 24 * solution.SolutionWithChange.N +
                                           (i * 24 * (solution.SolutionWithChange.N)), 0, 0),
                    Content = "F:"
                };
                var FsForXValues = new TextBlock
                {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment   = VerticalAlignment.Top,
                    Margin = new Thickness(150 + 2 * 65 * solution.SolutionWithChange.N,
                                           height + 100 + 24 * solution.SolutionWithChange.N +
                                           (i * 24 * (solution.SolutionWithChange.N)), 0, 0),
                    Text = solution.SolutionWithChange.FsForX[i]
                };

                var FsForXsLabel = new Label
                {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment   = VerticalAlignment.Top,
                    Margin = new Thickness(75 + 2 * 65 * solution.SolutionWithChange.N,
                                           height + 115 + 24 * solution.SolutionWithChange.N +
                                           (i * 24 * (solution.SolutionWithChange.N)), 0, 0),
                    Content = "F':"
                };
                var FsForXsValues = new TextBlock
                {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment   = VerticalAlignment.Top,
                    Margin = new Thickness(150 + 2 * 65 * solution.SolutionWithChange.N,
                                           height + 120 + 24 * solution.SolutionWithChange.N +
                                           (i * 24 * (solution.SolutionWithChange.N)), 0, 0),
                    Text = solution.SolutionWithChange.FsForXs[i]
                };
                var DeltasLabel = new Label
                {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment   = VerticalAlignment.Top,
                    Margin = new Thickness(75 + 2 * 65 * solution.SolutionWithChange.N,
                                           height + 135 + 24 * solution.SolutionWithChange.N +
                                           (i * 24 * (solution.SolutionWithChange.N)), 0, 0),
                    Content = "Δ:"
                };
                var DeltasValues = new TextBlock
                {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment   = VerticalAlignment.Top,
                    Margin = new Thickness(150 + 2 * 65 * solution.SolutionWithChange.N,
                                           height + 140 + 24 * solution.SolutionWithChange.N +
                                           (i * 24 * (solution.SolutionWithChange.N)), 0, 0),
                    Text = solution.SolutionWithChange.Deltas[i]
                };
                var YsLabel = new Label
                {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment   = VerticalAlignment.Top,
                    Margin = new Thickness(75 + 2 * 65 * solution.SolutionWithChange.N,
                                           height + 155 + 24 * solution.SolutionWithChange.N +
                                           (i * 24 * (solution.SolutionWithChange.N)), 0, 0),
                    Content = "Y:"
                };
                var YsValues = new TextBlock
                {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment   = VerticalAlignment.Top,
                    Margin = new Thickness(150 + 2 * 65 * solution.SolutionWithChange.N,
                                           height + 160 + 24 * solution.SolutionWithChange.N +
                                           (i * 24 * (solution.SolutionWithChange.N)), 0, 0),
                    Text = solution.SolutionWithChange.Ys[i]
                };
                var DistancesLabel = new Label
                {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment   = VerticalAlignment.Top,
                    Margin = new Thickness(75 + 2 * 65 * solution.SolutionWithChange.N,
                                           height + 175 + 24 * solution.SolutionWithChange.N +
                                           (i * 24 * (solution.SolutionWithChange.N)), 0, 0),
                    Content = Properties.Resources.DistanceLabel
                };
                var DistancesValues = new TextBlock
                {
                    HorizontalAlignment = HorizontalAlignment.Left,
                    VerticalAlignment   = VerticalAlignment.Top,
                    Margin = new Thickness(150 + 2 * 65 * solution.SolutionWithChange.N,
                                           height + 180 + 24 * solution.SolutionWithChange.N +
                                           (i * 24 * (solution.SolutionWithChange.N)), 0, 0),
                    Text = solution.SolutionWithChange.Distances[i]
                };
                height += 40;
                CoolGrid.Children.Add(newTxtBlock);
                CoolGrid.Children.Add(newXBlock);
                CoolGrid.Children.Add(FsForXLabel);
                CoolGrid.Children.Add(FsForXValues);
                CoolGrid.Children.Add(FsForXsLabel);
                CoolGrid.Children.Add(FsForXsValues);
                CoolGrid.Children.Add(DeltasLabel);
                CoolGrid.Children.Add(DeltasValues);
                CoolGrid.Children.Add(YsLabel);
                CoolGrid.Children.Add(YsValues);
                CoolGrid.Children.Add(DistancesLabel);
                CoolGrid.Children.Add(DistancesValues);
            }
        }