public void LearnParameters(DataMining.Data.Dataset dataset) { foreach (Variable variable in this._variables) { string desc = variable.ToString(); variable.CPT = new ConditionalProbabilityTable(desc, variable.GetCTPSize()); //if (cache.ContainsKey(desc)) // variable.CPT.LoadFormString(cache[desc]); //else //{ if (variable.Parents == null) { int rowIndex = 0; DataMining.Data.Attribute attribute = dataset.Metadata.Target.Index == variable.Index ? dataset.Metadata.Target : dataset.Metadata.Attributes[variable.Index]; for (int valueIndex = 0; valueIndex < variable.Attribute.Values.Length; valueIndex++) { int indexExpression = valueIndex + 1; int count = attribute.ValueCounts[valueIndex]; variable.CPT.Set(rowIndex, indexExpression, count); rowIndex++; } } else { List <int> attributeIndexes = new List <int>(); DataMining.Data.Attribute[] attributes = new DataMining.Data.Attribute[variable.Parents.Count + 1]; attributes[0] = variable.Attribute; attributeIndexes.Add(variable.Attribute.Index); if (variable.Parents != null) { int i = 1; foreach (Variable parent in variable.Parents) { attributes[i] = parent.Attribute; attributeIndexes.Add(parent.Attribute.Index); i++; } } int[] valuesPointers = new int[attributes.Length]; Stack <int> pointerStack = new Stack <int>(); int rowIndex = 0; bool stop = false; while (true) { int indexExpression = variable.GetIndexExpression(valuesPointers.ToArray()); int count = dataset.Filter(attributeIndexes, valuesPointers.ToList <int>()).Count; variable.CPT.Set(rowIndex, indexExpression, count); rowIndex++; int attributePointer = valuesPointers.Length - 1; while (true) { if (valuesPointers[attributePointer] == attributes[attributePointer].Values.Length - 1) { if (attributePointer == 0) { stop = true; break; } valuesPointers[attributePointer] = 0; attributePointer--; } else { valuesPointers[attributePointer]++; break; } } if (stop) { break; } } //} //cache[desc] = variable.CPT.ToString(); } } }