Example #1
0
        public ConditionViewModel(IEnumerable <MappingViewModel> mappings, ConditionNumber number, ACondition condition)
        {
            _mappings  = mappings;
            _number    = number;
            _condition = condition;

            if (_condition != null)
            {
                _name = _condition.Name;

                // assignment
                var options = _condition.AssignmentOptions.Select(a => new ConditionAssignment {
                    Target = a.Key, Description = a.Value
                });
                _assignmentOptions = new ObservableCollection <ConditionAssignment>(options);
                _assignment        = AssignmentOptions.SingleOrDefault(a => a.Target == _condition.Assignment);

                // value
                var enumDict = _condition.GetValueOptions();
                _valueOptions = new ObservableCollection <ConditionValue>(enumDict.Select(e => new ConditionValue {
                    Value = e.Key, Description = e.Value
                }));
                _value = ValueOptions.SingleOrDefault(v => v.Value != null && v.Value.Equals(_condition.GetValue()));
            }
        }
Example #2
0
        public ACondition Copy(ConditionNumber number)
        {
            var copy = All.KnownConditions[Id].Create(new MappingSettings(), number);

            copy.Assignment = Assignment;
            copy.SetValue(GetValue());
            return(copy);
        }
Example #3
0
        /// <summary>
        /// Set condition by proxy.
        /// </summary>
        /// <param name="mappingSettings">Format.MappingSettings needed by proxy for creation of condition</param>
        /// <param name="number">Number of condition</param>
        /// <param name="proxy">ConditionProxy or null to reset condition.</param>
        /// <returns>True if condition was changed.</returns>
        internal bool SetCondition(Format.MappingSettings mappingSettings, ConditionNumber number, ConditionProxy proxy)
        {
            ACondition condition = (proxy != null) ? proxy.Create(mappingSettings, number) : null;

            if (condition != null)
            {
                condition.Assignment = condition.AssignmentOptions.Keys.First();
                condition.SetValue(condition.GetValueOptions().Keys.First());
            }
            return(setCondition(number, condition));
        }
Example #4
0
        public void VolumetricAndAngleCriteriaEqualityTest()
        {
            var matrix = new Matrix(2, 2);

            matrix[0, 0]    = 4;
            matrix[0, 1]    = 3;
            matrix[1, 0]    = 9;
            matrix[1, 1]    = 2;
            conditionNumber = new ConditionNumber(matrix, null, null);
            Assert.AreEqual(conditionNumber.CalculateVolumetricCriterion(), conditionNumber.CalculateAngleCriterion());
        }
Example #5
0
        public void CriteriaBadMatrixTest()
        {
            var matrix = new Matrix(2, 2);

            matrix[0, 0]    = 1;
            matrix[0, 1]    = 0.99;
            matrix[1, 0]    = 0.99;
            matrix[1, 1]    = 0.98;
            conditionNumber = new ConditionNumber(matrix, null, null);
            Assert.IsTrue(conditionNumber.CalculateSpectralCriterion() > 10000);
            Assert.IsTrue(conditionNumber.CalculateVolumetricCriterion() > 10000);
            Assert.IsTrue(conditionNumber.CalculateAngleCriterion() > 10000);
        }
Example #6
0
        internal ACondition(int id, string name, TargetType target, Format.MappingSettings rawSettings, ConditionNumber number)
        {
            RawSettings = rawSettings;
            _number     = number;

            Id     = id;
            Name   = name;
            Target = target;

            _valueProperty = GetType().GetProperty("Value");

            updateAssignmentOptions();
            syncSettings();
        }
Example #7
0
        private void setCondition(ConditionNumber number, MenuItemViewModel item)
        {
            ConditionProxy proxy     = null;
            ACondition     condition = null;

            if (item.Tag is ConditionProxy)
            {
                proxy = item.Tag as ConditionProxy;
            }
            else if (item.Tag is ACondition)
            {
                condition = item.Tag as ACondition;
            }

            foreach (var mapping in _mappings)
            {
                if (proxy != null)
                {
                    mapping.SetCondition(number, proxy);
                }
                else if (condition != null)
                {
                    mapping.SetCondition(number, condition);
                }
                else
                {
                    mapping.SetCondition(number, condition); // clear condition with null value
                }
            }

            if (number == ConditionNumber.One)
            {
                _selectedC1Conditions = new List <ACondition> {
                    _mappings.First().Conditions.Condition1
                }
            }
            ;
            else
            {
                _selectedC2Conditions = new List <ACondition> {
                    _mappings.First().Conditions.Condition2
                }
            };

            update();
        }
Example #8
0
        public void VolumetricAndAngleCriteriaDiagonalMatrixTest()
        {
            var matrix = new Matrix(3, 3);

            matrix[0, 0]    = -400.6;
            matrix[0, 1]    = 0;
            matrix[0, 2]    = 0;
            matrix[1, 0]    = 0;
            matrix[1, 1]    = -600.4;
            matrix[1, 2]    = 0;
            matrix[2, 0]    = 0;
            matrix[2, 1]    = 0;
            matrix[2, 2]    = 200.2;
            conditionNumber = new ConditionNumber(matrix, null, null);
            Assert.AreEqual(1, conditionNumber.CalculateVolumetricCriterion());
            Assert.AreEqual(1, conditionNumber.CalculateAngleCriterion());
        }
Example #9
0
        public void CriteriaGilbertMatrixTest()
        {
            var matrix = new Matrix(6, 6);

            for (var i = 0; i < 6; i++)
            {
                for (var j = 0; j < 6; j++)
                {
                    matrix[i, j]  = 1;
                    matrix[i, j] /= 1 + i + j;
                }
            }
            conditionNumber = new ConditionNumber(matrix, null, null);
            Assert.IsTrue(conditionNumber.CalculateSpectralCriterion() > 10000);
            Assert.IsTrue(conditionNumber.CalculateVolumetricCriterion() > 10000);
            Assert.IsTrue(conditionNumber.CalculateAngleCriterion() > 10000);
        }
Example #10
0
        public void SetCondition(ConditionNumber number, ACondition condition)
        {
            var changed = _mapping.SetCondition(number, condition);

            if (changed)
            {
                if (number == ConditionNumber.One)
                {
                    raisePropertyChanged("Condition1");
                }
                else
                {
                    raisePropertyChanged("Condition2");
                }
                raisePropertyChanged("ConditionExpression");
                IsChanged = true;
            }
        }
Example #11
0
        /// This one is dumb and must not be called from other classes. RawMapping.Settings are ignored!
        private bool setCondition(ConditionNumber number, ACondition condition)
        {
            bool changed = false;

            if (number == ConditionNumber.One)
            {
                changed = (Condition1 != null && !Condition1.Equals(condition)) || (condition != null && !condition.Equals(Condition1));
                if (changed)
                {
                    Condition1 = condition;
                }
            }
            else
            {
                changed = (Condition2 != null && !Condition2.Equals(condition)) || (condition != null && !condition.Equals(Condition2));
                if (changed)
                {
                    Condition2 = condition;
                }
            }

            return(changed);
        }
Example #12
0
        /// <summary>
        /// Set condition by another condition.
        /// </summary>
        /// <param name="mappingSettings">Format.MappingSettings needed by proxy for creation of condition</param>
        /// <param name="number">Number of condition</param>
        /// <param name="condition">ACondition or null to reset condition.</param>
        /// <returns>True if condition was changed.</returns>
        internal bool SetCondition(Format.MappingSettings mappingSettings, ConditionNumber number, ACondition condition)
        {
            if (condition == null)
            {
                return(setCondition(number, condition));
            }
            else
            {
                bool changed = false;

                var targetCondition = (number == ConditionNumber.One) ? Condition1 : Condition2;

                if (targetCondition == null || targetCondition.Id != condition.Id)
                {
                    changed         = SetCondition(mappingSettings, number, Conditions.All.GetConditionProxy(condition.Id));
                    targetCondition = (number == ConditionNumber.One) ? Condition1 : Condition2; // needed?
                }

                // set assignment
                if (!changed)
                {
                    changed |= targetCondition.Assignment != condition.Assignment;
                }
                targetCondition.Assignment = condition.Assignment;

                // set value
                var newValue = condition.GetValue();
                if (!changed)
                {
                    changed |= targetCondition.GetValue() != newValue;
                }
                targetCondition.SetValue(newValue);

                return(changed);
            }
        }
Example #13
0
 internal IntCondition(int id, string name, TargetType target, Format.MappingSettings rawSettings, ConditionNumber number)
     : base(id, name, target, rawSettings, number)
 {
 }
Example #14
0
 public void Setup()
 {
     conditionNumber = null;
 }
Example #15
0
 internal EnumCondition(int id, string name, TargetType target, Format.MappingSettings rawSettings, ConditionNumber number)
     : base(id, name, target, rawSettings, number)
 {
     if (!typeof(T).IsEnum)
     {
         throw new Exception("T must be an Enumeration type.");
     }
 }
Example #16
0
 private void SelectedIndexChangedBase(string Values,ConditionNumber Condition)
 {
     if (!string.IsNullOrEmpty(Values))
     {
         if (IndexDict.ContainsKey(Values))
         {
             var Index = IndexDict[Values];
             string TypeName = string.Empty;
             switch (this.Types[Index])
             {
                 case esriFieldType.esriFieldTypeString:
                     TypeName = "String";
                     break;
                 case esriFieldType.esriFieldTypeDouble:
                 case esriFieldType.esriFieldTypeInteger:
                 case esriFieldType.esriFieldTypeOID:
                 case esriFieldType.esriFieldTypeSmallInteger:
                 case esriFieldType.esriFieldTypeGUID:
                 case esriFieldType.esriFieldTypeGlobalID:
                     TypeName = "Int";
                     break;
                 default:
                     TypeName = "String";
                     break;
             }
             var list = RelationHelper.GetRelations(TypeName);
             var unique = GISHelper.GetUniqueValue(this.FeatureClass, this.Fields[Index]).OrderBy(e => e).ToList();
             switch (Condition)
             {
                 case ConditionNumber.One:
                     comboBox2.Items.Clear();
                     foreach (var item in list)
                     {
                         comboBox2.Items.Add(item);
                     }
                     comboBox9.Items.Clear();
                     foreach (var item in unique)
                     {
                         comboBox9.Items.Add(item);
                     }
                     break;
                 case ConditionNumber.Two:
                     comboBox3.Items.Clear();
                     foreach (var item in list)
                     {
                         comboBox3.Items.Add(item);
                     }
                     comboBox10.Items.Clear();
                     foreach (var item in unique)
                     {
                         comboBox10.Items.Add(item);
                     }
                     break;
                 case ConditionNumber.Three:
                     comboBox5.Items.Clear();
                     foreach (var item in list)
                     {
                         comboBox5.Items.Add(item);
                     }
                     comboBox11.Items.Clear();
                     foreach (var item in unique)
                     {
                         comboBox11.Items.Add(item);
                     }
                     break;
             }
         }
     }
 }
Example #17
0
 /// <summary>
 /// Set condition by another condition.
 /// </summary>
 /// <param name="number">Number of condition</param>
 /// <param name="condition">ACondition or null to reset condition.</param>
 /// <returns>True if condition was changed.</returns>
 public bool SetCondition(ConditionNumber number, ACondition condition)
 {
     return(_conditions.SetCondition(_rawMapping.Settings, number, condition));
 }
Example #18
0
 /// <summary>
 /// Set condition by proxy.
 /// </summary>
 /// <param name="number">Number of condition</param>
 /// <param name="proxy">ConditionProxy or null to reset condition.</param>
 /// <returns>True if condition was changed.</returns>
 public bool SetCondition(ConditionNumber number, ConditionProxy proxy)
 {
     return(_conditions.SetCondition(_rawMapping.Settings, number, proxy));
 }
Example #19
0
        public void VariedMatrixAndVectorCalculationTest()
        {
            var equations = new List <(Matrix, Vector, Vector)>();

            var matrix1 = new Matrix(2, 2);

            matrix1[0, 0] = -400.6;
            matrix1[0, 1] = 199.8;
            matrix1[1, 0] = 1198.8;
            matrix1[1, 1] = -600.4;
            var vector1        = new Vector(new double[] { 200, -600 });
            var exactSolution1 = new Vector(new double[] { -0.2, 0.6 });

            equations.Add((matrix1, vector1, exactSolution1));

            var matrix2 = new Matrix(2, 2);

            matrix2[0, 0] = -200.4;
            matrix2[0, 1] = -398.6;
            matrix2[1, 0] = 1060.8;
            matrix2[1, 1] = 400.2;
            var vector2        = new Vector(new double[] { -40.74, 728.58 });
            var exactSolution2 = new Vector(new double[] { 0.8, -0.3 });

            equations.Add((matrix2, vector2, exactSolution2));

            var matrix3 = new Matrix(2, 2);

            matrix3[0, 0] = 58.4;
            matrix3[0, 1] = -60;
            matrix3[1, 0] = 14.2;
            matrix3[1, 1] = 34.6;
            var vector3        = new Vector(new double[] { 47.68, -17.92 });
            var exactSolution3 = new Vector(new double[] { 0.2, -0.6 });

            equations.Add((matrix3, vector3, exactSolution3));

            foreach (var equation in equations)
            {
                var conditionNumber = new ConditionNumber(equation.Item1, equation.Item2, equation.Item3);
                var variedSolution1 = conditionNumber.CalculateVariedSolution(0.01);
                var variedSolution2 = conditionNumber.CalculateVariedSolution(0.2);
                var variedSolution3 = conditionNumber.CalculateVariedSolution(3);

                var variedMatrix1 = equation.Item1.Clone();
                var variedMatrix2 = equation.Item1.Clone();
                var variedMatrix3 = equation.Item1.Clone();
                var variedVector1 = equation.Item2.Clone();
                var variedVector2 = equation.Item2.Clone();
                var variedVector3 = equation.Item2.Clone();
                for (var i = 0; i < conditionNumber.size; i++)
                {
                    for (var j = 0; j < conditionNumber.size; j++)
                    {
                        variedMatrix1[i, j] += 0.01;
                        variedMatrix2[i, j] += 0.2;
                        variedMatrix3[i, j] += 3;
                    }
                    variedVector1[i] += 0.01;
                    variedVector2[i] += 0.2;
                    variedVector3[i] += 3;
                }

                var actualVector1 = variedMatrix1 * variedSolution1;
                var actualVector2 = variedMatrix2 * variedSolution2;
                var actualVector3 = variedMatrix3 * variedSolution3;

                Assert.IsTrue(conditionNumber.CalculateSpectralCriterion() < 10000);
                Assert.IsTrue(conditionNumber.CalculateVolumetricCriterion() < 10000);
                Assert.IsTrue(conditionNumber.CalculateAngleCriterion() < 10000);
                for (var i = 0; i < conditionNumber.size; i++)
                {
                    Assert.That(variedVector1[i], Is.EqualTo(actualVector1[i, 0]).Within(Math.Pow(10, -10)));
                    Assert.That(variedVector2[i], Is.EqualTo(actualVector2[i, 0]).Within(Math.Pow(10, -10)));
                    Assert.That(variedVector3[i], Is.EqualTo(actualVector3[i, 0]).Within(Math.Pow(10, -10)));
                }
            }
        }
Example #20
0
        internal ACondition Create(MappingSettings rawSettings, ConditionNumber number)
        {
            var condition = (ACondition)Activator.CreateInstance(_description.ConditionType, _flags, null, new object[] { _description.Id, _description.Name, _description.TargetType, rawSettings, number }, _culture);

            return(condition);
        }
        public MainViewModel()
        {
            Model = new PlotModel {
                Title = "Chart"
            };
            Model.Axes.Add(new LinearColorAxis {
                Position = AxisPosition.None, Minimum = 0.1, Maximum = 0.9, HighColor = OxyColors.Red, LowColor = OxyColors.Black
            });
            Model.Axes.Add(new LinearAxis {
                Position = AxisPosition.Bottom, Title = "Condition number", FontSize = 14
            });
            Model.Axes.Add(new LinearAxis {
                Position = AxisPosition.Left, Title = "Solutions difference", FontSize = 14
            });

            var series = new ScatterSeries[8];

            series[0] = new ScatterSeries {
                MarkerType = MarkerType.Circle
            };
            series[1] = new ScatterSeries {
                MarkerType = MarkerType.Circle
            };
            series[2] = new ScatterSeries {
                MarkerType = MarkerType.Circle
            };
            series[3] = new ScatterSeries {
                MarkerType = MarkerType.Circle
            };
            series[4] = new ScatterSeries {
                MarkerType = MarkerType.Circle
            };
            series[5] = new ScatterSeries {
                MarkerType = MarkerType.Circle
            };
            series[6] = new ScatterSeries {
                MarkerType = MarkerType.Circle
            };
            series[7] = new ScatterSeries {
                MarkerType = MarkerType.Circle
            };

            var equations = new List <(Matrix, DotNumerics.LinearAlgebra.Vector, DotNumerics.LinearAlgebra.Vector)>();
            var matrix1   = new Matrix(2, 2);

            matrix1[0, 0] = -400.6;
            matrix1[0, 1] = 199.8;
            matrix1[1, 0] = 1198.8;
            matrix1[1, 1] = -600.4;
            var vector1        = new DotNumerics.LinearAlgebra.Vector(new double[] { 200, -600 });
            var exactSolution1 = new DotNumerics.LinearAlgebra.Vector(new double[] { -0.2, 0.6 });

            equations.Add((matrix1, vector1, exactSolution1));

            var matrix2 = new Matrix(2, 2);

            matrix2[0, 0] = -401.98;
            matrix2[0, 1] = 200.34;
            matrix2[1, 0] = 1202.04;
            matrix2[1, 1] = -602.32;
            var vector2        = new DotNumerics.LinearAlgebra.Vector(new double[] { 722.264, -2166.272 });
            var exactSolution2 = new DotNumerics.LinearAlgebra.Vector(new double[] { -0.8, 2 });

            equations.Add((matrix2, vector2, exactSolution2));

            var matrix3 = new Matrix(2, 2);

            matrix3[0, 0] = -400.94;
            matrix3[0, 1] = 200.2;
            matrix3[1, 0] = 1200.12;
            matrix3[1, 1] = -600.96;
            var vector3        = new DotNumerics.LinearAlgebra.Vector(new double[] { -160.268, 480.408 });
            var exactSolution3 = new DotNumerics.LinearAlgebra.Vector(new double[] { 0.2, -0.4 });

            equations.Add((matrix3, vector3, exactSolution3));

            var matrix4 = new Matrix(2, 2);

            matrix4[0, 0] = -41;
            matrix4[0, 1] = 127;
            matrix4[1, 0] = 113;
            matrix4[1, 1] = -60;
            var vector4        = new DotNumerics.LinearAlgebra.Vector(new double[] { -787, 1589 });
            var exactSolution4 = new DotNumerics.LinearAlgebra.Vector(new double[] { 13, -2 });

            equations.Add((matrix4, vector4, exactSolution4));

            var matrix5 = new Matrix(2, 2);

            matrix5[0, 0] = -402.9;
            matrix5[0, 1] = 200.7;
            matrix5[1, 0] = 1204.2;
            matrix5[1, 1] = -603.6;
            var vector5        = new DotNumerics.LinearAlgebra.Vector(new double[] { 201, -603 });
            var exactSolution5 = new DotNumerics.LinearAlgebra.Vector(new double[] { -0.2, 0.6 });

            equations.Add((matrix5, vector5, exactSolution5));

            // bad condition matrix
            var matrix6 = new Matrix(2, 2);

            matrix6[0, 0] = 1;
            matrix6[0, 1] = 0.99;
            matrix6[1, 0] = 0.99;
            matrix6[1, 1] = 0.98;
            var vector6        = new DotNumerics.LinearAlgebra.Vector(new double[] { 2, 2 });
            var exactSolution6 = new DotNumerics.LinearAlgebra.Vector(new double[] { 200, -200 });

            equations.Add((matrix6, vector6, exactSolution6));

            // Hilbert matrix
            var matrix7 = new Matrix(7, 7);

            for (var i = 0; i < 7; i++)
            {
                for (var j = 0; j < 7; j++)
                {
                    matrix7[i, j]  = 1;
                    matrix7[i, j] /= 1 + i + j;
                }
            }

            var vector7 = new DotNumerics.LinearAlgebra.Vector(new double[] { 1, 1, 1, 1, 1, 1, 1 });

            vector7[0] = vector7[0] * 5699 / 420;
            vector7[1] = vector7[1] * 4103 / 420;
            vector7[2] = vector7[2] * 19661 / 2520;
            vector7[3] = vector7[3] * 157 / 24;
            vector7[4] = vector7[4] * 156631 / 27720;
            vector7[5] = vector7[5] * 34523 / 6930;
            vector7[6] = vector7[6] * 146077 / 32760;
            var exactSolution7 = new DotNumerics.LinearAlgebra.Vector(new double[] { 2, 9, 4, 7, 11, 9, 2 });

            equations.Add((matrix7, vector7, exactSolution7));

            for (var i = 0; i < 7; i++)
            {
                var conditionNumber = new ConditionNumber(equations[i].Item1, equations[i].Item2, equations[i].Item3);

                var spectralCriterion   = conditionNumber.CalculateSpectralCriterion();
                var volumetricCriterion = conditionNumber.CalculateVolumetricCriterion();
                var angleCriterion      = conditionNumber.CalculateAngleCriterion();

                var    variedSolution1 = conditionNumber.CalculateVariedSolution(0.1);
                var    variedSolution2 = conditionNumber.CalculateVariedSolution(0.01);
                var    variedSolution3 = conditionNumber.CalculateVariedSolution(0.001);
                var    difference1     = equations[i].Item3 - variedSolution1;
                var    difference2     = equations[i].Item3 - variedSolution2;
                var    difference3     = equations[i].Item3 - variedSolution3;
                double delta1          = 0;
                double delta2          = 0;
                double delta3          = 0;
                for (var j = 0; j < equations[i].Item1.RowCount; j++)
                {
                    delta1 += difference1[j] * difference1[j];
                    delta2 += difference2[j] * difference2[j];
                    delta3 += difference3[j] * difference3[j];
                }
                delta1 = Math.Sqrt(delta1);
                delta2 = Math.Sqrt(delta2);
                delta3 = Math.Sqrt(delta3);

                // red dots
                series[i].Points.Add(new ScatterPoint(spectralCriterion, delta1, 3, 1));
                // green dots
                series[i].Points.Add(new ScatterPoint(spectralCriterion, delta2, 3, 0.4));
                // black dots
                series[i].Points.Add(new ScatterPoint(spectralCriterion, delta3, 3, 0));
                Model.Series.Add(series[i]);
            }
        }