/// <summary> /// Returns the probability for the given random variables. If it is not present yet, it is calculated first. /// All access to _probs should be through this method! /// </summary> /// <param name="variables">random variables for the distribution</param> /// <returns></returns> private Probability GetProbability(ICollection <RandomVariable> variables) { var index = SubsetUtils.GetIndex(variables, _randomVariables); if (!_probs.ContainsKey(index)) { _probs[index] = CalculateProbability(variables.ToList()); if (!string.IsNullOrWhiteSpace(_config.ProbabilitySerializationFilePath)) { SerializeCurrentProbabilities(); } } return(_probs[index]); }
private void DeserializeProbabilities() { using (var file = File.OpenText(_config.ProbabilityDeserializationFilePath)) { var serializer = new JsonSerializer(); var probs = (ProbabilitySerialization)serializer.Deserialize(file, typeof(ProbabilitySerialization)); foreach (var keyValuePair in probs.Probs) { var storedIndex = keyValuePair.Key; var storedRandomVariables = SubsetUtils.FromIndex(probs.RandomVariables, storedIndex); var realRandomVariables = _randomVariables.Where(rvar => storedRandomVariables.Contains(rvar.Name)).ToList(); _probs[SubsetUtils.GetIndex(realRandomVariables, _randomVariables)] = keyValuePair.Value; if (realRandomVariables.Count == 1) { realRandomVariables[0].Probability = new[] { keyValuePair.Value, keyValuePair.Value.Complement() }; } } } }
/// <summary> /// Calculates all probability distributions of all subsets of the random variables. /// Use with caution! /// </summary> public void CalculateTrueProbabilities() { // Iterate through all 2^n random variables for (var i = 1; i < (1 << _randomVariables.Count); i++) { var currentVars = new HashSet <RandomVariable>(); for (var j = 0; j < _randomVariables.Count; j++) { // is the jth random variable present in the current subset? // it is, if there is a 1 at the jth bit from the right side // so 'and' i and 2^j and test if the result is greater than zero if ((i & (1 << j)) > 0) { currentVars.Add(_randomVariables[j]); } } _probs[SubsetUtils.GetIndex(currentVars, _randomVariables)] = CalculateProbability(currentVars.ToList()); } WriteProbsToConsole(); }