public void ErrorBackPropagationBuilderExtensionsBuildsSoftmaxActivation() { TNetwork network = null; new ErrorBackPropagationBuilder() .With.ANewLayerOfInputUnits(2) .ConnectedTo.ANewLayerOfHiddenUnits(2).With.SoftmaxActivation() .ConnectedTo.ANewLayerOfOutputUnits(2).With.SoftmaxActivation() .And.SetupNetwork(n => network = n); network.ElementAt(1).Select(u => u.UnitActivation).Should().AllBeOfType <SoftmaxUnitActivationTraining>(); }
private static IErrorBackPropagationTraining SetUpXOrTraining(double learningRate = 0.5d, double bias = 0d, double momentum = 0d, double slopeMultiplier = 1d, bool oneHot = false, Action <TNetwork> networkCallback = null) { var weightSetterMock = new Mock <IWeightSetter>(); var stepsMock = new Mock <ErrorBackPropagationStepsDependencyFactory>().As <IErrorBackPropagationStepsDependencyFactory>(); stepsMock.CallBase = true; stepsMock.Setup(s => s.CreateWeightSetter(It.IsAny <double>(), It.IsAny <double>())).Returns(weightSetterMock.Object); var dependencyFactory = new ErrorBackPropagationDependencyFactory(stepsMock.Object); TNetwork network = null; var chain = new ErrorBackPropagationBuilder() .With.ANewLayerOfInputUnits(2) .ConnectedTo.ANewLayerOfHiddenUnits(3).With.UnitActivationMultiFold <SoftmaxUnitActivationTraining>() .ConnectedTo.ANewLayerOfOutputUnits(2).With.OutputUnitActivationMultiFold <SoftmaxUnitActivationTraining>() .And.NetworkErrorFunction <CrossEntropyErrorFunction>() .And.Bias(bias) .And.LearningRate(learningRate) .And.Momentum(momentum) .And.SlopeMultiplier(slopeMultiplier); if (oneHot) { chain = chain.And.UseOneHotEncoding(); } var errorBackPropagationTraining = chain .And.NetworkErrorFunction <DifferenceErrorFunction>() .And.SetupNetwork(n => { network = n; if (networkCallback != null) { networkCallback(n); } }) .And.NameEverything() .And.ReadyForTraining(dependencyFactory); // This whole ceremony ensures weight setting is deterministic (same weight to same connection every time even if weights are set asynchronously) var connections = network.Skip(1).Select(units => units.SelectMany(u => u.IncomingConnections.Select(ic => ic.Properties))); var randomWeights = new List <double> { -1d, -0.5d, 0.5d, 1d, 0.3, 0.2, 0.1, 0.5, 0.2, 0.3, 0.4, -1, -0.9, 0.1, 0.5, 1.2, 1.3, 1.1, 0.35, 1.1, 0.1, 0.2, 0.3, -1d, -0.5d, 0.5d, 1d, 0.3, 0.2, 0.1, 0.5, 0.2, 0.3, 0.4, -1, -0.9, 0.1, 0.5, 1.2, 1.3, 1.1, 0.35, 1.1, 0.1, 0.2, 0.3 }; weightSetterMock.Setup(wi => wi.SetWeight(It.IsAny <IConnectionUnderTraining>())).Callback <IConnectionUnderTraining>(c => { var randomWeightIndex = connections.SelectMany(x => x).ToList().IndexOf(c); c.Weight = randomWeights[randomWeightIndex]; }); return(errorBackPropagationTraining); }
public void SetUp() { _network = new StandardNetworkBuilderTraining() .With.ANewLayerOfInputUnits(2) .ConnectedTo.ANewLayerOfHiddenUnits(3).With.UnitActivationMultiFold <SoftmaxUnitActivationTraining>() .ConnectedTo.ANewLayerOfOutputUnits(2).With.OutputUnitActivationMultiFold <SoftmaxUnitActivationTraining>() .And.Bias(Bias) .And.SlopeMultiplier(SlopeMultiplier) .And.Build() .And.WithNamesAssignedToEverything() .And.GetNetwork(); var connections = _network.SelectMany(u => u).SelectMany(u => u.OutgoingConnections); var weight = 0.0001d; connections.Enumerate(c => { weight += 0.01d; c.Properties.Weight = weight; }); _perceptronFinalizer = new PerceptronFinalizer(); }
public ResponseMessage SortPoints([FromBody] PointsVm pointsVm) { try { var tspmode = TTSPmode.tspOpen; var gf = TGISFormat.gfSHP; var mTSP = new List <int>(); var sortedPoint = new List <GeoNode>(); //var point = JsonConvert.DeserializeObject<points>(w); //var count = point.coordinates.Count - 1; var shpfolder = _appSettings.RoutewareSettings.ShapeFolder.Replace("{{region}}", pointsVm.Region); var binfolder = _appSettings.RoutewareSettings.BinFolder.Replace("{{region}}", pointsVm.Region); var outfolder = _appSettings.RoutewareSettings.OutputFolder.Replace("{{region}}", pointsVm.Region); var NW = new TNetwork(); NW.InitPassword(_appSettings.RoutewareSettings.Password); NW.Directory = binfolder; NW.Open(true, true, true, 0); // open attributes too, don't cache coord3 and open externID without caching NW.OpenLimit(1, 1, false); NW.OpenLimit(2, 2, true); NW.OpenRoadName(1, false); NW.CreateArrayTime(3); // 3 time arrays: 0,1,2 NW.CreateArrayCost(1); // 1 cost array: 0 // set speed as value based upon road classes 1,2,3,4,6 (store in index 0) TRoadClassSpeed rcs = new TRoadClassSpeed(); rcs[1] = 110; rcs[2] = 80; rcs[3] = 65; rcs[4] = 55; rcs[5] = 45; rcs[6] = 25; NW.CalculateTime(0, rcs); TRandom r = new TRandom(); r.SetSeed(987654321); // read speed into ArrayTime[2] from field "speed" in link.dbf NW.ReadSpeed(2, shpfolder + "\\link.dbf", 0, "speed", false); int link; // set speed as random value from 60-100 km/h (store in index 1) for (link = 1; link <= NW.LinkCount; link++) { NW.SetSpeed(1, link, 60 + 40 * (float)r.NextDouble()); } // set cost as the same as time from index 0 for (link = 1; link <= NW.LinkCount; link++) { NW.SetCost(0, link, NW.GetTime(0, link)); } NW.UpdateAlphas(); TSpatialSearch ss = new TSpatialSearch(NW); TLocationList ll = new TLocationList(); TBitArray TBA = new TBitArray(1000); TIntegerList nl = new TIntegerList(); if (pointsVm.Nodes != null) { for (int i = 0; i < pointsVm.Nodes.Count; i++) { TFloatPoint fp; fp.x = Convert.ToDouble(pointsVm.Nodes[i].Coordinates[0]); fp.y = Convert.ToDouble(pointsVm.Nodes[i].Coordinates[1]); TLocation ll1 = new TLocation(); int side = 0; double distance = 0; TFloatPoint fPnew = new TFloatPoint(); ss.NearestLocation(fp, out ll1, out side, out distance, out fPnew); ll.Add1(ll1); ll.Add3(fp); ll.Add4(ll1, fp); nl.Add(ss.NearestNodeSimple(fp)); } ll.Sort(); nl.Sort(); nl.RemoveDuplicates(); } TRouteCalc calc = new TRouteCalc(NW, false); calc.SetTime(0); calc.SetFastest(false); calc.MaxSpeed = 110; // 90 > 80 and 110 > 80 float[][] matrix = calc.Matrix(nl, (tspmode != TTSPmode.tspRoundTrip), false); // A faster and straight-line matrix // TMatrix Matrix = NW.Matrix(NL,(mode != TTspmode.tspRoundTrip)); // optimize sequence of matrix TTSP tsp = new TTSP { Mode = tspmode }; tsp.Execute(matrix); for (int i = 0; i < nl.Count; i++) { mTSP.Add(tsp.SortedIndex[i]); } // Use TDrivingDirections for output TGISWrite output = NW.GISoutputInit(outfolder + "tsp_driving", gf); TDrivingDirections dd = new TDrivingDirections(calc) { ConcatenationMode = TConcatenationMode.cmCompact, RoundTrip = (tspmode == TTSPmode.tspRoundTrip), SortedIndex = tsp.SortedIndex }; dd.RouteList(output, nl); output = NW.GISoutputInit(outfolder + "tsp", gf); output.StartHeader(1, TObjectTypes.otPline); output.AddField("sequence", TGISField.gfInteger, 0, 0); int d = 0; if (tspmode != TTSPmode.tspRoundTrip) { d = 1; } for (int i = 0; i < nl.Count - d; i++) { int node1 = nl[tsp.SortedIndex[i]]; int node2 = i != nl.Count - 1 ? nl[tsp.SortedIndex[i + 1]] : nl[tsp.SortedIndex[0]]; calc.Route(node1, node2); TRoute route = calc.RouteFind(node2); TFloatPointArrayEx list = NW.GetGISSectionRoute(route); output.AddObject(1, false, i.ToString(CultureInfo.InvariantCulture)); output.AddSection(1, ref list); } output.Close(); output = NW.GISoutputInit(outfolder + "tsppoint", gf); output.StartHeader(1, TObjectTypes.otPoint); output.AddField("sequence", TGISField.gfInteger, 0, 0); for (int i = 0; i < nl.Count; i++) { int node1 = nl[tsp.SortedIndex[i]]; TFloatPoint p1 = NW.Node2Coordinate(node1); output.AddPoint2(p1, i.ToString(CultureInfo.InvariantCulture)); } output.Close(); for (int i = 0; i < mTSP.Count; i++) { sortedPoint.Add(pointsVm.Nodes[mTSP[i]]); } return(new ResponseMessage { Status = "Ok", Data = sortedPoint }); } catch (Exception ex) { return(new ResponseMessage { Status = "Error", Message = "Error sorting nodes." }); } }
private List <Node> GetMST(string region, List <GeoNode> geoNodes) { try { _logger?.LogInformation("No. of nodes: " + geoNodes.Count); TNetwork NW = new TNetwork(); var binfolder = _appSettings.RoutewareSettings.BinFolder.Replace("{{region}}", region); NW.InitPassword(_appSettings.RoutewareSettings.Password); NW.Directory = binfolder; NW.Open(false, false, true, 0); TIntegerList nodes = new TIntegerList(); var ss = new TSpatialSearch(NW); foreach (var geoNode in geoNodes) { var P = new TFloatPoint { x = geoNode.Coordinates[0], y = geoNode.Coordinates[1] }; nodes.Add(ss.NearestNodeSimple(P)); } TBitArray links = new TBitArray(); var calc = new TCalc(NW, false); calc.IgnoreOneway = false; calc.SteinerTree(nodes, links); var steinerTreeFile = _appSettings.RoutewareSettings.SteinerTreeFile.Replace("{{region}}", region); if (System.IO.File.Exists(steinerTreeFile)) { System.IO.File.Delete(steinerTreeFile); } var geoJsonFile = steinerTreeFile; if (System.IO.File.Exists(geoJsonFile + ".geojson")) { System.IO.File.Delete(geoJsonFile + ".geojson"); } NW.ExportLinks(geoJsonFile, TGISFormat.gfGeoJSON, null, links); var geoJsonData = JsonConvert.DeserializeObject <GeoJosn>(System.IO.File.ReadAllText(geoJsonFile + ".geojson")); var listNodes = GetMSTPaths(geoJsonData); return(listNodes); } catch (Exception ex) { _logger?.LogError(ex, "Error processing nodes."); return(null); } }
public Node(TNetwork key, TValue value) { Key = key; Value = value; }
private void MixingDataCancelDepersonalizeButton_Click(object sender, RoutedEventArgs e) { //меняем фон у StatusBar'а и выводим в него сообщение MixingDataMessagesStatusBar.Background = new SolidColorBrush(Color.FromRgb(225, 225, 225)); MixingDataMessagesTextBlock.Text = "Процедура деобезличивания персональных данных запущена"; //задаем набор позиций, определяющих процедуру обезличивания персональных данных var pZapDeobez = new TNetwork.Position(true, 1); var p9 = new TNetwork.Position(true, 1); var p10 = new TNetwork.Position(true, 1); var p7 = new TNetwork.Position(false, 0); var p8 = new TNetwork.Position(false, 0); var p2 = new TNetwork.Position(false, 0); var p5 = new TNetwork.Position(false, 0); var pa1 = new TNetwork.Position(false, 0); var pa2 = new TNetwork.Position(false, 0); var pa3 = new TNetwork.Position(false, 0); var pa4 = new TNetwork.Position(false, 0); var pa5 = new TNetwork.Position(false, 0); var pb1 = new TNetwork.Position(false, 0); var pb2 = new TNetwork.Position(false, 0); var pb3 = new TNetwork.Position(false, 0); var pb4 = new TNetwork.Position(false, 0); var pb5 = new TNetwork.Position(false, 0); var pK1 = new TNetwork.Position(false, 0); var pK2 = new TNetwork.Position(false, 0); var pKonecDeobez = new TNetwork.Position(false, 0); //задаем набор переходов с формированием Fl и Fr, определяющий процедуру обезличивания персональных данных var t13 = new TNetwork.Translation(new List <TNetwork.Position>() { p7, p8 }, new List <TNetwork.Position>() { p9, p10, pZapDeobez }); var t10 = new TNetwork.Translation(new List <TNetwork.Position>() { p2 }, new List <TNetwork.Position>() { p7 }); var t12 = new TNetwork.Translation(new List <TNetwork.Position>() { p5 }, new List <TNetwork.Position>() { p8 }); var t7 = new TNetwork.Translation(new List <TNetwork.Position>() { pb1, pb2, pb3, pb4, pb5, pK2 }, new List <TNetwork.Position>() { p5 }); var t4 = new TNetwork.Translation(new List <TNetwork.Position>() { pa1, pa2, pa3, pa4, pa5, pK1 }, new List <TNetwork.Position>() { p2 }); var t1 = new TNetwork.Translation(new List <TNetwork.Position>() { pKonecDeobez }, new List <TNetwork.Position>() { pK1, pK2 }); //очищаем таблицу записей с персональными данными Db.Persons.Local.Clear(); //для каждого набора ключей для деобезличивания восстанавливаем персональные данные foreach (var key in Db.Keys.Local) { //задаем исходную маркировку для набора позиций, определяющих процедуру обезличивания персональных данных pZapDeobez = new TNetwork.Position(true, 1); p9 = new TNetwork.Position(true, 1); p10 = new TNetwork.Position(true, 1); p7 = new TNetwork.Position(false, 0); p8 = new TNetwork.Position(false, 0); p2 = new TNetwork.Position(false, 0); p5 = new TNetwork.Position(false, 0); pa1 = new TNetwork.Position(false, 0); pa2 = new TNetwork.Position(false, 0); pa3 = new TNetwork.Position(false, 0); pa4 = new TNetwork.Position(false, 0); pa5 = new TNetwork.Position(false, 0); pb1 = new TNetwork.Position(false, 0); pb2 = new TNetwork.Position(false, 0); pb3 = new TNetwork.Position(false, 0); pb4 = new TNetwork.Position(false, 0); pb5 = new TNetwork.Position(false, 0); pK1 = new TNetwork.Position(false, 0); pK2 = new TNetwork.Position(false, 0); pKonecDeobez = new TNetwork.Position(false, 0); //задаем исходный набор переходов с формированием Fl и Fr, определяющий процедуру обезличивания персональных данных t13 = new TNetwork.Translation(new List <TNetwork.Position>() { p7, p8 }, new List <TNetwork.Position>() { p9, p10, pZapDeobez }); t10 = new TNetwork.Translation(new List <TNetwork.Position>() { p2 }, new List <TNetwork.Position>() { p7 }); t12 = new TNetwork.Translation(new List <TNetwork.Position>() { p5 }, new List <TNetwork.Position>() { p8 }); t7 = new TNetwork.Translation(new List <TNetwork.Position>() { pb1, pb2, pb3, pb4, pb5, pK2 }, new List <TNetwork.Position>() { p5 }); t4 = new TNetwork.Translation(new List <TNetwork.Position>() { pa1, pa2, pa3, pa4, pa5, pK1 }, new List <TNetwork.Position>() { p2 }); t1 = new TNetwork.Translation(new List <TNetwork.Position>() { pKonecDeobez }, new List <TNetwork.Position>() { pK1, pK2 }); var newPerson1 = Db.NewPersons.Find(key.Key1); var newPerson2 = Db.NewPersons.Find(key.Key2); //задаем наборы значений аттрибутов двух записей в таблице персональных данных, передаваемых Т-сети var firstPersonAttributes = new List <string> { newPerson1.Id.ToString(), newPerson1.LastName, newPerson1.FirstName, newPerson1.Patronymic, newPerson1.DateOfBirth.ToString("{0:dd.MM.yyyy}"), newPerson1.Address }; var secondPersonAttributes = new List <string> { newPerson2.Id.ToString(), newPerson2.LastName, newPerson2.FirstName, newPerson2.Patronymic, newPerson2.DateOfBirth.ToString("{0:dd.MM.yyyy}"), newPerson2.Address }; //создаем экземпляр класса, реализующего Т-сеть var tNet = new TNetwork(firstPersonAttributes, secondPersonAttributes); //меняем фон у StatusBar'а и выводим в него сообщение MixingDataMessagesStatusBar.Background = new SolidColorBrush(Color.FromRgb(225, 225, 225)); MixingDataMessagesTextBlock.Text = "Выполняется последовательность переходов t"; //запускаем последовательно переходы в с сетевой моелью (Т-сеть) деобезличивания персональных данных try { t13.DoTranslate(true); t10.DoTranslate(true); t12.DoTranslate(true); t7.DoTranslate(true); t4.DoTranslate(true); tNet.SwapAttrInPositions(4); tNet.SwapAttrInPositions(5); t1.DoTranslate(true); } //если при каком-то переходе возникнет исключение, то оно будет обработано catch (Exception ex) { //меняем фон у StatusBar'а и выводим в него сообщение MixingDataMessagesStatusBar.Background = new SolidColorBrush(Color.FromRgb(201, 16, 18)); MixingDataMessagesTextBlock.Text = "Возникло исключение: " + ex.Message; //если исключение возникло, то функция завершается досрочно return; } //если позиция конца обезличивания промаркирована, то if (pKonecDeobez.marked) { //создаем записи добавляем их в таблицу с обезличенными персональными записями var person1 = new Person() { Id = new Guid(tNet.firstAttributValues[0]), LastName = tNet.firstAttributValues[1], FirstName = tNet.firstAttributValues[2], Patronymic = tNet.firstAttributValues[3], DateOfBirth = DateTime.ParseExact(tNet.firstAttributValues[4], "{0:dd.MM.yyyy}", new CultureInfo("ru-RU")), Address = tNet.firstAttributValues[5] }; Db.Persons.Local.Add(person1); //меняем фон у StatusBar'а и выводим в него сообщение MixingDataMessagesStatusBar.Background = new SolidColorBrush(Color.FromRgb(225, 225, 225)); MixingDataMessagesTextBlock.Text = "Процедура деобезличивания персональных данных завершена"; } else { //меняем фон у StatusBar'а и выводим в него сообщение MixingDataMessagesStatusBar.Background = new SolidColorBrush(Color.FromRgb(201, 16, 18)); MixingDataMessagesTextBlock.Text = "Позиция конца деобезличивания не была промаркирована."; //если позиция конца обезличивания не помечена, то функция завершается досрочно (при этом деобезличенные ранее данные не стираются) return; } } //сохраняем изменения в БД Db.SaveChanges(); }
private void MixingDataDepersonalizeButton_Click(object sender, RoutedEventArgs e) { //запоминаем в переменных: splitCount - количество подмножеств исходного множества персональных данных, shift - циклический сдвиг значений перемешиваемых аттрибутов внутри каждого подмножества if (!int.TryParse(MixingDataSplitOnTextBox.Text, out var splitCount)) { return; } if (!int.TryParse(MixingDataShiftOnTextBox.Text, out var shift)) { return; } //меняем фон у StatusBar'а и выводим в него сообщение MixingDataMessagesStatusBar.Background = new SolidColorBrush(Color.FromRgb(225, 225, 225)); MixingDataMessagesTextBlock.Text = "Процедура обезличивания персональных данных запущена"; //задаем набор позиций, определяющих процедуру обезличивания персональных данных var pa1 = new TNetwork.Position(true, 1); var pa2 = new TNetwork.Position(true, 1); var pa3 = new TNetwork.Position(true, 1); var pa4 = new TNetwork.Position(true, 1); var pa5 = new TNetwork.Position(true, 1); var pb1 = new TNetwork.Position(true, 1); var pb2 = new TNetwork.Position(true, 1); var pb3 = new TNetwork.Position(true, 1); var pb4 = new TNetwork.Position(true, 1); var pb5 = new TNetwork.Position(true, 1); var pZapObez = new TNetwork.Position(true, 1); var pZ1 = new TNetwork.Position(false, 0); var pZ2 = new TNetwork.Position(false, 0); var pZ3 = new TNetwork.Position(false, 0); var pZ4 = new TNetwork.Position(false, 0); var p1 = new TNetwork.Position(false, 0); var p3 = new TNetwork.Position(false, 0); var p4 = new TNetwork.Position(false, 0); var p6 = new TNetwork.Position(false, 0); var p10 = new TNetwork.Position(false, 0); var p11 = new TNetwork.Position(false, 0); var p9 = new TNetwork.Position(false, 0); var p12 = new TNetwork.Position(false, 0); var p13 = new TNetwork.Position(false, 0); var p14 = new TNetwork.Position(false, 0); var pKonecObez = new TNetwork.Position(false, 0); //задаем набор переходов с формированием Fl и Fr, определяющий процедуру обезличивания персональных данных var t2 = new TNetwork.Translation(new List <TNetwork.Position>() { pZapObez }, new List <TNetwork.Position>() { pZ1, pZ2, pZ3, pZ4 }); var t3 = new TNetwork.Translation(new List <TNetwork.Position>() { pa1, pa2, pa3 }, new List <TNetwork.Position>() { p1 }); var t5 = new TNetwork.Translation(new List <TNetwork.Position>() { pa4, pa5 }, new List <TNetwork.Position>() { p6 }); var t6 = new TNetwork.Translation(new List <TNetwork.Position>() { pb1, pb2, pb3 }, new List <TNetwork.Position>() { p4 }); var t8 = new TNetwork.Translation(new List <TNetwork.Position>() { pb4, pb5 }, new List <TNetwork.Position>() { p3 }); var t9 = new TNetwork.Translation(new List <TNetwork.Position>() { p1, p3 }, new List <TNetwork.Position>() { p10, p11 }); var t11 = new TNetwork.Translation(new List <TNetwork.Position>() { p4, p6 }, new List <TNetwork.Position>() { p9, p12 }); var t14 = new TNetwork.Translation(new List <TNetwork.Position>() { p11 }, new List <TNetwork.Position>() { p13 }); var t15 = new TNetwork.Translation(new List <TNetwork.Position>() { p12 }, new List <TNetwork.Position>() { p14 }); var t16 = new TNetwork.Translation(new List <TNetwork.Position>() { p13, p14 }, new List <TNetwork.Position>() { pKonecObez }); //очищаем таблицы с обезличенными персональными данными и с ключами для обезличивания, сохранив все изменения в БД, перед обезличиванием ClearDepersonalizeDataGridAndKeysDataGrid(); //запоминаем в N - число записей в таблице персональных данных var N = Db.Persons.Local.Count; //считаем k - количество записей в каждом подмножестве int k; if (N % splitCount == 0) { k = N / splitCount; } else { k = N / splitCount + 1; } if (k < 2) { //меняем фон у StatusBar'а и выводим в него сообщение MixingDataMessagesStatusBar.Background = new SolidColorBrush(Color.FromRgb(201, 16, 18)); MixingDataMessagesTextBlock.Text = "Невозможно разбить на " + splitCount.ToString() + " подмножеств"; //если исключение возникло, то функция завершается досрочно return; } //создаем временный список с записями персональных данных и инициализируем его var tempPersons = new List <Person>(); foreach (var person in Db.Persons.Local) { tempPersons.Add(person); } //shift раз осуществляем циклический сдвиг на 1 элемент влево в этом временном массиве //осуществляем циклический сдвиг на shift в каждом подмножестве множества элементов персональных данных и результат помещаем в новый список (уже со сдвигом элементов) персональных данных #region это алгоритм смещения элементов множества на shift влево for (var i = 0; i < splitCount; i++) { //p - номер первой записи в каждом подмножестве var p = k * i; //shift раз сдвигаем влево на 1 элемент for (var s = 0; s < shift; s++) { //запоминаем первый элемент подмножества var firstPerson = tempPersons[p]; var last = p + k - 1; //будет хранить номер последнего элемента в каждом подмножестве //смещаем все элементы подмножества на 1 влево for (var j = p; j < p + k; j++) { if (j + 1 < N) { tempPersons[j] = tempPersons[j + 1]; } else { last = j; break; } } //на место последнего элемента подмножества ставим первый tempPersons[last] = firstPerson; } } #endregion //для всех элементов нового списка персональных данных for (var i = 0; i < tempPersons.Count; i++) { //задаем начальную маркировку для набора позиций, определяющих процедуру обезличивания персональных данных pa1 = new TNetwork.Position(true, 1); pa2 = new TNetwork.Position(true, 1); pa3 = new TNetwork.Position(true, 1); pa4 = new TNetwork.Position(true, 1); pa5 = new TNetwork.Position(true, 1); pb1 = new TNetwork.Position(true, 1); pb2 = new TNetwork.Position(true, 1); pb3 = new TNetwork.Position(true, 1); pb4 = new TNetwork.Position(true, 1); pb5 = new TNetwork.Position(true, 1); pZapObez = new TNetwork.Position(true, 1); pZ1 = new TNetwork.Position(false, 0); pZ2 = new TNetwork.Position(false, 0); pZ3 = new TNetwork.Position(false, 0); pZ4 = new TNetwork.Position(false, 0); p1 = new TNetwork.Position(false, 0); p3 = new TNetwork.Position(false, 0); p4 = new TNetwork.Position(false, 0); p6 = new TNetwork.Position(false, 0); p10 = new TNetwork.Position(false, 0); p11 = new TNetwork.Position(false, 0); p9 = new TNetwork.Position(false, 0); p12 = new TNetwork.Position(false, 0); p13 = new TNetwork.Position(false, 0); p14 = new TNetwork.Position(false, 0); pKonecObez = new TNetwork.Position(false, 0); //задаем исходный набор переходов с формированием Fl и Fr, определяющий процедуру обезличивания персональных данных t2 = new TNetwork.Translation(new List <TNetwork.Position>() { pZapObez }, new List <TNetwork.Position>() { pZ1, pZ2, pZ3, pZ4 }); t3 = new TNetwork.Translation(new List <TNetwork.Position>() { pa1, pa2, pa3 }, new List <TNetwork.Position>() { p1 }); t5 = new TNetwork.Translation(new List <TNetwork.Position>() { pa4, pa5 }, new List <TNetwork.Position>() { p6 }); t6 = new TNetwork.Translation(new List <TNetwork.Position>() { pb1, pb2, pb3 }, new List <TNetwork.Position>() { p4 }); t8 = new TNetwork.Translation(new List <TNetwork.Position>() { pb4, pb5 }, new List <TNetwork.Position>() { p3 }); t9 = new TNetwork.Translation(new List <TNetwork.Position>() { p1, p3 }, new List <TNetwork.Position>() { p10, p11 }); t11 = new TNetwork.Translation(new List <TNetwork.Position>() { p4, p6 }, new List <TNetwork.Position>() { p9, p12 }); t14 = new TNetwork.Translation(new List <TNetwork.Position>() { p11 }, new List <TNetwork.Position>() { p13 }); t15 = new TNetwork.Translation(new List <TNetwork.Position>() { p12 }, new List <TNetwork.Position>() { p14 }); t16 = new TNetwork.Translation(new List <TNetwork.Position>() { p13, p14 }, new List <TNetwork.Position>() { pKonecObez }); //будем перемещивать аттрибуты исходных персональных данных и получившихся после смещения на shift в каждом подмножестве var person1 = Db.Persons.Local[i]; var person2 = tempPersons[i]; //задаем наборы значений аттрибутов двух записей в таблице персональных данных, передаваемых Т-сети var firstPersonAttributes = new List <string>(); firstPersonAttributes.Add(person1.Id.ToString()); firstPersonAttributes.Add(person1.LastName); firstPersonAttributes.Add(person1.FirstName); firstPersonAttributes.Add(person1.Patronymic); firstPersonAttributes.Add(person1.DateOfBirth.ToString("{0:dd.MM.yyyy}")); firstPersonAttributes.Add(person1.Address); var secondPersonAttributes = new List <string> { person2.Id.ToString(), person2.LastName, person2.FirstName, person2.Patronymic, person2.DateOfBirth.ToString("{0:dd.MM.yyyy}"), person2.Address }; //создаем экземпляр класса, реализующего Т-сеть var tNet = new TNetwork(firstPersonAttributes, secondPersonAttributes); //меняем фон у StatusBar'а и выводим в него сообщение MixingDataMessagesStatusBar.Background = new SolidColorBrush(Color.FromRgb(225, 225, 225)); MixingDataMessagesTextBlock.Text = "Выполняется последовательность переходов t"; //запускаем последовательно переходы в с сетевой моелью (Т-сеть) обезличивания персональных данных try { t2.DoTranslate(false); t3.DoTranslate(false); t5.DoTranslate(false); t6.DoTranslate(false); t8.DoTranslate(false); t9.DoTranslate(false); t11.DoTranslate(false); tNet.SwapAttrInPositions(4); tNet.SwapAttrInPositions(5); t14.DoTranslate(false); t15.DoTranslate(false); t16.DoTranslate(false); } //если при каком-то переходе возникнет исключение, то оно будет обработано catch (Exception ex) { //меняем фон у StatusBar'а и выводим в него сообщение MixingDataMessagesStatusBar.Background = new SolidColorBrush(Color.FromRgb(201, 16, 18)); MixingDataMessagesTextBlock.Text = "Возникло исключение: " + ex.Message; //если исключение возникло, то функция завершается досрочно return; } //если позиция конца обезличивания промаркирована, то if (pKonecObez.marked) { //создаем записи добавляем их в таблицу с обезличенными персональными записями var newPerson2 = new NewPerson() { Id = new Guid(tNet.secondAttributValues[0]), LastName = tNet.secondAttributValues[1], FirstName = tNet.secondAttributValues[2], Patronymic = tNet.secondAttributValues[3], DateOfBirth = DateTime.ParseExact(tNet.secondAttributValues[4], "{0:dd.MM.yyyy}", new CultureInfo("ru-RU")), Address = tNet.secondAttributValues[5] }; Db.NewPersons.Local.Add(newPerson2); //создаем записи добавляем их в таблицу с ключами для деобезличивания var key1 = new Key() { Id = Guid.NewGuid(), Key1 = new Guid(tNet.firstAttributValues[0]), Key2 = newPerson2.Id }; Db.Keys.Local.Add(key1); //меняем фон у StatusBar'а и выводим в него сообщение MixingDataMessagesStatusBar.Background = new SolidColorBrush(Color.FromRgb(225, 225, 225)); MixingDataMessagesTextBlock.Text = "Процедура обезличивания персональных данных завершена"; } else { //меняем фон у StatusBar'а и выводим в него сообщение MixingDataMessagesStatusBar.Background = new SolidColorBrush(Color.FromRgb(201, 16, 18)); MixingDataMessagesTextBlock.Text = "Позиция конца обезличивания не была промаркирована."; //очищаем таблицы с обезличенными персональными данными и с ключами для обезличивания, сохранив все изменения в БД, перед обезличиванием ClearDepersonalizeDataGridAndKeysDataGrid(); //если позиция конца обезличивания не помечена, то функция завершается досрочно return; } } //сохраняем изменения в БД Db.SaveChanges(); }