예제 #1
0
 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)
예제 #2
0
    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