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
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