/// <summary> /// Генерирует ситуацию по неполному заполнению. /// </summary> /// <param name="situation">Исходная ситуация с пустыми полями.</param> /// <param name="situationName">Наименование ситуации в онтологии</param> /// <returns>Заполненная ситуация.</returns> public Situation GenerateSituation(Situation situation, string situationName) { var resultSituation = new SafeSituation(); var relevantNodes = GetRelevantNodes(situation, situationName); if (situation.Agent.Name != EmptyOntologyNode.Name) { resultSituation.Agent = situation.Agent; } else if (relevantNodes.Agents.Any()) { var agentItem = relevantNodes.Agents.ToNodeCollection().GetRandom(); resultSituation.Agent = agentItem; relevantNodes = GetRelevantNodes(relevantNodes, resultSituation, Relations.Agent); } if (situation.Action.Name != EmptyOntologyNode.Name) { resultSituation.Action = situation.Action; } else if (relevantNodes.Actions.Any()) { var actionItem = relevantNodes.Actions.ToNodeCollection().GetRandom(); resultSituation.Action = actionItem; relevantNodes = GetRelevantNodes(relevantNodes, resultSituation, Relations.Action); } if (situation.Object.Name != EmptyOntologyNode.Name) { resultSituation.Object = situation.Object; } else if (relevantNodes.Objects.Any()) { var objectItem = relevantNodes.Objects.ToNodeCollection().GetRandom(); resultSituation.Object = objectItem; relevantNodes = GetRelevantNodes(relevantNodes, resultSituation, Relations.Object); } resultSituation.Locative = situation.Locative.Name != EmptyOntologyNode.Name ? situation.Locative : relevantNodes.Locatives.Any() ? relevantNodes.Locatives.ToNodeCollection().GetRandom() : new EmptyOntologyNode(); return(resultSituation); }
public DangerousSituation GenerateDangerousSituation(SafeSituation safeSituation) { var dangerousSituation = new DangerousSituation(); var nodes = safeSituation .GetNodes() .Where(x => x.FromRelations.Any(y => y.Name == Relations.Affects || y.Name == Relations.APartOf) || x.ToRelations.Any(y => y.Name == Relations.Affects || y.Name == Relations.APartOf) ) .ToNodeCollection(); if (nodes.Count > 0) { var node = nodes.GetRandom(); var relation = node.FromRelations .Union(node.ToRelations) .Where(x => x.Name == Relations.Affects || x.Name == Relations.APartOf) .ToRelationCollection() .GetRandom(); var dangerousNode = OntologyHelper.GetDangerousNode(relation); if (dangerousNode.ToRelations.Any(x => x.Name == Relations.Agent)) { dangerousSituation.Agent = dangerousNode; } if (dangerousNode.ToRelations.Any(x => x.Name == Relations.Action)) { dangerousSituation.Action = dangerousNode; } if (dangerousNode.ToRelations.Any(x => x.Name == Relations.Object)) { dangerousSituation.Object = dangerousNode; } if (dangerousNode.ToRelations.Any(x => x.Name == Relations.Locative)) { dangerousSituation.Locative = dangerousNode; } } return(GenerateSituation(dangerousSituation, Nodes.DangerousSituation).ToDangerousSituation()); }