public override void GetInputDataSync() //Diastole
        {
            PatternToSendInOutputChannels = string.Empty;

            var activeChannels = ListOfInputChannels.Where(inputChannel => inputChannel.IsActive).OrderBy(inputChannel => inputChannel.XCellOrigin.Id).ToList();
            var activeChannelsWithoutXCellDestiny = activeChannels.Where(activeChannel => activeChannel.XCellDestiny == null).ToList();

            foreach (var activeChannelWithoutXCellDestiny in activeChannelsWithoutXCellDestiny)
            {
                var xCellDP_I = new XCellDP_I(activeChannelWithoutXCellDestiny.XCellOrigin.Id, this);
                activeChannelWithoutXCellDestiny.XCellDestiny = xCellDP_I;
                xCellDP_I.ListOfInputChannels.Add(activeChannelWithoutXCellDestiny);
                ListOfXCellsDPI.Add(xCellDP_I);
            }

            foreach (var xCellDPI in ListOfXCellsDPI)
            {
                xCellDPI.GetInputData();
                xCellDPI.SendOutputData();
            }

            foreach (var xCellDPI in ListOfXCellsDPI.Where(xCelldpI => xCelldpI.ListOfOutputChannels[0].IsActive).OrderBy(xCelldpI => xCelldpI.ListOfOutputChannels[0].PatternToSendToAnXCell).ToList())
            {
                PatternToSendInOutputChannels = $"{PatternToSendInOutputChannels}{xCellDPI.ListOfOutputChannels[0].PatternToSendToAnXCell}&";
            }
            PatternToSendInOutputChannels = PatternToSendInOutputChannels.TrimEnd('&');

            var c1 = activeChannels.Count();
            var c2 = activeChannelsWithoutXCellDestiny.Count();

            if (c1 == c2 && c1 > 0)
            {
                if (!string.IsNullOrEmpty(PatternToSendInOutputChannels))
                {
                    var xCellAND = ((ANDLayer)LayerUp).CreateAnXCellANDGivenItsID(PatternToSendInOutputChannels);
                    //Crear una XCellAND con los canales de entrada igual a los canales de salida de las XCellDP_I creadas
                    foreach (var activeChannelWithoutXCell in activeChannelsWithoutXCellDestiny)
                    {
                        xCellAND.ListOfInputChannels.Add(activeChannelWithoutXCell.XCellDestiny.ListOfOutputChannels[0]);
                    }
                }
            }

            foreach (var xCellDPI in ListOfXCellsDPI)
            {
                xCellDPI.GetInputData();
            }

            foreach (var xCellDPI in ListOfXCellsDPI)
            {
                xCellDPI.ListOfInputChannels[0].PatternToSendToAnXCell = null;
                xCellDPI.ListOfInputChannels[0].Aij      = double.NaN;
                xCellDPI.ListOfInputChannels[0].IsActive = false;
            }
        }
        public string CreateIdOfAllInactiveInputs()
        {
            var id = string.Empty;
            var listOfInActiveInputs = ListOfInputChannels.Where(inputChannel => inputChannel.Aij < Threshold);

            foreach (var activeChannelInput in listOfInActiveInputs)
            {
                id = $"{id}{activeChannelInput.XCellOrigin.Id}&";
            }
            return(id.TrimEnd('&'));
        }
        public string CreateIdOfAllInActiveInputs()
        {
            var id = string.Empty;
            var listOfInActiveInputs = ListOfInputChannels.Where(input => input.Pin.Value < Threshold);

            foreach (var activeInput in listOfInActiveInputs)
            {
                id = $"{id}{activeInput.Pin.Id}|";
            }
            return(id.TrimEnd('|'));
        }
        public virtual void ActivateOutputChannelsAndGenerateOutputValue()
        {
            var outputValue = 0.0;

            foreach (var inputChannelActive in ListOfInputChannels.Where(inputChannel => inputChannel.IsActive))
            {
                outputValue += (inputChannelActive.Nijpos - inputChannelActive.Nijneg) * inputChannelActive.Pin.Value / Nii;
            }

            foreach (var outputChannel in ListOfOutputChannels)
            {
                outputChannel.Pin.Value = outputValue;
                outputChannel.IsActive  = outputChannel.Pin.Value >= 0; //el caso =0 es para asegurar la difusión (maximiza la entropía en caso de duda)
            }
        }
        public override void ActivateOutputChannelsAndGenerateOutputValue()
        {
            var outputValue = double.MaxValue;

            foreach (var inputChannelActive in ListOfInputChannels.Where(inputChannel => inputChannel.IsActive))
            {
                var value = (inputChannelActive.Nijpos - inputChannelActive.Nijneg) * inputChannelActive.Aij / Nii;
                if (value < outputValue)
                {
                    outputValue = value;
                }
            }

            foreach (var outputChannel in ListOfOutputChannels)
            {
                outputChannel.Aij      = outputValue;
                outputChannel.IsActive = outputChannel.Aij >= 0; //el caso =0 es para asegurar la difusión (maximiza la entropía en caso de duda)
            }
        }
示例#6
0
        public override void GetInputDataSync() //Diastole
        {
            var listOfInputChannelsActive = ListOfInputChannels.Where(inputChannel => inputChannel.IsActive == true).ToList();

            if (listOfInputChannelsActive != null)
            {
                foreach (var inputChannelActive in listOfInputChannelsActive)
                {
                    if (inputChannelActive.XCellDestiny == null)
                    {
                        var xCellFuzzyMaster = new XCellFuzzyMaster(inputChannelActive.XCellOrigin.Id, this, ((XCellInput)(inputChannelActive.XCellOrigin)).R);
                        xCellFuzzyMaster.AssignLevel();
                        xCellFuzzyMaster.ListOfInputChannels.Add(inputChannelActive);
                        inputChannelActive.XCellDestiny = xCellFuzzyMaster;
                        ListOfXCellsFuzzyMaster.Add(xCellFuzzyMaster);
                        xCellFuzzyMaster.ORExplodeLayer.ConnectThisLayerWithOutputLayer(this);
                    }
                    inputChannelActive.XCellDestiny.GetInputData();
                }
            }
        }
示例#7
0
        /// <summary>
        /// Hacer la atomización o la autogénesis al leer los datos de entrada para generar la estructura que se usará para hacer SendOutputData
        /// </summary>
        public override void GetInputData() //Diastole
        {
            var splittedIds            = Id.Split('&');
            var concatenatedRestingIDs = string.Empty;
            var idsOfActiveChannels    = string.Empty;

            var listOfActiveChannels = ListOfInputChannels.Where(inputChannel => inputChannel.IsActive).ToList();

            foreach (var inputChannel in listOfActiveChannels)
            {
                var patternToSendToAnXCell = inputChannel.PatternToSendToAnXCell;

                foreach (var splittedId in splittedIds)
                {
                    inputChannel.PatternToSendToAnXCell = inputChannel.PatternToSendToAnXCell.Trim(splittedId.ToCharArray()).Replace("&&", string.Empty);
                }
                if (!string.IsNullOrEmpty(inputChannel.PatternToSendToAnXCell) && !string.IsNullOrEmpty(concatenatedRestingIDs))
                {
                    concatenatedRestingIDs = $"{concatenatedRestingIDs}{inputChannel.PatternToSendToAnXCell}&";
                }

                if (inputChannel.IsActive && !string.IsNullOrEmpty(inputChannel.XCellOrigin.Id) && !string.IsNullOrEmpty(idsOfActiveChannels))
                {
                    idsOfActiveChannels = $"{idsOfActiveChannels}{inputChannel.XCellOrigin.Id}&";
                }
            }
            concatenatedRestingIDs = concatenatedRestingIDs.TrimEnd('&');
            idsOfActiveChannels    = idsOfActiveChannels.TrimEnd('&');

            if (listOfActiveChannels.Count() == ListOfInputChannels.Count()) //Han llegado patrones por todos los canales
            {
                if (concatenatedRestingIDs.Length == 0)                      //Se han eliminado todos los IDs en los InP
                {
                    var kk = 0;
                    //AuxPattern = string.Empty;
                    //AuxIsActive = false;
                    //double minValue = double.MaxValue;
                    //foreach (var inputChannel in ListOfInputChannels)
                    //{
                    //    if (inputChannel.IsActive)
                    //    {
                    //        AuxIsActive = true;
                    //        if (inputChannel.Aij < minValue)
                    //        {
                    //            minValue = inputChannel.Aij;
                    //        }
                    //        if (!string.IsNullOrEmpty(inputChannel.PatternToSendToAnXCell))
                    //        {
                    //            AuxPattern = $"{AuxPattern}{inputChannel.PatternToSendToAnXCell}|";
                    //        }
                    //    }
                    //}
                    //AuxPattern = AuxPattern.TrimEnd('|');
                    //IN = minValue;
                }
                else //Quedan IDs en los InP
                {
                    var splittedConcatenatedRestingIDs = concatenatedRestingIDs.Split('&');
                    var messageWasSent = false;
                    foreach (var outputChannel in ListOfOutputChannels)
                    {
                        foreach (var restingID in splittedConcatenatedRestingIDs)
                        {
                            if (outputChannel.XCellDestiny.Id.Contains(restingID))
                            {
                                //calcular la AND de los valores de entrada y dejar el valor preparado
                                //IN=
                                //foreach
                                messageWasSent = true;
                            }
                        }
                    }
                    if (!messageWasSent)
                    {
                        var kk = 0;
                        //Autogenesis(concatenatedRestingIDs);
                    }
                }
            }
            else //Han llegado patrones sólo por algunos canales
            {
                var kk = 0;
                //Atomice(idsOfActiveChannels);
            }
        }