示例#1
0
    def run(self, query, observed, elim_order, log):
        self.wall_clock_time = datetime.datetime.now()

        factors = np.array([])
        for node in self.network.nodes:
            factor = self._makeFactor(node, observed, log)
            if factor.nr_nodes > 0:
                factors = np.append(factors, factor)

                log.write("factor " + str(factors.size) + ":\n" + str(factor) +
                          "\n")

        for node in elim_order:
            node_factors_indices = [
                i for i, factor in enumerate(factors) if node in factor.nodes
            ]
            node_factors = factors[node_factors_indices]

            product, nr_multiplication_steps = Factor.product(
                node_factors.copy())

            self.nr_multiplication_steps += nr_multiplication_steps

            if product.nr_nodes > 1:
                marginalization = product.marginalize(node)
                factors = np.append(factors, marginalization)

                log.write(
                    "\n---------------------------------------------------------------\n"
                    "Eliminating " + node + "\n\n")
                log.write("Multiply\n")
                for i, node_factor in enumerate(node_factors):
                    log.write("factor " + str(i + 1) + ":\n" +
                              str(node_factor) + "\n")
                log.write("\nProduct:\n" + str(product) + "\n")
                log.write("\nMarginalization:\n" + str(marginalization))

            factors = np.delete(factors, node_factors_indices)

        result_product, nr_multiplication_steps = Factor.product(
            factors.copy())
        result = result_product.normalize(query)

        log.write(
            "\n\n---------------------------------------------------------------\n"
            "Producing query " + query + "\n\n")
        log.write("Multiply\n")
        for i, factor in enumerate(factors):
            log.write("factor " + str(i + 1) + ":\n" + str(factor) + "\n")
        log.write("\nProduct:\n" + str(result_product) + "\n")
        log.write("\nNormalization:\n" + str(result))

        self.wall_clock_time = datetime.datetime.now() - self.wall_clock_time
        self.nr_multiplication_steps += nr_multiplication_steps

        return result