public Task(ISolver Solver, SolverParams SolParams, ExtraParams Params)
 {
     this.Solver    = Solver;
     this.SolParams = SolParams;
     this.Params    = Params;
     //this.CurrentCorrelation = CurrentCorrelation;
 }
Exemple #2
0
        protected virtual void KLayer(SolverParams SolParams)
        {
            var LIndex = SolParams.lastNotEmptyLayerIndex;
            var kblock = SolParams.Way.layers[LIndex].blocks[0];

            kblock.active_outputs = kblock.active_inputs;
            SolParams.Way.layers[LIndex].blocks[0] = kblock;
        }
Exemple #3
0
        protected override bool SLayer(SolverParams SolParams)
        {
            //var LIndex = SolParams.lastNotEmptyLayerIndex;
            var ret = true;
            int ActiveBlocksCount = 0;

            //var BIndex = SolParams.BIndex;
            if (SolParams.BIndex == -1)
            {
                SolParams.BIndex = 0;
                for (; SolParams.BIndex < SolParams.Way.layers[SolParams.lastNotEmptyLayerIndex].blocks.Count; SolParams.BIndex++)
                {
                    var WayBlock = SolParams.Way.layers[SolParams.lastNotEmptyLayerIndex].blocks[SolParams.BIndex];
                    if (!WayBlock.active_inputs.All(x => !x))
                    {
                        ActiveBlocksCount++;
                        continue;
                    }
                }
                if (ActiveBlocksCount > SolParams.MaxActiveBlocksOnLayer)
                {
                    return(false);
                }
                SolParams.BIndex = 0;
            }
            for (; SolParams.BIndex < SolParams.Way.layers[SolParams.lastNotEmptyLayerIndex].blocks.Count; SolParams.BIndex++)
            {
                var WayBlock = SolParams.Way.layers[SolParams.lastNotEmptyLayerIndex].blocks[SolParams.BIndex];
                if (WayBlock.active_inputs.All(x => !x))
                {
                    continue;
                }
                if (!WayBlock.active_outputs.All(x => !x))
                {
                    //ActiveBlocksCount++;
                    continue; //already solved block
                }
                ret = false;
                var NetBlock = SolParams.Net.GetLayers()[SolParams.lastNotEmptyLayerIndex].GetBlocks()[SolParams.BIndex];
                var Params   = new BlockStateExtrParams(WayBlock.active_inputs, null, SolParams.Net.GetMultiThreadPrevalence(), SolParams.P, SolParams.Type, true);
                var States   = NetBlock.ExtractStates(Params);
                if (States.Count > 0)
                {
                    var State    = States[0];
                    var NewWay   = WayConverter.CloneWay(SolParams.Way);
                    var NewBLock = NewWay.layers[SolParams.lastNotEmptyLayerIndex].blocks[SolParams.BIndex];
                    NewBLock.active_outputs = State._outputs;
                    NewWay.layers[SolParams.lastNotEmptyLayerIndex].blocks[SolParams.BIndex] = NewBLock;
                    var NewSolParams = SolParams;
                    NewSolParams.P  *= State.MatrixValue;
                    NewSolParams.Way = NewWay;
                    NewSolParams.BIndex++;
                    Solve(NewSolParams);
                }
                break;
            }
            return(ret);
        }
Exemple #4
0
        public virtual void Solve(SolverParams SolParams)
        {
            var layersCount = SolParams.Way.layers.Count();
            var roundsCount = layersCount / 3;

            #region FindLastNotEmptyLayer
            if (SolParams.lastNotEmptyLayerIndex == -1)
            {
                SolParams.lastNotEmptyLayerIndex = WayConverter.SearchLastNotEmptyLayer(SolParams.Way);
            }
            #endregion
            #region FullRounds
            if ((SolParams.lastNotEmptyLayerIndex >= 0) && (SolParams.lastNotEmptyLayerIndex / 3 < roundsCount - 1))
            {
                for (int i = SolParams.lastNotEmptyLayerIndex / 3; i < roundsCount - 1; i++)
                {
                    #region K-layer
                    if (SolParams.Way.layers[SolParams.lastNotEmptyLayerIndex].type == LayerType.KLayer)
                    {
                        KLayer(SolParams);
                        WayConverter.CopyOutToIn(SolParams.Way, SolParams.lastNotEmptyLayerIndex, SolParams.lastNotEmptyLayerIndex + 1);
                        SolParams.lastNotEmptyLayerIndex++;
                        SolParams.BIndex = -1;
                    }
                    #endregion
                    #region S-layer
                    if (SolParams.Way.layers[SolParams.lastNotEmptyLayerIndex].type == LayerType.SLayer)
                    {
                        if (!(SLayer(SolParams)))
                        {
                            return;
                        }
                        WayConverter.CopyOutToIn(SolParams.Way, SolParams.lastNotEmptyLayerIndex, SolParams.lastNotEmptyLayerIndex + 1);
                        SolParams.lastNotEmptyLayerIndex++;
                    }
                    #endregion
                    #region P-layer
                    if (SolParams.Way.layers[SolParams.lastNotEmptyLayerIndex].type == LayerType.PLayer)
                    {
                        PLayer(SolParams);
                        WayConverter.CopyOutToIn(SolParams.Way, SolParams.lastNotEmptyLayerIndex, SolParams.lastNotEmptyLayerIndex + 1);
                        SolParams.lastNotEmptyLayerIndex++;
                    }
                    #endregion
                }
            }
            #endregion
            #region LastRound
            //No need to process LastRound, because LastRound must be reversed.
            #endregion
            SolParams.Net.GetCallbackAddSolution()(new Solution(SolParams.P, SolParams.Way));
            if (SolParams.P > SolParams.Net.GetMultiThreadPrevalence())
            {
                SolParams.Net.SetMultiThreadPrevalence(SolParams.P);
            }
        }
Exemple #5
0
        void ProcessRules()
        {
            //throw new NotImplementedException();
            for (int i = 0; i < Params.Alg.Rules.Count; i++)
            {
                var Rule = Params.Alg.Rules[i];
                if (Rule.UseCustomInput == true)
                {
                    var SolParam = new SolverParams(WayConverter.ToWay(Params.Net, Rule.Input), Params.Net, Params.Alg.Type, Rule.MaxActiveBlocksOnLayer);
                    var T        = new Task(Solvers[Rule.SolverType].S, SolParam, new ExtraParams());
                    _tasks.Enqueue(T);
                }
                else
                {
                    var S = Solvers[Rule.SolverType];
                    S.IsUsedForBruteForce    = true;
                    S.MaxActiveBlocksOnLayer = Rule.MaxActiveBlocksOnLayer;
                    Solvers[Rule.SolverType] = S;
                    IsBruteForceTurnedOn     = true;
                }
            }
            //Warning! Unoptimized code!!!
            if (IsBruteForceTurnedOn)
            {
                var          temp = Iter;
                SolverInputs NextInput;
                foreach (var S in Solvers)
                {
                    if (S.Value.IsUsedForBruteForce)
                    {
                        Iter = new InputsIterator(Params.Net.GetSettings().SBoxCount, Params.Net.GetSettings().SBoxSize);
                        while (!Iter.IsFinished())
                        {
                            NextInput = Iter.NextState();
                            var ws = WayConverter.ToWay(Params.Net, NextInput);

                            _tasks.Enqueue(new Task(S.Value.S, new SolverParams(ws, Params.Net, Params.Alg.Type, S.Value.MaxActiveBlocksOnLayer)));
                        }
                    }
                }
                Iter = temp;
            }
        }
Exemple #6
0
        protected virtual void PLayer(SolverParams SolParams)
        {
            var LIndex = SolParams.lastNotEmptyLayerIndex;
            var Params = new BlockStateExtrParams(SolParams.Way.layers[LIndex].blocks[0].active_inputs, null,
                                                  new Prevalence(), new Prevalence(), SolParams.Type);
            var States = SolParams.Net.GetLayers()[LIndex].GetBlocks()[0].ExtractStates(Params);

            if (States.Count == 1)
            {
                //deep copying
                foreach (var j in Enumerable.Range(0, SolParams.Way.layers[LIndex].blocks[0].active_outputs.Count))
                {
                    SolParams.Way.layers[LIndex].blocks[0].active_outputs[j] = States[0]._outputs[j];
                }
            }
            else
            {
                Logger.UltraLogger.Instance.AddToLog("BaseSolver: Cant extract state from P-layer", Logger.MsgType.Error);
                throw new NotImplementedException();
            }
        }
 public Task(ISolver Solver, SolverParams SolParams)
 {
     this.Solver    = Solver;
     this.SolParams = SolParams;
     this.Params    = new ExtraParams();
 }