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) }); }
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); } }
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) }); }
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() }); } }