Esempio n. 1
0
 def __init__(self, base, parent_approximation, models=None, exact=Infinity,
              category=None, element_constructor=None, gens=None, names=None, normalize=True, facade=None):
     Parent.__init__(self,base,category=category,element_constructor=element_constructor,
                     gens=gens, names=names, normalize=normalize, facade=facade)
     self._approximation = parent_approximation
     self._precision = ParentBigOh(self)
     if models is None:
         dimension = self.dimension()
         if dimension == 1:
             self._precision.add_model(ValuationBigOh)
         else:
             if self.dimension() < Infinity:
                 self._precision.add_model(FlatBigOh)
             self._precision.add_model(JaggedBigOh)
             try:
                 if self.indices_basis() is None:
                     self._precision.add_model(FlatIntervalBigOh)
                     self._precision.add_modelconversion(FlatIntervalBigOh,JaggedBigOh)
             except NotImplementedError:
                 pass
             self._precision.add_modelconversion(FlatBigOh,JaggedBigOh,safemode=True)
             self._precision.add_modelconversion(FlatBigOh,FlatIntervalBigOh,safemode=True)
     else:
         for model in models.vertices():
             self._precision.add_model(model)
         for (mfrom,mto,map) in models.edges():
             self._precision.add_modelconversion(mfrom,mto,map)
     try:
         self._exact_precision = self._precision(exact)
     except PrecisionError:
         self._exact_precision = ExactBigOh(self._precision)
Esempio n. 2
0
class Parent_inexact(Parent,UniqueRepresentation):
    def __init__(self, base, parent_approximation, models=None, exact=Infinity,
                 category=None, element_constructor=None, gens=None, names=None, normalize=True, facade=None):
        Parent.__init__(self,base,category=category,element_constructor=element_constructor,
                        gens=gens, names=names, normalize=normalize, facade=facade)
        self._approximation = parent_approximation
        self._precision = ParentBigOh(self)
        if models is None:
            dimension = self.dimension()
            if dimension == 1:
                self._precision.add_model(ValuationBigOh)
            else:
                if self.dimension() < Infinity:
                    self._precision.add_model(FlatBigOh)
                self._precision.add_model(JaggedBigOh)
                try:
                    if self.indices_basis() is None:
                        self._precision.add_model(FlatIntervalBigOh)
                        self._precision.add_modelconversion(FlatIntervalBigOh,JaggedBigOh)
                except NotImplementedError:
                    pass
                self._precision.add_modelconversion(FlatBigOh,JaggedBigOh,safemode=True)
                self._precision.add_modelconversion(FlatBigOh,FlatIntervalBigOh,safemode=True)
        else:
            for model in models.vertices():
                self._precision.add_model(model)
            for (mfrom,mto,map) in models.edges():
                self._precision.add_modelconversion(mfrom,mto,map)
        try:
            self._exact_precision = self._precision(exact)
        except PrecisionError:
            self._exact_precision = ExactBigOh(self._precision)

    def __hash__(self):
        return id(self)

    def uniformizer_name(self):
        base = self._base
        if hasattr(base, "uniformizer_name"):
            return base.uniformizer_name()
        elif hasattr(base, "uniformizer"):
            import re
            return re.sub("\s*\+\s*O(.*)", "", base.uniformizer().__repr__())
        else:
            raise NotImplementedError

    def _repr_(self):
        s = self._approximation.__repr__()
        i = s.rfind("over ")
        if i == -1: s = ""
        else: s = s[:i+5]
        s += self._base.__repr__()
        return s

    def approximation(self):
        return self._approximation

    def default_working_precision(self):
        return self._default_workprec

    def is_exact(self):
        return False

    def random_element(self,*args,**kwargs):
        dimension = self.dimension()
        if dimension is Infinity:
            raise NotImplementedError
        base = self.base_ring()
        coefficients = [ base.random_element(*args,**kwargs) for _ in range(dimension) ]
        return self(coefficients)

    def dimension(self):
        try:
            return self._approximation.dimension()
        except AttributeError:
            return Infinity

    def indices_basis(self):
        """
        None: the basis is indexed by usual natural integers (including 0, as always in Python)
        """
        pass

    def precision_models(self,graph=False):
        return self._precision.models(graph)

    def precision(self):
        return self._precision