diff --git a/factorOperations.py b/factorOperations.py index e96250b..304d7b7 100644 --- a/factorOperations.py +++ b/factorOperations.py @@ -102,7 +102,40 @@ def joinFactors(factors: List[Factor]): "*** YOUR CODE HERE ***" - raiseNotDefined() + conditioned_variables = set() + unconditioned_variables = set() + + + for factor in factors: + print(factor) + ''' + print(factor.unconditionedVariables()) + print(factor.conditionedVariables()) + ''' + conditioned_variables.update([ i for i in factor.conditionedVariables()]) + unconditioned_variables.update([ i for i in factor.unconditionedVariables()]) + + # remove unconditioned_variables from new conditioned_variables + for var in list(conditioned_variables): + if var in unconditioned_variables: + conditioned_variables.remove(var) + + # construct the new factor + # then, we should change the probability. + + # Hint from CS188's page: + # For this problem, you may assume that all the input Factors have come from the same BayesNet, and so their variableDomainsDicts are all the same + new_factor = Factor(unconditioned_variables, conditioned_variables, list(factors)[0].variableDomainsDict()) + + # new probability + for assignment in new_factor.getAllPossibleAssignmentDicts(): + prob = 1 + for factor in factors: + prob *= factor.getProbability(assignment) + new_factor.setProbability(assignment, prob) + + return new_factor + "*** END YOUR CODE HERE ***" ########### ########### ###########