Ejemplo n.º 1
0
        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.");
            }
        }
Ejemplo n.º 2
0
        /// <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);
        }