Пример #1
0
        public Project()
        {
            _diagram = null;
            _network = null;
            _path = "";

            _linkMenu = new LinkContextMenu();
            _nodeMenu = new NodeContextMenu();
        }
Пример #2
0
        internal TaleNode(TalesNetwork talesNetwork, string name)
            : base(talesNetwork, name)
        {
            _functionNodes = new TaleFunctionNodeCollection(this);

            //TODO Необходимо разобраться с событиями коллекций. Возможно, они сами должны подписывать сеть.
            //_functionNodes.CollectionChanged += OnNetworkObjectCollectionChanged;
            //_functionNodes.PropertyChanged += OnNetworkObjectPropertyChanged;
        }
        public TextGeneratorContext(TalesNetwork network, string text)
        {
            Contract.Requires<ArgumentNullException>(network != null);
            Contract.Requires<ArgumentException>(!string.IsNullOrEmpty(text));

            Network = network;
            InputText = text;
            ResolvedFunctions = new List<FunctionGenerationInfo>();
            ResolvedPersons = new DistinctCollection<NetworkNode>();
            ResolvedLocatives = new DistinctCollection<NetworkNode>();
            ResolvedActions = new DistinctCollection<NetworkNode>();
            CurrentContextNodes = new DistinctCollection<NetworkNode>();
            Tales = new GenerationCollection();
        }
 public void LoadFromXDocument(XDocument xDoc, TalesNetwork network)
 {
     Gt.Controls.Diagramming.DiagramSerializer serializer =
         new Gt.Controls.Diagramming.DiagramSerializer(_diagram);
     XElement xDiagram = xDoc.Root != null ? xDoc.Root.Element("Gt.Diagram") : null;
     if (xDiagram != null)
     {
         serializer.LoadFromXDocument(xDoc);
         RaiseDiagramLoaded();
     }
     else
     {
         RaiseNeedBuildDiagram();
     }
 }
Пример #5
0
        public NetworkTree()
            : base()
        {
            _network = null;

            _dictionary = Application.LoadComponent(new Uri("/TalesGenerator;component/Themes/Generic.xaml",
                UriKind.Relative)) as ResourceDictionary;

            _infos = new List<TreeItemInfo>();
            _linkMenu = new LinkContextMenu();
            _nodeMenu = new NodeContextMenu();

            _nodeMenu.SelectLinkedNodes += new IntNotifyEventHandler(OnSelectLinkedNodes);

            InUpdate = false;
        }
        public ConsultWindow(TalesNetwork talesNetwork)
            : this()
        {
            Contract.Requires<ArgumentNullException>(talesNetwork != null);

            _talesNetwork = talesNetwork;

            TextAnalyzer textAnalyzer = new TextAnalyzer(AdapterKind.RussianCp1251Adapter);
            textAnalyzer.Load(
                @"Dictionaries\Russian\Dictionary.auto",
                @"Dictionaries\Russian\Paradigms.bin",
                @"Dictionaries\Russian\PredictionDictionary.auto");

            _textGenerator = new TextGenerator(textAnalyzer);

            QuestionTextBox.Focus();
        }
        public ConsultWindow2(TalesNetwork network)
        {
            InitializeComponent();

            _network = network;

            cmbTale.ItemsSource = _network.Tales;
            if (cmbTale.HasItems)
                cmbTale.SelectedIndex = 0;

            TextAnalyzer textAnalyzer = new TextAnalyzer(AdapterKind.RussianCp1251Adapter);
            textAnalyzer.Load(
                @"Dictionaries\Russian\Dictionary.auto",
                @"Dictionaries\Russian\Paradigms.bin",
                @"Dictionaries\Russian\PredictionDictionary.auto");

            _textGenerator = new TextGenerator(textAnalyzer);
        }
Пример #8
0
        public static void Main(string[] args)
        {
            TalesNetwork talesNetwork = CreateNetwork();
            TextAnalyzer textAnalyzer = CreateTextAnalyzer();
            TextGenerator textGenerator = new TextGenerator(textAnalyzer);
            Console.OutputEncoding = Encoding.UTF8;
            bool generateByNetwork = false;

            talesNetwork.SaveToXml().Save(@"C:\Temp\TalesNetwork.xml");

            TalesNetwork loadedNetwork = new TalesNetwork();
            loadedNetwork.LoadFromXml(XDocument.Load(@"C:\Temp\TalesNetwork.xml"));

            if (generateByNetwork)
            {
                string text = textGenerator.GenerateText(loadedNetwork.Tales[1]);
                Console.WriteLine(text);
            }
            else
            {
                File.WriteAllText(@"Output.txt", string.Empty);

                while (true)
                {
                    TextGeneratorContext result = textGenerator.GenerateText(loadedNetwork, File.ReadAllText(@"Input.txt"));

                    if (result != null)
                    {
                        string text = result.OutputText;
                        File.AppendAllText(@"Output.txt", text + Environment.NewLine);
                        Console.WriteLine(text);
                    }

                    Console.WriteLine("Press 'r' to repeat, 'q' to exit.");

                    string input = Console.ReadLine();

                    if (input.ToLower() == "q")
                    {
                        break;
                    }
                }
            }
        }
Пример #9
0
        private static void AnalyzeText(TalesNetwork taleNetwork, TextAnalyzer textAnalyzer, string path)
        {
            string text = File.ReadAllText(path);

            //if (foundFunctionNodes.Count != 0)
            //{
            //    TaleNode taleNode = foundFunctionNodes.First().Tale;
            //    bool areMembersOfTheSameTale = foundFunctionNodes.All(node => node.Tale == taleNode);

            //    if (areMembersOfTheSameTale)
            //    {
            //        TaleNode baseTale = (TaleNode)taleNode.BaseNode;
            //        var scenario = baseTale.Scenario;
            //        //TODO Сценарий необходимо хранить в сети.
            //        //List<FunctionType> scenario = new List<FunctionType>
            //        //{
            //        //    FunctionType.InitialState,
            //        //    FunctionType.Interdiction,
            //        //    FunctionType.Absentation,
            //        //    FunctionType.ViolationOfInterdiction,
            //        //    FunctionType.Sabotage,
            //        //    FunctionType.WoesPost
            //        //};
            //        Dictionary<FunctionType, FunctionNode> scenarioFunctions = new Dictionary<FunctionType, FunctionNode>();

            //        foreach (FunctionType functionType in scenario)
            //        {
            //            FunctionNode foundNode = foundFunctionNodes.SingleOrDefault(node => node.FunctionType == functionType);

            //            if (foundNode != null)
            //            {
            //                scenarioFunctions[functionType] = foundNode;
            //            }
            //            else
            //            {
            //                // TODO Необходимо рассмотреть два случая:
            //                // 1) Вершина не смогла полностью разрезолвиться;
            //                // 2) Вершины нет в сети.
            //                // Хотя, наверное, возможно ограничиться только 2-ым вариантом.

            //                TaleNode baseTaleNode = (TaleNode)taleNode.BaseNode;
            //                FunctionNode baseFunctionNode = baseTaleNode.FunctionNodes.SingleOrDefault(node => node.FunctionType == functionType);

            //                if (baseFunctionNode != null)
            //                {
            //                    // В случае, когда в базовой сказке нашлась функциональная вершина с искомым типом, необходимо сделать следующее:
            //                    // 1) Необходимо определить недостающий контекст, т.е. найти те контекстные вершины (агент, реципиент и т.п.),
            //                    //    которых не хватает для успешной генерации текста.
            //                    // 2) Найти дочерние вершины найденных вершин, относящиеся к текущей сказке.

            //                    TemplateParserResult baseNodeParserResult = resolvedNodes[baseFunctionNode];
            //                    TemplateParserDictionaryContext parserContext = new TemplateParserDictionaryContext();

            //                    if (baseNodeParserResult.UnresolvedContext.Any())
            //                    {
            //                        foreach (NetworkEdgeType unresolvedEdgeType in baseNodeParserResult.UnresolvedContext)
            //                        {
            //                            var baseNodes = baseFunctionNode.OutgoingEdges.GetEdges(unresolvedEdgeType, false).Select(edge => edge.EndNode);

            //                            foreach (NetworkNode baseNode in baseNodes)
            //                            {
            //                                NetworkEdge isAEdge = baseNode.IncomingEdges.GetEdge(NetworkEdgeType.IsA);

            //                                if (isAEdge != null)
            //                                {
            //                                    NetworkNode childNode = isAEdge.StartNode;

            //                                    if (childNode != null)
            //                                    {

            //                                    }
            //                                }
            //                            }
            //                        }
            //                    }
            //                    else
            //                    {

            //                        NetworkNode agentNode = baseFunctionNode.Agents.First();
            //                        //bool found = false;

            //                        NetworkEdge isAEdge = agentNode.IncomingEdges.GetEdge(NetworkEdgeType.IsA);
            //                        //NetworkEdge

            //                        if (isAEdge != null)
            //                        {
            //                            NetworkNode childNode = isAEdge.StartNode;

            //                            if (taleAgents.Any(node => node.BaseNode == childNode))
            //                            {
            //                                parserContext.Add(NetworkEdgeType.Agent, childNode);
            //                            }

            //                            //parserContext.Add(NetworkEdgeType.Agent
            //                        }
            //                    }
            //                }
            //                else
            //                {
            //                    throw new NotImplementedException();
            //                }
            //            }
            //        }
            //    }
            //    else
            //    {
            //        throw new NotImplementedException();
            //    }
            //}
        }
 public void SetNetwork(TalesNetwork network)
 {
     NetworkObjectsTree.CurrentNetwork = network;
 }
Пример #11
0
 public LinkContextMenu(TalesNetwork network = null)
     : base(network)
 {
 }
Пример #12
0
 internal TaleItemEdge(TalesNetwork talesNetwork)
     : base(talesNetwork)
 {
 }
Пример #13
0
 public NodeContextMenu(TalesNetwork network = null)
     : base(network)
 {
 }
Пример #14
0
        /// <summary>
        /// Загрузить проект
        /// </summary>
        public void Load()
        {
            if (Path == "")
                throw new ArgumentException("Path");
            XDocument xDoc = XDocument.Load(_path);

            _network = new TalesNetwork();
            _network.LoadFromXml(xDoc);

            _linkMenu.Network = Network;
            _nodeMenu.Network = Network;

            DiagramSerializer diagSr = new DiagramSerializer(_diagram);
            diagSr.NodeAdded += new DiagramItemEventHandler(NodeAdded);
            diagSr.LinkAdded += new DiagramItemEventHandler(LinkAdded);
            diagSr.DiagramLoaded += new NotifyEventHandler(UpdateDiagramStyle);
            diagSr.NeedBuildDiagram += new NotifyEventHandler(RebuildDiagram);
            diagSr.LoadFromXDocument(xDoc, _network);
        }
 protected TaleBaseItemNode(TalesNetwork talesNetwork)
     : base(talesNetwork)
 {
 }
Пример #16
0
        private static TalesNetwork CreateNetwork()
        {
            TalesNetwork talesNetwork = new TalesNetwork();
            TaleItemNode positivePersonNode = talesNetwork.Persons.Add("Положительный персонаж");
            TaleItemNode negativePersonNode = talesNetwork.Persons.Add("Отрицательный персонаж");
            TaleItemNode parentsNode = talesNetwork.Persons.Add("Родители", positivePersonNode);
            TaleItemNode heroNode = talesNetwork.Persons.Add("Герой", positivePersonNode);
            TaleItemNode donorNode = talesNetwork.Persons.Add("Испытатель", positivePersonNode);
            TaleItemNode seekingPersonNode = talesNetwork.Persons.Add("Искомый персонаж", positivePersonNode);
            TaleItemNode antagonistNode = talesNetwork.Persons.Add("Злодей", negativePersonNode);

            #region Scenario Tale

            TaleNode scenarioTaleNode = talesNetwork.Tales.Add("Сказка-сценарий");

            FunctionNode initialStateNode = scenarioTaleNode.Functions.Add("Начальная ситуация", FunctionType.InitialState);
            initialStateNode.Template = "{Action} {agents}.";
            initialStateNode.Actions.Add(talesNetwork.Actions.Add("Жили-были"));
            initialStateNode.Agents.Add(heroNode);

            FunctionNode interdictionNode = scenarioTaleNode.Functions.Add("Запрет", FunctionType.Interdiction);
            interdictionNode.Template = "{Agent} {~сказал:agent}: \"{Recipient}, {action}.\"";
            interdictionNode.Actions.Add(talesNetwork.Actions.Add("Не уходить"));
            interdictionNode.Agents.Add(parentsNode);
            interdictionNode.Recipients.Add(heroNode);

            FunctionNode absentationNode = scenarioTaleNode.Functions.Add("Отлучка старших", FunctionType.Absentation);
            absentationNode.Template = "{Agents} {action}.";
            absentationNode.Actions.Add(talesNetwork.Actions.Add("Уйти"));
            absentationNode.Agents.Add(parentsNode);

            FunctionNode violationOfInterdictionNode = scenarioTaleNode.Functions.Add("Нарушение запрета", FunctionType.ViolationOfInterdiction);
            violationOfInterdictionNode.Template = "{Agent} {action}.";
            violationOfInterdictionNode.Actions.Add(talesNetwork.Actions.Add("Нарушить запрет"));
            violationOfInterdictionNode.Agents.Add(heroNode);

            FunctionNode villainyNode = scenarioTaleNode.Functions.Add("Вредительство", FunctionType.Villainy);
            villainyNode.Template = "{Agent} {action} {recipient}.";
            villainyNode.Actions.Add(talesNetwork.Actions.Add("Похитить"));
            villainyNode.Agents.Add(antagonistNode);
            villainyNode.Recipients.Add(seekingPersonNode);

            FunctionNode mediationNode = scenarioTaleNode.Functions.Add("Сообщение беды", FunctionType.Mediation);
            mediationNode.Template = "{Agent} {action} {recipient}.";
            mediationNode.Actions.Add(talesNetwork.Actions.Add("Обнаружить пропажу"));
            mediationNode.Agents.Add(heroNode);
            mediationNode.Recipients.Add(seekingPersonNode);

            FunctionNode departureNode = scenarioTaleNode.Functions.Add("Отправка на поиски", FunctionType.Departure);
            departureNode.Template = "{Agent} {action}.";
            departureNode.Actions.Add(talesNetwork.Actions.Add("Отправиться на поиски"));
            departureNode.Agents.Add(heroNode);

            FunctionNode donorMeeting = scenarioTaleNode.Functions.Add("Встреча с испытателем", FunctionType.DonorMeeting);
            donorMeeting.Template = "{Agent} {action} {recipient}.";
            donorMeeting.Actions.Add(talesNetwork.Actions.Add("Встретить"));
            donorMeeting.Agents.Add(heroNode);
            donorMeeting.Recipients.Add(donorNode);

            FunctionNode testNode = scenarioTaleNode.Functions.Add("Испытание", FunctionType.Test);
            testNode.Template = "{Agent} {action} {recipient}";
            testNode.Actions.Add(talesNetwork.Actions.Add("Испытать"));
            testNode.Agents.Add(donorNode);
            testNode.Recipients.Add(heroNode);

            FunctionNode testAttemptNode = scenarioTaleNode.Functions.Add("Попытка пройти испытание", FunctionType.TestAttempt);
            testAttemptNode.Template = "{Agent} {action} {recipient}.";
            testAttemptNode.Actions.Add(talesNetwork.Actions.Add("Отказать"));
            testAttemptNode.Agents.Add(heroNode);
            testAttemptNode.Recipients.Add(donorNode);

            FunctionNode testResultNode = scenarioTaleNode.Functions.Add("Результат испытания", FunctionType.TestResult);
            testResultNode.Template = "{Agent} {action} {recipient}.";
            testResultNode.Actions.Add(talesNetwork.Actions.Add("Сказать"));
            testResultNode.Agents.Add(donorNode);
            testResultNode.Recipients.Add(heroNode);

            //NetworkNode antagonistHomeNode = network.Nodes.Add("Жилище антагониста");
            //NetworkNode antagonistHomeTemplateNode = network.Nodes.Add("{Agent} {action} {recipient}.");
            //NetworkNode antagonistHomeActionNode = network.Nodes.Add("Увидеть");
            //network.Edges.Add(antagonistHomeNode, antagonistHomeTemplateNode, NetworkEdgeType.Template);
            //network.Edges.Add(antagonistHomeNode, antagonistHomeActionNode, NetworkEdgeType.Action);

            //NetworkNode antagonistMeetingNode = network.Nodes.Add("Облик антагониста");
            //NetworkNode antagonistMeetingTemplateNode = network.Nodes.Add("{Agent} {action} {recipient}.");
            //NetworkNode antagonistMeetingActionNode = network.Nodes.Add("Увидеть");
            //network.Edges.Add(antagonistMeetingNode, antagonistMeetingTemplateNode, NetworkEdgeType.Template);
            //network.Edges.Add(antagonistMeetingNode, antagonistMeetingActionNode, NetworkEdgeType.Action);
            //network.Edges.Add(antagonistMeetingNode, girlNode, NetworkEdgeType.Agent);
            //network.Edges.Add(antagonistMeetingNode, babaYagaNode, NetworkEdgeType.Recipient);

            //NetworkNode desiredCharacterAppearanceNode = network.Nodes.Add("Появление искомого персонажа");
            //NetworkNode desiredCharacterAppearanceTemplateNode = network.Nodes.Add("{Agent} {action} {recipient}.");
            //NetworkNode desiredCharacterAppearanceActionNode = network.Nodes.Add("Увидеть");
            //network.Edges.Add(desiredCharacterAppearanceNode, desiredCharacterAppearanceTemplateNode, NetworkEdgeType.Template);
            //network.Edges.Add(desiredCharacterAppearanceNode, desiredCharacterAppearanceActionNode, NetworkEdgeType.Action);

            //NetworkNode desiredCharacterLiberationNode = network.Nodes.Add("Добыча искомого персонажа с применением хитрости или силы");
            //NetworkNode desiredCharacterLiberationTemplateNode = network.Nodes.Add("{Agent} {action} {recipient}.");
            //NetworkNode desiredCharacterLiberationActionNode = network.Nodes.Add("Схватить и унести");
            //network.Edges.Add(desiredCharacterLiberationNode, desiredCharacterLiberationTemplateNode, NetworkEdgeType.Template);
            //network.Edges.Add(desiredCharacterLiberationNode, desiredCharacterLiberationActionNode, NetworkEdgeType.Action);

            //NetworkNode persecutionBeginningNode = network.Nodes.Add("Начало преследования");
            //NetworkNode persecutionBeginningTemplateNode = network.Nodes.Add("{Agent} {action} {recipient}.");
            //NetworkNode persecutionBeginningActionNode = network.Nodes.Add("Начать преследовать");
            //network.Edges.Add(persecutionBeginningNode, persecutionBeginningTemplateNode, NetworkEdgeType.Template);
            //network.Edges.Add(persecutionBeginningNode, persecutionBeginningActionNode, NetworkEdgeType.Action);
            #endregion

            #region Сказка "Гуси-лебеди"

            TaleNode geeseTaleNode = talesNetwork.Tales.Add("Сказка \"Гуси-лебеди\"", scenarioTaleNode);
            TaleItemNode grandMotherNode = talesNetwork.Persons.Add("Старушка", parentsNode);
            TaleItemNode grandFatherNode = talesNetwork.Persons.Add("Старичок", parentsNode);
            TaleItemNode girlNode = talesNetwork.Persons.Add("Девочка", heroNode);
            TaleItemNode boyNode = talesNetwork.Persons.Add("Мальчик", seekingPersonNode);
            TaleItemNode geeseNode = talesNetwork.Persons.Add("Гуси-лебеди", antagonistNode, Grammem.Plural);
            TaleItemNode stoveNode = talesNetwork.Persons.Add("Печка", donorNode);
            TaleItemNode appleTreeNode = talesNetwork.Persons.Add("Яблоня", donorNode);
            TaleItemNode riverNode = talesNetwork.Persons.Add("Река", donorNode);
            TaleItemNode babaYagaNode = talesNetwork.Persons.Add("Баба-Яга", antagonistNode);
            TaleItemNode cabinOnChickenLegsNode = talesNetwork.Persons.Add("Избушка на курьих ножках", negativePersonNode);

            FunctionNode gtInitialStateNode = geeseTaleNode.Functions.Add("Сказка \"Гуси-лебеди\". Начальная ситуация", initialStateNode);
            gtInitialStateNode.Template = "{Action} {agent0}, {agent1}; у них {~был:agent2} {agent2}, да {~маленький:agent3} {agent3}.";
            gtInitialStateNode.Agents.Add(grandMotherNode, grandFatherNode, girlNode, boyNode);

            FunctionNode gtInterdictionNode = geeseTaleNode.Functions.Add("Сказка \"Гуси-лебеди\". Запрет", interdictionNode);
            gtInterdictionNode.Template = "\"{Recipient}, {recipient}, - {~говорить:agent} {agent}, - мы пойдем на работу, принесем тебе булочку, сошьем платьице, купим платочек: только {action}.\"";
            // TODO: Ошибки генератора. Неправильно определяется время.
            gtInterdictionNode.Actions.Add(talesNetwork.Actions.Add("Не уходить со двора"));
            gtInterdictionNode.Agents.Add(grandMotherNode);
            gtInterdictionNode.Recipients.Add(girlNode);

            FunctionNode gtAbsentationNode = geeseTaleNode.Functions.Add("Сказка \"Гуси-лебеди\". Отлучка старших", absentationNode);
            gtAbsentationNode.Agents.Add(grandMotherNode, grandFatherNode);

            FunctionNode gtViolationOfInterdictionNode = geeseTaleNode.Functions.Add("Сказка \"Гуси-лебеди\". Нарушение запрета", violationOfInterdictionNode);
            gtViolationOfInterdictionNode.Template = "А {agent} {action} про запрет, {~посадил:agent} {recipient} на травку под окошко, а {~сам:agent} {~побежал:agent} на улицу.";
            gtViolationOfInterdictionNode.Actions.Add(talesNetwork.Actions.Add("Забыть"));
            gtViolationOfInterdictionNode.Agents.Add(girlNode);
            gtViolationOfInterdictionNode.Recipients.Add(boyNode);

            FunctionNode gtVillainyNode = geeseTaleNode.Functions.Add("Сказка \"Гуси-лебеди\". Вредительство", villainyNode);
            gtVillainyNode.Template = "{Agent} {action0}, {action1} {recipient}, {action2}.";
            gtVillainyNode.Actions.Add(talesNetwork.Actions.Add("Налететь"), talesNetwork.Actions.Add("Подхватить"), talesNetwork.Actions.Add("Унести"));
            gtVillainyNode.Agents.Add(geeseNode);
            gtVillainyNode.Recipients.Add(boyNode);

            FunctionNode gtMediationNode = geeseTaleNode.Functions.Add("Сказка \"Гуси-лебеди\". Сообщение беды", mediationNode);
            gtMediationNode.Template = "{Agent} {action}, глядь - {recipient} нету.";
            gtMediationNode.Actions.Add(talesNetwork.Actions.Add("Прийти"));
            gtMediationNode.Agents.Add(girlNode);
            gtMediationNode.Recipients.Add(boyNode);

            FunctionNode gtDepartureNode = geeseTaleNode.Functions.Add("Сказка \"Гуси-лебеди\". Отправка на поиски", departureNode);
            gtDepartureNode.Template = "Тогда {agent} {action} {recipient}.";
            gtDepartureNode.Actions.Add(talesNetwork.Actions.Add("Отправилась на поиски"));
            gtDepartureNode.Agents.Add(girlNode);
            gtDepartureNode.Recipients.Add(boyNode);

            FunctionNode gtFirstDonorMeetingNode = geeseTaleNode.Functions.Add("Сказка \"Гуси-лебеди\". Встреча с первым испытателем", donorMeeting);
            gtFirstDonorMeetingNode.Template = "{Agent} {action0}, {action0}. {Recipient0} стоит. {Agent} {~спросить:agent}: \"{Recipient0}, {recipient0}, куда {recipient1} {action1}?\"";
            gtFirstDonorMeetingNode.Actions.Add(talesNetwork.Actions.Add("Бежать"), talesNetwork.Actions.Add("Полететь"));
            gtFirstDonorMeetingNode.Agents.Add(girlNode);
            gtFirstDonorMeetingNode.Recipients.Add(stoveNode, geeseNode);

            FunctionNode gtFirstTestNode = geeseTaleNode.Functions.Add("Сказка \"Гуси-лебеди\". Первое испытание", testNode);
            gtFirstTestNode.Template = "{Agent} {action} {recipient}: \"Съешь моего ржаного пирожка - скажу.\"";
            gtFirstTestNode.Actions.Add(talesNetwork.Actions.Add("Сказать"));
            gtFirstTestNode.Agents.Add(stoveNode);
            gtFirstTestNode.Recipients.Add(girlNode);

            FunctionNode gtFirstTestAttempt = geeseTaleNode.Functions.Add("Сказка \"Гуси-лебеди\". Попытка пройти первое испытание", testAttemptNode);
            gtFirstTestAttempt.Template = "{Agent} {action} {recipient}: \"О, у моего батюшки пшеничные не едятся\".";
            gtFirstTestAttempt.Actions.Add(talesNetwork.Actions.Add("Ответить"));
            gtFirstTestAttempt.Agents.Add(girlNode);
            gtFirstTestAttempt.Recipients.Add(stoveNode);

            FunctionNode gtFirstTestResult = geeseTaleNode.Functions.Add("Сказка \"Гуси-лебеди\". Результат первого испытания", testResultNode);
            gtFirstTestResult.Actions.Add(talesNetwork.Actions.Add("Не сказать"));
            gtFirstTestResult.Agents.Add(stoveNode);
            gtFirstTestResult.Recipients.Add(girlNode);

            //FunctionNode gtFirstTesterMeetingNode = geeseTaleNode.FunctionNodes.Add("Сказка \"Гуси-лебеди\". Встреча с испытателем", testerMeetingNode);
            //network.Edges.Add(gtFirstTesterMeetingNode, testerMeetingNode, NetworkEdgeType.IsA);
            //network.Edges.Add(gtFirstTesterMeetingNode, girlNode, NetworkEdgeType.Agent);
            //network.Edges.Add(gtFirstTesterMeetingNode, stoveNode, NetworkEdgeType.Recipient);
            //

            //NetworkNode gtFirstTestNode = network.Nodes.Add("Испытание");
            //network.Edges.Add(gtFirstTestNode, testNode, NetworkEdgeType.IsA);
            //network.Edges.Add(gtFirstTestNode, stoveNode, NetworkEdgeType.Agent);

            //NetworkNode gtFirstTestAttemptNode = network.Nodes.Add("Попытка пройти испытание");
            //network.Edges.Add(gtFirstTestAttemptNode, testAttemptNode, NetworkEdgeType.IsA);
            //network.Edges.Add(gtFirstTestAttemptNode, girlNode, NetworkEdgeType.Agent);
            //network.Edges.Add(gtFirstTestAttemptNode, stoveNode, NetworkEdgeType.Recipient);

            //NetworkNode gtFirstTestResultNode = network.Nodes.Add("Результат испытания");
            //network.Edges.Add(gtFirstTestResultNode, testResultNode, NetworkEdgeType.IsA);
            //network.Edges.Add(gtFirstTestResultNode, stoveNode, NetworkEdgeType.Agent);
            //network.Edges.Add(gtFirstTestResultNode, girlNode, NetworkEdgeType.Recipient);

            //NetworkNode gtSecondTesterMeetingNode = network.Nodes.Add("Встреча с испытателем");
            //network.Edges.Add(gtSecondTesterMeetingNode, testerMeetingNode, NetworkEdgeType.IsA);
            //network.Edges.Add(gtSecondTesterMeetingNode, girlNode, NetworkEdgeType.Agent);
            //network.Edges.Add(gtSecondTesterMeetingNode, appleTreeNode, NetworkEdgeType.Recipient);

            //NetworkNode gtSecondTestNode = network.Nodes.Add("Испытание");
            //network.Edges.Add(gtSecondTestNode, testNode, NetworkEdgeType.IsA);
            //network.Edges.Add(gtSecondTestNode, appleTreeNode, NetworkEdgeType.Agent);

            //NetworkNode gtSecondTestAttemptNode = network.Nodes.Add("Попытка пройти испытание");
            //network.Edges.Add(gtSecondTestAttemptNode, testAttemptNode, NetworkEdgeType.IsA);
            //network.Edges.Add(gtSecondTestAttemptNode, girlNode, NetworkEdgeType.Agent);
            //network.Edges.Add(gtSecondTestAttemptNode, appleTreeNode, NetworkEdgeType.Recipient);

            //NetworkNode gtSecondTestFailNode = network.Nodes.Add("Результат испытания");
            //network.Edges.Add(gtSecondTestFailNode, testResultNode, NetworkEdgeType.IsA);
            //network.Edges.Add(gtSecondTestFailNode, appleTreeNode, NetworkEdgeType.Agent);
            //network.Edges.Add(gtSecondTestFailNode, girlNode, NetworkEdgeType.Recipient);

            //NetworkNode gtThirdTesterMeetingNode = network.Nodes.Add("Встреча с испытателем");
            //network.Edges.Add(gtThirdTesterMeetingNode, testerMeetingNode, NetworkEdgeType.IsA);
            //network.Edges.Add(gtThirdTesterMeetingNode, girlNode, NetworkEdgeType.Agent);
            //network.Edges.Add(gtThirdTesterMeetingNode, riverNode, NetworkEdgeType.Recipient);

            //NetworkNode gtThirdTestNode = network.Nodes.Add("Испытание");
            //network.Edges.Add(gtThirdTestNode, testNode, NetworkEdgeType.IsA);
            //network.Edges.Add(gtThirdTestNode, riverNode, NetworkEdgeType.Agent);

            //NetworkNode gtThirdTestAttemptNode = network.Nodes.Add("Попытка пройти испытание");
            //network.Edges.Add(gtThirdTestAttemptNode, testAttemptNode, NetworkEdgeType.IsA);
            //network.Edges.Add(gtThirdTestAttemptNode, girlNode, NetworkEdgeType.Agent);
            //network.Edges.Add(gtThirdTestAttemptNode, riverNode, NetworkEdgeType.Recipient);

            //NetworkNode gtThirdTestFailNode = network.Nodes.Add("Результат испытания");
            //network.Edges.Add(gtThirdTestFailNode, testResultNode, NetworkEdgeType.IsA);
            //network.Edges.Add(gtThirdTestFailNode, riverNode, NetworkEdgeType.Agent);
            //network.Edges.Add(gtThirdTestFailNode, girlNode, NetworkEdgeType.Recipient);

            //NetworkNode fourthTesterMeetingNode = network.Nodes.Add("Встреча с испытателем");
            //NetworkNode fourthTesterMeetingTemplateNode = network.Nodes.Add("{Agent} {action} {recipient}.");
            //NetworkNode fourthTesterMeetingActionNode = network.Nodes.Add("Встретить");
            //network.Edges.Add(fourthTesterMeetingNode, thirdTesterMeetingTemplateNode, NetworkEdgeType.Template);
            //network.Edges.Add(fourthTesterMeetingNode, thirdTesterMeetingActionNode, NetworkEdgeType.Action);
            //network.Edges.Add(fourthTesterMeetingNode, girlNode, NetworkEdgeType.Agent);
            //network.Edges.Add(fourthTesterMeetingNode, riverNode, NetworkEdgeType.Recipient);

            //NetworkNode fourthTestNode = network.Nodes.Add("Испытание");
            //NetworkNode fourthTestTemplateNode = network.Nodes.Add("{Agent} {~сказал:agent}: \"Поешь моего простого киселька с молочком - скажу.\".");
            //NetworkNode fourthTestActionNode = network.Nodes.Add("Встретить");
            //network.Edges.Add(fourthTestNode, thirdTestTemplateNode, NetworkEdgeType.Template);
            //network.Edges.Add(fourthTestNode, thirdTestActionNode, NetworkEdgeType.Action);
            //network.Edges.Add(fourthTestNode, riverNode, NetworkEdgeType.Agent);

            //NetworkNode fourthTestAttemptNode = network.Nodes.Add("Попытка пройти испытание");
            ////TODO В этом случае ответил не определяется как сказуемое.
            //NetworkNode fourthTestAttemptTemplateNode = network.Nodes.Add("{Agent} {~ответил:agent} {recipient}: \"У моего батюшки и сливочки не едятся...\".");
            //NetworkNode fourthTestAttemptActionNode = network.Nodes.Add("Встретить");
            //network.Edges.Add(fourthTestAttemptNode, secondTestAttemptTemplateNode, NetworkEdgeType.Template);
            //network.Edges.Add(fourthTestAttemptNode, secondTestAttemptActionNode, NetworkEdgeType.Action);
            //network.Edges.Add(fourthTestAttemptNode, girlNode, NetworkEdgeType.Agent);
            //network.Edges.Add(fourthTestAttemptNode, riverNode, NetworkEdgeType.Recipient);

            //NetworkNode fourthTestFailNode = network.Nodes.Add("Результат испытания");
            ////TODO В этом случае ответил не определяется как сказуемое.
            //NetworkNode fourthTestFailTemplateNode = network.Nodes.Add("{Agent} не {action} {recipient}.");
            //NetworkNode fourthTestFailActionNode = network.Nodes.Add("Сказать");
            //network.Edges.Add(fourthTestFailNode, thirdTestFailTemplateNode, NetworkEdgeType.Template);
            //network.Edges.Add(fourthTestFailNode, thirdTestFailActionNode, NetworkEdgeType.Action);
            //network.Edges.Add(fourthTestFailNode, riverNode, NetworkEdgeType.Agent);
            //network.Edges.Add(fourthTestFailNode, girlNode, NetworkEdgeType.Recipient);

            //NetworkNode gtAntagonistHomeNode = network.Nodes.Add("Жилище антагониста");
            //network.Edges.Add(gtAntagonistHomeNode, antagonistHomeNode, NetworkEdgeType.IsA);
            //network.Edges.Add(gtAntagonistHomeNode, girlNode, NetworkEdgeType.Agent);
            //network.Edges.Add(gtAntagonistHomeNode, cabinOnChickenLegsNode, NetworkEdgeType.Recipient);

            //NetworkNode gtAntagonistMeetingNode = network.Nodes.Add("Облик антагониста");
            //network.Edges.Add(gtAntagonistMeetingNode, antagonistMeetingNode, NetworkEdgeType.IsA);
            //network.Edges.Add(gtAntagonistMeetingNode, girlNode, NetworkEdgeType.Agent);
            //network.Edges.Add(gtAntagonistMeetingNode, babaYagaNode, NetworkEdgeType.Recipient);

            //NetworkNode gtDesiredCharacterAppearanceNode = network.Nodes.Add("Появление искомого персонажа");
            //network.Edges.Add(gtDesiredCharacterAppearanceNode, desiredCharacterAppearanceNode, NetworkEdgeType.IsA);
            //network.Edges.Add(gtDesiredCharacterAppearanceNode, girlNode, NetworkEdgeType.Agent);
            //network.Edges.Add(gtDesiredCharacterAppearanceNode, boyNode, NetworkEdgeType.Recipient);

            //NetworkNode gtDesiredCharacterLiberationNode = network.Nodes.Add("Добыча искомого персонажа с применением хитрости или силы");
            //network.Edges.Add(gtDesiredCharacterLiberationNode, desiredCharacterLiberationNode, NetworkEdgeType.IsA);
            //network.Edges.Add(gtDesiredCharacterLiberationNode, girlNode, NetworkEdgeType.Agent);
            //network.Edges.Add(gtDesiredCharacterLiberationNode, boyNode, NetworkEdgeType.Recipient);

            //NetworkNode gtPersecutionBeginningNode = network.Nodes.Add("Начало преследования");
            //network.Edges.Add(gtPersecutionBeginningNode, persecutionBeginningNode, NetworkEdgeType.IsA);
            //network.Edges.Add(gtPersecutionBeginningNode, geeseNode, NetworkEdgeType.Agent);
            //network.Edges.Add(gtPersecutionBeginningNode, girlNode, NetworkEdgeType.Recipient);

            ////TODO Необходимо дублировать данные вершины, в противном случае будет цикл.
            //NetworkNode gtThirdTesterMeeting2Node = network.Nodes.Add("Встреча с испытателем");
            //network.Edges.Add(gtThirdTesterMeeting2Node, testerMeetingNode, NetworkEdgeType.IsA);
            //network.Edges.Add(gtThirdTesterMeeting2Node, girlNode, NetworkEdgeType.Agent);
            //network.Edges.Add(gtThirdTesterMeeting2Node, riverNode, NetworkEdgeType.Recipient);

            //NetworkNode gtThirdTest2Node = network.Nodes.Add("Испытание");
            //network.Edges.Add(gtThirdTest2Node, testNode, NetworkEdgeType.IsA);
            //network.Edges.Add(gtThirdTest2Node, riverNode, NetworkEdgeType.Agent);

            //NetworkNode gtThirdTestAttempt2Node = network.Nodes.Add("Попытка пройти испытание");
            //network.Edges.Add(gtThirdTestAttempt2Node, testAttemptNode, NetworkEdgeType.IsA);
            //network.Edges.Add(gtThirdTestAttempt2Node, girlNode, NetworkEdgeType.Agent);
            //network.Edges.Add(gtThirdTestAttempt2Node, riverNode, NetworkEdgeType.Recipient);

            //NetworkNode gtThirdTestSuccessNode = network.Nodes.Add("Результат испытания");
            ////TODO Непонятно, как представлять данное предложение.
            //NetworkNode thirdTestSuccessTemplateNode = network.Nodes.Add("{Agent} укрыла ее под кисельным бережком. Гуси-лебеди не увидали, пролетели мимо.");
            //NetworkNode thirdTestSuccessActionNode = network.Nodes.Add("Сказать");
            //network.Edges.Add(gtThirdTestSuccessNode, thirdTestSuccessTemplateNode, NetworkEdgeType.Template);
            //network.Edges.Add(gtThirdTestSuccessNode, thirdTestSuccessActionNode, NetworkEdgeType.Action);
            //network.Edges.Add(gtThirdTestSuccessNode, riverNode, NetworkEdgeType.Agent);
            //network.Edges.Add(gtThirdTestSuccessNode, girlNode, NetworkEdgeType.Recipient);

            //NetworkNode secondTesterMeeting2Node = network.Nodes.Add("Встреча с испытателем");
            //NetworkNode secondTesterMeeting2TemplateNode = network.Nodes.Add("{Agent} {action} {recipient}.");
            //NetworkNode secondTesterMeeting2ActionNode = network.Nodes.Add("Встретить");
            //network.Edges.Add(secondTesterMeeting2Node, secondTesterMeeting2TemplateNode, NetworkEdgeType.Template);
            //network.Edges.Add(secondTesterMeeting2Node, secondTesterMeeting2ActionNode, NetworkEdgeType.Action);
            //network.Edges.Add(secondTesterMeeting2Node, girlNode, NetworkEdgeType.Agent);
            //network.Edges.Add(secondTesterMeeting2Node, appleTreeNode, NetworkEdgeType.Recipient);

            //NetworkNode secondTest2Node = network.Nodes.Add("Испытание");
            //NetworkNode secondTest2TemplateNode = network.Nodes.Add("{Agent} {~сказал:agent}: \"Поешь моего лесного яблочка - скажу.\".");
            //NetworkNode secondTest2ActionNode = network.Nodes.Add("Встретить");
            //network.Edges.Add(secondTest2Node, secondTest2TemplateNode, NetworkEdgeType.Template);
            //network.Edges.Add(secondTest2Node, secondTest2ActionNode, NetworkEdgeType.Action);
            //network.Edges.Add(secondTest2Node, appleTreeNode, NetworkEdgeType.Agent);

            //NetworkNode secondTestAttempt2Node = network.Nodes.Add("Попытка пройти испытание");
            ////TODO В этом случае ответил не определяется как сказуемое.
            //NetworkNode secondTestAttempt2TemplateNode = network.Nodes.Add("{Agent} {~ответил:agent} {recipient}: \"У моего батюшки и садовые не едятся...\".");
            //NetworkNode secondTestAttempt2ActionNode = network.Nodes.Add("Встретить");
            //network.Edges.Add(secondTestAttempt2Node, secondTestAttempt2TemplateNode, NetworkEdgeType.Template);
            //network.Edges.Add(secondTestAttempt2Node, secondTestAttempt2ActionNode, NetworkEdgeType.Action);
            //network.Edges.Add(secondTestAttempt2Node, girlNode, NetworkEdgeType.Agent);
            //network.Edges.Add(secondTestAttempt2Node, appleTreeNode, NetworkEdgeType.Recipient);

            //NetworkNode secondTestSuccessNode = network.Nodes.Add("Результат испытания");
            ////TODO В этом случае ответил не определяется как сказуемое.
            //NetworkNode secondTestSuccessTemplateNode = network.Nodes.Add("{Agent} не сказала {recipient}.");
            //NetworkNode secondTestSuccessActionNode = network.Nodes.Add("Сказать");
            //network.Edges.Add(secondTestSuccessNode, secondTestSuccessTemplateNode, NetworkEdgeType.Template);
            //network.Edges.Add(secondTestSuccessNode, secondTestSuccessActionNode, NetworkEdgeType.Action);
            //network.Edges.Add(secondTestSuccessNode, appleTreeNode, NetworkEdgeType.Agent);
            //network.Edges.Add(secondTestSuccessNode, girlNode, NetworkEdgeType.Recipient);

            //NetworkNode firstTesterMeeting2Node = network.Nodes.Add("Встреча с испытателем");
            //NetworkNode firstTesterMeeting2TemplateNode = network.Nodes.Add("{Agent} {action} {recipient}.");
            //NetworkNode firstTesterMeeting2ActionNode = network.Nodes.Add("Встретить");
            //network.Edges.Add(firstTesterMeeting2Node, firstTesterMeeting2TemplateNode, NetworkEdgeType.Template);
            //network.Edges.Add(firstTesterMeeting2Node, firstTesterMeeting2ActionNode, NetworkEdgeType.Action);
            //network.Edges.Add(firstTesterMeeting2Node, girlNode, NetworkEdgeType.Agent);
            //network.Edges.Add(firstTesterMeeting2Node, stoveNode, NetworkEdgeType.Recipient);

            //NetworkNode firstTest2Node = network.Nodes.Add("Испытание");
            //NetworkNode firstTest2TemplateNode = network.Nodes.Add("{Agent} {~сказал:agent}: \"Съешь моего ржаного пирожка - скажу\".");
            //NetworkNode firstTest2ActionNode = network.Nodes.Add("Встретить");
            //network.Edges.Add(firstTest2Node, firstTest2TemplateNode, NetworkEdgeType.Template);
            //network.Edges.Add(firstTest2Node, firstTest2ActionNode, NetworkEdgeType.Action);
            //network.Edges.Add(firstTest2Node, stoveNode, NetworkEdgeType.Agent);

            //NetworkNode firstTestAttempt2Node = network.Nodes.Add("Попытка пройти испытание");
            ////TODO В этом случае ответил не определяется как сказуемое.
            //NetworkNode firstTestAttempt2TemplateNode = network.Nodes.Add("{Agent} {~ответил:agent} {recipient}: \"О, у моего батюшки пшеничные не едятся\".");
            //NetworkNode firstTestAttempt2ActionNode = network.Nodes.Add("Встретить");
            //network.Edges.Add(firstTestAttempt2Node, firstTestAttempt2TemplateNode, NetworkEdgeType.Template);
            //network.Edges.Add(firstTestAttempt2Node, firstTestAttempt2ActionNode, NetworkEdgeType.Action);
            //network.Edges.Add(firstTestAttempt2Node, girlNode, NetworkEdgeType.Agent);
            //network.Edges.Add(firstTestAttempt2Node, stoveNode, NetworkEdgeType.Recipient);

            //NetworkNode firstTestSuccessNode = network.Nodes.Add("Результат испытания");
            ////TODO В этом случае ответил не определяется как сказуемое.
            //NetworkNode firstTestSuccessTemplateNode = network.Nodes.Add("{Agent} не сказала {recipient}.");
            //NetworkNode firstTestSuccessActionNode = network.Nodes.Add("Сказать");
            //network.Edges.Add(firstTestSuccessNode, firstTestSuccessTemplateNode, NetworkEdgeType.Template);
            //network.Edges.Add(firstTestSuccessNode, firstTestSuccessActionNode, NetworkEdgeType.Action);
            //network.Edges.Add(firstTestSuccessNode, stoveNode, NetworkEdgeType.Agent);
            //network.Edges.Add(firstTestSuccessNode, girlNode, NetworkEdgeType.Recipient);
            #endregion

            #region Сказка "Сестрица Аленушка и братец Иванушка"

            TaleNode alenushkaTaleNode = talesNetwork.Tales.Add("Сказка \"Сестрица Аленушка и братец Иванушка\"", scenarioTaleNode);

            FunctionNode atInitialStateNode = alenushkaTaleNode.Functions.Add("Сказка \"Сестрица Аленушка и братец Иванушка\". Начальная ситуация", initialStateNode);
            atInitialStateNode.Agents.Add(girlNode, boyNode);

            FunctionNode atProhibitionNode = alenushkaTaleNode.Functions.Add("Сказка \"Сестрица Аленушка и братец Иванушка\". Запрет", interdictionNode);
            atProhibitionNode.Actions.Add(talesNetwork.Actions.Add("Не пей из лужи"));
            atProhibitionNode.Agents.Add(girlNode);
            atProhibitionNode.Recipients.Add(boyNode);

            //FunctionNode atSeniorsDepartureNode = alenushkaTaleNode.FunctionNodes.Add("Уход старших", seniorsDepartureNode);
            //atSeniorsDepartureNode.Agents.Add(grandMotherNode, grandFatherNode);

            FunctionNode atProhibitionViolationNode = alenushkaTaleNode.Functions.Add("Сказка \"Сестрица Аленушка и братец Иванушка\". Нарушение запрета", violationOfInterdictionNode);
            atProhibitionViolationNode.Agents.Add(boyNode);

            //FunctionNode gtSabotageNode = geeseTaleNode.FunctionNodes.Add("Вредительство", sabotageNode);
            //gtSabotageNode.Agents.Add(geeseNode);
            //gtSabotageNode.Recipients.Add(boyNode);
            //gtSabotageNode.Action = "Похитить";

            //FunctionNode gtWoesPostNode = geeseTaleNode.FunctionNodes.Add("Сообщение беды", woesPostNode);
            //gtWoesPostNode.Agents.Add(girlNode);
            //gtWoesPostNode.Recipients.Add(boyNode);

            //FunctionNode gtSearchSubmittingNode = geeseTaleNode.FunctionNodes.Add("Отправка на поиски", searchSubmittingNode);
            //gtSearchSubmittingNode.Agents.Add(girlNode);
            #endregion

            #region Сказка "Братец"

            TaleNode brotherTaleNode = talesNetwork.Tales.Add("Сказка \"Братец\"", scenarioTaleNode);
            TaleItemNode ladyNode = talesNetwork.Persons.Add("Барыня", parentsNode);
            TaleItemNode sisterNode = talesNetwork.Persons.Add("Сестра", heroNode);
            TaleItemNode brotherNode = talesNetwork.Persons.Add("Брат", seekingPersonNode);
            TaleItemNode windNode = talesNetwork.Persons.Add("Ветер", antagonistNode);
            TaleItemNode birchNode = talesNetwork.Persons.Add("Береза", donorNode);

            FunctionNode btInitialStateNode = brotherTaleNode.Functions.Add("Сказка \"Братец\". Начальная ситуация", initialStateNode);
            btInitialStateNode.Agents.Add(ladyNode, sisterNode, brotherNode);

            FunctionNode btIterdictionNode = brotherTaleNode.Functions.Add("Сказка \"Братец\". Запрет", interdictionNode);
            btIterdictionNode.Actions.Add(talesNetwork.Actions.Add("Отпустить брата"));
            btIterdictionNode.Agents.Add(sisterNode);
            btIterdictionNode.Recipients.Add(ladyNode);

            FunctionNode btVillainyNode = brotherTaleNode.Functions.Add("Сказка \"Братец\". Вредительство", villainyNode);
            btVillainyNode.Actions.Add(talesNetwork.Actions.Add("Вырвать из рук няньки"));
            btVillainyNode.Agents.Add(windNode);
            btVillainyNode.Recipients.Add(brotherNode);

            FunctionNode btMediationNode = brotherTaleNode.Functions.Add("Сказка \"Братец\". Сообщение беды", mediationNode);
            //TODO Не учитывается отрицание (частица "не").
            btMediationNode.Actions.Add(talesNetwork.Actions.Add("Не нашла"));
            btMediationNode.Agents.Add(sisterNode);
            btMediationNode.Recipients.Add(brotherNode);

            FunctionNode btDepartureNode = brotherTaleNode.Functions.Add("Сказка \"Братец\". Отправка на поиски", departureNode);
            btDepartureNode.Agents.Add(sisterNode);
            btDepartureNode.Recipients.Add(brotherNode);

            FunctionNode btDonorMeeting = brotherTaleNode.Functions.Add("Сказка \"Братец\". Встреча с испытателем", donorMeeting);
            btDonorMeeting.Template = "\"{Recipient}, {recipient}! Скажи, где мой братец!\"";
            btDonorMeeting.Agents.Add(sisterNode);
            btDonorMeeting.Recipients.Add(birchNode);

            FunctionNode btTestNode = brotherTaleNode.Functions.Add("Сказка \"Братец\". Испытание", testNode);
            btTestNode.Template = "\"Сбери с меня листики, половину возьми себе, половину оставь мне. Я тебе на время пригожусь!\" - сказала {agent}.";
            btTestNode.Agents.Add(birchNode);
            btTestNode.Recipients.Add(sisterNode);

            FunctionNode btTestAttemptNode = brotherTaleNode.Functions.Add("Сказка \"Братец\". Попытка пройти испытание", testAttemptNode);
            btTestAttemptNode.Template = "{Agent} cобрала листики, половину взяла себе, половину оставила {recipient}.";
            btTestAttemptNode.Agents.Add(sisterNode);
            btTestAttemptNode.Recipients.Add(birchNode);
            #endregion

            return talesNetwork;
        }
Пример #17
0
 internal TaleNode(TalesNetwork talesNetwork)
     : base(talesNetwork)
 {
     _functionNodes = new TaleFunctionNodeCollection(this);
 }
Пример #18
0
 internal TaleNode(TalesNetwork taleNetwork, string name, TaleNode baseTaleNode)
     : base(taleNetwork, name, baseTaleNode)
 {
     _functionNodes = new TaleFunctionNodeCollection(this);
 }
Пример #19
0
 internal FunctionNode(TalesNetwork talesNetwork)
     : base(talesNetwork)
 {
     _actionNodes = new FunctionNodeContextNodeCollection(this, NetworkEdgeType.Action);
     _agentNodes = new FunctionNodeContextNodeCollection(this, NetworkEdgeType.Agent);
     _recipientNodes = new FunctionNodeContextNodeCollection(this, NetworkEdgeType.Recipient);
     _locativeNodes = new FunctionNodeContextNodeCollection(this, NetworkEdgeType.Locative);
 }
Пример #20
0
        private void ResolveText(TalesNetwork talesNetwork, string text)
        {
            _currentContext = new TextGeneratorContext(talesNetwork, text);

            // 1. Сначала входной текст разбиваем на предложения,
            //    а каждое предложение в свою очередь на лексемы.

            IEnumerable<IEnumerable<SentenceToken>> textTokens = _textParser.Parse(text);

            // 2. Затем среди лексем входного текста выполняется поиск отдельных
            //    концептов сети (персонажей, локативов и т.д.).

            foreach (var sentenceTokens in textTokens)
            {
                ResolveSentence(sentenceTokens, talesNetwork.Persons, _currentContext.ResolvedPersons);
                ResolveSentence(sentenceTokens, talesNetwork.Locatives, _currentContext.ResolvedLocatives);
                ResolveSentence(sentenceTokens, talesNetwork.Actions, _currentContext.ResolvedActions);
            }

            // 3. Затем выполняется поиск функций, которые содержат привязавшиеся концепты.
            //    Одновременно для каждой функции рассчитывается числовой коэффициент,
            //    отображающий ее уровень релевантности контексту, содержащемуся во входном тексте.

            foreach (TaleNode tale in talesNetwork.Tales)
            {
                // TODO: Функции базовой сказки не учитываются при формировании
                //       набора привязавшихся функций и списка генерации.

                if (!(tale.BaseNode is TaleNode))
                {
                    continue;
                }

                foreach (FunctionNode function in tale.Functions)
                {
                    double resolvedFunctionNodes =
                        function.Agents.Count(agent => _currentContext.ResolvedPersons.Contains(agent)) +
                        function.Recipients.Count(recipient => _currentContext.ResolvedPersons.Contains(recipient)) +
                        function.Locatives.Count(locative => _currentContext.ResolvedLocatives.Contains(locative)) +
                        function.Actions.Count(action => _currentContext.ResolvedActions.Contains(action));

                    if (resolvedFunctionNodes != 0)
                    {
                        double generalFunctionNodes =
                            function.Agents.Count() +
                            function.Recipients.Count() +
                            function.Locatives.Count() +
                            function.Actions.Count();
                        double functionRelevanceLevel = resolvedFunctionNodes / generalFunctionNodes;

                        _currentContext.ResolvedFunctions.Add(new FunctionGenerationInfo(function, functionRelevanceLevel));
                    }
                }
            }

            // 4. Затем составляется отсортированный
            //    в соответсвии уровнем релевантности список сказок.

            Dictionary<TaleNode, double> taleRelevanceLevels = new Dictionary<TaleNode, double>();

            foreach (FunctionGenerationInfo functionResolveContext in _currentContext.ResolvedFunctions)
            {
                TaleNode currentTale = functionResolveContext.Function.Tale;
                TaleNode baseTale = currentTale.BaseNode as TaleNode;

                // TODO: Базовые сказки пока не попадают в список генерации.
                if (baseTale == null)
                {
                    continue;
                }

                double taleRelevanceLevel;

                if (!taleRelevanceLevels.TryGetValue(currentTale, out taleRelevanceLevel))
                {
                    taleRelevanceLevel = 0.0;
                }

                taleRelevanceLevel += functionResolveContext.RelevanceLevel / baseTale.Functions.Count();

                taleRelevanceLevels[currentTale] = taleRelevanceLevel;
            }

            List<KeyValuePair<TaleNode, double>> list = taleRelevanceLevels.ToList();

            // Список сортируется в порядке уменьшения уровня релевантности.

            list.Sort((firstPair, secondPair) => secondPair.Value.CompareTo(firstPair.Value));

            foreach (var pair in list)
            {
                _currentContext.Tales.Add(new TaleGenerationInfo(pair.Key, pair.Value));
            }
        }
 protected TaleBaseItemNode(TalesNetwork talesNetwork, string name, TaleBaseItemNode baseNode)
     : base(talesNetwork, name, baseNode)
 {
 }
Пример #22
0
        public TextGeneratorContext GenerateText(TalesNetwork talesNetwork, string text)
        {
            Contract.Requires<ArgumentNullException>(talesNetwork != null);
            Contract.Requires<ArgumentException>(!string.IsNullOrEmpty(text));

            StringBuilder textBuilder = new StringBuilder();

            // 1. Сначала проверим, не изменился ли контекст.

            if (_currentContext == null ||
                _currentContext.Network != talesNetwork ||
                string.Compare(_currentContext.InputText, text) != 0)
            {
                // Если контекст изменился или его не было, необходимо выполнить этап анализа.

                ResolveText(talesNetwork, text);
            }

            // 2. Найдем сказку, для которой еще остались неиспользованные сочетания функций в конфликтных наборах.

            TaleGenerationInfo currentTaleInfo = _currentContext.Tales.GetCurrentTale();

            if (currentTaleInfo == null)
            {
                return null;
            }
            //TaleGenerationInfo currentTaleInfo = _currentContext.GenerationList.FirstOrDefault(
            //	taleInfo => taleInfo.ConflictSets.Any(
            //		conflictSet => !conflictSet.Closed));

            // Если такой сказки нет, то необходимо сбросить все индексы во всех конфликтных наборах
            // и начать процесс генерации c первой сказки в списке генерации.

            //if (currentTaleInfo == null)
            //{
            //	_currentContext.GenerationList.ForEach(taleInfo =>
            //		taleInfo.ConflictSets.ForEach(conflictSet =>
            //			conflictSet.Reset()));

            //	currentTaleInfo = _currentContext.GenerationList.First();
            //}

            //Contract.Assume(currentTaleInfo != null);

            // TODO: Необходимо вручную задавать режим переключения конфликтных наборов.
            //currentTaleInfo.CanToogleConflictSets = true;

            // Запомним текущую сказку, сценарий и выберем первую функцию.

            TaleNode currentTale = currentTaleInfo.Tale;
            IEnumerable<FunctionType> scenario = currentTale.Scenario;
            FunctionNode firstFunction = currentTale.Functions.FirstOrDefault();

            // Перед началом процесса генерации необходимо очистить список текущих контекстных вершин,
            // на основе которых будет определяться выполнение принципа монотонности.

            _currentContext.CurrentContextNodes.Clear();

            if (firstFunction == null)
            {
                // TODO: Должна быть выполнена генерация для вершины базовой (сценарной) сказки с выполнением замещения контекста.
                throw new NotImplementedException();
            }

            // Отдельно выполним процесс генерации для первой функции.

            textBuilder.AppendLine(GenerateText(firstFunction));

            // Процесс генерации начинается со второй по счету функции.

            foreach (FunctionType functionType in scenario.Skip(1))
            {
                // 1. Определим наличие конфликтного набора для текущего типа функции.

                // TODO: Возникнут проблемы, если в сказке несколько функций с одним типом.
                FunctionConflictSet conflictSet = currentTaleInfo.ConflictSets.FirstOrDefault(set => set.FunctionType == functionType);

                if (conflictSet != null)
                {
                    // Если конфликтный набор нашелся, то
                    // процесс генерации выполняется для текущей функции этого набора.

                    textBuilder.AppendLine(GenerateText(conflictSet.CurrentFunction.Function));
                    continue;
                }

                // 2. В противном случае осуществляется попытка поиска функции с нужным типом во входном наборе.

                var resolvedFunctions = _currentContext.ResolvedFunctions
                    .Where(functionContext => functionContext.Function.FunctionType == functionType)
                    .Select(functionContext => functionContext.Function);

                if (resolvedFunctions.Any())
                {
                    if (resolvedFunctions.Count() == 1)
                    {
                        textBuilder.AppendLine(GenerateText(resolvedFunctions.First()));
                        continue;
                    }
                    else
                    {
                        // Если функций с необходимым типом во входном наборе больше 1, то
                        // необходимо сформировать конфликтный набор.

                        ICollection<NetworkNode> currentContextNodes = _currentContext.CurrentContextNodes;
                        Func<FunctionNode, int> getContextNodesCount =
                            function =>
                            {
                                return
                                    function.Agents.Count(agent => currentContextNodes.Contains(agent)) +
                                    function.Recipients.Count(recipient => currentContextNodes.Contains(recipient)) +
                                    function.Locatives.Count(locative => currentContextNodes.Contains(locative));
                            };
                        List<FunctionGenerationInfo> sortedFunctionsList = resolvedFunctions
                            .Select(function => new FunctionGenerationInfo(function, getContextNodesCount(function)))
                            .ToList();

                        // Функции в конфликтном наборе упорядочиваются в соответсвии с принципом монотонности.

                        sortedFunctionsList.Sort(
                            (firstFunc, secondFunc) => secondFunc.RelevanceLevel.CompareTo(firstFunc.RelevanceLevel));

                        currentTaleInfo.ConflictSets.Add(new FunctionConflictSet(sortedFunctionsList));

                        // Процесс генерации выполняется для функции, которая больше всего
                        // удовлетворяет принципу монотонности, т.е. для первой функции из конфликтного набора.

                        textBuilder.AppendLine(GenerateText(sortedFunctionsList.First().Function));
                        continue;
                    }
                }

                // 3. Если во входном наборе не оказалось функций с нужным типом, выполняем процесс генерации для функции текущей сказки.
                textBuilder.AppendLine(GenerateText(currentTale.Functions.First(function => function.FunctionType == functionType)));
            }

            _currentContext.OutputText = textBuilder.ToString();

            return _currentContext;
        }
Пример #23
0
        /// <summary>
        /// Новый проект
        /// </summary>
        public void NewProject()
        {
            Diagram = new Diagram();
            Network = new TalesNetwork();
            Path = "";

            _linkMenu.Network = Network;
            _nodeMenu.Network = Network;
        }
Пример #24
0
 internal TaleItemNode(TalesNetwork talesNetwork)
     : base(talesNetwork)
 {
 }
Пример #25
0
 internal TaleItemNode(TalesNetwork talesNetwork, string name, TaleItemNode baseNode)
     : base(talesNetwork, name, baseNode)
 {
 }
Пример #26
0
        public NetworkContextMenu(TalesNetwork network)
            : base()
        {
            Network = network;

            CreateMenu();
        }