示例#1
0
    def eventVarInEvent_test_4(self):
        """
        Test varInEvent() method
        """

        event = Event(var=self.X, val=self.X.domain[0])

        assert (event.varInEvent(self.X))
        assert (not event.varInEvent(self.Y))
示例#2
0
    def eventVarInEvent_test_4(self):
        """
        Test varInEvent() method
        """

        event = Event(var=self.X, val=self.X.domain[0])

        assert(event.varInEvent(self.X))
        assert(not event.varInEvent(self.Y))
示例#3
0
    def eventRemoveVar_test_7(self):
        """
        Test setValue method
        """

        event = Event(var=self.X, val=self.X.domain[0])
        event.removeVar(self.X)
        event.removeVar(self.Y)  # Already not in event
        assert (not event.varInEvent(self.X))
        assert (not event.varInEvent(self.Y))
示例#4
0
    def eventRemoveVar_test_7(self):
        """
        Test setValue method
        """

        event = Event(var=self.X, val=self.X.domain[0])
        event.removeVar(self.X)
        event.removeVar(self.Y)  # Already not in event
        assert(not event.varInEvent(self.X))
        assert(not event.varInEvent(self.Y))
示例#5
0
    def _compute_event_prob(self, event: ppy.Event):
        HashableFac.next_id = 0

        # create factors
        factors = set()
        num_to_eliminate = 0
        for i in self.network:
            # Append factor to factors list, removing observations
            fac = self.makeFactor(i.factor, event)
            factors.add(HashableFac(fac))
            if not event.varInEvent(i.node):
                num_to_eliminate += 1

        # run variable elimination
        for n in range(0, num_to_eliminate):
            new_factor_vars = {
            }  # for each variable, the set of variables in the factor if that variable is eliminated
            factors_for_var = {
            }  # for each variable, the list of factors containing the variable
            for hfac in factors:
                fac = hfac.fac
                rvset = set(fac.rand_vars)
                for var in fac.rand_vars:
                    if var not in new_factor_vars:
                        new_factor_vars[var] = rvset.copy()
                        factors_for_var[var] = []
                    else:
                        new_factor_vars[var] = new_factor_vars[var].union(
                            rvset)
                    factors_for_var[var].append(hfac)

            # find best variable to eliminate next according to min-degree strategy
            best_var = None
            best_size = -1
            for var, s in new_factor_vars.items():
                if best_var is None or len(s) < best_size:
                    best_var = var
                    best_size = len(s)

            # eliminate the variable
            rm_factors = factors_for_var[best_var]
            new_factor = self.sumOut(best_var, rm_factors)
            factors = factors.difference(rm_factors)
            factors.add(HashableFac(new_factor))

        prod = None
        for f in factors:
            if prod is None:
                prod = f.fac
            else:
                prod = prod.mult(f.fac)
        return prod.values[0]
示例#6
0
文件: bn.py 项目: miguelbarao/ProbPy
    def gibbsAsk(self, query_var, observed, samples_num):
        # Result is a list of counts for each value in the domain of the query
        # variable. Initialized with 0
        res = {i: 0 for i in query_var.domain}

        # Assure the observed argument is an Event
        if type(observed) != Event:
            observed = Event(observed)

        # Create non evidence variable list, which are all the variables not
        # present in the observations
        non_evidence_vars = [i for i in self.network
                             if not observed.varInEvent(i.node)]

        # Get markov blankets for each non evidence variable
        mbs = dict()
        for i in non_evidence_vars:
            mbs[i.node.name] = self.markovBlanket(i)

        # Make an initial sample
        sample = self.sample(observed)

        # Execute for samples_num samples
        for i in range(samples_num):
            for j in non_evidence_vars:
                # Get distribution P(j | mb(j))
                dist = j.factor
                for k in mbs[j.node.name]:
                    dist *= k.factor

                # Instantiate with previous sample, except for current j
                # variable
                sample.removeVar(j.node)
                dist = dist.instVar(sample)

                # Set new random value of current variable in sample
                rvalue = self.pickRandomValue(dist.rand_vars[0].domain,
                                              dist.values, random.random())
                sample.setValue(j.node, rvalue)

                # Increment count
                res[rvalue] += 1

        # Return the count list normalized
        values = [res[i] for i in query_var.domain]
        return Factor(query_var, values).normalize(query_var)
示例#7
0
文件: bn.py 项目: Python3pkg/ProbPy
    def gibbsAsk(self, query_var, observed, samples_num):
        # Result is a list of counts for each value in the domain of the query
        # variable. Initialized with 0
        res = {i: 0 for i in query_var.domain}

        # Assure the observed argument is an Event
        if type(observed) != Event:
            observed = Event(observed)

        # Create non evidence variable list, which are all the variables not
        # present in the observations
        non_evidence_vars = [i for i in self.network
                             if not observed.varInEvent(i.node)]

        # Get markov blankets for each non evidence variable
        mbs = dict()
        for i in non_evidence_vars:
            mbs[i.node.name] = self.markovBlanket(i)

        # Make an initial sample
        sample = self.sample(observed)

        # Execute for samples_num samples
        for i in range(samples_num):
            for j in non_evidence_vars:
                # Get distribution P(j | mb(j))
                dist = j.factor
                for k in mbs[j.node.name]:
                    dist *= k.factor

                # Instantiate with previous sample, except for current j
                # variable
                sample.removeVar(j.node)
                dist = dist.instVar(sample)

                # Set new random value of current variable in sample
                rvalue = self.pickRandomValue(dist.rand_vars[0].domain,
                                              dist.values, random.random())
                sample.setValue(j.node, rvalue)

                # Increment count
                res[rvalue] += 1

        # Return the count list normalized
        values = [res[i] for i in query_var.domain]
        return Factor(query_var, values).normalize(query_var)