/// <summary> /// Define the truth table. /// </summary> /// <param name="network">The bayesian network.</param> /// <param name="result">The resulting probability.</param> public void DefineTruthTable(BayesianNetwork network, double result) { ParsedEvent childParsed = ChildEvent; BayesianEvent childEvent = network.RequireEvent(childParsed.Label); // define truth table line int[] args = GetArgs(network); childEvent.Table.AddLine(result, childParsed.ResolveValue(childEvent), args); }
/// <summary> /// Define the relationships. /// </summary> /// <param name="network">The network.</param> public void DefineRelationships(BayesianNetwork network) { // define event relations, if they are not there already ParsedEvent childParsed = ChildEvent; BayesianEvent childEvent = network.RequireEvent(childParsed.Label); foreach (ParsedEvent e in this.givenEvents) { BayesianEvent parentEvent = network.RequireEvent(e.Label); network.CreateDependency(parentEvent, childEvent); } }
/// <summary> /// Get the arguments to this event. /// </summary> /// <param name="network">The network.</param> /// <returns>The arguments.</returns> public int[] GetArgs(BayesianNetwork network) { int[] result = new int[givenEvents.Count]; for (int i = 0; i < givenEvents.Count; i++) { ParsedEvent givenEvent = this.givenEvents[i]; BayesianEvent actualEvent = network.GetEvent(givenEvent.Label); result[i] = givenEvent.ResolveValue(actualEvent); } return(result); }
/// <summary> /// Add a given event. /// </summary> /// <param name="theEvent">The event to add.</param> public void AddGivenEvent(ParsedEvent theEvent) { this.givenEvents.Add(theEvent); }
/// <summary> /// Add a base event. /// </summary> /// <param name="theEvent"The base event to add.></param> public void AddBaseEvent(ParsedEvent theEvent) { this.baseEvents.Add(theEvent); }
/// <summary> /// Add events, as they are pased. /// </summary> /// <param name="parser">The parser.</param> /// <param name="results">The events found.</param> /// <param name="delim">The delimiter to use.</param> private void AddEvents(SimpleParser parser, IList<ParsedEvent> results, String delim) { bool done = false; StringBuilder l = new StringBuilder(); while (!done && !parser.EOL()) { char ch = parser.Peek(); if (delim.IndexOf(ch) != -1) { if (ch == ')' || ch == '|') done = true; ParsedEvent parsedEvent; // deal with a value specified by + or - if (l.Length > 0 && l[0] == '+') { String l2 = l.ToString().Substring(1); parsedEvent = new ParsedEvent(l2.Trim()); parsedEvent.Value = "true"; } else if (l.Length > 0 && l[0] == '-') { String l2 = l.ToString().Substring(1); parsedEvent = new ParsedEvent(l2.Trim()); parsedEvent.Value = "false"; } else { String l2 = l.ToString(); parsedEvent = new ParsedEvent(l2.Trim()); } // parse choices if (ch == '[') { parser.Advance(); int index = 0; while (ch != ']' && !parser.EOL()) { String labelName = parser.ReadToChars(":,]"); if (parser.Peek() == ':') { parser.Advance(); parser.EatWhiteSpace(); double min = double.Parse(parser.ReadToWhiteSpace()); parser.EatWhiteSpace(); if (!parser.LookAhead("to", true)) { throw new BayesianError("Expected \"to\" in probability choice range."); } parser.Advance(2); double max = CSVFormat.EgFormat.Parse(parser.ReadToChars(",]")); parsedEvent.ChoiceList.Add(new ParsedChoice(labelName, min, max)); } else { parsedEvent.ChoiceList.Add(new ParsedChoice(labelName, index++)); } parser.EatWhiteSpace(); ch = parser.Peek(); if (ch == ',') { parser.Advance(); } } } // deal with a value specified by = if (parser.Peek() == '=') { parser.ReadChar(); String value = parser.ReadToChars(delim); // BayesianEvent evt = this.network.getEvent(parsedEvent.getLabel()); parsedEvent.Value = value; } if (ch == ',') { parser.Advance(); } if (ch == ']') { parser.Advance(); } if (parsedEvent.Label.Length > 0) { results.Add(parsedEvent); } l.Length = 0; } else { parser.Advance(); l.Append(ch); } } }
/// <summary> /// Add a base event. /// </summary> /// <param name="theEvent"The base event to add.></param> public void AddBaseEvent(ParsedEvent theEvent) { this.baseEvents.Add(theEvent); }
/// <summary> /// Add a given event. /// </summary> /// <param name="theEvent">The event to add.</param> public void AddGivenEvent(ParsedEvent theEvent) { this.givenEvents.Add(theEvent); }
/// <summary> /// Add events, as they are pased. /// </summary> /// <param name="parser">The parser.</param> /// <param name="results">The events found.</param> /// <param name="delim">The delimiter to use.</param> private void AddEvents(SimpleParser parser, IList <ParsedEvent> results, String delim) { bool done = false; StringBuilder l = new StringBuilder(); while (!done && !parser.EOL()) { char ch = parser.Peek(); if (delim.IndexOf(ch) != -1) { if (ch == ')' || ch == '|') { done = true; } ParsedEvent parsedEvent; // deal with a value specified by + or - if (l.Length > 0 && l[0] == '+') { String l2 = l.ToString().Substring(1); parsedEvent = new ParsedEvent(l2.Trim()); parsedEvent.Value = "true"; } else if (l.Length > 0 && l[0] == '-') { String l2 = l.ToString().Substring(1); parsedEvent = new ParsedEvent(l2.Trim()); parsedEvent.Value = "false"; } else { String l2 = l.ToString(); parsedEvent = new ParsedEvent(l2.Trim()); } // parse choices if (ch == '[') { parser.Advance(); int index = 0; while (ch != ']' && !parser.EOL()) { String labelName = parser.ReadToChars(":,]"); if (parser.Peek() == ':') { parser.Advance(); parser.EatWhiteSpace(); double min = double.Parse(parser.ReadToWhiteSpace()); parser.EatWhiteSpace(); if (!parser.LookAhead("to", true)) { throw new BayesianError("Expected \"to\" in probability choice range."); } parser.Advance(2); double max = CSVFormat.EgFormat.Parse(parser.ReadToChars(",]")); parsedEvent.ChoiceList.Add(new ParsedChoice(labelName, min, max)); } else { parsedEvent.ChoiceList.Add(new ParsedChoice(labelName, index++)); } parser.EatWhiteSpace(); ch = parser.Peek(); if (ch == ',') { parser.Advance(); } } } // deal with a value specified by = if (parser.Peek() == '=') { parser.ReadChar(); String value = parser.ReadToChars(delim); // BayesianEvent evt = this.network.getEvent(parsedEvent.getLabel()); parsedEvent.Value = value; } if (ch == ',') { parser.Advance(); } if (ch == ']') { parser.Advance(); } if (parsedEvent.Label.Length > 0) { results.Add(parsedEvent); } l.Length = 0; } else { parser.Advance(); l.Append(ch); } } }