def set_shape(self, shape): "Sets the shape parameter for a Gamma distribution over rates." if self._rate_het_type > RateHetType.LAST_GAMMA: raise TypeError("RateHetManager.set_shape can only be used with gamma distributions") if shape > _MIN_GAMMA_SHAPE: self._rate_list = None # this will trigger recalculation of the rates self._shape = shape self._state_hash_dirty = True casrvo_set_shape(self._asrv, shape) else: raise ValueError("Shape must be > %f" % _MIN_GAMMA_SHAPE)
def __init__(self, rate_het_type=RateHetType.ARBITRARY_RATES, **kwargs): """Currently just supports the discrete approximation of gamma-distributed rates. `rate_het_type` indicates the distribution used to calculate rates this should be a facet of the RateHetType "enum" """ if rate_het_type > RateHetType.MAX_RATE_HET_TYPE: raise ValueError("Illegal value for rate_het_type") self._state_hash = None self._state_hash_dirty = True self._rate_het_type = rate_het_type num_categories = kwargs.get("num_categories", 0) rates = kwargs.get("rates") probabilities = kwargs.get("probabilities") if not num_categories: if rates: num_categories = len(rates) elif probabilities: num_categories = len(probabilities) else: raise ValueError('At least one of "num_categories", "rates", or "probabilities" arguments must be used') if num_categories < 1 or int(num_categories) != num_categories: raise ValueError("num_categories must be a positive integer") self._num_cat = num_categories if probabilities is None: self._probabilities = [1.0/num_categories] * num_categories self._rate_list = [1.0] * num_categories if rate_het_type <= RateHetType.LAST_GAMMA: shape = float(kwargs.get("shape", 0.5)) if shape <= 0.0: raise ValueError("shape must be greater than 0.0") s = max(_MIN_GAMMA_SHAPE, shape) a = casrvo_ctor(s, num_categories, rate_het_type) casrvo_set_shape(a, shape) assert(a is not None) self._asrv = a self._rate_list = None self.shape = s if rates: self.rates = rates if probabilities: self.probabilities = probabilities self._prob_hash = None