예제 #1
0
    def _check_compute_canalization_variables(self, **kwargs):
        """ Recursevely check if the requested canalization variables are instantiated/computed, otherwise computes them in order.
        For example: to compute `two_symbols` we need `prime_implicants` first.
        Likewise, to compute `prime_implicants` we need the `transition_density_table` first.
        """
        if 'prime_implicants' in kwargs:
            if self._prime_implicants is None:
                self._prime_implicants = dict()
                for output in set(self.outputs):
                    output_binstates = outputs_to_binstates_of_given_type(
                        self.outputs, output=output, k=self.k)
                    self._prime_implicants[
                        output] = cBCanalization.find_implicants_qm(
                            input_binstates=output_binstates)

        elif 'pi_coverage' in kwargs:
            self._check_compute_canalization_variables(prime_implicants=True)
            if self._pi_coverage is None:
                self._pi_coverage = dict()
                for output, piset in self._prime_implicants.items():
                    self._pi_coverage.update(
                        cBCanalization.return_pi_coverage(piset))

                # make sure every inputstate was covered by at least one prime implicant
                assert len(self._pi_coverage) == 2**self.k

        elif 'two_symbols' in kwargs:
            self._check_compute_canalization_variables(prime_implicants=True)
            if self._two_symbols is None:
                # this is a temporary fix until we update 'find_two_symbols' to cython.
                if '0' in self._prime_implicants:
                    pi0 = self._prime_implicants['0']
                    pi0 = set([pi.replace('#', '2') for pi in pi0])
                else:
                    pi0 = []
                if '1' in self._prime_implicants:
                    pi1 = self._prime_implicants['1']
                    pi1 = set([pi.replace('#', '2') for pi in pi1])
                else:
                    pi1 = []
                # /end fix
                self._two_symbols = \
                    (
                        BCanalization.find_two_symbols_v2(k=self.k, prime_implicants=pi0),
                        BCanalization.find_two_symbols_v2(k=self.k, prime_implicants=pi1)
                    )
        elif 'ts_coverage' in kwargs:
            self._check_compute_canalization_variables(two_symbols=True)
            if self._ts_coverage is None:
                self._ts_coverage = BCanalization.computes_ts_coverage(
                    self.k, self.outputs, self._two_symbols)

        else:
            raise Exception('Canalization variable name not found. %s' %
                            kwargs)
        return True
예제 #2
0
파일: boolean_node.py 프로젝트: xuan-w/CANA
    def _check_compute_canalization_variables(self, **kwargs):
        """ Recursevely check if the requested canalization variables are instantiated/computed, otherwise computes them in order.
		For example: to compute `two_symbols` we need `prime_implicants` first.
		Likewise, to compute `prime_implicants` we need the `transition_density_tuple` first.
		"""
        if 'transition_density_tuple' in kwargs:
            if self._transition_density_tuple is None:
                if self.verbose:
                    print("Computing: Transition Density Tuple Table")
                self._transition_density_tuple = BCanalization.make_transition_density_tables(
                    self.k, self.outputs)

        elif 'prime_implicants' in kwargs:
            self._check_compute_canalization_variables(
                transition_density_tuple=True)
            if self._prime_implicants is None:
                if self.verbose: print("Computing: Prime Implicants")
                self._prime_implicants = \
                 (
                  BCanalization.find_implicants_qm(column=self._transition_density_tuple[0]),
                  BCanalization.find_implicants_qm(column=self._transition_density_tuple[1])
                 )

        elif 'pi_coverage' in kwargs:
            self._check_compute_canalization_variables(prime_implicants=True)
            if self._pi_coverage is None:
                if self.verbose:
                    print("Computing: Coverage of Prime Implicants")
                self._pi_coverage = BCanalization.computes_pi_coverage(
                    self.k, self.outputs, self._prime_implicants)

        elif 'two_symbols' in kwargs:
            self._check_compute_canalization_variables(prime_implicants=True)
            if self._two_symbols is None:
                if self.verbose: print("Computing: Two Symbols")
                self._two_symbols = \
                 (
                  BCanalization.find_two_symbols_v2(k=self.k, prime_implicants=self._prime_implicants[0]),
                  BCanalization.find_two_symbols_v2(k=self.k, prime_implicants=self._prime_implicants[1])
                 )
        elif 'ts_coverage' in kwargs:
            self._check_compute_canalization_variables(two_symbols=True)
            if self._ts_coverage is None:
                if self.verbose: print("Computing: Coverage of Two Symbols")
                self._ts_coverage = BCanalization.computes_ts_coverage(
                    self.k, self.outputs, self._two_symbols)

        else:
            raise Exception('Canalization variable name not found. %s' %
                            kwargs)
        return True