def __init__(self, reward, number_type=None): if not isinstance(reward, (numbers.Real, str)): raise TypeError('specify a numeric reward') if number_type is None: number_type = cdd.get_number_type_from_value(reward) cdd.NumberTypeable.__init__(self, number_type) self.reward = self.make_number(reward)
def get_number_type(xprevs, xprobs): """Determine number type from arguments.""" # special case: nothing specified, defaults to float if (all(xprev is None for xprev in xprevs) and all(xprob is None for xprob in xprobs)): return 'float' # inspect all values for xprev in xprevs: if xprev is None: continue for key, value in xprev.iteritems(): # inspect gamble if isinstance(key, Gamble): if key.number_type == 'float': return 'float' elif isinstance(key, collections.Sequence): if cdd.get_number_type_from_sequences(key) == 'float': return 'float' elif isinstance(key, collections.Mapping): if cdd.get_number_type_from_sequences( key.itervalues()) == 'float': return 'float' # inspect value(s) if isinstance(value, collections.Sequence): if cdd.get_number_type_from_sequences( value) == 'float': return 'float' else: if cdd.get_number_type_from_value(value) == 'float': return 'float' for xprob in xprobs: if xprob is None: continue for key, value in iter_items(xprob): if cdd.get_number_type_from_value(value) == 'float': return 'float' # everything is fraction return 'fraction'
def get_number_type(xprevs, xprobs): """Determine number type from arguments.""" # special case: nothing specified, defaults to float if (all(xprev is None for xprev in xprevs) and all(xprob is None for xprob in xprobs)): return 'float' # inspect all values for xprev in xprevs: if xprev is None: continue for key, value in xprev.iteritems(): # inspect gamble if isinstance(key, Gamble): if key.number_type == 'float': return 'float' elif isinstance(key, collections.Sequence): if cdd.get_number_type_from_sequences(key) == 'float': return 'float' elif isinstance(key, collections.Mapping): if cdd.get_number_type_from_sequences(key.itervalues()) == 'float': return 'float' # inspect value(s) if isinstance(value, collections.Sequence): if cdd.get_number_type_from_sequences(value) == 'float': return 'float' else: if cdd.get_number_type_from_value(value) == 'float': return 'float' for xprob in xprobs: if xprob is None: continue for key, value in iter_items(xprob): if cdd.get_number_type_from_value(value) == 'float': return 'float' # everything is fraction return 'fraction'
def __init__(self, pspace, data, number_type=None): """Construct a gamble on the given possibility space. :param pspace: The possibility space. :type pspace: |pspacetype| :param data: The specification of a gamble, or a constant. :type data: |gambletype| :param number_type: The type to use for numbers: ``'float'`` or ``'fraction'``. If omitted, then :func:`~cdd.get_number_type_from_sequences` is used to determine the number type. :type number_type: :class:`str` """ self._pspace = PSpace.make(pspace) if isinstance(data, collections.Mapping): if number_type is None: cdd.NumberTypeable.__init__( self, cdd.get_number_type_from_sequences(data.itervalues())) else: cdd.NumberTypeable.__init__(self, number_type) self._data = dict((omega, self.make_number(data.get(omega, 0))) for omega in self.pspace) elif isinstance(data, collections.Sequence): if len(data) < len(self.pspace): raise ValueError("data sequence too short") if number_type is None: cdd.NumberTypeable.__init__( self, cdd.get_number_type_from_sequences(data)) else: cdd.NumberTypeable.__init__(self, number_type) self._data = dict((omega, self.make_number(value)) for omega, value in itertools.izip(self.pspace, data)) elif isinstance(data, numbers.Real): if number_type is None: cdd.NumberTypeable.__init__( self, cdd.get_number_type_from_value(data)) else: cdd.NumberTypeable.__init__(self, number_type) self._data = dict((omega, self.make_number(data)) for omega in self.pspace) else: raise TypeError('specify data as sequence or mapping')