/// <summary> /// Define a relationship. /// </summary> /// <param name="line">The relationship to define.</param> public void DefineRelationship(String line) { var parse = new ParseProbability(this); ParsedProbability parsedProbability = parse.Parse(line); parsedProbability.DefineRelationships(this); }
/// <summary> /// Define the probability for an event. /// </summary> /// <param name="line">The event.</param> /// <param name="probability">The probability.</param> public void DefineProbability(String line, double probability) { var parse = new ParseProbability(this); ParsedProbability parsedProbability = parse.Parse(line); parsedProbability.DefineTruthTable(this, probability); }
/// <summary> /// Define a classification structure of the form P(A|B) = P(C) /// </summary> /// <param name="line">The structure.</param> public void DefineClassificationStructure(String line) { IList <ParsedProbability> list = ParseProbability.ParseProbabilityList(this, line); if (list.Count > 1) { throw new BayesianError("Must only define a single probability, not a chain."); } if (list.Count == 0) { throw new BayesianError("Must define at least one probability."); } // first define everything to be hidden foreach (BayesianEvent e in _events) { Query.DefineEventType(e, EventType.Hidden); } // define the base event ParsedProbability prob = list[0]; if (prob.BaseEvents.Count == 0) { return; } BayesianEvent be = GetEvent(prob.ChildEvent.Label); _classificationTarget = _events.IndexOf(be); Query.DefineEventType(be, EventType.Outcome); // define the given events foreach (ParsedEvent parsedGiven in prob.GivenEvents) { BayesianEvent given = GetEvent(parsedGiven.Label); Query.DefineEventType(given, EventType.Evidence); } Query.LocateEventTypes(); // set the values foreach (ParsedEvent parsedGiven in prob.GivenEvents) { BayesianEvent e = GetEvent(parsedGiven.Label); Query.SetEventValue(e, ParseInt(parsedGiven.Value)); } Query.SetEventValue(be, ParseInt(prob.BaseEvents[0].Value)); }
/// <summary> /// Perform a query. /// </summary> /// <param name="line">The query.</param> /// <returns>The probability.</returns> public double PerformQuery(String line) { if (Query == null) { throw new BayesianError("This Bayesian network does not have a query to define."); } var parse = new ParseProbability(this); ParsedProbability parsedProbability = parse.Parse(line); // create a temp query IBayesianQuery q = Query.Clone(); // first, mark all events as hidden q.Reset(); // deal with evidence (input) foreach (ParsedEvent parsedEvent in parsedProbability.GivenEvents) { BayesianEvent e = RequireEvent(parsedEvent.Label); q.DefineEventType(e, EventType.Evidence); q.SetEventValue(e, parsedEvent.ResolveValue(e)); } // deal with outcome (output) foreach (ParsedEvent parsedEvent in parsedProbability.BaseEvents) { BayesianEvent e = RequireEvent(parsedEvent.Label); q.DefineEventType(e, EventType.Outcome); q.SetEventValue(e, parsedEvent.ResolveValue(e)); } q.LocateEventTypes(); q.Execute(); return(q.Probability); }