protected void BddlAddPartition_SelectionChanged(object sender, EventArgs e)
        {
            if (Counts.Count > 0)
            {
                hdnPartitionType.Value = (( ButtonDropDownList )sender).SelectedValue;
                ScriptManager.RegisterStartupScript(upEditControls, upEditControls.GetType(), "PartitionWarning", "Rock.dialogs.confirm('Making changes to partition settings can affect existing counts!  Are you sure you want to proceed?', function(result) {if(result) {$(\"#" + btnAddPartition.ClientID + "\")[0].click();}});", true);
                return;
            }
            var partition = new PartitionSettings()
            {
                PartitionType = (( ButtonDropDownList )sender).SelectedValue, Guid = Guid.NewGuid(), SignupSettings = Settings
            };

            if (partition.PartitionType == "Role")
            {
                partition.AttributeKey = "GroupTypeRole";
            }
            else if (partition.PartitionType == "Campus")
            {
                partition.AttributeKey = "Campus";
            }
            Settings.Partitions.Add(partition);
            SaveViewState();
            rptPartions.DataSource = Settings.Partitions;
            rptPartions.DataBind();
        }
示例#2
0
        public void Init(PartitionSettings partitionSettings, int centerIndex)
        {
            var data = partitionSettings.CentersSettings.CenterDatas[centerIndex];

            TextInfo.text = $"№{centerIndex + 1}\n(X; Y) = ({data.Position[0]:0.00}; {data.Position[1]:0.00})\nA = {data.A}\nW = {data.W}";
            gameObject.SetActive(true);
            _centerInfoBlock.SetActive(false);
        }
        private List <GridValueInterpolator> GetMuGrids(PartitionSettings settings)
        {
            //var muMatrices = new FuzzyPartitionFixedCentersAlgorithm(_settings).BuildPartition();
            //var interpolators = muMatrices.Select(m => new GridValueInterpolator(settings.SpaceSettings, new MatrixGridValueGetter(m))).ToList();
            //return interpolators;

            var partitionTexture         = _partitionFixedCentersComputer.Run();
            var muGridValueInterpolators = _muConverter.GetGridValueInterpolators(partitionTexture, settings);

            return(muGridValueInterpolators);
        }
        public static CenterData GetDefaultCenterData(PartitionSettings settings)
        {
            var data = new CenterData
            {
                IsFixed  = false,
                Position = (settings.SpaceSettings.MaxCorner + settings.SpaceSettings.MinCorner) / 2,
                A        = 0,
                W        = 1
            };

            return(data);
        }
        private double CalculateTargetFunctionalValue(PartitionSettings partitionSettings, RenderTexture muRenderTexture)
        {
            if (!_calculateTargetFunctionalValue)
            {
                return(double.MinValue);
            }

            var muGridGetters         = _textureToGridConverter.GetGridValueInterpolators(muRenderTexture, partitionSettings);
            var targetFunctionalValue = new TargetFunctionalCalculator(partitionSettings).CalculateFunctionalValue(muGridGetters);

            Logger.Info($"Target functional value = {targetFunctionalValue}");
            return(targetFunctionalValue);
        }
        private double CalculateDualFunctionalValue(PartitionSettings partitionSettings, RenderTexture psiGridTexture)
        {
            if (!_calculateDualFunctionalValue)
            {
                return(double.MinValue);
            }

            var psiGridValueGetter  = _textureToGridConverter.GetGridValueInterpolator(psiGridTexture, partitionSettings);
            var dualFunctionalValue = new DualFunctionalCalculator(partitionSettings, psiGridValueGetter).CalculateFunctionalValue();

            Logger.Info($"Dual functional value = {dualFunctionalValue}");
            return(dualFunctionalValue);
        }
        public FuzzyPartitionPlacingCentersAlgorithm(PartitionSettings partitionSettings, List <Vector <double> > zeroCenters, List <GridValueInterpolator> zeroMuGrids)
        {
            PerformedIterationCount = 0;
            _settings          = partitionSettings;
            _rAlgorithmSolvers = new List <RAlgorithmSolverBForm>();
            _previousTaus.AddRange(Enumerable.Repeat(default(Vector <double>), _settings.CentersSettings.CentersCount));

            for (var centerIndex = 0; centerIndex < _settings.CentersSettings.CentersCount; centerIndex++)
            {
                var zeroCenter         = zeroCenters[centerIndex];
                var gradientCalculator = new GradientCalculator(_settings);
                var gradientVector     = gradientCalculator.CalculateGradientForCenter(zeroCenter, zeroMuGrids[centerIndex]);
                var rAlgorithm         = new RAlgorithmSolverBForm(zeroCenter, _ => gradientVector, _settings.RAlgorithmSettings.SpaceStretchFactor);
                _rAlgorithmSolvers.Add(rAlgorithm);
            }
        }
        public PartitionResult CreateFuzzyPartitionWithFixedCenters(PartitionSettings partitionSettings, RenderingSettings renderingSettings)
        {
            _partitionFixedCentersComputer.Init(partitionSettings);

            var muRenderTexture = _partitionFixedCentersComputer.Run(out var psiGridTexture);

            var result = new PartitionResult
            {
                TargetFunctionalValue = CalculateTargetFunctionalValue(partitionSettings, muRenderTexture),
                DualFunctionalValue   = CalculateDualFunctionalValue(partitionSettings, psiGridTexture),
                WorkFinished          = true
            };

            _partitionImageShower.RenderingSettings = renderingSettings;
            _partitionImageShower.CreatePartitionAndShow(partitionSettings, muRenderTexture);

            return(result);
        }
        public void Init(PartitionSettings settings)
        {
            _settings = settings;

            _timer = new Stopwatch();
            _timer.Start();

            _partitionFixedCentersComputer.Init(_settings);

            var zeroTaus = GetZeroIterationCentersPositions(settings);

            SetCentersPositions(zeroTaus);

            var muGrids = GetMuGrids(settings);

            PlacingAlgorithm = new FuzzyPartitionPlacingCentersAlgorithm(_settings, zeroTaus, muGrids);
            _timer.Stop();
        }
        public PartitionResult CreateFuzzyPartitionWithCentersPlacing(PartitionSettings partitionSettings, RenderingSettings renderingSettings)
        {
            _partitionPlacingCentersComputer.Init(partitionSettings);

            var centersPositions = _partitionPlacingCentersComputer.Run(out var iterationsCount);

            for (var i = 0; i < centersPositions.Count; i++)
            {
                partitionSettings.CentersSettings.CenterDatas[i].Position = centersPositions[i];
            }

            var result = CreateFuzzyPartitionWithFixedCenters(partitionSettings, renderingSettings);

            result.CentersPositions         = centersPositions.ToArray();
            result.WorkFinished             = true;
            result.PerformedIterationsCount = iterationsCount;

            return(result);
        }
示例#11
0
        public PartitionSettings GetPartitionSettings()
        {
            if (_centersCount > _centerPositions.Length)
            {
                throw new Exception($"Centers count ({_centersCount}) is bigger then center positions count ({_centerPositions.Length}).");
            }

            if (_centersCount > _centerDatas.Length)
            {
                throw new Exception($"Centers count ({_centersCount}) is bigger then center datas count ({_centerDatas.Length}).");
            }

            var settings = new PartitionSettings
            {
                IsCenterPlacingTask = _isCentersPlacingTask,
                SpaceSettings       = new SpaceSettings
                {
                    MinCorner = _minCorner.ToVector(),
                    MaxCorner = _maxCorner.ToVector(),
                    GridSize  = new List <int> {
                        _gridSize.x, _gridSize.y
                    },
                    DensityType = _densityType,
                    MetricsType = _metricsType
                },
                CentersSettings = new CentersSettings
                {
                    CentersCount = _centersCount,
                    CenterDatas  = _centerDatas
                                   .Take(_centersCount)
                                   .Select((v, i) =>
                    {
                        v.Position = _centerPositions[i].ToVector();
                        return(v);
                    }).ToList()
                },
                RAlgorithmSettings = _rAlgorithmSettings,
                FuzzyPartitionFixedCentersSettings   = _fuzzyPartitionFixedCentersSettings,
                FuzzyPartitionPlacingCentersSettings = _fuzzyPartitionPlacingCentersSettings
            };

            return(settings);
        }
        private List <Vector <double> > GetZeroIterationCentersPositions(PartitionSettings settings)
        {
            var zeroTaus = new List <Vector <double> >();

            var p1 = settings.SpaceSettings.MinCorner;
            var p2 = VectorUtils.CreateVector(p1[0], settings.SpaceSettings.MaxCorner[1]);

            for (var i = 0; i < settings.CentersSettings.CentersCount; i++)
            {
                //var zeroTau = settings.SpaceSettings.MinCorner.Clone();
                //
                var zeroTau = p1 + ((i + 1) / (settings.CentersSettings.CentersCount + 1d)) * (p2 - p1);
                //zeroTau += VectorUtils.CreateVector(Random.value - 0.5f, Random.value - 0.5f);
                //var zeroTau = VectorUtils.CreateVector(_zeroTau[0], _zeroTau[1]);
                zeroTaus.Add(zeroTau);
            }

            //zeroTaus = _zeroTausManual.Select(v => VectorUtils.CreateVector(v.x, v.y)).ToList();
            return(zeroTaus);
        }
        protected void btnAddPartition_Click(object sender, EventArgs e)
        {
            var partition = new PartitionSettings()
            {
                PartitionType = hdnPartitionType.Value, Guid = Guid.NewGuid(), SignupSettings = Settings
            };

            if (partition.PartitionType == "Role")
            {
                partition.AttributeKey = "GroupTypeRole";
            }
            else if (partition.PartitionType == "Campus")
            {
                partition.AttributeKey = "Campus";
            }
            Settings.Partitions.Add(partition);
            SaveViewState();
            rptPartions.DataSource = Settings.Partitions;
            rptPartions.DataBind();
        }
        public void Init(PartitionSettings partitionSettings)
        {
            _partitionSettings = partitionSettings;

            foreach (var centerInfo in _centerInfos)
            {
                centerInfo.Hide();
            }

            while (_centerInfos.Count < partitionSettings.CentersSettings.CentersCount)
            {
                _centerInfos.Add(Instantiate(_centerInfoPrefab, transform, true));
            }

            for (var index = 0; index < partitionSettings.CentersSettings.CentersCount; index++)
            {
                var centerInfo = _centerInfos[index];
                centerInfo.Init(partitionSettings, index);
            }

            SetCenterInfoPositions();
        }
        public void Init(PartitionSettings partitionSettings, RenderingSettings renderingSettings, Color[] centersColors)
        {
            _settings          = partitionSettings;
            _renderingSettings = renderingSettings;
            _centersColors     = centersColors;

            _partitionDrawingKernel = _partitionDrawingShader.FindKernel(PartitionDrawingKernel);

            _partitionRenderTexture = new RenderTexture(_settings.SpaceSettings.GridSize[0], _settings.SpaceSettings.GridSize[1], 0)
            {
                format            = RenderTextureFormat.ARGB32,
                enableRandomWrite = true
            };
            _partitionRenderTexture.Create();

            CheckAndReleaseBuffer();
            _colorsComputeBuffer = new ComputeBuffer(centersColors.Length, sizeof(float) * 4, ComputeBufferType.Default);
            _colorsComputeBuffer.SetData(_centersColors);

            _partitionDrawingShader.SetInt("CentersCount", _settings.CentersSettings.CentersCount);
            _partitionDrawingShader.SetBuffer(_partitionDrawingKernel, "CentersColors", _colorsComputeBuffer);
            _partitionDrawingShader.SetTexture(_partitionDrawingKernel, "Result", _partitionRenderTexture);
        }
示例#16
0
        public AlgorithmSettingsViewModel()
        {
            Settings = DefaultSettingsKeeper.GetPartitionSettings();

            CreatePartitionCommand = new RelayCommand(_ =>
            {
                if (_partitionCreationWindow == null || !_partitionCreationWindow.IsLoaded)
                {
                    _partitionCreationWindow = new PartitionCreationWindow(Settings);
                    _partitionCreationWindow.Show();
                }
                else
                {
                    _partitionCreationWindow.Activate();
                    var vm = (PartitionCreationViewModel)_partitionCreationWindow.DataContext;
                    vm.RunPartitionCreation();
                }
            },
                                                      obj =>
            {
                var valid = true;    //Utils.IsValid();

                if (!valid)
                {
                    MessageBox.Show("Введені некоректні дані! Щоб продовжити, введіть коректні дані.", "Некоректні дані",
                                    MessageBoxButton.OK, MessageBoxImage.Error);
                }

                return(true);
            });

            OnClosing = new RelayCommand(_ =>
            {
                _partitionCreationWindow?.Close();
            });
        }
        protected List <IDictionary <string, object> > GetTree(PartitionSettings partition, ICollection <ConnectionRequest> connectionRequests = null, String concatGuid = null, GroupTypeRoleService groupTypeRoleService = null, ScheduleService scheduleService = null, string ParentIdentifier = "signup", string parentUrl = "", string groupId = "", string roleId = "")
        {
            if (groupTypeRoleService == null || scheduleService == null)
            {
                RockContext context = new RockContext();
                groupTypeRoleService = new GroupTypeRoleService(context);
                scheduleService      = new ScheduleService(context);
            }
            var partitionList = new List <IDictionary <string, object> >();

            if (partition.PartitionValue == null)
            {
                return(null);
            }
            var values = partition.PartitionValue.Trim(',').Split(',');

            if (partition.PartitionType == "DefinedType")
            {
                // Use every Defined Value
                values = DefinedTypeCache.Read(partition.PartitionValue.AsGuid()).DefinedValues.Select(dv => dv.Guid.ToString()).ToArray();
            }

            foreach (var value in values)
            {
                if (partition.PartitionType == "Role")
                {
                    roleId = value;
                }
                if (partition.GroupMap != null && partition.GroupMap.ContainsKey(value))
                {
                    groupId = partition.GroupMap[value];
                }
                string url = parentUrl + (parentUrl.Contains("?") ? "&" : "?") + partition.AttributeKey + "=" + value;
                IDictionary <string, object> inner = new Dictionary <string, object>();
                inner.Add("ParentIdentifier", ParentIdentifier);
                inner.Add("PartitionType", partition.PartitionType);
                inner.Add("Url", url);
                inner.Add("ParameterName", partition.AttributeKey);
                inner.Add("Value", value);
                inner.Add("RoleGuid", roleId);
                inner.Add("GroupId", groupId);
                var newConcatGuid = concatGuid == null ? value : concatGuid + "," + value;
                int?count         = Counts.Where(kvp => kvp.Key.Contains(newConcatGuid)).Any(kvp => String.IsNullOrWhiteSpace(kvp.Value))?null:(int?)(Counts.Where(kvp => kvp.Key.Contains(newConcatGuid)).Select(kvp => kvp.Value.AsInteger()).Sum());
                inner.Add("Limit", count);
                ICollection <ConnectionRequest> subRequests = null;
                switch (partition.PartitionType)
                {
                case "DefinedType":
                    inner["Entity"] = DefinedValueCache.Read(value.AsGuid());
                    if (connectionRequests != null)
                    {
                        subRequests = connectionRequests.Where(cr => cr.AssignedGroupMemberAttributeValues != null && cr.AssignedGroupMemberAttributeValues.Contains(value)).ToList();

                        inner.Add("TotalFilled", this.connectionRequests.Where(cr => cr.AssignedGroupMemberAttributeValues != null && cr.AssignedGroupMemberAttributeValues.Contains(value) && cr.ConnectionState != ConnectionState.Inactive).Count());
                    }
                    break;

                case "Schedule":
                    inner["Entity"] = scheduleService.Get(value.AsGuid());
                    if (connectionRequests != null)
                    {
                        subRequests = connectionRequests.Where(cr => cr.AssignedGroupMemberAttributeValues != null && cr.AssignedGroupMemberAttributeValues.Contains(value)).ToList();

                        inner.Add("TotalFilled", this.connectionRequests.Where(cr => cr.AssignedGroupMemberAttributeValues != null && cr.AssignedGroupMemberAttributeValues.Contains(value) && cr.ConnectionState != ConnectionState.Inactive).Count());
                    }
                    break;

                case "Campus":
                    var campus = CampusCache.Read(value.AsGuid());
                    inner["Entity"] = campus;
                    if (connectionRequests != null && campus != null)
                    {
                        subRequests = connectionRequests.Where(cr => cr.CampusId == campus.Id).ToList();
                        inner.Add("TotalFilled", this.connectionRequests.Where(cr => cr.CampusId == campus.Id && cr.ConnectionState != ConnectionState.Inactive).Count());
                    }
                    break;

                case "Role":
                    var role = groupTypeRoleService.Get(value.AsGuid());
                    inner["Entity"] = role;
                    if (connectionRequests != null)
                    {
                        subRequests = connectionRequests.Where(cr => cr.AssignedGroupMemberRoleId == role.Id).ToList();
                        inner.Add("TotalFilled", this.connectionRequests.Where(cr => cr.AssignedGroupMemberRoleId == role.Id && cr.ConnectionState != ConnectionState.Inactive).Count());
                    }
                    break;
                }

                inner.Add("Filled", subRequests != null?subRequests.Where(sr => sr.ConnectionState != ConnectionState.Inactive).Count():0);

                if (partition.NextPartition != null)
                {
                    inner.Add("Partitions", GetTree(partition.NextPartition, subRequests, newConcatGuid, groupTypeRoleService, scheduleService, ParentIdentifier + "_" + value, url, groupId, roleId));
                }
                partitionList.Add(inner);
            }
            return(partitionList);
        }
示例#18
0
 public DualFunctionalCalculator(PartitionSettings partitionSettings, GridValueInterpolator psiGridValueGetter)
 {
     _settings           = partitionSettings;
     _psiGridValueGetter = psiGridValueGetter;
 }
 public GradientCalculator(PartitionSettings settings)
 {
     Settings = settings;
 }
 public PartitionCreationWindow()
 {
     _partitionSettings = DefaultSettingsKeeper.GetPartitionSettings();
 }
示例#21
0
        public void Grid3x3PlacingPartitionTest()
        {
            var f = "Logs.txt";

            if (File.Exists(f))
            {
                File.Delete(f);
            }
            Trace.Listeners.Add(new TextWriterTraceListener(f));

            var settings = new PartitionSettings
            {
                IsCenterPlacingTask = false,
                SpaceSettings       = new SpaceSettings
                {
                    MinCorner = VectorUtils.CreateVector(0, 0),
                    MaxCorner = VectorUtils.CreateVector(10, 10),
                    GridSize  = new List <int> {
                        8, 8
                    },
                    DensityType            = DensityType.Everywhere1,
                    MetricsType            = MetricsType.Euclidean,
                    CustomDensityFunction  = null,
                    CustomDistanceFunction = null
                },
                CentersSettings = new CentersSettings
                {
                    CentersCount = 2,
                    CenterDatas  = new List <CenterData>
                    {
                        new CenterData
                        {
                            A        = 0,
                            W        = 1,
                            Position = VectorUtils.CreateVector(2, 5),
                            IsFixed  = true
                        },
                        new CenterData
                        {
                            A        = 0,
                            W        = 1,
                            Position = VectorUtils.CreateVector(8, 5),
                            IsFixed  = true
                        },
                    }
                },
                FuzzyPartitionFixedCentersSettings = new FuzzyPartitionFixedCentersSettings
                {
                    GradientEpsilon    = 0.01,
                    GradientStep       = 0.1,
                    MaxIterationsCount = 400
                },
                FuzzyPartitionPlacingCentersSettings = new FuzzyPartitionPlacingCentersSettings
                {
                    CentersDeltaEpsilon        = 0.1,
                    GaussLegendreIntegralOrder = 32
                },
                RAlgorithmSettings = new RAlgorithmSettings
                {
                    SpaceStretchFactor = 2,
                    H0 = 1,
                    MaxIterationsCount = 30
                }
            };

            var zeroTaus = new List <Vector <double> >
            {
                //VectorUtils.CreateVector(2, 5),
                //VectorUtils.CreateVector(8, 5)
                VectorUtils.CreateVector(1, 1),
                VectorUtils.CreateVector(10, 10)
            };

            var calculator       = new FuzzyPartitionFixedCentersAlgorithm(settings);
            var partition        = calculator.BuildPartition();
            var muValueGetters   = partition.Select(v => new GridValueInterpolator(settings.SpaceSettings, new MatrixGridValueGetter(v))).ToList();
            var placingAlgorithm = new FuzzyPartitionPlacingCentersAlgorithm(settings, zeroTaus, muValueGetters);

            while (true)
            {
                placingAlgorithm.DoIteration(muValueGetters);

                var centers = placingAlgorithm.GetCenters();

                var targetFunctionalCalculator = new TargetFunctionalCalculator(settings);
                var targetFunctionalValue      = targetFunctionalCalculator.CalculateFunctionalValue(muValueGetters);
                Trace.WriteLine($"Target functional value = {targetFunctionalValue}\n");

                for (int i = 0; i < settings.CentersSettings.CentersCount; i++)
                {
                    settings.CentersSettings.CenterDatas[i].Position = centers[i].Clone();
                    Trace.WriteLine($"Center #{i + 1}: {centers[i][0]:0.00} {centers[i][1]:0.00}");
                }

                calculator = new FuzzyPartitionFixedCentersAlgorithm(settings);
                partition  = calculator.BuildPartition();

                if (placingAlgorithm.IsStopConditionSatisfied())
                {
                    break;
                }
            }

            var list = placingAlgorithm.GetCenters();

            for (var index = 0; index < list.Count; index++)
            {
                var center = list[index];

                Trace.WriteLine($"Center #{index + 1}: {center[0]:0.00} {center[1]:0.00}");
            }

            Trace.Flush();

            var vec = VectorUtils.CreateVector(44, 4, 4, 4, 4);
            var x   = 4;
        }
示例#22
0
        public GridValueTextureCalculator GetGridValueTextureCalculator(RenderTexture renderTexture2d, PartitionSettings partitionSettings)
        {
            var gridSizeX    = partitionSettings.SpaceSettings.GridSize[0];
            var textureArray = GetTextureNativeArray(renderTexture2d);
            var calculator   = new GridValueTextureCalculator(textureArray, gridSizeX);

            return(calculator);
        }
 public PartitionCreationWindow(PartitionSettings partitionSettings)
 {
     _partitionSettings = partitionSettings;
     InitializeComponent();
 }
 public TargetFunctionalCalculator(PartitionSettings partitionSettings)
 {
     Settings = partitionSettings;
 }
示例#25
0
 public static GridValueInterpolator ToGridValueInterpolator(this Matrix <double> matrix, PartitionSettings partitionSettings)
 {
     return(new GridValueInterpolator(partitionSettings.SpaceSettings, new MatrixGridValueGetter(matrix)));
 }
示例#26
0
        public GridValueInterpolator GetGridValueInterpolator(RenderTexture renderTexture2d, PartitionSettings partitionSettings)
        {
            var calculator   = GetGridValueTextureCalculator(renderTexture2d, partitionSettings);
            var interpolator = new GridValueInterpolator(partitionSettings.SpaceSettings, calculator);

            return(interpolator);
        }
示例#27
0
        public List <GridValueInterpolator> GetGridValueInterpolators(RenderTexture gridsRenderTexture, PartitionSettings partitionSettings)
        {
            var gridValueGetters = GetGridCellsGetters(gridsRenderTexture, partitionSettings);
            var interpolators    = gridValueGetters.Select(v => new GridValueInterpolator(partitionSettings.SpaceSettings, v)).ToList();

            return(interpolators);
        }
示例#28
0
        public List <IGridCellValueGetter> GetGridCellsGetters(RenderTexture gridsRenderTexture, PartitionSettings partitionSettings)
        {
            var list = new List <IGridCellValueGetter>();

            for (var centerIndex = 0; centerIndex < partitionSettings.CentersSettings.CentersCount; centerIndex++)
            {
                var data = GetTextureNativeArray(gridsRenderTexture, centerIndex);

                Assert.AreEqual(data.Length, partitionSettings.SpaceSettings.GridSize[0] * partitionSettings.SpaceSettings.GridSize[1]);

                var valueTextureGetter = new GridValueTextureCalculator(data, partitionSettings.SpaceSettings.GridSize[0]);

                list.Add(valueTextureGetter);
            }

            return(list);
        }
        public void MuGridsFixedPartition8x8Test()
        {
            const string f = "Logs.txt";

            if (File.Exists(f))
            {
                File.Delete(f);
            }
            Trace.Listeners.Add(new TextWriterTraceListener(f));

            var settings = new PartitionSettings
            {
                SpaceSettings = new SpaceSettings
                {
                    MinCorner = VectorUtils.CreateVector(0, 0),
                    MaxCorner = VectorUtils.CreateVector(10, 10),
                    GridSize  = new List <int> {
                        80, 80
                    },
                    DensityType            = DensityType.Everywhere1,
                    MetricsType            = MetricsType.Euclidean,
                    CustomDensityFunction  = null,
                    CustomDistanceFunction = null
                },
                CentersSettings = new CentersSettings
                {
                    CentersCount = 2,
                    CenterDatas  = new List <CenterData>
                    {
                        new CenterData
                        {
                            A        = 0,
                            W        = 1,
                            Position = VectorUtils.CreateVector(1, 1),
                            IsFixed  = true
                        },
                        new CenterData
                        {
                            A = 0,
                            W = 1,
                            //Position = VectorUtils.CreateVector(2, 4),
                            Position = VectorUtils.CreateVector(9, 1),
                            IsFixed  = true
                        },
                    }
                },
                FuzzyPartitionFixedCentersSettings = new FuzzyPartitionFixedCentersSettings
                {
                    GradientEpsilon    = 0.001,
                    GradientStep       = 10,
                    MaxIterationsCount = 400
                },
                FuzzyPartitionPlacingCentersSettings = new FuzzyPartitionPlacingCentersSettings
                {
                    GaussLegendreIntegralOrder = 4
                }
            };

            var calculator = new FuzzyPartitionFixedCentersAlgorithm(settings);
            var partition  = calculator.BuildPartition(out var psiGrid);

            Trace.WriteLine($"PerformedIterationsCount = {calculator.PerformedIterationsCount}");
            var muValueGetters = partition.Select(v => new GridValueInterpolator(settings.SpaceSettings, new MatrixGridValueGetter(v))).ToList();

            var targetFunctionalCalculator = new TargetFunctionalCalculator(settings);
            var targetFunctionalValue      = targetFunctionalCalculator.CalculateFunctionalValue(muValueGetters);

            Trace.WriteLine($"Target functional value = {targetFunctionalValue}\n");

            var dualFunctionalCalculator = new DualFunctionalCalculator(settings, psiGrid.ToGridValueInterpolator(settings));
            var dualFunctionalValue      = dualFunctionalCalculator.CalculateFunctionalValue();

            Trace.WriteLine($"Dual functional value = {dualFunctionalValue}\n");

            Trace.WriteLine("Center #1 Mu matrix:");
            MatrixUtils.WriteMatrix(partition[0], WriteLine, 3);

            Trace.WriteLine("Center #2 Mu matrix:");
            MatrixUtils.WriteMatrix(partition[1], WriteLine, 3);

            var sum = partition.Aggregate((a, b) => a + b);

            Trace.WriteLine("Sum mu matrix:");
            MatrixUtils.WriteMatrix(sum, WriteLine, 3);
            Trace.Flush();

            Assert.AreEqual(targetFunctionalValue, dualFunctionalValue, 1d);

            var q = 5;
        }
示例#30
0
 public FuzzyPartitionFixedCentersAlgorithm(PartitionSettings partitionSettings)
 {
     _settings = partitionSettings;
 }