def worker(node: Type[BaseNode]) -> DiscreteParams:
     parents = node.disc_parents + node.cont_parents
     if not parents:
         dist = DiscreteDistribution.from_samples(
             data[node.name].values)
         cprob = list(dict(sorted(dist.items())).values())
         vals = sorted(
             [str(x) for x in list(dist.parameters[0].keys())])
     else:
         dist = DiscreteDistribution.from_samples(
             data[node.name].values)
         vals = sorted(
             [str(x) for x in list(dist.parameters[0].keys())])
         dist = ConditionalProbabilityTable.from_samples(
             data[parents + [node.name]].values)
         params = dist.parameters[0]
         cprob = dict()
         for i in range(0, len(params), len(vals)):
             probs = []
             for j in range(i, (i + len(vals))):
                 probs.append(params[j][-1])
             combination = [str(x) for x in params[i][0:len(parents)]]
             cprob[str(combination)] = probs
     return {"cprob": cprob, 'vals': vals}