private bool IsIndependent(RandomVariable first, RandomVariable second) { var probDistribution = _probCalculator.CalculateProbabilityDistribution(new[] { first, second }); Console.Out.WriteLine($"Variables {first.Name} and {second.Name} distribution: {string.Join(",", probDistribution)}"); GC.Collect(); return(AreValuesIndependent(first.TrueProbability, second.TrueProbability, probDistribution[0]) && AreValuesIndependent(first.TrueProbability, second.TrueProbability.Complement(), probDistribution[1]) && AreValuesIndependent(first.TrueProbability.Complement(), second.TrueProbability, probDistribution[2]) && AreValuesIndependent(first.TrueProbability.Complement(), second.TrueProbability.Complement(), probDistribution[3])); }
private void AddIndependency(RandomVariable first, RandomVariable second, IEnumerable <RandomVariable> conditions = null) { if (!_conditionalIndependencies.ContainsKey(first, second)) { _conditionalIndependencies[first, second] = new List <ISet <RandomVariable> >(); } if (conditions != null) { _conditionalIndependencies[first, second].Add(new HashSet <RandomVariable>(conditions)); } else { _conditionalIndependencies[first, second].Add(new HashSet <RandomVariable>()); } }
public ProbabilityDistribution(RandomVariable randomVariable, IList <RandomVariable> conditions, IList <Probability> distribution) { RandomVariable = randomVariable; Conditions = conditions; Distribution = distribution; }
/// <summary> /// Returns true if there is a meeting left - middle - right and left and right are not adjecent /// </summary> private bool IsUncoupledMeeting(RandomVariable left, RandomVariable middle, RandomVariable right) { return(_dag.AreAdjecent(left, middle) && _dag.AreAdjecent(middle, right) && !_dag.AreAdjecent(left, right)); }
/// <summary> /// Calculate the conditional probability distribution of a random variable A given condition variables B1,...,Bn /// e.g. P(A|B,C) as [ P(a|b,c), P(a|b,!c), P(a|!b,c) P(a|!b!c), ...] /// </summary> /// <returns>A probability array of the distribution, the iteration order is last condition to first and to the variable</returns> public IList <Probability> CalculateConditionalProbabilityDistribution(RandomVariable randomVariable, IList <RandomVariable> conditions) { return(CalculateConditionalProbabilityDistribution(new List <RandomVariable> { randomVariable }, conditions)); }