示例#1
0
        public Link StrengthenLink(Entity entity, List <Pattern> currentPatterns, LinkSeverity severity = LinkSeverity.Weak)
        {
            var strongestPattern = currentPatterns.OrderByDescending(item => item.Length).FirstOrDefault();

            if (strongestPattern == null)
            {
                return(CreateLink(entity, severity));
            }

            var randomGenerator = new Random(DateTime.Now.Millisecond);
            var linkSize        = GetLinkSize(randomGenerator, severity, LinkApplyType.Strengthen);
            var startIndex      = strongestPattern.EndIndex + linkSize <= Settings.SequenceLength - 1 ? strongestPattern.EndIndex + 1 : strongestPattern.StartIndex - linkSize;

            if (startIndex >= 0 && startIndex < Settings.SequenceLength - linkSize - 1)
            {
                for (var i = startIndex; i < startIndex + linkSize; i++)
                {
                    Sequence.Set(i, entity.Sequence.Get(i));
                }
            }

            return(new Link {
                Left = this,
                Right = entity,
                Pattern = SequenceProcessor.CalculateSimillarPatterns(this.Sequence, entity.Sequence, Settings.MinimumPatternLength)
            });
        }
示例#2
0
        private static int GetLinkSize(Random r, LinkSeverity severity, LinkApplyType applyType = LinkApplyType.FirstTime)
        {
            var minSize = applyType == LinkApplyType.FirstTime ? Settings.LinkMinimumSize : Settings.LinkStregtheningMinimumSize;
            var medSize = applyType == LinkApplyType.FirstTime ? Settings.LinkMediumSize : Settings.LinkStregtheningMediumSize;
            var maxSize = applyType == LinkApplyType.FirstTime ? Settings.LinkMaximumSize : Settings.LinkStregtheningMaximumSize;

            switch (severity)
            {
            case LinkSeverity.Weak:
                return(r.Next(minSize, medSize));

            case LinkSeverity.Strong:
                return(r.Next(medSize, maxSize));

            default:
                throw new ArgumentOutOfRangeException(nameof(severity), severity, null);
            }
        }
示例#3
0
        public Link CreateLink(Entity to, LinkSeverity severity = LinkSeverity.Weak)
        {
            if (!Name.Equals(to.Name, StringComparison.InvariantCultureIgnoreCase))
            {
                var randomGenerator = new Random(DateTime.Now.Millisecond);
                var linkSize        = GetLinkSize(randomGenerator, severity);
                var startIndex      = randomGenerator.Next(Settings.SequenceLength - linkSize - 1);

                for (var i = startIndex; i < startIndex + linkSize; i++)
                {
                    Sequence.Set(i, to.Sequence.Get(i));
                }
            }

            return(new Link {
                Left = this,
                Right = to,
                Pattern = SequenceProcessor.CalculateSimillarPatterns(this.Sequence, to.Sequence, Settings.MinimumPatternLength)
            });
        }
示例#4
0
        public static void AddDefinition(Entity entity, string definition, int getDefinitionInvardsUpToLayer = 0, LinkSeverity severity = LinkSeverity.Weak, bool shouldAddAsWisdom = false)
        {
            var sentenceWords = TextProcessor.GetWords(definition);

            foreach (var sentenceWord in sentenceWords)
            {
                if (string.IsNullOrEmpty(sentenceWord))
                {
                    continue;
                }

                //get or create entity for word
                var sentenceWordEntity = GetOrCreate(sentenceWord, getDefinitionInvardsUpToLayer - 1);

                //calculate if a link between entities already exists
                var currentPatterns = SequenceProcessor.CalculateSimillarPatterns(entity.Sequence, sentenceWordEntity.Sequence, Settings.MinimumPatternLength);
                //if link already exists, strengthen
                if (currentPatterns.Any())
                {
                    sentenceWordEntity.StrengthenLink(entity, currentPatterns);
                }
                //else link word to it
                else
                {
                    sentenceWordEntity.CreateLink(entity, severity);
                }
            }

            if (shouldAddAsWisdom)
            {
                Wisdom.Add(new Entity(definition, false)
                {
                    Sequence = (BitArray)entity.Sequence.Clone()
                });
            }
        }