Commits

Volker Braun  committed 01dca99

updated for sage-5.8.rc0

  • Participants
  • Parent commits 6c3a653

Comments (0)

Files changed (8)

-trac_14188_vb.patch
-trac_14188_docfix.patch
-trac_14175_plot_options.patch
 trac_13249_vb.patch
 trac_13249_volume.patch
+trac_13249-review-fc.patch
 trac_12553_ppl_count_points.patch
 trac_12553_ppl_lattice_polytope.patch
 trac_12553_palp_database.patch

File trac_13249-review-fc.patch

+# HG changeset patch
+# User Frederic Chapoton <chapoton at math.univ-lyon1.fr>
+# Date 1363469649 -3600
+# Node ID fc5fd17c0d6f8548e7d0d7ff82971ffb9b617c5b
+# Parent  589c113dfd9707962f9583e877abb885da361ae4
+trac #13249 review patch : minor changes + removal of unused imports
+
+diff --git a/sage/geometry/polyhedron/base.py b/sage/geometry/polyhedron/base.py
+--- a/sage/geometry/polyhedron/base.py
++++ b/sage/geometry/polyhedron/base.py
+@@ -15,22 +15,19 @@ Base class for polyhedra
+ 
+ from sage.structure.element import Element, coerce_binop, is_Vector
+ 
+-from sage.misc.all import union, cached_method, prod
++from sage.misc.all import cached_method, prod
+ from sage.misc.package import is_package_installed
+ 
+-from sage.rings.all import Integer, QQ, ZZ, primes_first_n
+-from sage.rings.rational import Rational
++from sage.rings.all import Integer, QQ, ZZ
+ from sage.rings.real_double import RDF
+ from sage.modules.free_module_element import vector
+-from sage.matrix.constructor import matrix, identity_matrix
++from sage.matrix.constructor import matrix
+ from sage.functions.other import sqrt, floor, ceil
+-
+-from sage.plot.all import point2d, line2d, arrow, polygon2d
+-from sage.plot.plot3d.all import point3d, line3d, arrow3d, polygon3d
++from sage.misc.prandom import randint
++
+ from sage.graphs.graph import Graph
+ 
+ from sage.combinat.cartesian_product import CartesianProduct
+-from sage.groups.perm_gps.permgroup_named import AlternatingGroup
+ 
+ from constructor import Polyhedron
+ 
+@@ -1384,7 +1381,6 @@ class Polyhedron_base(Element):
+             (A vertex at (0, 1), A vertex at (1, 0))
+         """
+         obj = self.Vrepresentation()
+-        edges = []
+         for i in range(len(obj)):
+             if not obj[i].is_vertex(): continue
+             for j in range(i+1,len(obj)):
+@@ -3118,11 +3114,11 @@ class Polyhedron_base(Element):
+ 
+         EXAMPLES::
+ 
+-            sage: polytopes.n_cube(3)._volume_lrs() # optional - lrs
++            sage: polytopes.n_cube(3)._volume_lrs() #optional - lrs
+             8.0
+-            sage: (polytopes.n_cube(3)*2)._volume_lrs() # optional - lrs
++            sage: (polytopes.n_cube(3)*2)._volume_lrs() #optional - lrs
+             64.0
+-            sage: polytopes.twenty_four_cell()._volume_lrs() # optional - lrs
++            sage: polytopes.twenty_four_cell()._volume_lrs() #optional - lrs
+             2.0
+ 
+         REFERENCES:
+@@ -3170,13 +3166,13 @@ class Polyhedron_base(Element):
+ 
+         EXAMPLES::
+ 
+-            sage: polytopes.n_cube(3).lrs_volume() #optional, needs lrs package installed
++            sage: polytopes.n_cube(3).lrs_volume() #optional - lrs
+             doctest:...: DeprecationWarning: use volume(engine='lrs') instead
+             See http://trac.sagemath.org/13249 for details.
+             8.0
+-            sage: (polytopes.n_cube(3)*2).lrs_volume() #optional, needs lrs package installed
++            sage: (polytopes.n_cube(3)*2).lrs_volume() #optional - lrs
+             64.0
+-            sage: polytopes.twenty_four_cell().lrs_volume() #optional, needs lrs package installed
++            sage: polytopes.twenty_four_cell().lrs_volume() #optional - lrs
+             2.0
+ 
+         REFERENCES:
+@@ -3214,13 +3210,19 @@ class Polyhedron_base(Element):
+             64
+             sage: polytopes.twenty_four_cell().volume()
+             2
+-        
++
+             sage: polytopes.regular_polygon(5, base_ring=RDF).volume()
+             2.37764129...
+-            sage: polytopes.regular_polygon(5, base_ring=QQ).volume()   # rational approximation
++            sage: P5 = polytopes.regular_polygon(5, base_ring=QQ)
++            sage: P5.volume()   # rational approximation
+             3387471714099766473500515673753476175274812279494567801326487870013/1424719417220622426561086640229666223984528142237277803327699435400
+             sage: _.n()
+             2.37764129...
++
++        Volume of the same polytope, using the optional package lrs::
++
++            sage: P5.volume(engine='lrs') #optional - lrs
++            2.37764129...
+         """
+         if engine=='lrs':
+             return self._volume_lrs(**kwds)

File trac_13249_vb.patch

 # HG changeset patch
 # User Franco Saliola <saliola@gmail.com>
 # Date 1360775208 18000
-# Node ID 3d6d4e866cf9ca0b4671cde2f1f524538133da7c
-# Parent  ec1fb07db6e23f9fbd4c34f0d48198d08ec76473
-
+# Node ID f2dedcf836ef88f49914314f7fbba8e1b9f30d6f
+# Parent  69b0f872c3416fc48bd1e2ebeb0ca67f35c2d7d4
 Fix the optional lrs interface
 
 diff --git a/sage/geometry/polyhedron/base.py b/sage/geometry/polyhedron/base.py
 --- a/sage/geometry/polyhedron/base.py
 +++ b/sage/geometry/polyhedron/base.py
-@@ -2842,6 +2842,8 @@ class Polyhedron_base(Element):
+@@ -3197,6 +3197,8 @@
                    'for this function to work'
              raise NotImplementedError
  

File trac_13249_volume.patch

 # HG changeset patch
-# Parent e081b7e82a0aee5be907020f159a23a490b11101
-
+# User Volker Braun <vbraun@stp.dias.ie>
+# Date 1362885774 18000
+# Node ID a72f13f5bb2bcdfe749168e46d963bd913c4b5ae
+# Parent  f2dedcf836ef88f49914314f7fbba8e1b9f30d6f
 Native implementation of volume computation.
 
 diff --git a/sage/geometry/polyhedron/base.py b/sage/geometry/polyhedron/base.py
 --- a/sage/geometry/polyhedron/base.py
 +++ b/sage/geometry/polyhedron/base.py
-@@ -3100,9 +3100,9 @@
+@@ -3170,9 +3170,9 @@
                                for j in range(self.ambient_dim())]
          return proj.schlegel(projection_direction = projection_dir, height = height)
  
  
          OUTPUT:
  
-@@ -3111,11 +3111,11 @@
+@@ -3181,11 +3181,11 @@
  
          EXAMPLES::
  
--            sage: polytopes.n_cube(3).lrs_volume() #optional, needs lrs package installed
-+            sage: polytopes.n_cube(3)._volume_lrs() #optional, needs lrs package installed
+-            sage: polytopes.n_cube(3).lrs_volume() # optional - lrs
++            sage: polytopes.n_cube(3)._volume_lrs() # optional - lrs
              8.0
--            sage: (polytopes.n_cube(3)*2).lrs_volume() #optional, needs lrs package installed
-+            sage: (polytopes.n_cube(3)*2)._volume_lrs() #optional, needs lrs package installed
+-            sage: (polytopes.n_cube(3)*2).lrs_volume() # optional - lrs
++            sage: (polytopes.n_cube(3)*2)._volume_lrs() # optional - lrs
              64.0
--            sage: polytopes.twenty_four_cell().lrs_volume() #optional, needs lrs package installed
-+            sage: polytopes.twenty_four_cell()._volume_lrs() #optional, needs lrs package installed
+-            sage: polytopes.twenty_four_cell().lrs_volume() # optional - lrs
++            sage: polytopes.twenty_four_cell()._volume_lrs() # optional - lrs
              2.0
  
          REFERENCES:
-@@ -3150,7 +3150,79 @@
+@@ -3220,7 +3220,79 @@
                  volume = RDF(QQ(volume))
                  return volume
  

File trac_14175_plot_options.patch

-# HG changeset patch
-# Parent f8fbea9a346716af5ba987865acf395337a5472b
-
-Options for plotting of polytopes
-
-diff --git a/sage/geometry/polyhedron/base.py b/sage/geometry/polyhedron/base.py
---- a/sage/geometry/polyhedron/base.py
-+++ b/sage/geometry/polyhedron/base.py
-@@ -420,17 +420,35 @@
-                     for other_H, self_V in
-                     CartesianProduct(other.Hrepresentation(), self.Vrepresentation()) )
- 
--    def plot(self, **kwds):
-+    def plot(self, 
-+             point={}, line={}, polygon={},
-+             wireframe={}, fill={},
-+             **kwds):
-         """
-         Return a graphical representation.
- 
-         INPUT:
- 
--        - ``**kwds`` -- optional keyword parameters.
--
--        See :func:`render_2d`, :func:`render_3d`, :func:`render_4d`
--        for a description of available options for different ambient
--        space dimensions.
-+        - ``point``, ``line``, ``polygon`` -- Parameters to pass to
-+          point (0d), line (1d), and polygon (2d) plot
-+          commands. Allowed values are
-+
-+          * Python dictionary: Passed as keywords to the plot
-+            commands.
-+
-+          * String or triple of numbers: The color. This is equivalent
-+            to passing the dictionary ``{'color':...}``.
-+          
-+          * ``None`` or ``False``: Switch off drawing of the
-+            corresponding graphics options.
-+
-+        - ``wireframe``, ``fill`` -- Similar to ``point`` / ``line`` /
-+          ``polygon``, but ``fill`` is used for the graphics objects
-+          in the dimension of the polytope and ``wireframe`` is used
-+          for all lower-dimensional graphics objects.
-+
-+        - ``**kwds`` -- optional keyword parameters that are passed to
-+          all graphics objectcs.
- 
-         OUTPUT:
- 
-@@ -438,14 +456,59 @@
- 
-         TESTS::
- 
--            sage: polytopes.n_cube(2).plot()
-+            sage: square = polytopes.n_cube(2)
-+            sage: plt = square.plot()
-+            sage: for p in plt:
-+            ...       print p.options()['rgbcolor'], p
-+            (0, 0, 1) Point set defined by 4 point(s)
-+            (0, 0, 1) Line defined by 2 points
-+            (0, 0, 1) Line defined by 2 points
-+            (0, 0, 1) Line defined by 2 points
-+            (0, 0, 1) Line defined by 2 points
-+            (0, 1, 0) Polygon defined by 4 points
-+
-+        Draw the lines in red and nothing else::
-+
-+            sage: plt = square.plot(point=None, line='red', polygon=False)
-+            sage: for p in plt:
-+            ...       print p.options()['rgbcolor'], p
-+            red Line defined by 2 points
-+            red Line defined by 2 points
-+            red Line defined by 2 points
-+            red Line defined by 2 points
-+
-+        Draw vertices in red, no lines, and a blue polygon::
-+
-+            sage: plt = square.plot(point={'color':'red'}, line=False, fill=(0,0,1))
-+            sage: for p in plt:
-+            ...       print p.options()['rgbcolor'], p
-+            red Point set defined by 4 point(s)
-+            (0, 0, 1) Polygon defined by 4 points
-         """
-+        def merge_options(*opts):
-+            merged = dict()
-+            for i in range(len(opts)):
-+                opt = opts[i]
-+                if opt in (False, None):
-+                    return False
-+                elif isinstance(opt, (basestring, list, tuple)):
-+                    merged['color'] = opt
-+                else:
-+                    merged.update(opt)
-+            return merged
-+
-+        opts = [point, line, polygon]
-+        if self.dim() <= 2:
-+            opts[self.dim()] = merge_options(opts[self.dim()], fill, kwds)
-+        for i in range(min(3, self.dim())):
-+            opts[i] = merge_options(opts[i], wireframe, kwds)
-+        
-         from plot import render_2d, render_3d, render_4d
-         render_method = [ None, None, render_2d, render_3d, render_4d ]
-         if self.ambient_dim() < len(render_method):
-             render = render_method[self.ambient_dim()]
-             if render != None:
--                return render(self,**kwds)
-+                return render(self, *opts)
-         raise NotImplementedError('Plotting of '+str(self.ambient_dim())+
-                                   '-dimensional polyhedra not implemented')
- 
-diff --git a/sage/geometry/polyhedron/plot.py b/sage/geometry/polyhedron/plot.py
---- a/sage/geometry/polyhedron/plot.py
-+++ b/sage/geometry/polyhedron/plot.py
-@@ -29,7 +29,7 @@
- 
- 
- #############################################################
--def render_2d(projection, **kwds):
-+def render_2d(projection, point_opts={}, line_opts={}, polygon_opts={}):
-     """
-     Return 2d rendering of the projection of a polyhedron into
-     2-dimensional ambient space.
-@@ -54,13 +54,24 @@
-     """
-     if is_Polyhedron(projection):
-         projection = Projection(projection)
--    return \
--        projection.render_points_2d(zorder=2, pointsize=10, **kwds) + \
--        projection.render_outline_2d(zorder=1, **kwds) + \
--        projection.render_fill_2d(zorder=0, rgbcolor=(0,1,0), **kwds)
-+    from sage.plot.graphics import Graphics
-+    plt = Graphics()
-+    if isinstance(point_opts, dict):
-+        point_opts.setdefault('zorder', 2)
-+        point_opts.setdefault('pointsize', 10)
-+        plt += projection.render_points_2d(**point_opts)
-+    if isinstance(line_opts, dict):
-+        line_opts.setdefault('zorder', 1)
-+        plt += projection.render_outline_2d(**line_opts)
-+    if isinstance(polygon_opts, dict):
-+        polygon_opts.setdefault('zorder', 0)
-+        if 'color' not in polygon_opts:
-+            polygon_opts.setdefault('rgbcolor', (0,1,0))
-+        plt += projection.render_fill_2d(**polygon_opts)
-+    return plt
- 
- 
--def render_3d(projection, **kwds):
-+def render_3d(projection, point_opts={}, line_opts={}, polygon_opts={}):
-     """
-     Return 3d rendering of a polyhedron projected into
-     3-dimensional ambient space.
-@@ -90,13 +101,23 @@
-     """
-     if is_Polyhedron(projection):
-         projection = Projection(projection)
--    return \
--        projection.render_vertices_3d(width=3, color='green', **kwds) +\
--        projection.render_wireframe_3d(width=3, color='green', **kwds) + \
--        projection.render_solid_3d(**kwds)
-+    from sage.plot.plot3d.base import Graphics3d
-+    plt = Graphics3d()
-+    if isinstance(point_opts, dict):
-+        point_opts.setdefault('width', 3)
-+        if 'rgbcolor' not in polygon_opts:
-+            point_opts.setdefault('color', 'green')
-+        plt += projection.render_vertices_3d(**point_opts)
-+    if isinstance(line_opts, dict):
-+        line_opts.setdefault('width', 3)
-+        if 'rgbcolor' not in polygon_opts:
-+            line_opts.setdefault('color', 'green')
-+        plt += projection.render_wireframe_3d(**line_opts)
-+    if isinstance(polygon_opts, dict):
-+        plt += projection.render_solid_3d(**polygon_opts)
-+    return plt
- 
--
--def render_4d(polyhedron, **kwds):
-+def render_4d(polyhedron, point_opts={}, line_opts={}, polygon_opts={}, projection_direction=None):
-     """
-     Return a 3d rendering of the Schlegel projection of a 4d
-     polyhedron projected into 3-dimensional space.
-@@ -111,10 +132,13 @@
-     - ``polyhedron`` -- A
-       :mod:`~sage.geometry.polyhedron.constructor.Polyhedron` object.
- 
--    - ``kwds`` -- plot keywords. Passing
--      ``projection_direction=<list>`` sets the projetion direction of
--      the Schlegel projection. If it is not given, the center of a
--      facet is used.
-+    - ``point_opts``, ``line_opts``, ``polygon_opts`` -- dictionaries
-+      of plot keywords or ``False`` to disable. 
-+
-+    - ``projection_direction`` -- list/tuple/iterable of coordinates
-+      or ``None`` (default). Sets the projetion direction of the
-+      Schlegel projection. If it is not given, the center of a facet
-+      is used.
- 
-     EXAMPLES::
- 
-@@ -135,10 +159,7 @@
-         sage: tach_str.count('FCylinder')
-         32
-     """
--    projection_direction = None
--    try:
--        projection_direction = kwds.pop('projection_direction')
--    except KeyError:
-+    if projection_direction is None:
-         for ineq in polyhedron.inequality_generator():
-             center = [v() for v in ineq.incident() if v.is_vertex()]
-             center = sum(center) / len(center)
-@@ -146,7 +167,7 @@
-                 projection_direction = center
-                 break
-     projection_3d = Projection(polyhedron).schlegel(projection_direction)
--    return render_3d(projection_3d, **kwds)
-+    return render_3d(projection_3d, point_opts, line_opts, polygon_opts)
- 
- 
- 

File trac_14187_lazy_everywhere.patch

 # HG changeset patch
-# Parent 00b24fa9ca2e5eb19144cfe282f01630f8720380
-
+# User Volker Braun <vbraun@stp.dias.ie>
+# Date 1363031056 14400
+# Node ID 8cefe2e05ac231bb402c982ff1349356d129bcb7
+# Parent  f1fdd943f9441ea88c517fa21424181b17d034b1
 Replace all lazy references to a lazy import when resolving it.
 
 diff --git a/sage/libs/gap/libgap.pyx b/sage/libs/gap/libgap.pyx
              <class 'sage.libs.gap.libgap.Gap'>
          """
          initialize()
+diff --git a/sage/misc/dev_tools.py b/sage/misc/dev_tools.py
+--- a/sage/misc/dev_tools.py
++++ b/sage/misc/dev_tools.py
+@@ -139,8 +139,8 @@
+     In principle, the function should also work on object which are instances.
+     In case of ambiguity, one or two warning lines are printed::
+ 
+-        sage: import_statements(NN)
+-        from sage.rings.semirings.non_negative_integer_semiring import NN
++        sage: import_statements(RDF)
++        from sage.rings.real_double import RDF
+ 
+         sage: import_statements(ZZ)
+           ** Warning **: several names for that object: ZZ, Z
 diff --git a/sage/misc/lazy_import.pyx b/sage/misc/lazy_import.pyx
 --- a/sage/misc/lazy_import.pyx
 +++ b/sage/misc/lazy_import.pyx
          """
          if self._object is None:
              if startup_guard:
-@@ -213,18 +224,53 @@
+@@ -213,18 +224,54 @@
                  print 'Calling stack:'
                  traceback.print_stack(None, None, sys.stdout)
                  print '-' * 79
 +            True
 +        """
 +        import gc
++        gc_was_enabled = gc.isenabled()
 +        gc.disable()
-+        gc.collect()
 +        for ref in gc.get_referrers(self):
-+            if not isinstance(ref, dict):
++            if type(ref) is not dict:
 +                continue
 +            # the dicts are modules or classes holding lazy imports
-+            for k,v in ref.items():
-+                if v is self:
-+                    ref[k] = obj
-+        gc.enable()
++            lazy_keys = [k for k,v in ref.iteritems() if v is self]
++            for k in lazy_keys:
++                ref[k] = obj
++        if gc_was_enabled:
++            gc.enable()
 +
      
      def _sage_doc_(self):

File trac_14188_docfix.patch

-# HG changeset patch
-# User Volker Braun <vbraun@stp.dias.ie>
-# Date 1362080002 36000
-# Node ID 146639f9b98662a278732d2c050ec66014ce1577
-# Parent  8d5b47f3219290706989a2749735e47c5b98c8d5
-Switch off color in doctests
-
-diff --git a/sage/interfaces/sage0.py b/sage/interfaces/sage0.py
---- a/sage/interfaces/sage0.py
-+++ b/sage/interfaces/sage0.py
-@@ -145,10 +145,10 @@
-         else:
-             # Disable the IPython history (implemented as SQLite database)
-             # to avoid problems with locking.
--            command = "sage-ipython --HistoryManager.hist_file=:memory:"
-+            command = "sage-ipython --HistoryManager.hist_file=:memory: --colors=NoColor"
-             prompt = "sage: "
-             if init_code is None:
--                init_code = ['import cPickle', '%colors NoColor']
-+                init_code = ['import cPickle']
- 
-         Expect.__init__(self,
-                         name = 'sage',
-diff --git a/sage/misc/interpreter.py b/sage/misc/interpreter.py
---- a/sage/misc/interpreter.py
-+++ b/sage/misc/interpreter.py
-@@ -660,7 +660,7 @@
-         verbose_crash = True),
-     TerminalInteractiveShell = Config(
-         ast_node_interactivity = 'all',
--        colors = 'LightBG',
-+        colors = 'LightBG' if sys.stdout.isatty() else 'NoColor',
-         confirm_exit = False,
-         separate_in = ''),
-     # The extension is *always* loaded for SageTerminalApp

File trac_14188_vb.patch

-# HG changeset patch
-# User J. H. Palmieri <palmieri@math.washington.edu>
-# Date 1361903310 28800
-# Node ID 8d5b47f3219290706989a2749735e47c5b98c8d5
-# Parent  be4962cdd100d0521c00f2469aa014e2a124ca5c
-Merge user's IPython configuration with Sage's.
-
-diff --git a/sage/misc/interpreter.py b/sage/misc/interpreter.py
---- a/sage/misc/interpreter.py
-+++ b/sage/misc/interpreter.py
-@@ -649,19 +649,23 @@
-             app, contact_name, contact_email, bug_tracker, show_crash_traceback=False)
-         self.crash_report_fname = 'Sage_crash_report.txt'
- 
--DEFAULT_SAGE_CONFIG = Config(PromptManager = Config(in_template = 'sage: ',
--                                                    in2_template = '....: ',
--                                                    justify = False,
--                                                    out_template = ''),
--                            TerminalIPythonApp = Config(display_banner = False,
--                                                        verbose_crash = True),
--                            TerminalInteractiveShell = Config(ast_node_interactivity = 'all',
--                                                              colors = 'NoColor',
--                                                              confirm_exit = False,
--                                                              separate_in = ''),
--                            # The extension is *always* loaded for SageTerminalApp
--                            # See the code for SageTerminalApp.init_shell
--                            #InteractiveShellApp = Config(extensions=['sage.misc.sage_extension']),
-+DEFAULT_SAGE_CONFIG = Config(
-+    PromptManager = Config(
-+        in_template = 'sage: ',
-+        in2_template = '....: ',
-+        justify = False,
-+        out_template = ''),
-+    TerminalIPythonApp = Config(
-+        display_banner = False,
-+        verbose_crash = True),
-+    TerminalInteractiveShell = Config(
-+        ast_node_interactivity = 'all',
-+        colors = 'LightBG',
-+        confirm_exit = False,
-+        separate_in = ''),
-+    # The extension is *always* loaded for SageTerminalApp
-+    # See the code for SageTerminalApp.init_shell
-+    #InteractiveShellApp = Config(extensions=['sage.misc.sage_extension']),
-     )
- 
- class SageTerminalApp(TerminalIPythonApp):
-@@ -670,14 +674,31 @@
-     test_shell = False
- 
-     def __init__(self, **kwargs):
--        # Overwrite the default Sage configuration with the user's.
--        new_config = Config()
--        new_config._merge(DEFAULT_SAGE_CONFIG)
--        new_config._merge(kwargs.get('config', Config()))
--        kwargs['config']=new_config
-+        self.command_line_config = kwargs.get('config', Config())
-         super(SageTerminalApp, self).__init__(**kwargs)
- 
- 
-+    def load_config_file(self, *args, **kwds):
-+        from IPython.frontend.terminal.ipapp import default_config_file_name
-+        from IPython.config.loader import PyFileConfigLoader, ConfigFileNotFound
-+        from IPython.core.profiledir import ProfileDir
-+        from IPython.utils.path import get_ipython_dir
-+
-+        conf = Config()
-+        conf._merge(DEFAULT_SAGE_CONFIG)
-+        conf._merge(self.command_line_config)
-+
-+        # Get user config.
-+        sage_profile_dir = ProfileDir.find_profile_dir_by_name(
-+            get_ipython_dir(), 'sage').location
-+        try:
-+            cl = PyFileConfigLoader(default_config_file_name, sage_profile_dir)
-+            conf._merge(cl.load_config())
-+        except ConfigFileNotFound:
-+            pass
-+        self.update_config(conf)
-+
-+
-     def init_shell(self):
-         r"""
-         Initialize the :class:`SageInteractiveShell` instance.