public static SPNetWay ToWay(ISPNet Net) { var NetWay = new SPNetWay(); if (CheckStandartNetCondition(Net)) { var Layers = Net.GetLayers(); var Settings = Net.GetSettings(); var LayerCount = Layers.Count; NetWay.layers = new List <SPNetWayLayer>(); for (int i = 0; i < LayerCount; i++) { var tmp = new SPNetWayLayer(); tmp.type = Layers[i].GetLayerType(); tmp.blocks = new List <SPNetWayBlock>(); if (tmp.type != LayerType.SLayer) { var tmp_block = new SPNetWayBlock(); tmp_block.active_inputs = new List <bool>(); tmp_block.active_outputs = new List <bool>(); tmp_block.active_inputs.AddRange(Enumerable.Repeat(false, Settings.WordLength)); tmp_block.active_outputs.AddRange(Enumerable.Repeat(false, Settings.WordLength)); tmp.blocks.Add(tmp_block); } else { foreach (var j in Enumerable.Range(0, Settings.SBoxCount)) { var tmp_sblock = new SPNetWayBlock(); tmp_sblock.active_inputs = new List <bool>(); tmp_sblock.active_outputs = new List <bool>(); tmp_sblock.active_inputs.AddRange(Enumerable.Repeat(false, Settings.SBoxSize)); tmp_sblock.active_outputs.AddRange(Enumerable.Repeat(false, Settings.SBoxSize)); tmp.blocks.Add(tmp_sblock); } } NetWay.layers.Add(tmp); } return(NetWay); } else { throw new Exception("Azaza. Wrong net."); } }
/// <summary> /// Deep Clone /// </summary> /// <param name="Way"></param> /// <param name="empty">Copy just struct without values</param> /// <returns></returns> public static SPNetWay CloneWay(SPNetWay Way, bool empty = false) { SPNetWay NewWay = new SPNetWay(); if (Way.layers != null) { NewWay.layers = new List <SPNetWayLayer>(Way.layers.Count); for (int i = 0; i < Way.layers.Count; i++) { var tmp_layer = new SPNetWayLayer(); tmp_layer.type = Way.layers[i].type; if (Way.layers[i].blocks != null) { tmp_layer.blocks = new List <SPNetWayBlock>(Way.layers[i].blocks.Count); for (int j = 0; j < Way.layers[i].blocks.Count; j++) { var tmp_block = new SPNetWayBlock(); if (Way.layers[i].blocks[j].active_inputs != null & Way.layers[i].blocks[j].active_outputs != null) { tmp_block.active_inputs = new List <bool>(Way.layers[i].blocks[j].active_inputs.Count); tmp_block.active_outputs = new List <bool>(Way.layers[i].blocks[j].active_outputs.Count); tmp_block.active_inputs.AddRange(Enumerable.Repeat(false, Way.layers[i].blocks[j].active_inputs.Count)); tmp_block.active_outputs.AddRange(Enumerable.Repeat(false, Way.layers[i].blocks[j].active_outputs.Count)); if (!empty & (Way.layers[i].blocks[j].active_inputs.Count == Way.layers[i].blocks[j].active_outputs.Count)) { for (int k = 0; k < Way.layers[i].blocks[j].active_inputs.Count; k++) { tmp_block.active_inputs[k] = Way.layers[i].blocks[j].active_inputs[k]; tmp_block.active_outputs[k] = Way.layers[i].blocks[j].active_outputs[k]; } } } tmp_layer.blocks.Add(tmp_block); } } NewWay.layers.Add(tmp_layer); } } return(NewWay); }