From c05ef3844802b8073ad402ca93a6be1c599b0d4c Mon Sep 17 00:00:00 2001 From: John Hunter Date: Fri, 31 Jul 2009 13:38:56 +0000 Subject: [PATCH 0001/1000] remove community choice vote from website svn path=/trunk/matplotlib/; revision=7317 --- doc/_templates/indexsidebar.html | 10 ++-------- doc/mpl_toolkits/mplot3d/api.rst | 1 - doc/users/toolkits.rst | 2 +- examples/tests/backend_driver.py | 1 - 4 files changed, 3 insertions(+), 11 deletions(-) diff --git a/doc/_templates/indexsidebar.html b/doc/_templates/indexsidebar.html index 2a226344d91c..787689471b28 100644 --- a/doc/_templates/indexsidebar.html +++ b/doc/_templates/indexsidebar.html @@ -1,19 +1,13 @@

News

+

Please donate to support matplotlib development.

-

Watch a video lecture about matplotlib presented at NIPS 08 Workshop Machine Learning Open Source Software. -

-

Nominate matplotlib for a community choice award by clicking the -image below -- suggested category "Best Project for Academia" for -software which "helps you hit the books, analyze global trends, or -just understand the world a little bit better than you did before": - +

Watch a video lecture about matplotlib presented at NIPS 08 Workshop Machine Learning Open Source Software.

-

Download

Current version: {{ version }}

diff --git a/doc/mpl_toolkits/mplot3d/api.rst b/doc/mpl_toolkits/mplot3d/api.rst index d44115bcad83..2d7d8ee1a720 100644 --- a/doc/mpl_toolkits/mplot3d/api.rst +++ b/doc/mpl_toolkits/mplot3d/api.rst @@ -7,7 +7,6 @@ mplot3d API .. automodule:: mpl_toolkits.mplot3d.axes3d :members: - :exclude-members: contour3D, contourf3D, plot3D, scatter3D :show-inheritance: :mod:`mpl_toolkits.mplot3d.art3d` diff --git a/doc/users/toolkits.rst b/doc/users/toolkits.rst index f9fe3225399e..13433cfab66f 100644 --- a/doc/users/toolkits.rst +++ b/doc/users/toolkits.rst @@ -66,5 +66,5 @@ ease displaying multiple images in matplotlib. The AxesGrid toolkit is distributed with matplotlib source. .. image:: ../_static/demo_axes_grid.png - + See :ref:`toolkit_axesgrid-index` for documentations. diff --git a/examples/tests/backend_driver.py b/examples/tests/backend_driver.py index b4f938b736f8..1fdf3b10a35e 100644 --- a/examples/tests/backend_driver.py +++ b/examples/tests/backend_driver.py @@ -336,7 +336,6 @@ def drive(backend, directories, python=['python'], switches = []): for fullpath in testcases: print ('\tdriving %-40s' % (fullpath)), sys.stdout.flush() - fpath, fname = os.path.split(fullpath) if fname in exclude: From 1052aa428216ad31532b602e5f4578c50a75f6e8 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Fri, 31 Jul 2009 13:46:28 +0000 Subject: [PATCH 0002/1000] Update coding guide for 0.99 version svn path=/trunk/matplotlib/; revision=7321 --- doc/devel/coding_guide.rst | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/doc/devel/coding_guide.rst b/doc/devel/coding_guide.rst index 686fc52d5054..53cb9caae36c 100644 --- a/doc/devel/coding_guide.rst +++ b/doc/devel/coding_guide.rst @@ -27,12 +27,12 @@ Checking out the main source:: Branch checkouts, eg the maintenance branch:: svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/\ - v0_91_maint mpl91 --username=youruser --password=yourpass + v0_99_maint mpl99 --username=youruser --password=yourpass -The current release of the trunk is in the 0.98.5 maintenance branch:: +The current release of the trunk is in the 0.99.x maintenance branch:: svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/\ - v0_98_5_maint mpl98.5 --username=youruser --password=yourpass + v0_99_maint mpl99 --username=youruser --password=yourpass Committing changes @@ -96,7 +96,7 @@ The basic procedure is: svnmerge.py merge -S BRANCHNAME Where BRANCHNAME is the name of the branch to merge *from*, - e.g. v0_98_5_maint. + e.g. v0_99_maint. If you wish to merge only specific revisions (in an unusual situation), do:: @@ -130,17 +130,17 @@ Setting up svnmerge with this. * Creating a new branch from the trunk (if the release version is - 0.98.5 at revision 6573):: + 0.99 at revision 6573):: > svn copy \ - https://matplotlib.svn.sf.net/svnroot/matplotlib/trunk/matplotlib@6573 \ - https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_98_5_maint \ - -m "Creating maintenance branch for 0.98.5" + https://matplotlib.svn.sf.net/svnroot/matplotlib/trunk/matplotlib@7315 \ + https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint \ + -m "Creating maintenance branch for 0.99" * You can add a new branch for the trunk to "track" using "svnmerge.py init", e.g., from a working copy of the trunk:: - > svnmerge.py init https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_98_5_maint + > svnmerge.py init https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint property 'svnmerge-integrated' set on '.' After doing a "svn commit" on this, this merge tracking is available @@ -150,7 +150,7 @@ Setting up svnmerge * Tracking can later be removed with the "svnmerge.py uninit" command, e.g.:: - > svnmerge.py -S v0_9_5_maint uninit + > svnmerge.py -S v0_99_maint uninit .. _using-git: From d1f45f18b0bbcda6a0c79e1efe121d622e455162 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Mon, 3 Aug 2009 20:06:02 +0000 Subject: [PATCH 0003/1000] Merged revisions 7338 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7338 | jouni | 2009-08-03 22:41:32 +0300 (Mon, 03 Aug 2009) | 2 lines Fixed boilerplate.py so it doesn't break the ReST docs. ........ svn path=/trunk/matplotlib/; revision=7339 --- CHANGELOG | 2 + boilerplate.py | 22 +- lib/matplotlib/pyplot.py | 4433 +------------------------------------- 3 files changed, 107 insertions(+), 4350 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 4491821ee03e..4122a56b5cad 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +2009-08-03 Fixed boilerplate.py so it doesn't break the ReST docs. - JKS + ====================================================================== 2009-07-31 Tagging 0.99.0.rc1 at 7314 - MGD diff --git a/boilerplate.py b/boilerplate.py index e8017430c092..061e3b89bcc8 100644 --- a/boilerplate.py +++ b/boilerplate.py @@ -21,7 +21,6 @@ # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def %(func)s(%(argspec)s): - %(docstring)s %(ax)s = gca() # allow callers to override the hold state by passing hold=True|False %(washold)s = %(ax)s.ishold() @@ -35,16 +34,19 @@ def %(func)s(%(argspec)s): %(ax)s.hold(%(washold)s) %(mappable)s return %(ret)s +if Axes.%(func)s.__doc__ is not None: + %(func)s.__doc__ = dedent(Axes.%(func)s.__doc__) + __docstring_addendum """ _fmtmisc = """\ # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def %(func)s(%(argspec)s): - %(docstring)s %(ret)s = gca().%(func)s(%(call)s) draw_if_interactive() return %(ret)s +if Axes.%(func)s.__doc__ is not None: + %(func)s.__doc__ = dedent(Axes.%(func)s.__doc__) """ # these methods are all simple wrappers of Axes methods by the same @@ -138,19 +140,6 @@ def remove_final_whitespace(string): """ return '\n'.join(x.rstrip() for x in string.split('\n')) -def make_docstring(cmd, mention_hold): - func = getattr(Axes, cmd) - docstring = inspect.getdoc(func) - if docstring is None: - return "" - escaped = re.sub(r'\\', r'\\\\', docstring) - if mention_hold: - escaped += ''' - -Additional kwargs: hold = [True|False] overrides default hold state -''' - return '"""'+escaped+'"""' - for fmt,cmdlist in (_fmtplot,_plotcommands),(_fmtmisc,_misccommands): for func in cmdlist: # For some commands, an additional line is needed to set the @@ -160,9 +149,6 @@ def make_docstring(cmd, mention_hold): else: mappable = '' - # Format docstring - docstring = make_docstring(func, fmt is _fmtplot) - # Get argspec of wrapped function args, varargs, varkw, defaults = inspect.getargspec(getattr(Axes, func)) args.pop(0) # remove 'self' argument diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index 40e6a94bb5c0..07c90ebf8ce0 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -1608,72 +1608,17 @@ def getname_val(identifier): draw_if_interactive() +# This is added to docstrings of autogenerated plotting functions +__docstring_addendum = """ + +Additional kwargs: hold = [True|False] overrides default hold state""" + ## Plotting part 2: autogenerated wrappers for axes methods ## # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def acorr(x, hold=None, **kwargs): - """call signature:: - - acorr(x, normed=True, detrend=mlab.detrend_none, usevlines=True, - maxlags=10, **kwargs) - -Plot the autocorrelation of *x*. If *normed* = *True*, -normalize the data by the autocorrelation at 0-th lag. *x* is -detrended by the *detrend* callable (default no normalization). - -Data are plotted as ``plot(lags, c, **kwargs)`` - -Return value is a tuple (*lags*, *c*, *line*) where: - - - *lags* are a length 2*maxlags+1 lag vector - - - *c* is the 2*maxlags+1 auto correlation vector - - - *line* is a :class:`~matplotlib.lines.Line2D` instance - returned by :meth:`plot` - -The default *linestyle* is None and the default *marker* is -``'o'``, though these can be overridden with keyword args. -The cross correlation is performed with -:func:`numpy.correlate` with *mode* = 2. - -If *usevlines* is *True*, :meth:`~matplotlib.axes.Axes.vlines` -rather than :meth:`~matplotlib.axes.Axes.plot` is used to draw -vertical lines from the origin to the acorr. Otherwise, the -plot style is determined by the kwargs, which are -:class:`~matplotlib.lines.Line2D` properties. - -*maxlags* is a positive integer detailing the number of lags -to show. The default value of *None* will return all -:math:`2 \\mathrm{len}(x) - 1` lags. - -The return value is a tuple (*lags*, *c*, *linecol*, *b*) -where - -- *linecol* is the - :class:`~matplotlib.collections.LineCollection` - -- *b* is the *x*-axis. - -.. seealso:: - - :meth:`~matplotlib.axes.Axes.plot` or - :meth:`~matplotlib.axes.Axes.vlines` - For documentation on valid kwargs. - -**Example:** - -:func:`~matplotlib.pyplot.xcorr` above, and -:func:`~matplotlib.pyplot.acorr` below. - -**Example:** - -.. plot:: mpl_examples/pylab_examples/xcorr_demo.py - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -1687,51 +1632,12 @@ def acorr(x, hold=None, **kwargs): ax.hold(washold) return ret +if Axes.acorr.__doc__ is not None: + acorr.__doc__ = dedent(Axes.acorr.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def arrow(x, y, dx, dy, hold=None, **kwargs): - """call signature:: - - arrow(x, y, dx, dy, **kwargs) - -Draws arrow on specified axis from (*x*, *y*) to (*x* + *dx*, -*y* + *dy*). - -Optional kwargs control the arrow properties: - alpha: float (0.0 transparent through 1.0 opaque) - animated: [True | False] - antialiased or aa: [True | False] or None for default - axes: an :class:`~matplotlib.axes.Axes` instance - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - color: matplotlib color arg or sequence of rgba tuples - contains: a callable function - edgecolor or ec: mpl color spec, or None for default, or 'none' for no color - facecolor or fc: mpl color spec, or None for default, or 'none' for no color - figure: a :class:`matplotlib.figure.Figure` instance - fill: [True | False] - gid: an id string - hatch: [ '/' | '\\\\' | '|' | '-' | '+' | 'x' | 'o' | 'O' | '.' | '*' ] - label: any string - linestyle or ls: ['solid' | 'dashed' | 'dashdot' | 'dotted'] - linewidth or lw: float or None for default - lod: [True | False] - picker: [None|float|boolean|callable] - rasterized: [True | False | None] - snap: unknown - transform: :class:`~matplotlib.transforms.Transform` instance - url: a url string - visible: [True | False] - zorder: any number - -**Example:** - -.. plot:: mpl_examples/pylab_examples/arrow_demo.py - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -1745,90 +1651,12 @@ def arrow(x, y, dx, dy, hold=None, **kwargs): ax.hold(washold) return ret +if Axes.arrow.__doc__ is not None: + arrow.__doc__ = dedent(Axes.arrow.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def axhline(y=0, xmin=0, xmax=1, hold=None, **kwargs): - """call signature:: - - axhline(y=0, xmin=0, xmax=1, **kwargs) - -Axis Horizontal Line - -Draw a horizontal line at *y* from *xmin* to *xmax*. With the -default values of *xmin* = 0 and *xmax* = 1, this line will -always span the horizontal extent of the axes, regardless of -the xlim settings, even if you change them, eg. with the -:meth:`set_xlim` command. That is, the horizontal extent is -in axes coords: 0=left, 0.5=middle, 1.0=right but the *y* -location is in data coordinates. - -Return value is the :class:`~matplotlib.lines.Line2D` -instance. kwargs are the same as kwargs to plot, and can be -used to control the line properties. Eg., - -* draw a thick red hline at *y* = 0 that spans the xrange - - >>> axhline(linewidth=4, color='r') - -* draw a default hline at *y* = 1 that spans the xrange - - >>> axhline(y=1) - -* draw a default hline at *y* = .5 that spans the the middle half of - the xrange - - >>> axhline(y=.5, xmin=0.25, xmax=0.75) - -Valid kwargs are :class:`~matplotlib.lines.Line2D` properties: - - alpha: float (0.0 transparent through 1.0 opaque) - animated: [True | False] - antialiased or aa: [True | False] - axes: an :class:`~matplotlib.axes.Axes` instance - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - color or c: any matplotlib color - contains: a callable function - dash_capstyle: ['butt' | 'round' | 'projecting'] - dash_joinstyle: ['miter' | 'round' | 'bevel'] - dashes: sequence of on/off ink in points - data: 2D array - drawstyle: [ 'default' | 'steps' | 'steps-pre' | 'steps-mid' | 'steps-post' ] - figure: a :class:`matplotlib.figure.Figure` instance - fillstyle: ['full' | 'left' | 'right' | 'bottom' | 'top'] - gid: an id string - label: any string - linestyle or ls: [ '-' | '--' | '-.' | ':' | 'None' | ' ' | '' ] and any drawstyle in combination with a linestyle, e.g. 'steps--'. - linewidth or lw: float value in points - lod: [True | False] - marker: [ '+' | '*' | ',' | '.' | '1' | '2' | '3' | '4' | '<' | '>' | 'D' | 'H' | '^' | '_' | 'd' | 'h' | 'o' | 'p' | 's' | 'v' | 'x' | '|' | TICKUP | TICKDOWN | TICKLEFT | TICKRIGHT | 'None' | ' ' | '' ] - markeredgecolor or mec: any matplotlib color - markeredgewidth or mew: float value in points - markerfacecolor or mfc: any matplotlib color - markersize or ms: float - markevery: None | integer | (startind, stride) - picker: float distance in points or callable pick function ``fn(artist, event)`` - pickradius: float distance in points - rasterized: [True | False | None] - snap: unknown - solid_capstyle: ['butt' | 'round' | 'projecting'] - solid_joinstyle: ['miter' | 'round' | 'bevel'] - transform: a :class:`matplotlib.transforms.Transform` instance - url: a url string - visible: [True | False] - xdata: 1D array - ydata: 1D array - zorder: any number - -.. seealso:: - - :meth:`axhspan` - for example plot and source code - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -1842,72 +1670,12 @@ def axhline(y=0, xmin=0, xmax=1, hold=None, **kwargs): ax.hold(washold) return ret +if Axes.axhline.__doc__ is not None: + axhline.__doc__ = dedent(Axes.axhline.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def axhspan(ymin, ymax, xmin=0, xmax=1, hold=None, **kwargs): - """call signature:: - - axhspan(ymin, ymax, xmin=0, xmax=1, **kwargs) - -Axis Horizontal Span. - -*y* coords are in data units and *x* coords are in axes (relative -0-1) units. - -Draw a horizontal span (rectangle) from *ymin* to *ymax*. -With the default values of *xmin* = 0 and *xmax* = 1, this -always spans the xrange, regardless of the xlim settings, even -if you change them, eg. with the :meth:`set_xlim` command. -That is, the horizontal extent is in axes coords: 0=left, -0.5=middle, 1.0=right but the *y* location is in data -coordinates. - -Return value is a :class:`matplotlib.patches.Polygon` -instance. - -Examples: - -* draw a gray rectangle from *y* = 0.25-0.75 that spans the - horizontal extent of the axes - - >>> axhspan(0.25, 0.75, facecolor='0.5', alpha=0.5) - -Valid kwargs are :class:`~matplotlib.patches.Polygon` properties: - - alpha: float (0.0 transparent through 1.0 opaque) - animated: [True | False] - antialiased or aa: [True | False] or None for default - axes: an :class:`~matplotlib.axes.Axes` instance - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - color: matplotlib color arg or sequence of rgba tuples - contains: a callable function - edgecolor or ec: mpl color spec, or None for default, or 'none' for no color - facecolor or fc: mpl color spec, or None for default, or 'none' for no color - figure: a :class:`matplotlib.figure.Figure` instance - fill: [True | False] - gid: an id string - hatch: [ '/' | '\\\\' | '|' | '-' | '+' | 'x' | 'o' | 'O' | '.' | '*' ] - label: any string - linestyle or ls: ['solid' | 'dashed' | 'dashdot' | 'dotted'] - linewidth or lw: float or None for default - lod: [True | False] - picker: [None|float|boolean|callable] - rasterized: [True | False | None] - snap: unknown - transform: :class:`~matplotlib.transforms.Transform` instance - url: a url string - visible: [True | False] - zorder: any number - -**Example:** - -.. plot:: mpl_examples/pylab_examples/axhspan_demo.py - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -1921,90 +1689,12 @@ def axhspan(ymin, ymax, xmin=0, xmax=1, hold=None, **kwargs): ax.hold(washold) return ret +if Axes.axhspan.__doc__ is not None: + axhspan.__doc__ = dedent(Axes.axhspan.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def axvline(x=0, ymin=0, ymax=1, hold=None, **kwargs): - """call signature:: - - axvline(x=0, ymin=0, ymax=1, **kwargs) - -Axis Vertical Line - -Draw a vertical line at *x* from *ymin* to *ymax*. With the -default values of *ymin* = 0 and *ymax* = 1, this line will -always span the vertical extent of the axes, regardless of the -ylim settings, even if you change them, eg. with the -:meth:`set_ylim` command. That is, the vertical extent is in -axes coords: 0=bottom, 0.5=middle, 1.0=top but the *x* location -is in data coordinates. - -Return value is the :class:`~matplotlib.lines.Line2D` -instance. kwargs are the same as kwargs to plot, and can be -used to control the line properties. Eg., - -* draw a thick red vline at *x* = 0 that spans the yrange - - >>> axvline(linewidth=4, color='r') - -* draw a default vline at *x* = 1 that spans the yrange - - >>> axvline(x=1) - -* draw a default vline at *x* = .5 that spans the the middle half of - the yrange - - >>> axvline(x=.5, ymin=0.25, ymax=0.75) - -Valid kwargs are :class:`~matplotlib.lines.Line2D` properties: - - alpha: float (0.0 transparent through 1.0 opaque) - animated: [True | False] - antialiased or aa: [True | False] - axes: an :class:`~matplotlib.axes.Axes` instance - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - color or c: any matplotlib color - contains: a callable function - dash_capstyle: ['butt' | 'round' | 'projecting'] - dash_joinstyle: ['miter' | 'round' | 'bevel'] - dashes: sequence of on/off ink in points - data: 2D array - drawstyle: [ 'default' | 'steps' | 'steps-pre' | 'steps-mid' | 'steps-post' ] - figure: a :class:`matplotlib.figure.Figure` instance - fillstyle: ['full' | 'left' | 'right' | 'bottom' | 'top'] - gid: an id string - label: any string - linestyle or ls: [ '-' | '--' | '-.' | ':' | 'None' | ' ' | '' ] and any drawstyle in combination with a linestyle, e.g. 'steps--'. - linewidth or lw: float value in points - lod: [True | False] - marker: [ '+' | '*' | ',' | '.' | '1' | '2' | '3' | '4' | '<' | '>' | 'D' | 'H' | '^' | '_' | 'd' | 'h' | 'o' | 'p' | 's' | 'v' | 'x' | '|' | TICKUP | TICKDOWN | TICKLEFT | TICKRIGHT | 'None' | ' ' | '' ] - markeredgecolor or mec: any matplotlib color - markeredgewidth or mew: float value in points - markerfacecolor or mfc: any matplotlib color - markersize or ms: float - markevery: None | integer | (startind, stride) - picker: float distance in points or callable pick function ``fn(artist, event)`` - pickradius: float distance in points - rasterized: [True | False | None] - snap: unknown - solid_capstyle: ['butt' | 'round' | 'projecting'] - solid_joinstyle: ['miter' | 'round' | 'bevel'] - transform: a :class:`matplotlib.transforms.Transform` instance - url: a url string - visible: [True | False] - xdata: 1D array - ydata: 1D array - zorder: any number - -.. seealso:: - - :meth:`axhspan` - for example plot and source code - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -2018,73 +1708,12 @@ def axvline(x=0, ymin=0, ymax=1, hold=None, **kwargs): ax.hold(washold) return ret +if Axes.axvline.__doc__ is not None: + axvline.__doc__ = dedent(Axes.axvline.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def axvspan(xmin, xmax, ymin=0, ymax=1, hold=None, **kwargs): - """call signature:: - - axvspan(xmin, xmax, ymin=0, ymax=1, **kwargs) - -Axis Vertical Span. - -*x* coords are in data units and *y* coords are in axes (relative -0-1) units. - -Draw a vertical span (rectangle) from *xmin* to *xmax*. With -the default values of *ymin* = 0 and *ymax* = 1, this always -spans the yrange, regardless of the ylim settings, even if you -change them, eg. with the :meth:`set_ylim` command. That is, -the vertical extent is in axes coords: 0=bottom, 0.5=middle, -1.0=top but the *y* location is in data coordinates. - -Return value is the :class:`matplotlib.patches.Polygon` -instance. - -Examples: - -* draw a vertical green translucent rectangle from x=1.25 to 1.55 that - spans the yrange of the axes - - >>> axvspan(1.25, 1.55, facecolor='g', alpha=0.5) - -Valid kwargs are :class:`~matplotlib.patches.Polygon` -properties: - - alpha: float (0.0 transparent through 1.0 opaque) - animated: [True | False] - antialiased or aa: [True | False] or None for default - axes: an :class:`~matplotlib.axes.Axes` instance - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - color: matplotlib color arg or sequence of rgba tuples - contains: a callable function - edgecolor or ec: mpl color spec, or None for default, or 'none' for no color - facecolor or fc: mpl color spec, or None for default, or 'none' for no color - figure: a :class:`matplotlib.figure.Figure` instance - fill: [True | False] - gid: an id string - hatch: [ '/' | '\\\\' | '|' | '-' | '+' | 'x' | 'o' | 'O' | '.' | '*' ] - label: any string - linestyle or ls: ['solid' | 'dashed' | 'dashdot' | 'dotted'] - linewidth or lw: float or None for default - lod: [True | False] - picker: [None|float|boolean|callable] - rasterized: [True | False | None] - snap: unknown - transform: :class:`~matplotlib.transforms.Transform` instance - url: a url string - visible: [True | False] - zorder: any number - -.. seealso:: - - :meth:`axhspan` - for example plot and source code - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -2098,110 +1727,12 @@ def axvspan(xmin, xmax, ymin=0, ymax=1, hold=None, **kwargs): ax.hold(washold) return ret +if Axes.axvspan.__doc__ is not None: + axvspan.__doc__ = dedent(Axes.axvspan.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def bar(left, height, width=0.80000000000000004, bottom=None, color=None, edgecolor=None, linewidth=None, yerr=None, xerr=None, ecolor=None, capsize=3, align='edge', orientation='vertical', log=False, hold=None, **kwargs): - """call signature:: - - bar(left, height, width=0.8, bottom=0, - color=None, edgecolor=None, linewidth=None, - yerr=None, xerr=None, ecolor=None, capsize=3, - align='edge', orientation='vertical', log=False) - -Make a bar plot with rectangles bounded by: - - *left*, *left* + *width*, *bottom*, *bottom* + *height* - (left, right, bottom and top edges) - -*left*, *height*, *width*, and *bottom* can be either scalars -or sequences - -Return value is a list of -:class:`matplotlib.patches.Rectangle` instances. - -Required arguments: - - ======== =============================================== - Argument Description - ======== =============================================== - *left* the x coordinates of the left sides of the bars - *height* the heights of the bars - ======== =============================================== - -Optional keyword arguments: - - =============== ========================================== - Keyword Description - =============== ========================================== - *width* the widths of the bars - *bottom* the y coordinates of the bottom edges of - the bars - *color* the colors of the bars - *edgecolor* the colors of the bar edges - *linewidth* width of bar edges; None means use default - linewidth; 0 means don't draw edges. - *xerr* if not None, will be used to generate - errorbars on the bar chart - *yerr* if not None, will be used to generate - errorbars on the bar chart - *ecolor* specifies the color of any errorbar - *capsize* (default 3) determines the length in - points of the error bar caps - *align* 'edge' (default) | 'center' - *orientation* 'vertical' | 'horizontal' - *log* [False|True] False (default) leaves the - orientation axis as-is; True sets it to - log scale - =============== ========================================== - -For vertical bars, *align* = 'edge' aligns bars by their left -edges in left, while *align* = 'center' interprets these -values as the *x* coordinates of the bar centers. For -horizontal bars, *align* = 'edge' aligns bars by their bottom -edges in bottom, while *align* = 'center' interprets these -values as the *y* coordinates of the bar centers. - -The optional arguments *color*, *edgecolor*, *linewidth*, -*xerr*, and *yerr* can be either scalars or sequences of -length equal to the number of bars. This enables you to use -bar as the basis for stacked bar charts, or candlestick plots. - -Other optional kwargs: - - alpha: float (0.0 transparent through 1.0 opaque) - animated: [True | False] - antialiased or aa: [True | False] or None for default - axes: an :class:`~matplotlib.axes.Axes` instance - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - color: matplotlib color arg or sequence of rgba tuples - contains: a callable function - edgecolor or ec: mpl color spec, or None for default, or 'none' for no color - facecolor or fc: mpl color spec, or None for default, or 'none' for no color - figure: a :class:`matplotlib.figure.Figure` instance - fill: [True | False] - gid: an id string - hatch: [ '/' | '\\\\' | '|' | '-' | '+' | 'x' | 'o' | 'O' | '.' | '*' ] - label: any string - linestyle or ls: ['solid' | 'dashed' | 'dashdot' | 'dotted'] - linewidth or lw: float or None for default - lod: [True | False] - picker: [None|float|boolean|callable] - rasterized: [True | False | None] - snap: unknown - transform: :class:`~matplotlib.transforms.Transform` instance - url: a url string - visible: [True | False] - zorder: any number - -**Example:** A stacked bar chart. - -.. plot:: mpl_examples/pylab_examples/bar_stacked.py - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -2215,100 +1746,12 @@ def bar(left, height, width=0.80000000000000004, bottom=None, color=None, edgeco ax.hold(washold) return ret +if Axes.bar.__doc__ is not None: + bar.__doc__ = dedent(Axes.bar.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def barh(bottom, width, height=0.80000000000000004, left=None, hold=None, **kwargs): - """call signature:: - - barh(bottom, width, height=0.8, left=0, **kwargs) - -Make a horizontal bar plot with rectangles bounded by: - - *left*, *left* + *width*, *bottom*, *bottom* + *height* - (left, right, bottom and top edges) - -*bottom*, *width*, *height*, and *left* can be either scalars -or sequences - -Return value is a list of -:class:`matplotlib.patches.Rectangle` instances. - -Required arguments: - - ======== ====================================================== - Argument Description - ======== ====================================================== - *bottom* the vertical positions of the bottom edges of the bars - *width* the lengths of the bars - ======== ====================================================== - -Optional keyword arguments: - - =============== ========================================== - Keyword Description - =============== ========================================== - *height* the heights (thicknesses) of the bars - *left* the x coordinates of the left edges of the - bars - *color* the colors of the bars - *edgecolor* the colors of the bar edges - *linewidth* width of bar edges; None means use default - linewidth; 0 means don't draw edges. - *xerr* if not None, will be used to generate - errorbars on the bar chart - *yerr* if not None, will be used to generate - errorbars on the bar chart - *ecolor* specifies the color of any errorbar - *capsize* (default 3) determines the length in - points of the error bar caps - *align* 'edge' (default) | 'center' - *log* [False|True] False (default) leaves the - horizontal axis as-is; True sets it to log - scale - =============== ========================================== - -Setting *align* = 'edge' aligns bars by their bottom edges in -bottom, while *align* = 'center' interprets these values as -the *y* coordinates of the bar centers. - -The optional arguments *color*, *edgecolor*, *linewidth*, -*xerr*, and *yerr* can be either scalars or sequences of -length equal to the number of bars. This enables you to use -barh as the basis for stacked bar charts, or candlestick -plots. - -other optional kwargs: - - alpha: float (0.0 transparent through 1.0 opaque) - animated: [True | False] - antialiased or aa: [True | False] or None for default - axes: an :class:`~matplotlib.axes.Axes` instance - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - color: matplotlib color arg or sequence of rgba tuples - contains: a callable function - edgecolor or ec: mpl color spec, or None for default, or 'none' for no color - facecolor or fc: mpl color spec, or None for default, or 'none' for no color - figure: a :class:`matplotlib.figure.Figure` instance - fill: [True | False] - gid: an id string - hatch: [ '/' | '\\\\' | '|' | '-' | '+' | 'x' | 'o' | 'O' | '.' | '*' ] - label: any string - linestyle or ls: ['solid' | 'dashed' | 'dashdot' | 'dotted'] - linewidth or lw: float or None for default - lod: [True | False] - picker: [None|float|boolean|callable] - rasterized: [True | False | None] - snap: unknown - transform: :class:`~matplotlib.transforms.Transform` instance - url: a url string - visible: [True | False] - zorder: any number - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -2322,77 +1765,12 @@ def barh(bottom, width, height=0.80000000000000004, left=None, hold=None, **kwar ax.hold(washold) return ret +if Axes.barh.__doc__ is not None: + barh.__doc__ = dedent(Axes.barh.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def broken_barh(xranges, yrange, hold=None, **kwargs): - """call signature:: - - broken_barh(self, xranges, yrange, **kwargs) - -A collection of horizontal bars spanning *yrange* with a sequence of -*xranges*. - -Required arguments: - - ========= ============================== - Argument Description - ========= ============================== - *xranges* sequence of (*xmin*, *xwidth*) - *yrange* sequence of (*ymin*, *ywidth*) - ========= ============================== - -kwargs are -:class:`matplotlib.collections.BrokenBarHCollection` -properties: - - alpha: float - animated: [True | False] - antialiased or antialiaseds: Boolean or sequence of booleans - array: unknown - axes: an :class:`~matplotlib.axes.Axes` instance - clim: a length 2 sequence of floats - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - cmap: a colormap - color: matplotlib color arg or sequence of rgba tuples - colorbar: unknown - contains: a callable function - edgecolor or edgecolors: matplotlib color arg or sequence of rgba tuples - facecolor or facecolors: matplotlib color arg or sequence of rgba tuples - figure: a :class:`matplotlib.figure.Figure` instance - gid: an id string - label: any string - linestyle or linestyles or dashes: ['solid' | 'dashed', 'dashdot', 'dotted' | (offset, on-off-dash-seq) ] - linewidth or lw or linewidths: float or sequence of floats - lod: [True | False] - norm: unknown - offsets: float or sequence of floats - picker: [None|float|boolean|callable] - pickradius: unknown - rasterized: [True | False | None] - snap: unknown - transform: :class:`~matplotlib.transforms.Transform` instance - url: a url string - urls: unknown - visible: [True | False] - zorder: any number - -these can either be a single argument, ie:: - - facecolors = 'black' - -or a sequence of arguments for the various bars, ie:: - - facecolors = ('black', 'red', 'green') - -**Example:** - -.. plot:: mpl_examples/pylab_examples/broken_barh.py - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -2406,55 +1784,12 @@ def broken_barh(xranges, yrange, hold=None, **kwargs): ax.hold(washold) return ret +if Axes.broken_barh.__doc__ is not None: + broken_barh.__doc__ = dedent(Axes.broken_barh.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def boxplot(x, notch=0, sym='b+', vert=1, whis=1.5, positions=None, widths=None, hold=None): - """call signature:: - - boxplot(x, notch=0, sym='+', vert=1, whis=1.5, - positions=None, widths=None) - -Make a box and whisker plot for each column of *x* or each -vector in sequence *x*. The box extends from the lower to -upper quartile values of the data, with a line at the median. -The whiskers extend from the box to show the range of the -data. Flier points are those past the end of the whiskers. - -- *notch* = 0 (default) produces a rectangular box plot. -- *notch* = 1 will produce a notched box plot - -*sym* (default 'b+') is the default symbol for flier points. -Enter an empty string ('') if you don't want to show fliers. - -- *vert* = 1 (default) makes the boxes vertical. -- *vert* = 0 makes horizontal boxes. This seems goofy, but - that's how Matlab did it. - -*whis* (default 1.5) defines the length of the whiskers as -a function of the inner quartile range. They extend to the -most extreme data point within ( ``whis*(75%-25%)`` ) data range. - -*positions* (default 1,2,...,n) sets the horizontal positions of -the boxes. The ticks and limits are automatically set to match -the positions. - -*widths* is either a scalar or a vector and sets the width of -each box. The default is 0.5, or ``0.15*(distance between extreme -positions)`` if that is smaller. - -*x* is an array or a sequence of vectors. - -Returns a dictionary mapping each component of the boxplot -to a list of the :class:`matplotlib.lines.Line2D` -instances created. - -**Example:** - -.. plot:: pyplots/boxplot_demo.py - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -2468,145 +1803,12 @@ def boxplot(x, notch=0, sym='b+', vert=1, whis=1.5, positions=None, widths=None, ax.hold(washold) return ret +if Axes.boxplot.__doc__ is not None: + boxplot.__doc__ = dedent(Axes.boxplot.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def cohere(x, y, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.window_hanning, noverlap=0, pad_to=None, sides='default', scale_by_freq=None, hold=None, **kwargs): - """call signature:: - - cohere(x, y, NFFT=256, Fs=2, Fc=0, detrend = mlab.detrend_none, - window = mlab.window_hanning, noverlap=0, pad_to=None, - sides='default', scale_by_freq=None, **kwargs) - -cohere the coherence between *x* and *y*. Coherence is the normalized -cross spectral density: - -.. math:: - - C_{xy} = \\frac{|P_{xy}|^2}{P_{xx}P_{yy}} - -Keyword arguments: - - *NFFT*: integer - The number of data points used in each block for the FFT. - Must be even; a power 2 is most efficient. The default value is 256. - - *Fs*: scalar - The sampling frequency (samples per time unit). It is used - to calculate the Fourier frequencies, freqs, in cycles per time - unit. The default value is 2. - - *detrend*: callable - The function applied to each segment before fft-ing, - designed to remove the mean or linear trend. Unlike in - matlab, where the *detrend* parameter is a vector, in - matplotlib is it a function. The :mod:`~matplotlib.pylab` - module defines :func:`~matplotlib.pylab.detrend_none`, - :func:`~matplotlib.pylab.detrend_mean`, and - :func:`~matplotlib.pylab.detrend_linear`, but you can use - a custom function as well. - - *window*: callable or ndarray - A function or a vector of length *NFFT*. To create window - vectors see :func:`window_hanning`, :func:`window_none`, - :func:`numpy.blackman`, :func:`numpy.hamming`, - :func:`numpy.bartlett`, :func:`scipy.signal`, - :func:`scipy.signal.get_window`, etc. The default is - :func:`window_hanning`. If a function is passed as the - argument, it must take a data segment as an argument and - return the windowed version of the segment. - - *noverlap*: integer - The number of points of overlap between blocks. The default value - is 0 (no overlap). - - *pad_to*: integer - The number of points to which the data segment is padded when - performing the FFT. This can be different from *NFFT*, which - specifies the number of data points used. While not increasing - the actual resolution of the psd (the minimum distance between - resolvable peaks), this can give more points in the plot, - allowing for more detail. This corresponds to the *n* parameter - in the call to fft(). The default is None, which sets *pad_to* - equal to *NFFT* - - *sides*: [ 'default' | 'onesided' | 'twosided' ] - Specifies which sides of the PSD to return. Default gives the - default behavior, which returns one-sided for real data and both - for complex data. 'onesided' forces the return of a one-sided PSD, - while 'twosided' forces two-sided. - - *scale_by_freq*: boolean - Specifies whether the resulting density values should be scaled - by the scaling frequency, which gives density in units of Hz^-1. - This allows for integration over the returned frequency values. - The default is True for MatLab compatibility. - - *Fc*: integer - The center frequency of *x* (defaults to 0), which offsets - the x extents of the plot to reflect the frequency range used - when a signal is acquired and then filtered and downsampled to - baseband. - -The return value is a tuple (*Cxy*, *f*), where *f* are the -frequencies of the coherence vector. - -kwargs are applied to the lines. - -References: - - * Bendat & Piersol -- Random Data: Analysis and Measurement - Procedures, John Wiley & Sons (1986) - -kwargs control the :class:`~matplotlib.lines.Line2D` -properties of the coherence plot: - - alpha: float (0.0 transparent through 1.0 opaque) - animated: [True | False] - antialiased or aa: [True | False] - axes: an :class:`~matplotlib.axes.Axes` instance - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - color or c: any matplotlib color - contains: a callable function - dash_capstyle: ['butt' | 'round' | 'projecting'] - dash_joinstyle: ['miter' | 'round' | 'bevel'] - dashes: sequence of on/off ink in points - data: 2D array - drawstyle: [ 'default' | 'steps' | 'steps-pre' | 'steps-mid' | 'steps-post' ] - figure: a :class:`matplotlib.figure.Figure` instance - fillstyle: ['full' | 'left' | 'right' | 'bottom' | 'top'] - gid: an id string - label: any string - linestyle or ls: [ '-' | '--' | '-.' | ':' | 'None' | ' ' | '' ] and any drawstyle in combination with a linestyle, e.g. 'steps--'. - linewidth or lw: float value in points - lod: [True | False] - marker: [ '+' | '*' | ',' | '.' | '1' | '2' | '3' | '4' | '<' | '>' | 'D' | 'H' | '^' | '_' | 'd' | 'h' | 'o' | 'p' | 's' | 'v' | 'x' | '|' | TICKUP | TICKDOWN | TICKLEFT | TICKRIGHT | 'None' | ' ' | '' ] - markeredgecolor or mec: any matplotlib color - markeredgewidth or mew: float value in points - markerfacecolor or mfc: any matplotlib color - markersize or ms: float - markevery: None | integer | (startind, stride) - picker: float distance in points or callable pick function ``fn(artist, event)`` - pickradius: float distance in points - rasterized: [True | False | None] - snap: unknown - solid_capstyle: ['butt' | 'round' | 'projecting'] - solid_joinstyle: ['miter' | 'round' | 'bevel'] - transform: a :class:`matplotlib.transforms.Transform` instance - url: a url string - visible: [True | False] - xdata: 1D array - ydata: 1D array - zorder: any number - -**Example:** - -.. plot:: mpl_examples/pylab_examples/cohere_demo.py - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -2620,75 +1822,12 @@ def cohere(x, y, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.wi ax.hold(washold) return ret +if Axes.cohere.__doc__ is not None: + cohere.__doc__ = dedent(Axes.cohere.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def clabel(CS, *args, **kwargs): - """call signature:: - - clabel(cs, **kwargs) - -adds labels to line contours in *cs*, where *cs* is a -:class:`~matplotlib.contour.ContourSet` object returned by -contour. - -:: - - clabel(cs, v, **kwargs) - -only labels contours listed in *v*. - -Optional keyword arguments: - - *fontsize*: - See http://matplotlib.sf.net/fonts.html - - *colors*: - - if *None*, the color of each label matches the color of - the corresponding contour - - - if one string color, e.g. *colors* = 'r' or *colors* = - 'red', all labels will be plotted in this color - - - if a tuple of matplotlib color args (string, float, rgb, etc), - different labels will be plotted in different colors in the order - specified - - *inline*: - controls whether the underlying contour is removed or - not. Default is *True*. - - *inline_spacing*: - space in pixels to leave on each side of label when - placing inline. Defaults to 5. This spacing will be - exact for labels at locations where the contour is - straight, less so for labels on curved contours. - - *fmt*: - a format string for the label. Default is '%1.3f' - Alternatively, this can be a dictionary matching contour - levels with arbitrary strings to use for each contour level - (i.e., fmt[level]=string) - - *manual*: - if *True*, contour labels will be placed manually using - mouse clicks. Click the first button near a contour to - add a label, click the second button (or potentially both - mouse buttons at once) to finish adding labels. The third - button can be used to remove the last label added, but - only if labels are not inline. Alternatively, the keyboard - can be used to select label locations (enter to end label - placement, delete or backspace act like the third mouse button, - and any other key will select a label location). - - *rightside_up*: - if *True* (default), label rotations will always be plus - or minus 90 degrees from level. - -.. plot:: mpl_examples/pylab_examples/contour_demo.py - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -2702,172 +1841,12 @@ def clabel(CS, *args, **kwargs): ax.hold(washold) return ret +if Axes.clabel.__doc__ is not None: + clabel.__doc__ = dedent(Axes.clabel.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def contour(*args, **kwargs): - """:func:`~matplotlib.pyplot.contour` and -:func:`~matplotlib.pyplot.contourf` draw contour lines and -filled contours, respectively. Except as noted, function -signatures and return values are the same for both versions. - -:func:`~matplotlib.pyplot.contourf` differs from the Matlab -(TM) version in that it does not draw the polygon edges, -because the contouring engine yields simply connected regions -with branch cuts. To draw the edges, add line contours with -calls to :func:`~matplotlib.pyplot.contour`. - - -call signatures:: - - contour(Z) - -make a contour plot of an array *Z*. The level values are chosen -automatically. - -:: - - contour(X,Y,Z) - -*X*, *Y* specify the (*x*, *y*) coordinates of the surface - -:: - - contour(Z,N) - contour(X,Y,Z,N) - -contour *N* automatically-chosen levels. - -:: - - contour(Z,V) - contour(X,Y,Z,V) - -draw contour lines at the values specified in sequence *V* - -:: - - contourf(..., V) - -fill the (len(*V*)-1) regions between the values in *V* - -:: - - contour(Z, **kwargs) - -Use keyword args to control colors, linewidth, origin, cmap ... see -below for more details. - -*X*, *Y*, and *Z* must be arrays with the same dimensions. - -*Z* may be a masked array, but filled contouring may not -handle internal masked regions correctly. - -``C = contour(...)`` returns a -:class:`~matplotlib.contour.ContourSet` object. - -Optional keyword arguments: - - *colors*: [ None | string | (mpl_colors) ] - If *None*, the colormap specified by cmap will be used. - - If a string, like 'r' or 'red', all levels will be plotted in this - color. - - If a tuple of matplotlib color args (string, float, rgb, etc), - different levels will be plotted in different colors in the order - specified. - - *alpha*: float - The alpha blending value - - *cmap*: [ None | Colormap ] - A cm :class:`~matplotlib.cm.Colormap` instance or - *None*. If *cmap* is *None* and *colors* is *None*, a - default Colormap is used. - - *norm*: [ None | Normalize ] - A :class:`matplotlib.colors.Normalize` instance for - scaling data values to colors. If *norm* is *None* and - *colors* is *None*, the default linear scaling is used. - - *origin*: [ None | 'upper' | 'lower' | 'image' ] - If *None*, the first value of *Z* will correspond to the - lower left corner, location (0,0). If 'image', the rc - value for ``image.origin`` will be used. - - This keyword is not active if *X* and *Y* are specified in - the call to contour. - - *extent*: [ None | (x0,x1,y0,y1) ] - - If *origin* is not *None*, then *extent* is interpreted as - in :func:`matplotlib.pyplot.imshow`: it gives the outer - pixel boundaries. In this case, the position of Z[0,0] - is the center of the pixel, not a corner. If *origin* is - *None*, then (*x0*, *y0*) is the position of Z[0,0], and - (*x1*, *y1*) is the position of Z[-1,-1]. - - This keyword is not active if *X* and *Y* are specified in - the call to contour. - - *locator*: [ None | ticker.Locator subclass ] - If *locator* is None, the default - :class:`~matplotlib.ticker.MaxNLocator` is used. The - locator is used to determine the contour levels if they - are not given explicitly via the *V* argument. - - *extend*: [ 'neither' | 'both' | 'min' | 'max' ] - Unless this is 'neither', contour levels are automatically - added to one or both ends of the range so that all data - are included. These added ranges are then mapped to the - special colormap values which default to the ends of the - colormap range, but can be set via - :meth:`matplotlib.cm.Colormap.set_under` and - :meth:`matplotlib.cm.Colormap.set_over` methods. - -contour-only keyword arguments: - - *linewidths*: [ None | number | tuple of numbers ] - If *linewidths* is *None*, the default width in - ``lines.linewidth`` in ``matplotlibrc`` is used. - - If a number, all levels will be plotted with this linewidth. - - If a tuple, different levels will be plotted with different - linewidths in the order specified - - *linestyles*: [None | 'solid' | 'dashed' | 'dashdot' | 'dotted' ] - If *linestyles* is *None*, the 'solid' is used. - - *linestyles* can also be an iterable of the above strings - specifying a set of linestyles to be used. If this - iterable is shorter than the number of contour levels - it will be repeated as necessary. - - If contour is using a monochrome colormap and the contour - level is less than 0, then the linestyle specified - in ``contour.negative_linestyle`` in ``matplotlibrc`` - will be used. - -contourf-only keyword arguments: - - *antialiased*: [ True | False ] - enable antialiasing - - *nchunk*: [ 0 | integer ] - If 0, no subdivision of the domain. Specify a positive integer to - divide the domain into subdomains of roughly *nchunk* by *nchunk* - points. This may never actually be advantageous, so this option may - be removed. Chunking introduces artifacts at the chunk boundaries - unless *antialiased* is *False*. - -**Example:** - -.. plot:: mpl_examples/pylab_examples/contour_demo.py - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -2881,172 +1860,12 @@ def contour(*args, **kwargs): ax.hold(washold) if ret._A is not None: gci._current = ret return ret +if Axes.contour.__doc__ is not None: + contour.__doc__ = dedent(Axes.contour.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def contourf(*args, **kwargs): - """:func:`~matplotlib.pyplot.contour` and -:func:`~matplotlib.pyplot.contourf` draw contour lines and -filled contours, respectively. Except as noted, function -signatures and return values are the same for both versions. - -:func:`~matplotlib.pyplot.contourf` differs from the Matlab -(TM) version in that it does not draw the polygon edges, -because the contouring engine yields simply connected regions -with branch cuts. To draw the edges, add line contours with -calls to :func:`~matplotlib.pyplot.contour`. - - -call signatures:: - - contour(Z) - -make a contour plot of an array *Z*. The level values are chosen -automatically. - -:: - - contour(X,Y,Z) - -*X*, *Y* specify the (*x*, *y*) coordinates of the surface - -:: - - contour(Z,N) - contour(X,Y,Z,N) - -contour *N* automatically-chosen levels. - -:: - - contour(Z,V) - contour(X,Y,Z,V) - -draw contour lines at the values specified in sequence *V* - -:: - - contourf(..., V) - -fill the (len(*V*)-1) regions between the values in *V* - -:: - - contour(Z, **kwargs) - -Use keyword args to control colors, linewidth, origin, cmap ... see -below for more details. - -*X*, *Y*, and *Z* must be arrays with the same dimensions. - -*Z* may be a masked array, but filled contouring may not -handle internal masked regions correctly. - -``C = contour(...)`` returns a -:class:`~matplotlib.contour.ContourSet` object. - -Optional keyword arguments: - - *colors*: [ None | string | (mpl_colors) ] - If *None*, the colormap specified by cmap will be used. - - If a string, like 'r' or 'red', all levels will be plotted in this - color. - - If a tuple of matplotlib color args (string, float, rgb, etc), - different levels will be plotted in different colors in the order - specified. - - *alpha*: float - The alpha blending value - - *cmap*: [ None | Colormap ] - A cm :class:`~matplotlib.cm.Colormap` instance or - *None*. If *cmap* is *None* and *colors* is *None*, a - default Colormap is used. - - *norm*: [ None | Normalize ] - A :class:`matplotlib.colors.Normalize` instance for - scaling data values to colors. If *norm* is *None* and - *colors* is *None*, the default linear scaling is used. - - *origin*: [ None | 'upper' | 'lower' | 'image' ] - If *None*, the first value of *Z* will correspond to the - lower left corner, location (0,0). If 'image', the rc - value for ``image.origin`` will be used. - - This keyword is not active if *X* and *Y* are specified in - the call to contour. - - *extent*: [ None | (x0,x1,y0,y1) ] - - If *origin* is not *None*, then *extent* is interpreted as - in :func:`matplotlib.pyplot.imshow`: it gives the outer - pixel boundaries. In this case, the position of Z[0,0] - is the center of the pixel, not a corner. If *origin* is - *None*, then (*x0*, *y0*) is the position of Z[0,0], and - (*x1*, *y1*) is the position of Z[-1,-1]. - - This keyword is not active if *X* and *Y* are specified in - the call to contour. - - *locator*: [ None | ticker.Locator subclass ] - If *locator* is None, the default - :class:`~matplotlib.ticker.MaxNLocator` is used. The - locator is used to determine the contour levels if they - are not given explicitly via the *V* argument. - - *extend*: [ 'neither' | 'both' | 'min' | 'max' ] - Unless this is 'neither', contour levels are automatically - added to one or both ends of the range so that all data - are included. These added ranges are then mapped to the - special colormap values which default to the ends of the - colormap range, but can be set via - :meth:`matplotlib.cm.Colormap.set_under` and - :meth:`matplotlib.cm.Colormap.set_over` methods. - -contour-only keyword arguments: - - *linewidths*: [ None | number | tuple of numbers ] - If *linewidths* is *None*, the default width in - ``lines.linewidth`` in ``matplotlibrc`` is used. - - If a number, all levels will be plotted with this linewidth. - - If a tuple, different levels will be plotted with different - linewidths in the order specified - - *linestyles*: [None | 'solid' | 'dashed' | 'dashdot' | 'dotted' ] - If *linestyles* is *None*, the 'solid' is used. - - *linestyles* can also be an iterable of the above strings - specifying a set of linestyles to be used. If this - iterable is shorter than the number of contour levels - it will be repeated as necessary. - - If contour is using a monochrome colormap and the contour - level is less than 0, then the linestyle specified - in ``contour.negative_linestyle`` in ``matplotlibrc`` - will be used. - -contourf-only keyword arguments: - - *antialiased*: [ True | False ] - enable antialiasing - - *nchunk*: [ 0 | integer ] - If 0, no subdivision of the domain. Specify a positive integer to - divide the domain into subdomains of roughly *nchunk* by *nchunk* - points. This may never actually be advantageous, so this option may - be removed. Chunking introduces artifacts at the chunk boundaries - unless *antialiased* is *False*. - -**Example:** - -.. plot:: mpl_examples/pylab_examples/contour_demo.py - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -3060,148 +1879,12 @@ def contourf(*args, **kwargs): ax.hold(washold) if ret._A is not None: gci._current = ret return ret +if Axes.contourf.__doc__ is not None: + contourf.__doc__ = dedent(Axes.contourf.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def csd(x, y, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.window_hanning, noverlap=0, pad_to=None, sides='default', scale_by_freq=None, hold=None, **kwargs): - """call signature:: - - csd(x, y, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, - window=mlab.window_hanning, noverlap=0, pad_to=None, - sides='default', scale_by_freq=None, **kwargs) - -The cross spectral density :math:`P_{xy}` by Welch's average -periodogram method. The vectors *x* and *y* are divided into -*NFFT* length segments. Each segment is detrended by function -*detrend* and windowed by function *window*. The product of -the direct FFTs of *x* and *y* are averaged over each segment -to compute :math:`P_{xy}`, with a scaling to correct for power -loss due to windowing. - -Returns the tuple (*Pxy*, *freqs*). *P* is the cross spectrum -(complex valued), and :math:`10\\log_{10}|P_{xy}|` is -plotted. - -Keyword arguments: - - *NFFT*: integer - The number of data points used in each block for the FFT. - Must be even; a power 2 is most efficient. The default value is 256. - - *Fs*: scalar - The sampling frequency (samples per time unit). It is used - to calculate the Fourier frequencies, freqs, in cycles per time - unit. The default value is 2. - - *detrend*: callable - The function applied to each segment before fft-ing, - designed to remove the mean or linear trend. Unlike in - matlab, where the *detrend* parameter is a vector, in - matplotlib is it a function. The :mod:`~matplotlib.pylab` - module defines :func:`~matplotlib.pylab.detrend_none`, - :func:`~matplotlib.pylab.detrend_mean`, and - :func:`~matplotlib.pylab.detrend_linear`, but you can use - a custom function as well. - - *window*: callable or ndarray - A function or a vector of length *NFFT*. To create window - vectors see :func:`window_hanning`, :func:`window_none`, - :func:`numpy.blackman`, :func:`numpy.hamming`, - :func:`numpy.bartlett`, :func:`scipy.signal`, - :func:`scipy.signal.get_window`, etc. The default is - :func:`window_hanning`. If a function is passed as the - argument, it must take a data segment as an argument and - return the windowed version of the segment. - - *noverlap*: integer - The number of points of overlap between blocks. The default value - is 0 (no overlap). - - *pad_to*: integer - The number of points to which the data segment is padded when - performing the FFT. This can be different from *NFFT*, which - specifies the number of data points used. While not increasing - the actual resolution of the psd (the minimum distance between - resolvable peaks), this can give more points in the plot, - allowing for more detail. This corresponds to the *n* parameter - in the call to fft(). The default is None, which sets *pad_to* - equal to *NFFT* - - *sides*: [ 'default' | 'onesided' | 'twosided' ] - Specifies which sides of the PSD to return. Default gives the - default behavior, which returns one-sided for real data and both - for complex data. 'onesided' forces the return of a one-sided PSD, - while 'twosided' forces two-sided. - - *scale_by_freq*: boolean - Specifies whether the resulting density values should be scaled - by the scaling frequency, which gives density in units of Hz^-1. - This allows for integration over the returned frequency values. - The default is True for MatLab compatibility. - - *Fc*: integer - The center frequency of *x* (defaults to 0), which offsets - the x extents of the plot to reflect the frequency range used - when a signal is acquired and then filtered and downsampled to - baseband. - -References: - Bendat & Piersol -- Random Data: Analysis and Measurement - Procedures, John Wiley & Sons (1986) - -kwargs control the Line2D properties: - - alpha: float (0.0 transparent through 1.0 opaque) - animated: [True | False] - antialiased or aa: [True | False] - axes: an :class:`~matplotlib.axes.Axes` instance - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - color or c: any matplotlib color - contains: a callable function - dash_capstyle: ['butt' | 'round' | 'projecting'] - dash_joinstyle: ['miter' | 'round' | 'bevel'] - dashes: sequence of on/off ink in points - data: 2D array - drawstyle: [ 'default' | 'steps' | 'steps-pre' | 'steps-mid' | 'steps-post' ] - figure: a :class:`matplotlib.figure.Figure` instance - fillstyle: ['full' | 'left' | 'right' | 'bottom' | 'top'] - gid: an id string - label: any string - linestyle or ls: [ '-' | '--' | '-.' | ':' | 'None' | ' ' | '' ] and any drawstyle in combination with a linestyle, e.g. 'steps--'. - linewidth or lw: float value in points - lod: [True | False] - marker: [ '+' | '*' | ',' | '.' | '1' | '2' | '3' | '4' | '<' | '>' | 'D' | 'H' | '^' | '_' | 'd' | 'h' | 'o' | 'p' | 's' | 'v' | 'x' | '|' | TICKUP | TICKDOWN | TICKLEFT | TICKRIGHT | 'None' | ' ' | '' ] - markeredgecolor or mec: any matplotlib color - markeredgewidth or mew: float value in points - markerfacecolor or mfc: any matplotlib color - markersize or ms: float - markevery: None | integer | (startind, stride) - picker: float distance in points or callable pick function ``fn(artist, event)`` - pickradius: float distance in points - rasterized: [True | False | None] - snap: unknown - solid_capstyle: ['butt' | 'round' | 'projecting'] - solid_joinstyle: ['miter' | 'round' | 'bevel'] - transform: a :class:`matplotlib.transforms.Transform` instance - url: a url string - visible: [True | False] - xdata: 1D array - ydata: 1D array - zorder: any number - -**Example:** - -.. plot:: mpl_examples/pylab_examples/csd_demo.py - -.. seealso: - - :meth:`psd` - For a description of the optional parameters. - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -3215,126 +1898,12 @@ def csd(x, y, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.windo ax.hold(washold) return ret +if Axes.csd.__doc__ is not None: + csd.__doc__ = dedent(Axes.csd.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def errorbar(x, y, yerr=None, xerr=None, fmt='-', ecolor=None, elinewidth=None, capsize=3, barsabove=False, lolims=False, uplims=False, xlolims=False, xuplims=False, hold=None, **kwargs): - """call signature:: - - errorbar(x, y, yerr=None, xerr=None, - fmt='-', ecolor=None, elinewidth=None, capsize=3, - barsabove=False, lolims=False, uplims=False, - xlolims=False, xuplims=False) - -Plot *x* versus *y* with error deltas in *yerr* and *xerr*. -Vertical errorbars are plotted if *yerr* is not *None*. -Horizontal errorbars are plotted if *xerr* is not *None*. - -*x*, *y*, *xerr*, and *yerr* can all be scalars, which plots a -single error bar at *x*, *y*. - -Optional keyword arguments: - - *xerr*/*yerr*: [ scalar | N, Nx1, or 2xN array-like ] - If a scalar number, len(N) array-like object, or an Nx1 array-like - object, errorbars are drawn +/- value. - - If a rank-1, 2xN numpy array, errorbars are drawn at -row1 and - +row2 - - *fmt*: '-' - The plot format symbol for *y*. If *fmt* is *None*, just plot the - errorbars with no line symbols. This can be useful for creating a - bar plot with errorbars. - - *ecolor*: [ None | mpl color ] - a matplotlib color arg which gives the color the errorbar lines; if - *None*, use the marker color. - - *elinewidth*: scalar - the linewidth of the errorbar lines. If *None*, use the linewidth. - - *capsize*: scalar - the size of the error bar caps in points - - *barsabove*: [ True | False ] - if *True*, will plot the errorbars above the plot - symbols. Default is below. - - *lolims*/*uplims*/*xlolims*/*xuplims*: [ False | True ] - These arguments can be used to indicate that a value gives - only upper/lower limits. In that case a caret symbol is - used to indicate this. lims-arguments may be of the same - type as *xerr* and *yerr*. - -All other keyword arguments are passed on to the plot command for the -markers, so you can add additional key=value pairs to control the -errorbar markers. For example, this code makes big red squares with -thick green edges:: - - x,y,yerr = rand(3,10) - errorbar(x, y, yerr, marker='s', - mfc='red', mec='green', ms=20, mew=4) - -where *mfc*, *mec*, *ms* and *mew* are aliases for the longer -property names, *markerfacecolor*, *markeredgecolor*, *markersize* -and *markeredgewith*. - -valid kwargs for the marker properties are - - alpha: float (0.0 transparent through 1.0 opaque) - animated: [True | False] - antialiased or aa: [True | False] - axes: an :class:`~matplotlib.axes.Axes` instance - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - color or c: any matplotlib color - contains: a callable function - dash_capstyle: ['butt' | 'round' | 'projecting'] - dash_joinstyle: ['miter' | 'round' | 'bevel'] - dashes: sequence of on/off ink in points - data: 2D array - drawstyle: [ 'default' | 'steps' | 'steps-pre' | 'steps-mid' | 'steps-post' ] - figure: a :class:`matplotlib.figure.Figure` instance - fillstyle: ['full' | 'left' | 'right' | 'bottom' | 'top'] - gid: an id string - label: any string - linestyle or ls: [ '-' | '--' | '-.' | ':' | 'None' | ' ' | '' ] and any drawstyle in combination with a linestyle, e.g. 'steps--'. - linewidth or lw: float value in points - lod: [True | False] - marker: [ '+' | '*' | ',' | '.' | '1' | '2' | '3' | '4' | '<' | '>' | 'D' | 'H' | '^' | '_' | 'd' | 'h' | 'o' | 'p' | 's' | 'v' | 'x' | '|' | TICKUP | TICKDOWN | TICKLEFT | TICKRIGHT | 'None' | ' ' | '' ] - markeredgecolor or mec: any matplotlib color - markeredgewidth or mew: float value in points - markerfacecolor or mfc: any matplotlib color - markersize or ms: float - markevery: None | integer | (startind, stride) - picker: float distance in points or callable pick function ``fn(artist, event)`` - pickradius: float distance in points - rasterized: [True | False | None] - snap: unknown - solid_capstyle: ['butt' | 'round' | 'projecting'] - solid_joinstyle: ['miter' | 'round' | 'bevel'] - transform: a :class:`matplotlib.transforms.Transform` instance - url: a url string - visible: [True | False] - xdata: 1D array - ydata: 1D array - zorder: any number - -Return value is a length 3 tuple. The first element is the -:class:`~matplotlib.lines.Line2D` instance for the *y* symbol -lines. The second element is a list of error bar cap lines, -the third element is a list of -:class:`~matplotlib.collections.LineCollection` instances for -the horizontal and vertical error ranges. - -**Example:** - -.. plot:: mpl_examples/pylab_examples/errorbar_demo.py - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -3348,72 +1917,12 @@ def errorbar(x, y, yerr=None, xerr=None, fmt='-', ecolor=None, elinewidth=None, ax.hold(washold) return ret +if Axes.errorbar.__doc__ is not None: + errorbar.__doc__ = dedent(Axes.errorbar.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def fill(*args, **kwargs): - """call signature:: - - fill(*args, **kwargs) - -Plot filled polygons. *args* is a variable length argument, -allowing for multiple *x*, *y* pairs with an optional color -format string; see :func:`~matplotlib.pyplot.plot` for details -on the argument parsing. For example, to plot a polygon with -vertices at *x*, *y* in blue.:: - - ax.fill(x,y, 'b' ) - -An arbitrary number of *x*, *y*, *color* groups can be specified:: - - ax.fill(x1, y1, 'g', x2, y2, 'r') - -Return value is a list of :class:`~matplotlib.patches.Patch` -instances that were added. - -The same color strings that :func:`~matplotlib.pyplot.plot` -supports are supported by the fill format string. - -If you would like to fill below a curve, eg. shade a region -between 0 and *y* along *x*, use :meth:`fill_between` - -The *closed* kwarg will close the polygon when *True* (default). - -kwargs control the Polygon properties: - - alpha: float (0.0 transparent through 1.0 opaque) - animated: [True | False] - antialiased or aa: [True | False] or None for default - axes: an :class:`~matplotlib.axes.Axes` instance - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - color: matplotlib color arg or sequence of rgba tuples - contains: a callable function - edgecolor or ec: mpl color spec, or None for default, or 'none' for no color - facecolor or fc: mpl color spec, or None for default, or 'none' for no color - figure: a :class:`matplotlib.figure.Figure` instance - fill: [True | False] - gid: an id string - hatch: [ '/' | '\\\\' | '|' | '-' | '+' | 'x' | 'o' | 'O' | '.' | '*' ] - label: any string - linestyle or ls: ['solid' | 'dashed' | 'dashdot' | 'dotted'] - linewidth or lw: float or None for default - lod: [True | False] - picker: [None|float|boolean|callable] - rasterized: [True | False | None] - snap: unknown - transform: :class:`~matplotlib.transforms.Transform` instance - url: a url string - visible: [True | False] - zorder: any number - -**Example:** - -.. plot:: mpl_examples/pylab_examples/fill_demo.py - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -3427,79 +1936,12 @@ def fill(*args, **kwargs): ax.hold(washold) return ret +if Axes.fill.__doc__ is not None: + fill.__doc__ = dedent(Axes.fill.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def fill_between(x, y1, y2=0, where=None, hold=None, **kwargs): - """call signature:: - - fill_between(x, y1, y2=0, where=None, **kwargs) - -Create a :class:`~matplotlib.collections.PolyCollection` -filling the regions between *y1* and *y2* where -``where==True`` - -*x* - an N length np array of the x data - -*y1* - an N length scalar or np array of the y data - -*y2* - an N length scalar or np array of the y data - -*where* - if None, default to fill between everywhere. If not None, - it is a a N length numpy boolean array and the fill will - only happen over the regions where ``where==True`` - -*kwargs* - keyword args passed on to the :class:`PolyCollection` - -kwargs control the Polygon properties: - - alpha: float - animated: [True | False] - antialiased or antialiaseds: Boolean or sequence of booleans - array: unknown - axes: an :class:`~matplotlib.axes.Axes` instance - clim: a length 2 sequence of floats - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - cmap: a colormap - color: matplotlib color arg or sequence of rgba tuples - colorbar: unknown - contains: a callable function - edgecolor or edgecolors: matplotlib color arg or sequence of rgba tuples - facecolor or facecolors: matplotlib color arg or sequence of rgba tuples - figure: a :class:`matplotlib.figure.Figure` instance - gid: an id string - label: any string - linestyle or linestyles or dashes: ['solid' | 'dashed', 'dashdot', 'dotted' | (offset, on-off-dash-seq) ] - linewidth or lw or linewidths: float or sequence of floats - lod: [True | False] - norm: unknown - offsets: float or sequence of floats - picker: [None|float|boolean|callable] - pickradius: unknown - rasterized: [True | False | None] - snap: unknown - transform: :class:`~matplotlib.transforms.Transform` instance - url: a url string - urls: unknown - visible: [True | False] - zorder: any number - -.. plot:: mpl_examples/pylab_examples/fill_between_demo.py - -.. seealso:: - - :meth:`fill_betweenx` - for filling between two sets of x-values - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -3513,48 +1955,12 @@ def fill_between(x, y1, y2=0, where=None, hold=None, **kwargs): ax.hold(washold) return ret +if Axes.fill_between.__doc__ is not None: + fill_between.__doc__ = dedent(Axes.fill_between.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def fill_betweenx(y, x1, x2=0, where=None, hold=None, **kwargs): - """call signature:: - - fill_between(y, x1, x2=0, where=None, **kwargs) - -Create a :class:`~matplotlib.collections.PolyCollection` -filling the regions between *x1* and *x2* where -``where==True`` - -*y* - an N length np array of the y data - -*x1* - an N length scalar or np array of the x data - -*x2* - an N length scalar or np array of the x data - -*where* - if None, default to fill between everywhere. If not None, - it is a a N length numpy boolean array and the fill will - only happen over the regions where ``where==True`` - -*kwargs* - keyword args passed on to the :class:`PolyCollection` - -kwargs control the Polygon properties: - -%(PolyCollection)s - -.. plot:: mpl_examples/pylab_examples/fill_betweenx_demo.py - -.. seealso:: - - :meth:`fill_between` - for filling between two sets of y-values - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -3568,166 +1974,12 @@ def fill_betweenx(y, x1, x2=0, where=None, hold=None, **kwargs): ax.hold(washold) return ret +if Axes.fill_betweenx.__doc__ is not None: + fill_betweenx.__doc__ = dedent(Axes.fill_betweenx.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def hexbin(x, y, C=None, gridsize=100, bins=None, xscale='linear', yscale='linear', extent=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=1.0, linewidths=None, edgecolors='none', reduce_C_function=np.mean, mincnt=None, marginals=False, hold=None, **kwargs): - """call signature:: - - hexbin(x, y, C = None, gridsize = 100, bins = None, - xscale = 'linear', yscale = 'linear', - cmap=None, norm=None, vmin=None, vmax=None, - alpha=1.0, linewidths=None, edgecolors='none' - reduce_C_function = np.mean, mincnt=None, marginals=True - **kwargs) - -Make a hexagonal binning plot of *x* versus *y*, where *x*, -*y* are 1-D sequences of the same length, *N*. If *C* is None -(the default), this is a histogram of the number of occurences -of the observations at (x[i],y[i]). - -If *C* is specified, it specifies values at the coordinate -(x[i],y[i]). These values are accumulated for each hexagonal -bin and then reduced according to *reduce_C_function*, which -defaults to numpy's mean function (np.mean). (If *C* is -specified, it must also be a 1-D sequence of the same length -as *x* and *y*.) - -*x*, *y* and/or *C* may be masked arrays, in which case only -unmasked points will be plotted. - -Optional keyword arguments: - - *gridsize*: [ 100 | integer ] - The number of hexagons in the *x*-direction, default is - 100. The corresponding number of hexagons in the - *y*-direction is chosen such that the hexagons are - approximately regular. Alternatively, gridsize can be a - tuple with two elements specifying the number of hexagons - in the *x*-direction and the *y*-direction. - - *bins*: [ None | 'log' | integer | sequence ] - If *None*, no binning is applied; the color of each hexagon - directly corresponds to its count value. - - If 'log', use a logarithmic scale for the color - map. Internally, :math:`log_{10}(i+1)` is used to - determine the hexagon color. - - If an integer, divide the counts in the specified number - of bins, and color the hexagons accordingly. - - If a sequence of values, the values of the lower bound of - the bins to be used. - - *xscale*: [ 'linear' | 'log' ] - Use a linear or log10 scale on the horizontal axis. - - *scale*: [ 'linear' | 'log' ] - Use a linear or log10 scale on the vertical axis. - - *mincnt*: None | a positive integer - If not None, only display cells with more than *mincnt* - number of points in the cell - - *marginals*: True|False - if marginals is True, plot the marginal density as - colormapped rectagles along the bottom of the x-axis and - left of the y-axis - - *extent*: [ None | scalars (left, right, bottom, top) ] - The limits of the bins. The default assigns the limits - based on gridsize, x, y, xscale and yscale. - -Other keyword arguments controlling color mapping and normalization -arguments: - - *cmap*: [ None | Colormap ] - a :class:`matplotlib.cm.Colormap` instance. If *None*, - defaults to rc ``image.cmap``. - - *norm*: [ None | Normalize ] - :class:`matplotlib.colors.Normalize` instance is used to - scale luminance data to 0,1. - - *vmin*/*vmax*: scalar - *vmin* and *vmax* are used in conjunction with *norm* to normalize - luminance data. If either are *None*, the min and max of the color - array *C* is used. Note if you pass a norm instance, your settings - for *vmin* and *vmax* will be ignored. - - *alpha*: scalar - the alpha value for the patches - - *linewidths*: [ None | scalar ] - If *None*, defaults to rc lines.linewidth. Note that this - is a tuple, and if you set the linewidths argument you - must set it as a sequence of floats, as required by - :class:`~matplotlib.collections.RegularPolyCollection`. - -Other keyword arguments controlling the Collection properties: - - *edgecolors*: [ None | mpl color | color sequence ] - If 'none', draws the edges in the same color as the fill color. - This is the default, as it avoids unsightly unpainted pixels - between the hexagons. - - If *None*, draws the outlines in the default color. - - If a matplotlib color arg or sequence of rgba tuples, draws the - outlines in the specified color. - -Here are the standard descriptions of all the -:class:`~matplotlib.collections.Collection` kwargs: - - alpha: float - animated: [True | False] - antialiased or antialiaseds: Boolean or sequence of booleans - array: unknown - axes: an :class:`~matplotlib.axes.Axes` instance - clim: a length 2 sequence of floats - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - cmap: a colormap - color: matplotlib color arg or sequence of rgba tuples - colorbar: unknown - contains: a callable function - edgecolor or edgecolors: matplotlib color arg or sequence of rgba tuples - facecolor or facecolors: matplotlib color arg or sequence of rgba tuples - figure: a :class:`matplotlib.figure.Figure` instance - gid: an id string - label: any string - linestyle or linestyles or dashes: ['solid' | 'dashed', 'dashdot', 'dotted' | (offset, on-off-dash-seq) ] - linewidth or lw or linewidths: float or sequence of floats - lod: [True | False] - norm: unknown - offsets: float or sequence of floats - picker: [None|float|boolean|callable] - pickradius: unknown - rasterized: [True | False | None] - snap: unknown - transform: :class:`~matplotlib.transforms.Transform` instance - url: a url string - urls: unknown - visible: [True | False] - zorder: any number - -The return value is a -:class:`~matplotlib.collections.PolyCollection` instance; use -:meth:`~matplotlib.collection.PolyCollection.get_array` on -this :class:`~matplotlib.collections.PolyCollection` to get -the counts in each hexagon.. If marginals is True, horizontal -bar and vertical bar (both PolyCollections) will be attached -to the return collection as attributes *hbar* and *vbar* - - -**Example:** - -.. plot:: mpl_examples/pylab_examples/hexbin_demo.py - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -3741,158 +1993,12 @@ def hexbin(x, y, C=None, gridsize=100, bins=None, xscale='linear', yscale='linea ax.hold(washold) gci._current = ret return ret +if Axes.hexbin.__doc__ is not None: + hexbin.__doc__ = dedent(Axes.hexbin.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def hist(x, bins=10, range=None, normed=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, hold=None, **kwargs): - """call signature:: - - hist(x, bins=10, range=None, normed=False, cumulative=False, - bottom=None, histtype='bar', align='mid', - orientation='vertical', rwidth=None, log=False, **kwargs) - -Compute and draw the histogram of *x*. The return value is a -tuple (*n*, *bins*, *patches*) or ([*n0*, *n1*, ...], *bins*, -[*patches0*, *patches1*,...]) if the input contains multiple -data. - -Keyword arguments: - - *bins*: - Either an integer number of bins or a sequence giving the - bins. *x* are the data to be binned. *x* can be an array, - a 2D array with multiple data in its columns, or a list of - arrays with data of different length. Note, if *bins* - is an integer input argument=numbins, *bins* + 1 bin edges - will be returned, compatible with the semantics of - :func:`numpy.histogram` with the *new* = True argument. - Unequally spaced bins are supported if *bins* is a sequence. - - *range*: - The lower and upper range of the bins. Lower and upper outliers - are ignored. If not provided, *range* is (x.min(), x.max()). - Range has no effect if *bins* is a sequence. - - If *bins* is a sequence or *range* is specified, autoscaling is - set off (*autoscale_on* is set to *False*) and the xaxis limits - are set to encompass the full specified bin range. - - *normed*: - If *True*, the first element of the return tuple will - be the counts normalized to form a probability density, i.e., - ``n/(len(x)*dbin)``. In a probability density, the integral of - the histogram should be 1; you can verify that with a - trapezoidal integration of the probability density function:: - - pdf, bins, patches = ax.hist(...) - print np.sum(pdf * np.diff(bins)) - - *weights* - An array of weights, of the same shape as *x*. Each value in - *x* only contributes its associated weight towards the bin - count (instead of 1). If *normed* is True, the weights are - normalized, so that the integral of the density over the range - remains 1. - - *cumulative*: - If *True*, then a histogram is computed where each bin - gives the counts in that bin plus all bins for smaller values. - The last bin gives the total number of datapoints. If *normed* - is also *True* then the histogram is normalized such that the - last bin equals 1. If *cumulative* evaluates to less than 0 - (e.g. -1), the direction of accumulation is reversed. In this - case, if *normed* is also *True*, then the histogram is normalized - such that the first bin equals 1. - - *histtype*: [ 'bar' | 'barstacked' | 'step' | 'stepfilled' ] - The type of histogram to draw. - - - 'bar' is a traditional bar-type histogram. If multiple data - are given the bars are aranged side by side. - - - 'barstacked' is a bar-type histogram where multiple - data are stacked on top of each other. - - - 'step' generates a lineplot that is by default - unfilled. - - - 'stepfilled' generates a lineplot that is by default - filled. - - *align*: ['left' | 'mid' | 'right' ] - Controls how the histogram is plotted. - - - 'left': bars are centered on the left bin edges. - - - 'mid': bars are centered between the bin edges. - - - 'right': bars are centered on the right bin edges. - - *orientation*: [ 'horizontal' | 'vertical' ] - If 'horizontal', :func:`~matplotlib.pyplot.barh` will be - used for bar-type histograms and the *bottom* kwarg will be - the left edges. - - *rwidth*: - The relative width of the bars as a fraction of the bin - width. If *None*, automatically compute the width. Ignored - if *histtype* = 'step' or 'stepfilled'. - - *log*: - If *True*, the histogram axis will be set to a log scale. - If *log* is *True* and *x* is a 1D array, empty bins will - be filtered out and only the non-empty (*n*, *bins*, - *patches*) will be returned. - -kwargs are used to update the properties of the hist -:class:`~matplotlib.patches.Rectangle` instances: - - alpha: float (0.0 transparent through 1.0 opaque) - animated: [True | False] - antialiased or aa: [True | False] or None for default - axes: an :class:`~matplotlib.axes.Axes` instance - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - color: matplotlib color arg or sequence of rgba tuples - contains: a callable function - edgecolor or ec: mpl color spec, or None for default, or 'none' for no color - facecolor or fc: mpl color spec, or None for default, or 'none' for no color - figure: a :class:`matplotlib.figure.Figure` instance - fill: [True | False] - gid: an id string - hatch: [ '/' | '\\\\' | '|' | '-' | '+' | 'x' | 'o' | 'O' | '.' | '*' ] - label: any string - linestyle or ls: ['solid' | 'dashed' | 'dashdot' | 'dotted'] - linewidth or lw: float or None for default - lod: [True | False] - picker: [None|float|boolean|callable] - rasterized: [True | False | None] - snap: unknown - transform: :class:`~matplotlib.transforms.Transform` instance - url: a url string - visible: [True | False] - zorder: any number - -You can use labels for your histogram, and only the first -:class:`~matplotlib.patches.Rectangle` gets the label (the -others get the magic string '_nolegend_'. This will make the -histograms work in the intuitive way for bar charts:: - - ax.hist(10+2*np.random.randn(1000), label='men') - ax.hist(12+3*np.random.randn(1000), label='women', alpha=0.5) - ax.legend() - -label can also be a sequence of strings. If multiple data is -provided in *x*, the labels are asigned sequentially to the -histograms. - -**Example:** - -.. plot:: mpl_examples/pylab_examples/histogram_demo.py - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -3906,44 +2012,12 @@ def hist(x, bins=10, range=None, normed=False, weights=None, cumulative=False, b ax.hold(washold) return ret +if Axes.hist.__doc__ is not None: + hist.__doc__ = dedent(Axes.hist.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def hlines(y, xmin, xmax, colors='k', linestyles='solid', label='', hold=None, **kwargs): - """call signature:: - - hlines(y, xmin, xmax, colors='k', linestyles='solid', **kwargs) - -Plot horizontal lines at each *y* from *xmin* to *xmax*. - -Returns the :class:`~matplotlib.collections.LineCollection` -that was added. - -Required arguments: - - *y*: - a 1-D numpy array or iterable. - - *xmin* and *xmax*: - can be scalars or ``len(x)`` numpy arrays. If they are - scalars, then the respective values are constant, else the - widths of the lines are determined by *xmin* and *xmax*. - -Optional keyword arguments: - - *colors*: - a line collections color argument, either a single color - or a ``len(y)`` list of colors - - *linestyles*: - [ 'solid' | 'dashed' | 'dashdot' | 'dotted' ] - -**Example:** - -.. plot:: mpl_examples/pylab_examples/hline_demo.py - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -3957,127 +2031,12 @@ def hlines(y, xmin, xmax, colors='k', linestyles='solid', label='', hold=None, * ax.hold(washold) return ret +if Axes.hlines.__doc__ is not None: + hlines.__doc__ = dedent(Axes.hlines.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=1.0, vmin=None, vmax=None, origin=None, extent=None, shape=None, filternorm=1, filterrad=4.0, imlim=None, resample=None, url=None, hold=None, **kwargs): - """call signature:: - - imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, - alpha=1.0, vmin=None, vmax=None, origin=None, extent=None, - **kwargs) - -Display the image in *X* to current axes. *X* may be a float -array, a uint8 array or a PIL image. If *X* is an array, *X* -can have the following shapes: - -* MxN -- luminance (grayscale, float array only) -* MxNx3 -- RGB (float or uint8 array) -* MxNx4 -- RGBA (float or uint8 array) - -The value for each component of MxNx3 and MxNx4 float arrays should be -in the range 0.0 to 1.0; MxN float arrays may be normalised. - -An :class:`matplotlib.image.AxesImage` instance is returned. - -Keyword arguments: - - *cmap*: [ None | Colormap ] - A :class:`matplotlib.cm.Colormap` instance, eg. cm.jet. - If *None*, default to rc ``image.cmap`` value. - - *cmap* is ignored when *X* has RGB(A) information - - *aspect*: [ None | 'auto' | 'equal' | scalar ] - If 'auto', changes the image aspect ratio to match that of the axes - - If 'equal', and *extent* is *None*, changes the axes - aspect ratio to match that of the image. If *extent* is - not *None*, the axes aspect ratio is changed to match that - of the extent. - - If *None*, default to rc ``image.aspect`` value. - - *interpolation*: - - Acceptable values are *None*, 'nearest', 'bilinear', - 'bicubic', 'spline16', 'spline36', 'hanning', 'hamming', - 'hermite', 'kaiser', 'quadric', 'catrom', 'gaussian', - 'bessel', 'mitchell', 'sinc', 'lanczos', - - - If *interpolation* is *None*, default to rc - ``image.interpolation``. See also the *filternorm* and - *filterrad* parameters - - *norm*: [ None | Normalize ] - An :class:`matplotlib.colors.Normalize` instance; if - *None*, default is ``normalization()``. This scales - luminance -> 0-1 - - *norm* is only used for an MxN float array. - - *vmin*/*vmax*: [ None | scalar ] - Used to scale a luminance image to 0-1. If either is - *None*, the min and max of the luminance values will be - used. Note if *norm* is not *None*, the settings for - *vmin* and *vmax* will be ignored. - - *alpha*: scalar - The alpha blending value, between 0 (transparent) and 1 (opaque) - - *origin*: [ None | 'upper' | 'lower' ] - Place the [0,0] index of the array in the upper left or lower left - corner of the axes. If *None*, default to rc ``image.origin``. - - *extent*: [ None | scalars (left, right, bottom, top) ] - Data limits for the axes. The default assigns zero-based row, - column indices to the *x*, *y* centers of the pixels. - - *shape*: [ None | scalars (columns, rows) ] - For raw buffer images - - *filternorm*: - A parameter for the antigrain image resize filter. From the - antigrain documentation, if *filternorm* = 1, the filter normalizes - integer values and corrects the rounding errors. It doesn't do - anything with the source floating point values, it corrects only - integers according to the rule of 1.0 which means that any sum of - pixel weights must be equal to 1.0. So, the filter function must - produce a graph of the proper shape. - - *filterrad*: - The filter radius for filters that have a radius - parameter, i.e. when interpolation is one of: 'sinc', - 'lanczos' or 'blackman' - -Additional kwargs are :class:`~matplotlib.artist.Artist` properties: - - alpha: float (0.0 transparent through 1.0 opaque) - animated: [True | False] - axes: an :class:`~matplotlib.axes.Axes` instance - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - contains: a callable function - figure: a :class:`matplotlib.figure.Figure` instance - gid: an id string - label: any string - lod: [True | False] - picker: [None|float|boolean|callable] - rasterized: [True | False | None] - snap: unknown - transform: :class:`~matplotlib.transforms.Transform` instance - url: a url string - visible: [True | False] - zorder: any number - -**Example:** - -.. plot:: mpl_examples/pylab_examples/image_demo.py - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -4091,85 +2050,12 @@ def imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=1.0, ax.hold(washold) gci._current = ret return ret +if Axes.imshow.__doc__ is not None: + imshow.__doc__ = dedent(Axes.imshow.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def loglog(*args, **kwargs): - """call signature:: - - loglog(*args, **kwargs) - -Make a plot with log scaling on the *x* and *y* axis. - -:func:`~matplotlib.pyplot.loglog` supports all the keyword -arguments of :func:`~matplotlib.pyplot.plot` and -:meth:`matplotlib.axes.Axes.set_xscale` / -:meth:`matplotlib.axes.Axes.set_yscale`. - -Notable keyword arguments: - - *basex*/*basey*: scalar > 1 - base of the *x*/*y* logarithm - - *subsx*/*subsy*: [ None | sequence ] - the location of the minor *x*/*y* ticks; *None* defaults - to autosubs, which depend on the number of decades in the - plot; see :meth:`matplotlib.axes.Axes.set_xscale` / - :meth:`matplotlib.axes.Axes.set_yscale` for details - - *nonposx*/*nonposy*: ['mask' | 'clip' ] - non-positive values in *x* or *y* can be masked as - invalid, or clipped to a very small positive number - -The remaining valid kwargs are -:class:`~matplotlib.lines.Line2D` properties: - - alpha: float (0.0 transparent through 1.0 opaque) - animated: [True | False] - antialiased or aa: [True | False] - axes: an :class:`~matplotlib.axes.Axes` instance - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - color or c: any matplotlib color - contains: a callable function - dash_capstyle: ['butt' | 'round' | 'projecting'] - dash_joinstyle: ['miter' | 'round' | 'bevel'] - dashes: sequence of on/off ink in points - data: 2D array - drawstyle: [ 'default' | 'steps' | 'steps-pre' | 'steps-mid' | 'steps-post' ] - figure: a :class:`matplotlib.figure.Figure` instance - fillstyle: ['full' | 'left' | 'right' | 'bottom' | 'top'] - gid: an id string - label: any string - linestyle or ls: [ '-' | '--' | '-.' | ':' | 'None' | ' ' | '' ] and any drawstyle in combination with a linestyle, e.g. 'steps--'. - linewidth or lw: float value in points - lod: [True | False] - marker: [ '+' | '*' | ',' | '.' | '1' | '2' | '3' | '4' | '<' | '>' | 'D' | 'H' | '^' | '_' | 'd' | 'h' | 'o' | 'p' | 's' | 'v' | 'x' | '|' | TICKUP | TICKDOWN | TICKLEFT | TICKRIGHT | 'None' | ' ' | '' ] - markeredgecolor or mec: any matplotlib color - markeredgewidth or mew: float value in points - markerfacecolor or mfc: any matplotlib color - markersize or ms: float - markevery: None | integer | (startind, stride) - picker: float distance in points or callable pick function ``fn(artist, event)`` - pickradius: float distance in points - rasterized: [True | False | None] - snap: unknown - solid_capstyle: ['butt' | 'round' | 'projecting'] - solid_joinstyle: ['miter' | 'round' | 'bevel'] - transform: a :class:`matplotlib.transforms.Transform` instance - url: a url string - visible: [True | False] - xdata: 1D array - ydata: 1D array - zorder: any number - -**Example:** - -.. plot:: mpl_examples/pylab_examples/log_demo.py - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -4183,164 +2069,12 @@ def loglog(*args, **kwargs): ax.hold(washold) return ret +if Axes.loglog.__doc__ is not None: + loglog.__doc__ = dedent(Axes.loglog.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def pcolor(*args, **kwargs): - """call signatures:: - - pcolor(C, **kwargs) - pcolor(X, Y, C, **kwargs) - -Create a pseudocolor plot of a 2-D array. - -*C* is the array of color values. - -*X* and *Y*, if given, specify the (*x*, *y*) coordinates of -the colored quadrilaterals; the quadrilateral for C[i,j] has -corners at:: - - (X[i, j], Y[i, j]), - (X[i, j+1], Y[i, j+1]), - (X[i+1, j], Y[i+1, j]), - (X[i+1, j+1], Y[i+1, j+1]). - -Ideally the dimensions of *X* and *Y* should be one greater -than those of *C*; if the dimensions are the same, then the -last row and column of *C* will be ignored. - -Note that the the column index corresponds to the -*x*-coordinate, and the row index corresponds to *y*; for -details, see the :ref:`Grid Orientation -` section below. - -If either or both of *X* and *Y* are 1-D arrays or column vectors, -they will be expanded as needed into the appropriate 2-D arrays, -making a rectangular grid. - -*X*, *Y* and *C* may be masked arrays. If either C[i, j], or one -of the vertices surrounding C[i,j] (*X* or *Y* at [i, j], [i+1, j], -[i, j+1],[i+1, j+1]) is masked, nothing is plotted. - -Keyword arguments: - - *cmap*: [ None | Colormap ] - A :class:`matplotlib.cm.Colormap` instance. If *None*, use - rc settings. - - norm: [ None | Normalize ] - An :class:`matplotlib.colors.Normalize` instance is used - to scale luminance data to 0,1. If *None*, defaults to - :func:`normalize`. - - *vmin*/*vmax*: [ None | scalar ] - *vmin* and *vmax* are used in conjunction with *norm* to - normalize luminance data. If either are *None*, the min - and max of the color array *C* is used. If you pass a - *norm* instance, *vmin* and *vmax* will be ignored. - - *shading*: [ 'flat' | 'faceted' ] - If 'faceted', a black grid is drawn around each rectangle; if - 'flat', edges are not drawn. Default is 'flat', contrary to - Matlab(TM). - - This kwarg is deprecated; please use 'edgecolors' instead: - * shading='flat' -- edgecolors='None' - * shading='faceted -- edgecolors='k' - - *edgecolors*: [ None | 'None' | color | color sequence] - If *None*, the rc setting is used by default. - - If 'None', edges will not be visible. - - An mpl color or sequence of colors will set the edge color - - *alpha*: 0 <= scalar <= 1 - the alpha blending value - -Return value is a :class:`matplotlib.collection.Collection` -instance. - -.. _axes-pcolor-grid-orientation: - -The grid orientation follows the Matlab(TM) convention: an -array *C* with shape (*nrows*, *ncolumns*) is plotted with -the column number as *X* and the row number as *Y*, increasing -up; hence it is plotted the way the array would be printed, -except that the *Y* axis is reversed. That is, *C* is taken -as *C*(*y*, *x*). - -Similarly for :func:`~matplotlib.pyplot.meshgrid`:: - - x = np.arange(5) - y = np.arange(3) - X, Y = meshgrid(x,y) - -is equivalent to: - - X = array([[0, 1, 2, 3, 4], - [0, 1, 2, 3, 4], - [0, 1, 2, 3, 4]]) - - Y = array([[0, 0, 0, 0, 0], - [1, 1, 1, 1, 1], - [2, 2, 2, 2, 2]]) - -so if you have:: - - C = rand( len(x), len(y)) - -then you need:: - - pcolor(X, Y, C.T) - -or:: - - pcolor(C.T) - -Matlab :func:`pcolor` always discards the last row and column -of *C*, but matplotlib displays the last row and column if *X* and -*Y* are not specified, or if *X* and *Y* have one more row and -column than *C*. - -kwargs can be used to control the -:class:`~matplotlib.collection.PolyCollection` properties: - - alpha: float - animated: [True | False] - antialiased or antialiaseds: Boolean or sequence of booleans - array: unknown - axes: an :class:`~matplotlib.axes.Axes` instance - clim: a length 2 sequence of floats - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - cmap: a colormap - color: matplotlib color arg or sequence of rgba tuples - colorbar: unknown - contains: a callable function - edgecolor or edgecolors: matplotlib color arg or sequence of rgba tuples - facecolor or facecolors: matplotlib color arg or sequence of rgba tuples - figure: a :class:`matplotlib.figure.Figure` instance - gid: an id string - label: any string - linestyle or linestyles or dashes: ['solid' | 'dashed', 'dashdot', 'dotted' | (offset, on-off-dash-seq) ] - linewidth or lw or linewidths: float or sequence of floats - lod: [True | False] - norm: unknown - offsets: float or sequence of floats - picker: [None|float|boolean|callable] - pickradius: unknown - rasterized: [True | False | None] - snap: unknown - transform: :class:`~matplotlib.transforms.Transform` instance - url: a url string - urls: unknown - visible: [True | False] - zorder: any number - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -4354,105 +2088,12 @@ def pcolor(*args, **kwargs): ax.hold(washold) gci._current = ret return ret +if Axes.pcolor.__doc__ is not None: + pcolor.__doc__ = dedent(Axes.pcolor.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def pcolormesh(*args, **kwargs): - """call signatures:: - - pcolormesh(C) - pcolormesh(X, Y, C) - pcolormesh(C, **kwargs) - -*C* may be a masked array, but *X* and *Y* may not. Masked -array support is implemented via *cmap* and *norm*; in -contrast, :func:`~matplotlib.pyplot.pcolor` simply does not -draw quadrilaterals with masked colors or vertices. - -Keyword arguments: - - *cmap*: [ None | Colormap ] - A :class:`matplotlib.cm.Colormap` instance. If None, use - rc settings. - - *norm*: [ None | Normalize ] - A :class:`matplotlib.colors.Normalize` instance is used to - scale luminance data to 0,1. If None, defaults to - :func:`normalize`. - - *vmin*/*vmax*: [ None | scalar ] - *vmin* and *vmax* are used in conjunction with *norm* to - normalize luminance data. If either are *None*, the min - and max of the color array *C* is used. If you pass a - *norm* instance, *vmin* and *vmax* will be ignored. - - *shading*: [ 'flat' | 'faceted' ] - If 'faceted', a black grid is drawn around each rectangle; if - 'flat', edges are not drawn. Default is 'flat', contrary to - Matlab(TM). - - This kwarg is deprecated; please use 'edgecolors' instead: - * shading='flat' -- edgecolors='None' - * shading='faceted -- edgecolors='k' - - *edgecolors*: [ None | 'None' | color | color sequence] - If None, the rc setting is used by default. - - If 'None', edges will not be visible. - - An mpl color or sequence of colors will set the edge color - - *alpha*: 0 <= scalar <= 1 - the alpha blending value - -Return value is a :class:`matplotlib.collection.QuadMesh` -object. - -kwargs can be used to control the -:class:`matplotlib.collections.QuadMesh` -properties: - - alpha: float - animated: [True | False] - antialiased or antialiaseds: Boolean or sequence of booleans - array: unknown - axes: an :class:`~matplotlib.axes.Axes` instance - clim: a length 2 sequence of floats - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - cmap: a colormap - color: matplotlib color arg or sequence of rgba tuples - colorbar: unknown - contains: a callable function - edgecolor or edgecolors: matplotlib color arg or sequence of rgba tuples - facecolor or facecolors: matplotlib color arg or sequence of rgba tuples - figure: a :class:`matplotlib.figure.Figure` instance - gid: an id string - label: any string - linestyle or linestyles or dashes: ['solid' | 'dashed', 'dashdot', 'dotted' | (offset, on-off-dash-seq) ] - linewidth or lw or linewidths: float or sequence of floats - lod: [True | False] - norm: unknown - offsets: float or sequence of floats - picker: [None|float|boolean|callable] - pickradius: unknown - rasterized: [True | False | None] - snap: unknown - transform: :class:`~matplotlib.transforms.Transform` instance - url: a url string - urls: unknown - visible: [True | False] - zorder: any number - -.. seealso:: - - :func:`~matplotlib.pyplot.pcolor` - For an explanation of the grid orientation and the - expansion of 1-D *X* and/or *Y* to 2-D arrays. - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -4466,74 +2107,12 @@ def pcolormesh(*args, **kwargs): ax.hold(washold) gci._current = ret return ret +if Axes.pcolormesh.__doc__ is not None: + pcolormesh.__doc__ = dedent(Axes.pcolormesh.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.59999999999999998, shadow=False, labeldistance=1.1000000000000001, hold=None): - """call signature:: - - pie(x, explode=None, labels=None, - colors=('b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'), - autopct=None, pctdistance=0.6, labeldistance=1.1, shadow=False) - -Make a pie chart of array *x*. The fractional area of each -wedge is given by x/sum(x). If sum(x) <= 1, then the values -of x give the fractional area directly and the array will not -be normalized. - -Keyword arguments: - - *explode*: [ None | len(x) sequence ] - If not *None*, is a len(*x*) array which specifies the - fraction of the radius with which to offset each wedge. - - *colors*: [ None | color sequence ] - A sequence of matplotlib color args through which the pie chart - will cycle. - - *labels*: [ None | len(x) sequence of strings ] - A sequence of strings providing the labels for each wedge - - *autopct*: [ None | format string | format function ] - If not *None*, is a string or function used to label the - wedges with their numeric value. The label will be placed inside - the wedge. If it is a format string, the label will be ``fmt%pct``. - If it is a function, it will be called. - - *pctdistance*: scalar - The ratio between the center of each pie slice and the - start of the text generated by *autopct*. Ignored if - *autopct* is *None*; default is 0.6. - - *labeldistance*: scalar - The radial distance at which the pie labels are drawn - - *shadow*: [ False | True ] - Draw a shadow beneath the pie. - -The pie chart will probably look best if the figure and axes are -square. Eg.:: - - figure(figsize=(8,8)) - ax = axes([0.1, 0.1, 0.8, 0.8]) - -Return value: - If *autopct* is None, return the tuple (*patches*, *texts*): - - - *patches* is a sequence of - :class:`matplotlib.patches.Wedge` instances - - - *texts* is a list of the label - :class:`matplotlib.text.Text` instances. - - If *autopct* is not *None*, return the tuple (*patches*, - *texts*, *autotexts*), where *patches* and *texts* are as - above, and *autotexts* is a list of - :class:`~matplotlib.text.Text` instances for the numeric - labels. - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -4547,166 +2126,12 @@ def pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.5 ax.hold(washold) return ret +if Axes.pie.__doc__ is not None: + pie.__doc__ = dedent(Axes.pie.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def plot(*args, **kwargs): - """Plot lines and/or markers to the -:class:`~matplotlib.axes.Axes`. *args* is a variable length -argument, allowing for multiple *x*, *y* pairs with an -optional format string. For example, each of the following is -legal:: - - plot(x, y) # plot x and y using default line style and color - plot(x, y, 'bo') # plot x and y using blue circle markers - plot(y) # plot y using x as index array 0..N-1 - plot(y, 'r+') # ditto, but with red plusses - -If *x* and/or *y* is 2-dimensional, then the corresponding columns -will be plotted. - -An arbitrary number of *x*, *y*, *fmt* groups can be -specified, as in:: - - a.plot(x1, y1, 'g^', x2, y2, 'g-') - -Return value is a list of lines that were added. - -The following format string characters are accepted to control -the line style or marker: - -================ =============================== -character description -================ =============================== -``'-'`` solid line style -``'--'`` dashed line style -``'-.'`` dash-dot line style -``':'`` dotted line style -``'.'`` point marker -``','`` pixel marker -``'o'`` circle marker -``'v'`` triangle_down marker -``'^'`` triangle_up marker -``'<'`` triangle_left marker -``'>'`` triangle_right marker -``'1'`` tri_down marker -``'2'`` tri_up marker -``'3'`` tri_left marker -``'4'`` tri_right marker -``'s'`` square marker -``'p'`` pentagon marker -``'*'`` star marker -``'h'`` hexagon1 marker -``'H'`` hexagon2 marker -``'+'`` plus marker -``'x'`` x marker -``'D'`` diamond marker -``'d'`` thin_diamond marker -``'|'`` vline marker -``'_'`` hline marker -================ =============================== - - -The following color abbreviations are supported: - -========== ======== -character color -========== ======== -'b' blue -'g' green -'r' red -'c' cyan -'m' magenta -'y' yellow -'k' black -'w' white -========== ======== - -In addition, you can specify colors in many weird and -wonderful ways, including full names (``'green'``), hex -strings (``'#008000'``), RGB or RGBA tuples (``(0,1,0,1)``) or -grayscale intensities as a string (``'0.8'``). Of these, the -string specifications can be used in place of a ``fmt`` group, -but the tuple forms can be used only as ``kwargs``. - -Line styles and colors are combined in a single format string, as in -``'bo'`` for blue circles. - -The *kwargs* can be used to set line properties (any property that has -a ``set_*`` method). You can use this to set a line label (for auto -legends), linewidth, anitialising, marker face color, etc. Here is an -example:: - - plot([1,2,3], [1,2,3], 'go-', label='line 1', linewidth=2) - plot([1,2,3], [1,4,9], 'rs', label='line 2') - axis([0, 4, 0, 10]) - legend() - -If you make multiple lines with one plot command, the kwargs -apply to all those lines, e.g.:: - - plot(x1, y1, x2, y2, antialised=False) - -Neither line will be antialiased. - -You do not need to use format strings, which are just -abbreviations. All of the line properties can be controlled -by keyword arguments. For example, you can set the color, -marker, linestyle, and markercolor with:: - - plot(x, y, color='green', linestyle='dashed', marker='o', - markerfacecolor='blue', markersize=12). See - :class:`~matplotlib.lines.Line2D` for details. - -The kwargs are :class:`~matplotlib.lines.Line2D` properties: - - alpha: float (0.0 transparent through 1.0 opaque) - animated: [True | False] - antialiased or aa: [True | False] - axes: an :class:`~matplotlib.axes.Axes` instance - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - color or c: any matplotlib color - contains: a callable function - dash_capstyle: ['butt' | 'round' | 'projecting'] - dash_joinstyle: ['miter' | 'round' | 'bevel'] - dashes: sequence of on/off ink in points - data: 2D array - drawstyle: [ 'default' | 'steps' | 'steps-pre' | 'steps-mid' | 'steps-post' ] - figure: a :class:`matplotlib.figure.Figure` instance - fillstyle: ['full' | 'left' | 'right' | 'bottom' | 'top'] - gid: an id string - label: any string - linestyle or ls: [ '-' | '--' | '-.' | ':' | 'None' | ' ' | '' ] and any drawstyle in combination with a linestyle, e.g. 'steps--'. - linewidth or lw: float value in points - lod: [True | False] - marker: [ '+' | '*' | ',' | '.' | '1' | '2' | '3' | '4' | '<' | '>' | 'D' | 'H' | '^' | '_' | 'd' | 'h' | 'o' | 'p' | 's' | 'v' | 'x' | '|' | TICKUP | TICKDOWN | TICKLEFT | TICKRIGHT | 'None' | ' ' | '' ] - markeredgecolor or mec: any matplotlib color - markeredgewidth or mew: float value in points - markerfacecolor or mfc: any matplotlib color - markersize or ms: float - markevery: None | integer | (startind, stride) - picker: float distance in points or callable pick function ``fn(artist, event)`` - pickradius: float distance in points - rasterized: [True | False | None] - snap: unknown - solid_capstyle: ['butt' | 'round' | 'projecting'] - solid_joinstyle: ['miter' | 'round' | 'bevel'] - transform: a :class:`matplotlib.transforms.Transform` instance - url: a url string - visible: [True | False] - xdata: 1D array - ydata: 1D array - zorder: any number - -kwargs *scalex* and *scaley*, if defined, are passed on to -:meth:`~matplotlib.axes.Axes.autoscale_view` to determine -whether the *x* and *y* axes are autoscaled; the default is -*True*. - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -4720,103 +2145,12 @@ def plot(*args, **kwargs): ax.hold(washold) return ret +if Axes.plot.__doc__ is not None: + plot.__doc__ = dedent(Axes.plot.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def plot_date(x, y, fmt='bo', tz=None, xdate=True, ydate=False, hold=None, **kwargs): - """call signature:: - - plot_date(x, y, fmt='bo', tz=None, xdate=True, ydate=False, **kwargs) - -Similar to the :func:`~matplotlib.pyplot.plot` command, except -the *x* or *y* (or both) data is considered to be dates, and the -axis is labeled accordingly. - -*x* and/or *y* can be a sequence of dates represented as float -days since 0001-01-01 UTC. - -Keyword arguments: - - *fmt*: string - The plot format string. - - *tz*: [ None | timezone string ] - The time zone to use in labeling dates. If *None*, defaults to rc - value. - - *xdate*: [ True | False ] - If *True*, the *x*-axis will be labeled with dates. - - *ydate*: [ False | True ] - If *True*, the *y*-axis will be labeled with dates. - -Note if you are using custom date tickers and formatters, it -may be necessary to set the formatters/locators after the call -to :meth:`plot_date` since :meth:`plot_date` will set the -default tick locator to -:class:`matplotlib.dates.AutoDateLocator` (if the tick -locator is not already set to a -:class:`matplotlib.dates.DateLocator` instance) and the -default tick formatter to -:class:`matplotlib.dates.AutoDateFormatter` (if the tick -formatter is not already set to a -:class:`matplotlib.dates.DateFormatter` instance). - -Valid kwargs are :class:`~matplotlib.lines.Line2D` properties: - - alpha: float (0.0 transparent through 1.0 opaque) - animated: [True | False] - antialiased or aa: [True | False] - axes: an :class:`~matplotlib.axes.Axes` instance - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - color or c: any matplotlib color - contains: a callable function - dash_capstyle: ['butt' | 'round' | 'projecting'] - dash_joinstyle: ['miter' | 'round' | 'bevel'] - dashes: sequence of on/off ink in points - data: 2D array - drawstyle: [ 'default' | 'steps' | 'steps-pre' | 'steps-mid' | 'steps-post' ] - figure: a :class:`matplotlib.figure.Figure` instance - fillstyle: ['full' | 'left' | 'right' | 'bottom' | 'top'] - gid: an id string - label: any string - linestyle or ls: [ '-' | '--' | '-.' | ':' | 'None' | ' ' | '' ] and any drawstyle in combination with a linestyle, e.g. 'steps--'. - linewidth or lw: float value in points - lod: [True | False] - marker: [ '+' | '*' | ',' | '.' | '1' | '2' | '3' | '4' | '<' | '>' | 'D' | 'H' | '^' | '_' | 'd' | 'h' | 'o' | 'p' | 's' | 'v' | 'x' | '|' | TICKUP | TICKDOWN | TICKLEFT | TICKRIGHT | 'None' | ' ' | '' ] - markeredgecolor or mec: any matplotlib color - markeredgewidth or mew: float value in points - markerfacecolor or mfc: any matplotlib color - markersize or ms: float - markevery: None | integer | (startind, stride) - picker: float distance in points or callable pick function ``fn(artist, event)`` - pickradius: float distance in points - rasterized: [True | False | None] - snap: unknown - solid_capstyle: ['butt' | 'round' | 'projecting'] - solid_joinstyle: ['miter' | 'round' | 'bevel'] - transform: a :class:`matplotlib.transforms.Transform` instance - url: a url string - visible: [True | False] - xdata: 1D array - ydata: 1D array - zorder: any number - -.. seealso:: - - :mod:`~matplotlib.dates` - for helper functions - - :func:`~matplotlib.dates.date2num`, - :func:`~matplotlib.dates.num2date` and - :func:`~matplotlib.dates.drange` - for help on creating the required floating point - dates. - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -4830,146 +2164,12 @@ def plot_date(x, y, fmt='bo', tz=None, xdate=True, ydate=False, hold=None, **kwa ax.hold(washold) return ret +if Axes.plot_date.__doc__ is not None: + plot_date.__doc__ = dedent(Axes.plot_date.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def psd(x, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.window_hanning, noverlap=0, pad_to=None, sides='default', scale_by_freq=None, hold=None, **kwargs): - """call signature:: - - psd(x, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, - window=mlab.window_hanning, noverlap=0, pad_to=None, - sides='default', scale_by_freq=None, **kwargs) - -The power spectral density by Welch's average periodogram -method. The vector *x* is divided into *NFFT* length -segments. Each segment is detrended by function *detrend* and -windowed by function *window*. *noverlap* gives the length of -the overlap between segments. The :math:`|\\mathrm{fft}(i)|^2` -of each segment :math:`i` are averaged to compute *Pxx*, with a -scaling to correct for power loss due to windowing. *Fs* is the -sampling frequency. - -Keyword arguments: - - *NFFT*: integer - The number of data points used in each block for the FFT. - Must be even; a power 2 is most efficient. The default value is 256. - - *Fs*: scalar - The sampling frequency (samples per time unit). It is used - to calculate the Fourier frequencies, freqs, in cycles per time - unit. The default value is 2. - - *detrend*: callable - The function applied to each segment before fft-ing, - designed to remove the mean or linear trend. Unlike in - matlab, where the *detrend* parameter is a vector, in - matplotlib is it a function. The :mod:`~matplotlib.pylab` - module defines :func:`~matplotlib.pylab.detrend_none`, - :func:`~matplotlib.pylab.detrend_mean`, and - :func:`~matplotlib.pylab.detrend_linear`, but you can use - a custom function as well. - - *window*: callable or ndarray - A function or a vector of length *NFFT*. To create window - vectors see :func:`window_hanning`, :func:`window_none`, - :func:`numpy.blackman`, :func:`numpy.hamming`, - :func:`numpy.bartlett`, :func:`scipy.signal`, - :func:`scipy.signal.get_window`, etc. The default is - :func:`window_hanning`. If a function is passed as the - argument, it must take a data segment as an argument and - return the windowed version of the segment. - - *noverlap*: integer - The number of points of overlap between blocks. The default value - is 0 (no overlap). - - *pad_to*: integer - The number of points to which the data segment is padded when - performing the FFT. This can be different from *NFFT*, which - specifies the number of data points used. While not increasing - the actual resolution of the psd (the minimum distance between - resolvable peaks), this can give more points in the plot, - allowing for more detail. This corresponds to the *n* parameter - in the call to fft(). The default is None, which sets *pad_to* - equal to *NFFT* - - *sides*: [ 'default' | 'onesided' | 'twosided' ] - Specifies which sides of the PSD to return. Default gives the - default behavior, which returns one-sided for real data and both - for complex data. 'onesided' forces the return of a one-sided PSD, - while 'twosided' forces two-sided. - - *scale_by_freq*: boolean - Specifies whether the resulting density values should be scaled - by the scaling frequency, which gives density in units of Hz^-1. - This allows for integration over the returned frequency values. - The default is True for MatLab compatibility. - - *Fc*: integer - The center frequency of *x* (defaults to 0), which offsets - the x extents of the plot to reflect the frequency range used - when a signal is acquired and then filtered and downsampled to - baseband. - -Returns the tuple (*Pxx*, *freqs*). - -For plotting, the power is plotted as -:math:`10\\log_{10}(P_{xx})` for decibels, though *Pxx* itself -is returned. - -References: - Bendat & Piersol -- Random Data: Analysis and Measurement - Procedures, John Wiley & Sons (1986) - -kwargs control the :class:`~matplotlib.lines.Line2D` properties: - - alpha: float (0.0 transparent through 1.0 opaque) - animated: [True | False] - antialiased or aa: [True | False] - axes: an :class:`~matplotlib.axes.Axes` instance - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - color or c: any matplotlib color - contains: a callable function - dash_capstyle: ['butt' | 'round' | 'projecting'] - dash_joinstyle: ['miter' | 'round' | 'bevel'] - dashes: sequence of on/off ink in points - data: 2D array - drawstyle: [ 'default' | 'steps' | 'steps-pre' | 'steps-mid' | 'steps-post' ] - figure: a :class:`matplotlib.figure.Figure` instance - fillstyle: ['full' | 'left' | 'right' | 'bottom' | 'top'] - gid: an id string - label: any string - linestyle or ls: [ '-' | '--' | '-.' | ':' | 'None' | ' ' | '' ] and any drawstyle in combination with a linestyle, e.g. 'steps--'. - linewidth or lw: float value in points - lod: [True | False] - marker: [ '+' | '*' | ',' | '.' | '1' | '2' | '3' | '4' | '<' | '>' | 'D' | 'H' | '^' | '_' | 'd' | 'h' | 'o' | 'p' | 's' | 'v' | 'x' | '|' | TICKUP | TICKDOWN | TICKLEFT | TICKRIGHT | 'None' | ' ' | '' ] - markeredgecolor or mec: any matplotlib color - markeredgewidth or mew: float value in points - markerfacecolor or mfc: any matplotlib color - markersize or ms: float - markevery: None | integer | (startind, stride) - picker: float distance in points or callable pick function ``fn(artist, event)`` - pickradius: float distance in points - rasterized: [True | False | None] - snap: unknown - solid_capstyle: ['butt' | 'round' | 'projecting'] - solid_joinstyle: ['miter' | 'round' | 'bevel'] - transform: a :class:`matplotlib.transforms.Transform` instance - url: a url string - visible: [True | False] - xdata: 1D array - ydata: 1D array - zorder: any number - -**Example:** - -.. plot:: mpl_examples/pylab_examples/psd_demo.py - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -4983,154 +2183,12 @@ def psd(x, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.window_h ax.hold(washold) return ret +if Axes.psd.__doc__ is not None: + psd.__doc__ = dedent(Axes.psd.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def quiver(*args, **kw): - """Plot a 2-D field of arrows. - -call signatures:: - - quiver(U, V, **kw) - quiver(U, V, C, **kw) - quiver(X, Y, U, V, **kw) - quiver(X, Y, U, V, C, **kw) - -Arguments: - - *X*, *Y*: - - The x and y coordinates of the arrow locations (default is tail of - arrow; see *pivot* kwarg) - - *U*, *V*: - - give the *x* and *y* components of the arrow vectors - - *C*: - an optional array used to map colors to the arrows - -All arguments may be 1-D or 2-D arrays or sequences. If *X* and *Y* -are absent, they will be generated as a uniform grid. If *U* and *V* -are 2-D arrays but *X* and *Y* are 1-D, and if len(*X*) and len(*Y*) -match the column and row dimensions of *U*, then *X* and *Y* will be -expanded with :func:`numpy.meshgrid`. - -*U*, *V*, *C* may be masked arrays, but masked *X*, *Y* are not -supported at present. - -Keyword arguments: - - *units*: ['width' | 'height' | 'dots' | 'inches' | 'x' | 'y' ] - arrow units; the arrow dimensions *except for length* are in - multiples of this unit. - - * 'width' or 'height': the width or height of the axes - - * 'dots' or 'inches': pixels or inches, based on the figure dpi - - * 'x' or 'y': *X* or *Y* data units - - The arrows scale differently depending on the units. For - 'x' or 'y', the arrows get larger as one zooms in; for other - units, the arrow size is independent of the zoom state. For - 'width or 'height', the arrow size increases with the width and - height of the axes, respectively, when the the window is resized; - for 'dots' or 'inches', resizing does not change the arrows. - - *angles*: ['uv' | 'xy' | array] - With the default 'uv', the arrow aspect ratio is 1, so that - if *U*==*V* the angle of the arrow on the plot is 45 degrees - CCW from the *x*-axis. - With 'xy', the arrow points from (x,y) to (x+u, y+v). - Alternatively, arbitrary angles may be specified as an array - of values in degrees, CCW from the *x*-axis. - - *scale*: [ None | float ] - data units per arrow unit, e.g. m/s per plot width; a smaller - scale parameter makes the arrow longer. If *None*, a simple - autoscaling algorithm is used, based on the average vector length - and the number of vectors. - - *width*: - shaft width in arrow units; default depends on choice of units, - above, and number of vectors; a typical starting value is about - 0.005 times the width of the plot. - - *headwidth*: scalar - head width as multiple of shaft width, default is 3 - - *headlength*: scalar - head length as multiple of shaft width, default is 5 - - *headaxislength*: scalar - head length at shaft intersection, default is 4.5 - - *minshaft*: scalar - length below which arrow scales, in units of head length. Do not - set this to less than 1, or small arrows will look terrible! - Default is 1 - - *minlength*: scalar - minimum length as a multiple of shaft width; if an arrow length - is less than this, plot a dot (hexagon) of this diameter instead. - Default is 1. - - *pivot*: [ 'tail' | 'middle' | 'tip' ] - The part of the arrow that is at the grid point; the arrow rotates - about this point, hence the name *pivot*. - - *color*: [ color | color sequence ] - This is a synonym for the - :class:`~matplotlib.collections.PolyCollection` facecolor kwarg. - If *C* has been set, *color* has no effect. - -The defaults give a slightly swept-back arrow; to make the head a -triangle, make *headaxislength* the same as *headlength*. To make the -arrow more pointed, reduce *headwidth* or increase *headlength* and -*headaxislength*. To make the head smaller relative to the shaft, -scale down all the head parameters. You will probably do best to leave -minshaft alone. - -linewidths and edgecolors can be used to customize the arrow -outlines. Additional :class:`~matplotlib.collections.PolyCollection` -keyword arguments: - - alpha: float - animated: [True | False] - antialiased or antialiaseds: Boolean or sequence of booleans - array: unknown - axes: an :class:`~matplotlib.axes.Axes` instance - clim: a length 2 sequence of floats - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - cmap: a colormap - color: matplotlib color arg or sequence of rgba tuples - colorbar: unknown - contains: a callable function - edgecolor or edgecolors: matplotlib color arg or sequence of rgba tuples - facecolor or facecolors: matplotlib color arg or sequence of rgba tuples - figure: a :class:`matplotlib.figure.Figure` instance - gid: an id string - label: any string - linestyle or linestyles or dashes: ['solid' | 'dashed', 'dashdot', 'dotted' | (offset, on-off-dash-seq) ] - linewidth or lw or linewidths: float or sequence of floats - lod: [True | False] - norm: unknown - offsets: float or sequence of floats - picker: [None|float|boolean|callable] - pickradius: unknown - rasterized: [True | False | None] - snap: unknown - transform: :class:`~matplotlib.transforms.Transform` instance - url: a url string - urls: unknown - visible: [True | False] - zorder: any number - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -5144,71 +2202,12 @@ def quiver(*args, **kw): ax.hold(washold) gci._current = ret return ret +if Axes.quiver.__doc__ is not None: + quiver.__doc__ = dedent(Axes.quiver.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def quiverkey(*args, **kw): - """Add a key to a quiver plot. - -call signature:: - - quiverkey(Q, X, Y, U, label, **kw) - -Arguments: - - *Q*: - The Quiver instance returned by a call to quiver. - - *X*, *Y*: - The location of the key; additional explanation follows. - - *U*: - The length of the key - - *label*: - a string with the length and units of the key - -Keyword arguments: - - *coordinates* = [ 'axes' | 'figure' | 'data' | 'inches' ] - Coordinate system and units for *X*, *Y*: 'axes' and 'figure' are - normalized coordinate systems with 0,0 in the lower left and 1,1 - in the upper right; 'data' are the axes data coordinates (used for - the locations of the vectors in the quiver plot itself); 'inches' - is position in the figure in inches, with 0,0 at the lower left - corner. - - *color*: - overrides face and edge colors from *Q*. - - *labelpos* = [ 'N' | 'S' | 'E' | 'W' ] - Position the label above, below, to the right, to the left of the - arrow, respectively. - - *labelsep*: - Distance in inches between the arrow and the label. Default is - 0.1 - - *labelcolor*: - defaults to default :class:`~matplotlib.text.Text` color. - - *fontproperties*: - A dictionary with keyword arguments accepted by the - :class:`~matplotlib.font_manager.FontProperties` initializer: - *family*, *style*, *variant*, *size*, *weight* - -Any additional keyword arguments are used to override vector -properties taken from *Q*. - -The positioning of the key depends on *X*, *Y*, *coordinates*, and -*labelpos*. If *labelpos* is 'N' or 'S', *X*, *Y* give the position -of the middle of the key arrow. If *labelpos* is 'E', *X*, *Y* -positions the head, and if *labelpos* is 'W', *X*, *Y* positions the -tail; in either of these two cases, *X*, *Y* is somewhere in the -middle of the arrow+label key object. - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -5222,166 +2221,12 @@ def quiverkey(*args, **kw): ax.hold(washold) return ret +if Axes.quiverkey.__doc__ is not None: + quiverkey.__doc__ = dedent(Axes.quiverkey.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def scatter(x, y, s=20, c='b', marker='o', cmap=None, norm=None, vmin=None, vmax=None, alpha=1.0, linewidths=None, faceted=True, verts=None, hold=None, **kwargs): - """call signatures:: - - scatter(x, y, s=20, c='b', marker='o', cmap=None, norm=None, - vmin=None, vmax=None, alpha=1.0, linewidths=None, - verts=None, **kwargs) - -Make a scatter plot of *x* versus *y*, where *x*, *y* are -converted to 1-D sequences which must be of the same length, *N*. - -Keyword arguments: - - *s*: - size in points^2. It is a scalar or an array of the same - length as *x* and *y*. - - *c*: - a color. *c* can be a single color format string, or a - sequence of color specifications of length *N*, or a - sequence of *N* numbers to be mapped to colors using the - *cmap* and *norm* specified via kwargs (see below). Note - that *c* should not be a single numeric RGB or RGBA - sequence because that is indistinguishable from an array - of values to be colormapped. *c* can be a 2-D array in - which the rows are RGB or RGBA, however. - - *marker*: - can be one of: - - ===== ============== - Value Description - ===== ============== - 's' square - 'o' circle - '^' triangle up - '>' triangle right - 'v' triangle down - '<' triangle left - 'd' diamond - 'p' pentagram - 'h' hexagon - '8' octagon - '+' plus - 'x' cross - ===== ============== - - The marker can also be a tuple (*numsides*, *style*, - *angle*), which will create a custom, regular symbol. - - *numsides*: - the number of sides - - *style*: - the style of the regular symbol: - - ===== ============================================= - Value Description - ===== ============================================= - 0 a regular polygon - 1 a star-like symbol - 2 an asterisk - 3 a circle (*numsides* and *angle* is ignored) - ===== ============================================= - - *angle*: - the angle of rotation of the symbol - - Finally, *marker* can be (*verts*, 0): *verts* is a - sequence of (*x*, *y*) vertices for a custom scatter - symbol. Alternatively, use the kwarg combination - *marker* = *None*, *verts* = *verts*. - -Any or all of *x*, *y*, *s*, and *c* may be masked arrays, in -which case all masks will be combined and only unmasked points -will be plotted. - -Other keyword arguments: the color mapping and normalization -arguments will be used only if *c* is an array of floats. - - *cmap*: [ None | Colormap ] - A :class:`matplotlib.colors.Colormap` instance. If *None*, - defaults to rc ``image.cmap``. *cmap* is only used if *c* - is an array of floats. - - *norm*: [ None | Normalize ] - A :class:`matplotlib.colors.Normalize` instance is used to - scale luminance data to 0, 1. If *None*, use the default - :func:`normalize`. *norm* is only used if *c* is an array - of floats. - - *vmin*/*vmax*: - *vmin* and *vmax* are used in conjunction with norm to - normalize luminance data. If either are None, the min and - max of the color array *C* is used. Note if you pass a - *norm* instance, your settings for *vmin* and *vmax* will - be ignored. - - *alpha*: 0 <= scalar <= 1 - The alpha value for the patches - - *linewidths*: [ None | scalar | sequence ] - If *None*, defaults to (lines.linewidth,). Note that this - is a tuple, and if you set the linewidths argument you - must set it as a sequence of floats, as required by - :class:`~matplotlib.collections.RegularPolyCollection`. - -Optional kwargs control the -:class:`~matplotlib.collections.Collection` properties; in -particular: - - *edgecolors*: - 'none' to plot faces with no outlines - - *facecolors*: - 'none' to plot unfilled outlines - -Here are the standard descriptions of all the -:class:`~matplotlib.collections.Collection` kwargs: - - alpha: float - animated: [True | False] - antialiased or antialiaseds: Boolean or sequence of booleans - array: unknown - axes: an :class:`~matplotlib.axes.Axes` instance - clim: a length 2 sequence of floats - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - cmap: a colormap - color: matplotlib color arg or sequence of rgba tuples - colorbar: unknown - contains: a callable function - edgecolor or edgecolors: matplotlib color arg or sequence of rgba tuples - facecolor or facecolors: matplotlib color arg or sequence of rgba tuples - figure: a :class:`matplotlib.figure.Figure` instance - gid: an id string - label: any string - linestyle or linestyles or dashes: ['solid' | 'dashed', 'dashdot', 'dotted' | (offset, on-off-dash-seq) ] - linewidth or lw or linewidths: float or sequence of floats - lod: [True | False] - norm: unknown - offsets: float or sequence of floats - picker: [None|float|boolean|callable] - pickradius: unknown - rasterized: [True | False | None] - snap: unknown - transform: :class:`~matplotlib.transforms.Transform` instance - url: a url string - urls: unknown - visible: [True | False] - zorder: any number - -A :class:`~matplotlib.collections.Collection` instance is -returned. - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -5395,85 +2240,12 @@ def scatter(x, y, s=20, c='b', marker='o', cmap=None, norm=None, vmin=None, vmax ax.hold(washold) gci._current = ret return ret +if Axes.scatter.__doc__ is not None: + scatter.__doc__ = dedent(Axes.scatter.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def semilogx(*args, **kwargs): - """call signature:: - - semilogx(*args, **kwargs) - -Make a plot with log scaling on the *x* axis. - -:func:`semilogx` supports all the keyword arguments of -:func:`~matplotlib.pyplot.plot` and -:meth:`matplotlib.axes.Axes.set_xscale`. - -Notable keyword arguments: - - *basex*: scalar > 1 - base of the *x* logarithm - - *subsx*: [ None | sequence ] - The location of the minor xticks; *None* defaults to - autosubs, which depend on the number of decades in the - plot; see :meth:`~matplotlib.axes.Axes.set_xscale` for - details. - - *nonposx*: ['mask' | 'clip' ] - non-positive values in *x* can be masked as - invalid, or clipped to a very small positive number - -The remaining valid kwargs are -:class:`~matplotlib.lines.Line2D` properties: - - alpha: float (0.0 transparent through 1.0 opaque) - animated: [True | False] - antialiased or aa: [True | False] - axes: an :class:`~matplotlib.axes.Axes` instance - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - color or c: any matplotlib color - contains: a callable function - dash_capstyle: ['butt' | 'round' | 'projecting'] - dash_joinstyle: ['miter' | 'round' | 'bevel'] - dashes: sequence of on/off ink in points - data: 2D array - drawstyle: [ 'default' | 'steps' | 'steps-pre' | 'steps-mid' | 'steps-post' ] - figure: a :class:`matplotlib.figure.Figure` instance - fillstyle: ['full' | 'left' | 'right' | 'bottom' | 'top'] - gid: an id string - label: any string - linestyle or ls: [ '-' | '--' | '-.' | ':' | 'None' | ' ' | '' ] and any drawstyle in combination with a linestyle, e.g. 'steps--'. - linewidth or lw: float value in points - lod: [True | False] - marker: [ '+' | '*' | ',' | '.' | '1' | '2' | '3' | '4' | '<' | '>' | 'D' | 'H' | '^' | '_' | 'd' | 'h' | 'o' | 'p' | 's' | 'v' | 'x' | '|' | TICKUP | TICKDOWN | TICKLEFT | TICKRIGHT | 'None' | ' ' | '' ] - markeredgecolor or mec: any matplotlib color - markeredgewidth or mew: float value in points - markerfacecolor or mfc: any matplotlib color - markersize or ms: float - markevery: None | integer | (startind, stride) - picker: float distance in points or callable pick function ``fn(artist, event)`` - pickradius: float distance in points - rasterized: [True | False | None] - snap: unknown - solid_capstyle: ['butt' | 'round' | 'projecting'] - solid_joinstyle: ['miter' | 'round' | 'bevel'] - transform: a :class:`matplotlib.transforms.Transform` instance - url: a url string - visible: [True | False] - xdata: 1D array - ydata: 1D array - zorder: any number - -.. seealso:: - - :meth:`loglog` - For example code and figure - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -5487,85 +2259,12 @@ def semilogx(*args, **kwargs): ax.hold(washold) return ret +if Axes.semilogx.__doc__ is not None: + semilogx.__doc__ = dedent(Axes.semilogx.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def semilogy(*args, **kwargs): - """call signature:: - - semilogy(*args, **kwargs) - -Make a plot with log scaling on the *y* axis. - -:func:`semilogy` supports all the keyword arguments of -:func:`~matplotlib.pylab.plot` and -:meth:`matplotlib.axes.Axes.set_yscale`. - -Notable keyword arguments: - - *basey*: scalar > 1 - Base of the *y* logarithm - - *subsy*: [ None | sequence ] - The location of the minor yticks; *None* defaults to - autosubs, which depend on the number of decades in the - plot; see :meth:`~matplotlib.axes.Axes.set_yscale` for - details. - - *nonposy*: ['mask' | 'clip' ] - non-positive values in *y* can be masked as - invalid, or clipped to a very small positive number - -The remaining valid kwargs are -:class:`~matplotlib.lines.Line2D` properties: - - alpha: float (0.0 transparent through 1.0 opaque) - animated: [True | False] - antialiased or aa: [True | False] - axes: an :class:`~matplotlib.axes.Axes` instance - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - color or c: any matplotlib color - contains: a callable function - dash_capstyle: ['butt' | 'round' | 'projecting'] - dash_joinstyle: ['miter' | 'round' | 'bevel'] - dashes: sequence of on/off ink in points - data: 2D array - drawstyle: [ 'default' | 'steps' | 'steps-pre' | 'steps-mid' | 'steps-post' ] - figure: a :class:`matplotlib.figure.Figure` instance - fillstyle: ['full' | 'left' | 'right' | 'bottom' | 'top'] - gid: an id string - label: any string - linestyle or ls: [ '-' | '--' | '-.' | ':' | 'None' | ' ' | '' ] and any drawstyle in combination with a linestyle, e.g. 'steps--'. - linewidth or lw: float value in points - lod: [True | False] - marker: [ '+' | '*' | ',' | '.' | '1' | '2' | '3' | '4' | '<' | '>' | 'D' | 'H' | '^' | '_' | 'd' | 'h' | 'o' | 'p' | 's' | 'v' | 'x' | '|' | TICKUP | TICKDOWN | TICKLEFT | TICKRIGHT | 'None' | ' ' | '' ] - markeredgecolor or mec: any matplotlib color - markeredgewidth or mew: float value in points - markerfacecolor or mfc: any matplotlib color - markersize or ms: float - markevery: None | integer | (startind, stride) - picker: float distance in points or callable pick function ``fn(artist, event)`` - pickradius: float distance in points - rasterized: [True | False | None] - snap: unknown - solid_capstyle: ['butt' | 'round' | 'projecting'] - solid_joinstyle: ['miter' | 'round' | 'bevel'] - transform: a :class:`matplotlib.transforms.Transform` instance - url: a url string - visible: [True | False] - xdata: 1D array - ydata: 1D array - zorder: any number - -.. seealso:: - - :meth:`loglog` - For example code and figure - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -5579,118 +2278,12 @@ def semilogy(*args, **kwargs): ax.hold(washold) return ret +if Axes.semilogy.__doc__ is not None: + semilogy.__doc__ = dedent(Axes.semilogy.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def specgram(x, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.window_hanning, noverlap=128, cmap=None, xextent=None, pad_to=None, sides='default', scale_by_freq=None, hold=None, **kwargs): - """call signature:: - - specgram(x, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, - window=mlab.window_hanning, noverlap=128, - cmap=None, xextent=None, pad_to=None, sides='default', - scale_by_freq=None, **kwargs) - -Compute a spectrogram of data in *x*. Data are split into -*NFFT* length segments and the PSD of each section is -computed. The windowing function *window* is applied to each -segment, and the amount of overlap of each segment is -specified with *noverlap*. - -Keyword arguments: - - *NFFT*: integer - The number of data points used in each block for the FFT. - Must be even; a power 2 is most efficient. The default value is 256. - - *Fs*: scalar - The sampling frequency (samples per time unit). It is used - to calculate the Fourier frequencies, freqs, in cycles per time - unit. The default value is 2. - - *detrend*: callable - The function applied to each segment before fft-ing, - designed to remove the mean or linear trend. Unlike in - matlab, where the *detrend* parameter is a vector, in - matplotlib is it a function. The :mod:`~matplotlib.pylab` - module defines :func:`~matplotlib.pylab.detrend_none`, - :func:`~matplotlib.pylab.detrend_mean`, and - :func:`~matplotlib.pylab.detrend_linear`, but you can use - a custom function as well. - - *window*: callable or ndarray - A function or a vector of length *NFFT*. To create window - vectors see :func:`window_hanning`, :func:`window_none`, - :func:`numpy.blackman`, :func:`numpy.hamming`, - :func:`numpy.bartlett`, :func:`scipy.signal`, - :func:`scipy.signal.get_window`, etc. The default is - :func:`window_hanning`. If a function is passed as the - argument, it must take a data segment as an argument and - return the windowed version of the segment. - - *noverlap*: integer - The number of points of overlap between blocks. The default value - is 0 (no overlap). - - *pad_to*: integer - The number of points to which the data segment is padded when - performing the FFT. This can be different from *NFFT*, which - specifies the number of data points used. While not increasing - the actual resolution of the psd (the minimum distance between - resolvable peaks), this can give more points in the plot, - allowing for more detail. This corresponds to the *n* parameter - in the call to fft(). The default is None, which sets *pad_to* - equal to *NFFT* - - *sides*: [ 'default' | 'onesided' | 'twosided' ] - Specifies which sides of the PSD to return. Default gives the - default behavior, which returns one-sided for real data and both - for complex data. 'onesided' forces the return of a one-sided PSD, - while 'twosided' forces two-sided. - - *scale_by_freq*: boolean - Specifies whether the resulting density values should be scaled - by the scaling frequency, which gives density in units of Hz^-1. - This allows for integration over the returned frequency values. - The default is True for MatLab compatibility. - - *Fc*: integer - The center frequency of *x* (defaults to 0), which offsets - the y extents of the plot to reflect the frequency range used - when a signal is acquired and then filtered and downsampled to - baseband. - - *cmap*: - A :class:`matplotlib.cm.Colormap` instance; if *None* use - default determined by rc - - *xextent*: - The image extent along the x-axis. xextent = (xmin,xmax) - The default is (0,max(bins)), where bins is the return - value from :func:`mlab.specgram` - - *kwargs*: - - Additional kwargs are passed on to imshow which makes the - specgram image - - Return value is (*Pxx*, *freqs*, *bins*, *im*): - - - *bins* are the time points the spectrogram is calculated over - - *freqs* is an array of frequencies - - *Pxx* is a len(times) x len(freqs) array of power - - *im* is a :class:`matplotlib.image.AxesImage` instance - -Note: If *x* is real (i.e. non-complex), only the positive -spectrum is shown. If *x* is complex, both positive and -negative parts of the spectrum are shown. This can be -overridden using the *sides* keyword argument. - -**Example:** - -.. plot:: mpl_examples/pylab_examples/specgram_demo.py - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -5704,81 +2297,12 @@ def specgram(x, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.win ax.hold(washold) gci._current = ret[-1] return ret +if Axes.specgram.__doc__ is not None: + specgram.__doc__ = dedent(Axes.specgram.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def spy(Z, precision=0, marker=None, markersize=None, aspect='equal', hold=None, **kwargs): - """call signature:: - - spy(Z, precision=0, marker=None, markersize=None, - aspect='equal', **kwargs) - -``spy(Z)`` plots the sparsity pattern of the 2-D array *Z*. - -If *precision* is 0, any non-zero value will be plotted; -else, values of :math:`|Z| > precision` will be plotted. - -For :class:`scipy.sparse.spmatrix` instances, there is a -special case: if *precision* is 'present', any value present in -the array will be plotted, even if it is identically zero. - -The array will be plotted as it would be printed, with -the first index (row) increasing down and the second -index (column) increasing to the right. - -By default aspect is 'equal', so that each array element -occupies a square space; set the aspect kwarg to 'auto' -to allow the plot to fill the plot box, or to any scalar -number to specify the aspect ratio of an array element -directly. - -Two plotting styles are available: image or marker. Both -are available for full arrays, but only the marker style -works for :class:`scipy.sparse.spmatrix` instances. - -If *marker* and *markersize* are *None*, an image will be -returned and any remaining kwargs are passed to -:func:`~matplotlib.pyplot.imshow`; else, a -:class:`~matplotlib.lines.Line2D` object will be returned with -the value of marker determining the marker type, and any -remaining kwargs passed to the -:meth:`~matplotlib.axes.Axes.plot` method. - -If *marker* and *markersize* are *None*, useful kwargs include: - -* *cmap* -* *alpha* - -.. seealso:: - - :func:`~matplotlib.pyplot.imshow` - For image options. - -For controlling colors, e.g. cyan background and red marks, -use:: - - cmap = mcolors.ListedColormap(['c','r']) - -If *marker* or *markersize* is not *None*, useful kwargs include: - -* *marker* -* *markersize* -* *color* - -Useful values for *marker* include: - -* 's' square (default) -* 'o' circle -* '.' point -* ',' pixel - -.. seealso:: - - :func:`~matplotlib.pyplot.plot` - For plotting options - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -5792,34 +2316,12 @@ def spy(Z, precision=0, marker=None, markersize=None, aspect='equal', hold=None, ax.hold(washold) gci._current = ret return ret +if Axes.spy.__doc__ is not None: + spy.__doc__ = dedent(Axes.spy.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def stem(x, y, linefmt='b-', markerfmt='bo', basefmt='r-', hold=None): - """call signature:: - - stem(x, y, linefmt='b-', markerfmt='bo', basefmt='r-') - -A stem plot plots vertical lines (using *linefmt*) at each *x* -location from the baseline to *y*, and places a marker there -using *markerfmt*. A horizontal line at 0 is is plotted using -*basefmt*. - -Return value is a tuple (*markerline*, *stemlines*, -*baseline*). - -.. seealso:: - - `this document`__ - for details - - :file:`examples/pylab_examples/stem_plot.py` - for a demo - -__ http://www.mathworks.com/access/helpdesk/help/techdoc/ref/stem.html - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -5833,32 +2335,12 @@ def stem(x, y, linefmt='b-', markerfmt='bo', basefmt='r-', hold=None): ax.hold(washold) return ret +if Axes.stem.__doc__ is not None: + stem.__doc__ = dedent(Axes.stem.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def step(x, y, *args, **kwargs): - """call signature:: - - step(x, y, *args, **kwargs) - -Make a step plot. Additional keyword args to :func:`step` are the same -as those for :func:`~matplotlib.pyplot.plot`. - -*x* and *y* must be 1-D sequences, and it is assumed, but not checked, -that *x* is uniformly increasing. - -Keyword arguments: - -*where*: [ 'pre' | 'post' | 'mid' ] - If 'pre', the interval from x[i] to x[i+1] has level y[i+1] - - If 'post', that interval has level y[i] - - If 'mid', the jumps in *y* occur half-way between the - *x*-values. - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -5872,69 +2354,12 @@ def step(x, y, *args, **kwargs): ax.hold(washold) return ret +if Axes.step.__doc__ is not None: + step.__doc__ = dedent(Axes.step.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def vlines(x, ymin, ymax, colors='k', linestyles='solid', label='', hold=None, **kwargs): - """call signature:: - - vlines(x, ymin, ymax, color='k', linestyles='solid') - -Plot vertical lines at each *x* from *ymin* to *ymax*. *ymin* -or *ymax* can be scalars or len(*x*) numpy arrays. If they are -scalars, then the respective values are constant, else the -heights of the lines are determined by *ymin* and *ymax*. - -*colors* - a line collections color args, either a single color - or a len(*x*) list of colors - -*linestyles* - - one of [ 'solid' | 'dashed' | 'dashdot' | 'dotted' ] - -Returns the :class:`matplotlib.collections.LineCollection` -that was added. - -kwargs are :class:`~matplotlib.collections.LineCollection` properties: - - alpha: float - animated: [True | False] - antialiased or antialiaseds: Boolean or sequence of booleans - array: unknown - axes: an :class:`~matplotlib.axes.Axes` instance - clim: a length 2 sequence of floats - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - cmap: a colormap - color: matplotlib color arg or sequence of rgba tuples - colorbar: unknown - contains: a callable function - edgecolor or edgecolors: matplotlib color arg or sequence of rgba tuples - facecolor or facecolors: matplotlib color arg or sequence of rgba tuples - figure: a :class:`matplotlib.figure.Figure` instance - gid: an id string - label: any string - linestyle or linestyles or dashes: ['solid' | 'dashed', 'dashdot', 'dotted' | (offset, on-off-dash-seq) ] - linewidth or lw or linewidths: float or sequence of floats - lod: [True | False] - norm: unknown - offsets: float or sequence of floats - picker: [None|float|boolean|callable] - pickradius: unknown - rasterized: [True | False | None] - segments: unknown - snap: unknown - transform: :class:`~matplotlib.transforms.Transform` instance - url: a url string - urls: unknown - verts: unknown - visible: [True | False] - zorder: any number - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -5948,63 +2373,12 @@ def vlines(x, ymin, ymax, colors='k', linestyles='solid', label='', hold=None, * ax.hold(washold) return ret +if Axes.vlines.__doc__ is not None: + vlines.__doc__ = dedent(Axes.vlines.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def xcorr(x, y, normed=True, detrend=mlab.detrend_none, usevlines=True, maxlags=10, hold=None, **kwargs): - """call signature:: - - def xcorr(self, x, y, normed=True, detrend=mlab.detrend_none, - usevlines=True, maxlags=10, **kwargs): - -Plot the cross correlation between *x* and *y*. If *normed* = -*True*, normalize the data by the cross correlation at 0-th -lag. *x* and y are detrended by the *detrend* callable -(default no normalization). *x* and *y* must be equal length. - -Data are plotted as ``plot(lags, c, **kwargs)`` - -Return value is a tuple (*lags*, *c*, *line*) where: - - - *lags* are a length ``2*maxlags+1`` lag vector - - - *c* is the ``2*maxlags+1`` auto correlation vector - - - *line* is a :class:`~matplotlib.lines.Line2D` instance - returned by :func:`~matplotlib.pyplot.plot`. - -The default *linestyle* is *None* and the default *marker* is -'o', though these can be overridden with keyword args. The -cross correlation is performed with :func:`numpy.correlate` -with *mode* = 2. - -If *usevlines* is *True*: - - :func:`~matplotlib.pyplot.vlines` - rather than :func:`~matplotlib.pyplot.plot` is used to draw - vertical lines from the origin to the xcorr. Otherwise the - plotstyle is determined by the kwargs, which are - :class:`~matplotlib.lines.Line2D` properties. - - The return value is a tuple (*lags*, *c*, *linecol*, *b*) - where *linecol* is the - :class:`matplotlib.collections.LineCollection` instance and - *b* is the *x*-axis. - -*maxlags* is a positive integer detailing the number of lags to show. -The default value of *None* will return all ``(2*len(x)-1)`` lags. - -**Example:** - -:func:`~matplotlib.pyplot.xcorr` above, and -:func:`~matplotlib.pyplot.acorr` below. - -**Example:** - -.. plot:: mpl_examples/pylab_examples/xcorr_demo.py - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -6018,182 +2392,12 @@ def xcorr(self, x, y, normed=True, detrend=mlab.detrend_none, ax.hold(washold) return ret +if Axes.xcorr.__doc__ is not None: + xcorr.__doc__ = dedent(Axes.xcorr.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def barbs(*args, **kw): - """Plot a 2-D field of barbs. - -call signatures:: - - barb(U, V, **kw) - barb(U, V, C, **kw) - barb(X, Y, U, V, **kw) - barb(X, Y, U, V, C, **kw) - -Arguments: - - *X*, *Y*: - The x and y coordinates of the barb locations - (default is head of barb; see *pivot* kwarg) - - *U*, *V*: - give the *x* and *y* components of the barb shaft - - *C*: - an optional array used to map colors to the barbs - -All arguments may be 1-D or 2-D arrays or sequences. If *X* and *Y* -are absent, they will be generated as a uniform grid. If *U* and *V* -are 2-D arrays but *X* and *Y* are 1-D, and if len(*X*) and len(*Y*) -match the column and row dimensions of *U*, then *X* and *Y* will be -expanded with :func:`numpy.meshgrid`. - -*U*, *V*, *C* may be masked arrays, but masked *X*, *Y* are not -supported at present. - -Keyword arguments: - - *length*: - Length of the barb in points; the other parts of the barb - are scaled against this. - Default is 9 - - *pivot*: [ 'tip' | 'middle' ] - The part of the arrow that is at the grid point; the arrow rotates - about this point, hence the name *pivot*. Default is 'tip' - - *barbcolor*: [ color | color sequence ] - Specifies the color all parts of the barb except any flags. This - parameter is analagous to the *edgecolor* parameter for polygons, - which can be used instead. However this parameter will override - facecolor. - - *flagcolor*: [ color | color sequence ] - Specifies the color of any flags on the barb. This parameter is - analagous to the *facecolor* parameter for polygons, which can be - used instead. However this parameter will override facecolor. If - this is not set (and *C* has not either) then *flagcolor* will be - set to match *barbcolor* so that the barb has a uniform color. If - *C* has been set, *flagcolor* has no effect. - - *sizes*: - A dictionary of coefficients specifying the ratio of a given - feature to the length of the barb. Only those values one wishes to - override need to be included. These features include: - - - 'spacing' - space between features (flags, full/half barbs) - - - 'height' - height (distance from shaft to top) of a flag or - full barb - - - 'width' - width of a flag, twice the width of a full barb - - - 'emptybarb' - radius of the circle used for low magnitudes - - *fill_empty*: - A flag on whether the empty barbs (circles) that are drawn should - be filled with the flag color. If they are not filled, they will - be drawn such that no color is applied to the center. Default is - False - - *rounding*: - A flag to indicate whether the vector magnitude should be rounded - when allocating barb components. If True, the magnitude is - rounded to the nearest multiple of the half-barb increment. If - False, the magnitude is simply truncated to the next lowest - multiple. Default is True - - *barb_increments*: - A dictionary of increments specifying values to associate with - different parts of the barb. Only those values one wishes to - override need to be included. - - - 'half' - half barbs (Default is 5) - - - 'full' - full barbs (Default is 10) - - - 'flag' - flags (default is 50) - - *flip_barb*: - Either a single boolean flag or an array of booleans. Single - boolean indicates whether the lines and flags should point - opposite to normal for all barbs. An array (which should be the - same size as the other data arrays) indicates whether to flip for - each individual barb. Normal behavior is for the barbs and lines - to point right (comes from wind barbs having these features point - towards low pressure in the Northern Hemisphere.) Default is - False - -Barbs are traditionally used in meteorology as a way to plot the speed -and direction of wind observations, but can technically be used to -plot any two dimensional vector quantity. As opposed to arrows, which -give vector magnitude by the length of the arrow, the barbs give more -quantitative information about the vector magnitude by putting slanted -lines or a triangle for various increments in magnitude, as show -schematically below:: - - : /\\ \\ - : / \\ \\ - : / \\ \\ \\ - : / \\ \\ \\ - : ------------------------------ - -.. note the double \\ at the end of each line to make the figure -.. render correctly - -The largest increment is given by a triangle (or "flag"). After those -come full lines (barbs). The smallest increment is a half line. There -is only, of course, ever at most 1 half line. If the magnitude is -small and only needs a single half-line and no full lines or -triangles, the half-line is offset from the end of the barb so that it -can be easily distinguished from barbs with a single full line. The -magnitude for the barb shown above would nominally be 65, using the -standard increments of 50, 10, and 5. - -linewidths and edgecolors can be used to customize the barb. -Additional :class:`~matplotlib.collections.PolyCollection` keyword -arguments: - - alpha: float - animated: [True | False] - antialiased or antialiaseds: Boolean or sequence of booleans - array: unknown - axes: an :class:`~matplotlib.axes.Axes` instance - clim: a length 2 sequence of floats - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - cmap: a colormap - color: matplotlib color arg or sequence of rgba tuples - colorbar: unknown - contains: a callable function - edgecolor or edgecolors: matplotlib color arg or sequence of rgba tuples - facecolor or facecolors: matplotlib color arg or sequence of rgba tuples - figure: a :class:`matplotlib.figure.Figure` instance - gid: an id string - label: any string - linestyle or linestyles or dashes: ['solid' | 'dashed', 'dashdot', 'dotted' | (offset, on-off-dash-seq) ] - linewidth or lw or linewidths: float or sequence of floats - lod: [True | False] - norm: unknown - offsets: float or sequence of floats - picker: [None|float|boolean|callable] - pickradius: unknown - rasterized: [True | False | None] - snap: unknown - transform: :class:`~matplotlib.transforms.Transform` instance - url: a url string - urls: unknown - visible: [True | False] - zorder: any number - -**Example:** - -.. plot:: mpl_examples/pylab_examples/barb_demo.py - -Additional kwargs: hold = [True|False] overrides default hold state -""" ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -6207,497 +2411,62 @@ def barbs(*args, **kw): ax.hold(washold) return ret +if Axes.barbs.__doc__ is not None: + barbs.__doc__ = dedent(Axes.barbs.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def cla(): - """Clear the current axes""" ret = gca().cla() draw_if_interactive() return ret +if Axes.cla.__doc__ is not None: + cla.__doc__ = dedent(Axes.cla.__doc__) # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def grid(b=None, **kwargs): - """call signature:: - - grid(self, b=None, **kwargs) - -Set the axes grids on or off; *b* is a boolean - -If *b* is *None* and ``len(kwargs)==0``, toggle the grid state. If -*kwargs* are supplied, it is assumed that you want a grid and *b* -is thus set to *True* - -*kawrgs* are used to set the grid line properties, eg:: - - ax.grid(color='r', linestyle='-', linewidth=2) - -Valid :class:`~matplotlib.lines.Line2D` kwargs are - - alpha: float (0.0 transparent through 1.0 opaque) - animated: [True | False] - antialiased or aa: [True | False] - axes: an :class:`~matplotlib.axes.Axes` instance - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - color or c: any matplotlib color - contains: a callable function - dash_capstyle: ['butt' | 'round' | 'projecting'] - dash_joinstyle: ['miter' | 'round' | 'bevel'] - dashes: sequence of on/off ink in points - data: 2D array - drawstyle: [ 'default' | 'steps' | 'steps-pre' | 'steps-mid' | 'steps-post' ] - figure: a :class:`matplotlib.figure.Figure` instance - fillstyle: ['full' | 'left' | 'right' | 'bottom' | 'top'] - gid: an id string - label: any string - linestyle or ls: [ '-' | '--' | '-.' | ':' | 'None' | ' ' | '' ] and any drawstyle in combination with a linestyle, e.g. 'steps--'. - linewidth or lw: float value in points - lod: [True | False] - marker: [ '+' | '*' | ',' | '.' | '1' | '2' | '3' | '4' | '<' | '>' | 'D' | 'H' | '^' | '_' | 'd' | 'h' | 'o' | 'p' | 's' | 'v' | 'x' | '|' | TICKUP | TICKDOWN | TICKLEFT | TICKRIGHT | 'None' | ' ' | '' ] - markeredgecolor or mec: any matplotlib color - markeredgewidth or mew: float value in points - markerfacecolor or mfc: any matplotlib color - markersize or ms: float - markevery: None | integer | (startind, stride) - picker: float distance in points or callable pick function ``fn(artist, event)`` - pickradius: float distance in points - rasterized: [True | False | None] - snap: unknown - solid_capstyle: ['butt' | 'round' | 'projecting'] - solid_joinstyle: ['miter' | 'round' | 'bevel'] - transform: a :class:`matplotlib.transforms.Transform` instance - url: a url string - visible: [True | False] - xdata: 1D array - ydata: 1D array - zorder: any number """ ret = gca().grid(b, **kwargs) draw_if_interactive() return ret +if Axes.grid.__doc__ is not None: + grid.__doc__ = dedent(Axes.grid.__doc__) # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def legend(*args, **kwargs): - """call signature:: - - legend(*args, **kwargs) - -Place a legend on the current axes at location *loc*. Labels are a -sequence of strings and *loc* can be a string or an integer specifying -the legend location. - -To make a legend with existing lines:: - - legend() - -:meth:`legend` by itself will try and build a legend using the label -property of the lines/patches/collections. You can set the label of -a line by doing:: - - plot(x, y, label='my data') - -or:: - - line.set_label('my data'). - -If label is set to '_nolegend_', the item will not be shown in -legend. - -To automatically generate the legend from labels:: - - legend( ('label1', 'label2', 'label3') ) - -To make a legend for a list of lines and labels:: - - legend( (line1, line2, line3), ('label1', 'label2', 'label3') ) - -To make a legend at a given location, using a location argument:: - - legend( ('label1', 'label2', 'label3'), loc='upper left') - -or:: - - legend( (line1, line2, line3), ('label1', 'label2', 'label3'), loc=2) - -The location codes are - - =============== ============= - Location String Location Code - =============== ============= - 'best' 0 - 'upper right' 1 - 'upper left' 2 - 'lower left' 3 - 'lower right' 4 - 'right' 5 - 'center left' 6 - 'center right' 7 - 'lower center' 8 - 'upper center' 9 - 'center' 10 - =============== ============= - - -Users can specify any arbitrary location for the legend using the -*bbox_to_anchor* keyword argument. bbox_to_anchor can be an instance -of BboxBase(or its derivatives) or a tuple of 2 or 4 floats. -For example, :: - - loc = 'upper right', bbox_to_anchor = (0.5, 0.5) - -will place the legend so that the upper right corner of the legend at -the center of the axes. - -The legend location can be specified in other coordinate, by using the -*bbox_transform* keyword. - -The loc itslef can be a 2-tuple giving x,y of the lower-left corner of -the legend in axes coords (*bbox_to_anchor* is ignored). - - -Keyword arguments: - - *isaxes*: [ True | False ] - Indicates that this is an axes legend - - *prop*: [ None | FontProperties | dict ] - A :class:`matplotlib.font_manager.FontProperties` - instance. If *prop* is a dictionary, a new instance will be - created with *prop*. If *None*, use rc settings. - - *numpoints*: integer - The number of points in the legend for line - - *scatterpoints*: integer - The number of points in the legend for scatter plot - - *scatteroffsets*: list of floats - a list of yoffsets for scatter symbols in legend - - *markerscale*: [ None | scalar ] - The relative size of legend markers vs. original. If *None*, use rc - settings. - - *fancybox*: [ None | False | True ] - if True, draw a frame with a round fancybox. If None, use rc - - *shadow*: [ None | False | True ] - If *True*, draw a shadow behind legend. If *None*, use rc settings. - - *ncol* : integer - number of columns. default is 1 - - *mode* : [ "expand" | None ] - if mode is "expand", the legend will be horizontally expanded - to fill the axes area (or *bbox_to_anchor*) - - *bbox_to_anchor* : an instance of BboxBase or a tuple of 2 or 4 floats - the bbox that the legend will be anchored. - - *bbox_transform* : [ an instance of Transform | None ] - the transform for the bbox. transAxes if None. - - *title* : string - the legend title - -Padding and spacing between various elements use following keywords -parameters. The dimensions of these values are given as a fraction -of the fontsize. Values from rcParams will be used if None. - -================ ================================================================== -Keyword Description -================ ================================================================== -borderpad the fractional whitespace inside the legend border -labelspacing the vertical space between the legend entries -handlelength the length of the legend handles -handletextpad the pad between the legend handle and text -borderaxespad the pad between the axes and legend border -columnspacing the spacing between columns -================ ================================================================== - - -**Example:** - -.. plot:: mpl_examples/api/legend_demo.py - -Also see :ref:`plotting-guide-legend`. - -""" ret = gca().legend(*args, **kwargs) draw_if_interactive() return ret +if Axes.legend.__doc__ is not None: + legend.__doc__ = dedent(Axes.legend.__doc__) # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def table(**kwargs): - """call signature:: - - table(cellText=None, cellColours=None, - cellLoc='right', colWidths=None, - rowLabels=None, rowColours=None, rowLoc='left', - colLabels=None, colColours=None, colLoc='center', - loc='bottom', bbox=None): - -Add a table to the current axes. Returns a -:class:`matplotlib.table.Table` instance. For finer grained -control over tables, use the :class:`~matplotlib.table.Table` -class and add it to the axes with -:meth:`~matplotlib.axes.Axes.add_table`. - -Thanks to John Gill for providing the class and table. - -kwargs control the :class:`~matplotlib.table.Table` -properties: - - alpha: float (0.0 transparent through 1.0 opaque) - animated: [True | False] - axes: an :class:`~matplotlib.axes.Axes` instance - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - contains: a callable function - figure: a :class:`matplotlib.figure.Figure` instance - fontsize: a float in points - gid: an id string - label: any string - lod: [True | False] - picker: [None|float|boolean|callable] - rasterized: [True | False | None] - snap: unknown - transform: :class:`~matplotlib.transforms.Transform` instance - url: a url string - visible: [True | False] - zorder: any number """ ret = gca().table(**kwargs) draw_if_interactive() return ret +if Axes.table.__doc__ is not None: + table.__doc__ = dedent(Axes.table.__doc__) # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def text(x, y, s, fontdict=None, withdash=False, **kwargs): - """call signature:: - - text(x, y, s, fontdict=None, **kwargs) - -Add text in string *s* to axis at location *x*, *y*, data -coordinates. - -Keyword arguments: - - *fontdict*: - A dictionary to override the default text properties. - If *fontdict* is *None*, the defaults are determined by your rc - parameters. - - *withdash*: [ False | True ] - Creates a :class:`~matplotlib.text.TextWithDash` instance - instead of a :class:`~matplotlib.text.Text` instance. - -Individual keyword arguments can be used to override any given -parameter:: - - text(x, y, s, fontsize=12) - -The default transform specifies that text is in data coords, -alternatively, you can specify text in axis coords (0,0 is -lower-left and 1,1 is upper-right). The example below places -text in the center of the axes:: - - text(0.5, 0.5,'matplotlib', - horizontalalignment='center', - verticalalignment='center', - transform = ax.transAxes) - -You can put a rectangular box around the text instance (eg. to -set a background color) by using the keyword *bbox*. *bbox* is -a dictionary of :class:`matplotlib.patches.Rectangle` -properties. For example:: - - text(x, y, s, bbox=dict(facecolor='red', alpha=0.5)) - -Valid kwargs are :class:`matplotlib.text.Text` properties: - - alpha: float (0.0 transparent through 1.0 opaque) - animated: [True | False] - axes: an :class:`~matplotlib.axes.Axes` instance - backgroundcolor: any matplotlib color - bbox: rectangle prop dict - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - color: any matplotlib color - contains: a callable function - family or fontfamily or fontname or name: [ FONTNAME | 'serif' | 'sans-serif' | 'cursive' | 'fantasy' | 'monospace' ] - figure: a :class:`matplotlib.figure.Figure` instance - fontproperties or font_properties: a :class:`matplotlib.font_manager.FontProperties` instance - gid: an id string - horizontalalignment or ha: [ 'center' | 'right' | 'left' ] - label: any string - linespacing: float (multiple of font size) - lod: [True | False] - multialignment: ['left' | 'right' | 'center' ] - picker: [None|float|boolean|callable] - position: (x,y) - rasterized: [True | False | None] - rotation: [ angle in degrees | 'vertical' | 'horizontal' ] - rotation_mode: unknown - size or fontsize: [ size in points | 'xx-small' | 'x-small' | 'small' | 'medium' | 'large' | 'x-large' | 'xx-large' ] - snap: unknown - stretch or fontstretch: [ a numeric value in range 0-1000 | 'ultra-condensed' | 'extra-condensed' | 'condensed' | 'semi-condensed' | 'normal' | 'semi-expanded' | 'expanded' | 'extra-expanded' | 'ultra-expanded' ] - style or fontstyle: [ 'normal' | 'italic' | 'oblique'] - text: string or anything printable with '%s' conversion. - transform: :class:`~matplotlib.transforms.Transform` instance - url: a url string - variant or fontvariant: [ 'normal' | 'small-caps' ] - verticalalignment or va or ma: [ 'center' | 'top' | 'bottom' | 'baseline' ] - visible: [True | False] - weight or fontweight: [ a numeric value in range 0-1000 | 'ultralight' | 'light' | 'normal' | 'regular' | 'book' | 'medium' | 'roman' | 'semibold' | 'demibold' | 'demi' | 'bold' | 'heavy' | 'extra bold' | 'black' ] - x: float - y: float - zorder: any number """ ret = gca().text(x, y, s, fontdict, withdash, **kwargs) draw_if_interactive() return ret +if Axes.text.__doc__ is not None: + text.__doc__ = dedent(Axes.text.__doc__) # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost def annotate(*args, **kwargs): - """call signature:: - - annotate(s, xy, xytext=None, xycoords='data', - textcoords='data', arrowprops=None, **kwargs) - -Keyword arguments: - -Annotate the *x*, *y* point *xy* with text *s* at *x*, *y* -location *xytext*. (If *xytext* = *None*, defaults to *xy*, -and if *textcoords* = *None*, defaults to *xycoords*). - -*arrowprops*, if not *None*, is a dictionary of line properties -(see :class:`matplotlib.lines.Line2D`) for the arrow that connects -annotation to the point. - -If the dictionary has a key *arrowstyle*, a FancyArrowPatch -instance is created with the given dictionary and is -drawn. Otherwise, a YAArow patch instance is created and -drawn. Valid keys for YAArow are - - -========= ============================================================= -Key Description -========= ============================================================= -width the width of the arrow in points -frac the fraction of the arrow length occupied by the head -headwidth the width of the base of the arrow head in points -shrink oftentimes it is convenient to have the arrowtip - and base a bit away from the text and point being - annotated. If *d* is the distance between the text and - annotated point, shrink will shorten the arrow so the tip - and base are shink percent of the distance *d* away from the - endpoints. ie, ``shrink=0.05 is 5%`` -? any key for :class:`matplotlib.patches.polygon` -========= ============================================================= - - -Valid keys for FancyArrowPatch are - - -=============== ====================================================== -Key Description -=============== ====================================================== -arrowstyle the arrow style -connectionstyle the connection style -relpos default is (0.5, 0.5) -patchA default is bounding box of the text -patchB default is None -shrinkA default is 2 points -shrinkB default is 2 points -mutation_scale default is text size (in points) -mutation_aspect default is 1. -? any key for :class:`matplotlib.patches.PathPatch` -=============== ====================================================== - - -*xycoords* and *textcoords* are strings that indicate the -coordinates of *xy* and *xytext*. - -================= =================================================== -Property Description -================= =================================================== -'figure points' points from the lower left corner of the figure -'figure pixels' pixels from the lower left corner of the figure -'figure fraction' 0,0 is lower left of figure and 1,1 is upper, right -'axes points' points from lower left corner of axes -'axes pixels' pixels from lower left corner of axes -'axes fraction' 0,1 is lower left of axes and 1,1 is upper right -'data' use the coordinate system of the object being - annotated (default) -'offset points' Specify an offset (in points) from the *xy* value - -'polar' you can specify *theta*, *r* for the annotation, - even in cartesian plots. Note that if you - are using a polar axes, you do not need - to specify polar for the coordinate - system since that is the native "data" coordinate - system. -================= =================================================== - -If a 'points' or 'pixels' option is specified, values will be -added to the bottom-left and if negative, values will be -subtracted from the top-right. Eg:: - - # 10 points to the right of the left border of the axes and - # 5 points below the top border - xy=(10,-5), xycoords='axes points' - -Additional kwargs are Text properties: - - alpha: float (0.0 transparent through 1.0 opaque) - animated: [True | False] - axes: an :class:`~matplotlib.axes.Axes` instance - backgroundcolor: any matplotlib color - bbox: rectangle prop dict - clip_box: a :class:`matplotlib.transforms.Bbox` instance - clip_on: [True | False] - clip_path: [ (:class:`~matplotlib.path.Path`, :class:`~matplotlib.transforms.Transform`) | :class:`~matplotlib.patches.Patch` | None ] - color: any matplotlib color - contains: a callable function - family or fontfamily or fontname or name: [ FONTNAME | 'serif' | 'sans-serif' | 'cursive' | 'fantasy' | 'monospace' ] - figure: a :class:`matplotlib.figure.Figure` instance - fontproperties or font_properties: a :class:`matplotlib.font_manager.FontProperties` instance - gid: an id string - horizontalalignment or ha: [ 'center' | 'right' | 'left' ] - label: any string - linespacing: float (multiple of font size) - lod: [True | False] - multialignment: ['left' | 'right' | 'center' ] - picker: [None|float|boolean|callable] - position: (x,y) - rasterized: [True | False | None] - rotation: [ angle in degrees | 'vertical' | 'horizontal' ] - rotation_mode: unknown - size or fontsize: [ size in points | 'xx-small' | 'x-small' | 'small' | 'medium' | 'large' | 'x-large' | 'xx-large' ] - snap: unknown - stretch or fontstretch: [ a numeric value in range 0-1000 | 'ultra-condensed' | 'extra-condensed' | 'condensed' | 'semi-condensed' | 'normal' | 'semi-expanded' | 'expanded' | 'extra-expanded' | 'ultra-expanded' ] - style or fontstyle: [ 'normal' | 'italic' | 'oblique'] - text: string or anything printable with '%s' conversion. - transform: :class:`~matplotlib.transforms.Transform` instance - url: a url string - variant or fontvariant: [ 'normal' | 'small-caps' ] - verticalalignment or va or ma: [ 'center' | 'top' | 'bottom' | 'baseline' ] - visible: [True | False] - weight or fontweight: [ a numeric value in range 0-1000 | 'ultralight' | 'light' | 'normal' | 'regular' | 'book' | 'medium' | 'roman' | 'semibold' | 'demibold' | 'demi' | 'bold' | 'heavy' | 'extra bold' | 'black' ] - x: float - y: float - zorder: any number - -.. plot:: mpl_examples/pylab_examples/annotation_demo2.py""" ret = gca().annotate(*args, **kwargs) draw_if_interactive() return ret +if Axes.annotate.__doc__ is not None: + annotate.__doc__ = dedent(Axes.annotate.__doc__) # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost From b91865c99762c02cec7cee30ecc800cd48322710 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Tue, 4 Aug 2009 06:52:24 +0000 Subject: [PATCH 0004/1000] Add PathCollection; reorganize collections.py PathCollection is added to support complex paths in contourf. Other changes are to improve readability and reduce redundancy. svn path=/trunk/matplotlib/; revision=7340 --- lib/matplotlib/collections.py | 304 ++++++++++++++++++---------------- 1 file changed, 161 insertions(+), 143 deletions(-) diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index c813541d27e0..ba08d986f8d2 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -5,15 +5,15 @@ The classes are not meant to be as flexible as their single element counterparts (e.g. you may not be able to select all line styles) but -they are meant to be fast for common use cases (e.g. a bunch of solid +they are meant to be fast for common use cases (e.g. a large set of solid line segemnts) """ -import copy, math, warnings +import warnings import numpy as np -from numpy import ma +import numpy.ma as ma import matplotlib as mpl import matplotlib.cbook as cbook -import matplotlib.colors as _colors # avoid conflict with kwarg +import matplotlib.colors as mcolors import matplotlib.cm as cm import matplotlib.transforms as transforms import matplotlib.artist as artist @@ -106,6 +106,7 @@ def __init__(self, self._pickradius = pickradius self.update(kwargs) + self._paths = None def _get_value(self, val): @@ -131,6 +132,9 @@ def _get_bool(self, val): def get_paths(self): + return self._paths + + def set_paths(self): raise NotImplementedError def get_transforms(self): @@ -385,7 +389,7 @@ def set_facecolor(self, c): pass if c is None: c = mpl.rcParams['patch.facecolor'] self._facecolors_original = c - self._facecolors = _colors.colorConverter.to_rgba_array(c, self._alpha) + self._facecolors = mcolors.colorConverter.to_rgba_array(c, self._alpha) def set_facecolors(self, c): """alias for set_facecolor""" @@ -427,7 +431,7 @@ def set_edgecolor(self, c): else: if c is None: c = mpl.rcParams['patch.edgecolor'] self._edgecolors_original = c - self._edgecolors = _colors.colorConverter.to_rgba_array(c, self._alpha) + self._edgecolors = mcolors.colorConverter.to_rgba_array(c, self._alpha) def set_edgecolors(self, c): @@ -446,13 +450,13 @@ def set_alpha(self, alpha): else: artist.Artist.set_alpha(self, alpha) try: - self._facecolors = _colors.colorConverter.to_rgba_array( + self._facecolors = mcolors.colorConverter.to_rgba_array( self._facecolors_original, self._alpha) except (AttributeError, TypeError, IndexError): pass try: if self._edgecolors_original != 'face': - self._edgecolors = _colors.colorConverter.to_rgba_array( + self._edgecolors = mcolors.colorConverter.to_rgba_array( self._edgecolors_original, self._alpha) except (AttributeError, TypeError, IndexError): pass @@ -516,132 +520,26 @@ def update_from(self, other): setting, in sequence form. """ -class QuadMesh(Collection): +class PathCollection(Collection): """ - Class for the efficient drawing of a quadrilateral mesh. - - A quadrilateral mesh consists of a grid of vertices. The - dimensions of this array are (*meshWidth* + 1, *meshHeight* + - 1). Each vertex in the mesh has a different set of "mesh - coordinates" representing its position in the topology of the - mesh. For any values (*m*, *n*) such that 0 <= *m* <= *meshWidth* - and 0 <= *n* <= *meshHeight*, the vertices at mesh coordinates - (*m*, *n*), (*m*, *n* + 1), (*m* + 1, *n* + 1), and (*m* + 1, *n*) - form one of the quadrilaterals in the mesh. There are thus - (*meshWidth* * *meshHeight*) quadrilaterals in the mesh. The mesh - need not be regular and the polygons need not be convex. - - A quadrilateral mesh is represented by a (2 x ((*meshWidth* + 1) * - (*meshHeight* + 1))) numpy array *coordinates*, where each row is - the *x* and *y* coordinates of one of the vertices. To define the - function that maps from a data point to its corresponding color, - use the :meth:`set_cmap` method. Each of these arrays is indexed in - row-major order by the mesh coordinates of the vertex (or the mesh - coordinates of the lower left vertex, in the case of the - colors). - - For example, the first entry in *coordinates* is the - coordinates of the vertex at mesh coordinates (0, 0), then the one - at (0, 1), then at (0, 2) .. (0, meshWidth), (1, 0), (1, 1), and - so on. + This is the most basic :class:`Collection` subclass. """ - def __init__(self, meshWidth, meshHeight, coordinates, showedges, antialiased=True): - Collection.__init__(self) - self._meshWidth = meshWidth - self._meshHeight = meshHeight - self._coordinates = coordinates - self._showedges = showedges - self._antialiased = antialiased - - self._paths = None - - self._bbox = transforms.Bbox.unit() - self._bbox.update_from_data_xy(coordinates.reshape( - ((meshWidth + 1) * (meshHeight + 1), 2))) - - # By converting to floats now, we can avoid that on every draw. - self._coordinates = self._coordinates.reshape((meshHeight + 1, meshWidth + 1, 2)) - self._coordinates = np.array(self._coordinates, np.float_) - - def get_paths(self, dataTrans=None): - if self._paths is None: - self._paths = self.convert_mesh_to_paths( - self._meshWidth, self._meshHeight, self._coordinates) - return self._paths - - @staticmethod - def convert_mesh_to_paths(meshWidth, meshHeight, coordinates): + def __init__(self, paths, **kwargs): """ - Converts a given mesh into a sequence of - :class:`matplotlib.path.Path` objects for easier rendering by - backends that do not directly support quadmeshes. + *paths* is a sequence of :class:`matplotlib.path.Path` + instances. - This function is primarily of use to backend implementers. + %(Collection)s """ - Path = mpath.Path - - if ma.isMaskedArray(coordinates): - c = coordinates.data - else: - c = coordinates - - points = np.concatenate(( - c[0:-1, 0:-1], - c[0:-1, 1: ], - c[1: , 1: ], - c[1: , 0:-1], - c[0:-1, 0:-1] - ), axis=2) - points = points.reshape((meshWidth * meshHeight, 5, 2)) - return [Path(x) for x in points] - def get_datalim(self, transData): - return self._bbox - - @allow_rasterization - def draw(self, renderer): - if not self.get_visible(): return - renderer.open_group(self.__class__.__name__) - transform = self.get_transform() - transOffset = self._transOffset - offsets = self._offsets - - if self.have_units(): - if len(self._offsets): - xs = self.convert_xunits(self._offsets[:0]) - ys = self.convert_yunits(self._offsets[:1]) - offsets = zip(xs, ys) - - offsets = np.asarray(offsets, np.float_) - - if self.check_update('array'): - self.update_scalarmappable() - - clippath, clippath_trans = self.get_transformed_clip_path_and_affine() - if clippath_trans is not None: - clippath_trans = clippath_trans.frozen() + Collection.__init__(self, **kwargs) + self.set_paths(paths) + __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd - if not transform.is_affine: - coordinates = self._coordinates.reshape( - (self._coordinates.shape[0] * - self._coordinates.shape[1], - 2)) - coordinates = transform.transform(coordinates) - coordinates = coordinates.reshape(self._coordinates.shape) - transform = transforms.IdentityTransform() - else: - coordinates = self._coordinates - if not transOffset.is_affine: - offsets = transOffset.transform_non_affine(offsets) - transOffset = transOffset.get_affine() + def set_paths(self, paths): + self._paths = paths - renderer.draw_quad_mesh( - transform.frozen(), self.clipbox, clippath, clippath_trans, - self._meshWidth, self._meshHeight, coordinates, - offsets, transOffset, self.get_facecolor(), self._antialiased, - self._showedges) - renderer.close_group(self.__class__.__name__) class PolyCollection(Collection): def __init__(self, verts, sizes = None, closed = True, **kwargs): @@ -687,8 +585,7 @@ def set_verts(self, verts, closed=True): else: self._paths = [mpath.Path(xy) for xy in verts] - def get_paths(self): - return self._paths + set_paths = set_verts def draw(self, renderer): if self._sizes is not None: @@ -797,9 +694,6 @@ def draw(self, renderer): for x in self._sizes] return Collection.draw(self, renderer) - def get_paths(self): - return self._paths - def get_numsides(self): return self._numsides @@ -907,7 +801,7 @@ def __init__(self, segments, # Can be None. if antialiaseds is None: antialiaseds = (mpl.rcParams['lines.antialiased'],) self.set_linestyles(linestyles) - colors = _colors.colorConverter.to_rgba_array(colors) + colors = mcolors.colorConverter.to_rgba_array(colors) Collection.__init__( self, @@ -925,9 +819,6 @@ def __init__(self, segments, # Can be None. self.set_segments(segments) - def get_paths(self): - return self._paths - def set_segments(self, segments): if segments is None: return _segments = [] @@ -940,6 +831,7 @@ def set_segments(self, segments): self._paths = [mpath.Path(seg) for seg in _segments] set_verts = set_segments # for compatibility with PolyCollection + set_paths = set_segments def _add_offsets(self, segs): offsets = self._uniform_offsets @@ -963,7 +855,7 @@ def set_color(self, c): ACCEPTS: matplotlib color arg or sequence of rgba tuples """ - self._edgecolors = _colors.colorConverter.to_rgba_array(c) + self._edgecolors = mcolors.colorConverter.to_rgba_array(c) def color(self, c): """ @@ -1011,8 +903,6 @@ def draw(self, renderer): for x in self._sizes] return Collection.draw(self, renderer) - def get_paths(self): - return self._paths class EllipseCollection(Collection): """ @@ -1095,9 +985,6 @@ def draw(self, renderer): self.set_transforms() return Collection.draw(self, renderer) - def get_paths(self): - return self._paths - class PatchCollection(Collection): """ A generic collection of patches. @@ -1152,17 +1039,148 @@ def determine_facecolor(patch): else: Collection.__init__(self, **kwargs) - paths = [p.get_transform().transform_path(p.get_path()) - for p in patches] + self.set_paths(patches) + def set_paths(self, patches): + paths = [p.get_transform().transform_path(p.get_path()) + for p in patches] self._paths = paths + +class QuadMesh(Collection): + """ + Class for the efficient drawing of a quadrilateral mesh. + + A quadrilateral mesh consists of a grid of vertices. The + dimensions of this array are (*meshWidth* + 1, *meshHeight* + + 1). Each vertex in the mesh has a different set of "mesh + coordinates" representing its position in the topology of the + mesh. For any values (*m*, *n*) such that 0 <= *m* <= *meshWidth* + and 0 <= *n* <= *meshHeight*, the vertices at mesh coordinates + (*m*, *n*), (*m*, *n* + 1), (*m* + 1, *n* + 1), and (*m* + 1, *n*) + form one of the quadrilaterals in the mesh. There are thus + (*meshWidth* * *meshHeight*) quadrilaterals in the mesh. The mesh + need not be regular and the polygons need not be convex. + + A quadrilateral mesh is represented by a (2 x ((*meshWidth* + 1) * + (*meshHeight* + 1))) numpy array *coordinates*, where each row is + the *x* and *y* coordinates of one of the vertices. To define the + function that maps from a data point to its corresponding color, + use the :meth:`set_cmap` method. Each of these arrays is indexed in + row-major order by the mesh coordinates of the vertex (or the mesh + coordinates of the lower left vertex, in the case of the + colors). + + For example, the first entry in *coordinates* is the + coordinates of the vertex at mesh coordinates (0, 0), then the one + at (0, 1), then at (0, 2) .. (0, meshWidth), (1, 0), (1, 1), and + so on. + """ + def __init__(self, meshWidth, meshHeight, coordinates, showedges, antialiased=True): + Collection.__init__(self) + self._meshWidth = meshWidth + self._meshHeight = meshHeight + self._coordinates = coordinates + self._showedges = showedges + self._antialiased = antialiased + + self._bbox = transforms.Bbox.unit() + self._bbox.update_from_data_xy(coordinates.reshape( + ((meshWidth + 1) * (meshHeight + 1), 2))) + + # By converting to floats now, we can avoid that on every draw. + self._coordinates = self._coordinates.reshape((meshHeight + 1, meshWidth + 1, 2)) + self._coordinates = np.array(self._coordinates, np.float_) + def get_paths(self): + if self._paths is None: + self.set_paths() return self._paths + def set_paths(self): + self._paths = self.convert_mesh_to_paths( + self._meshWidth, self._meshHeight, self._coordinates) + + @staticmethod + def convert_mesh_to_paths(meshWidth, meshHeight, coordinates): + """ + Converts a given mesh into a sequence of + :class:`matplotlib.path.Path` objects for easier rendering by + backends that do not directly support quadmeshes. + + This function is primarily of use to backend implementers. + """ + Path = mpath.Path + + if ma.isMaskedArray(coordinates): + c = coordinates.data + else: + c = coordinates + + points = np.concatenate(( + c[0:-1, 0:-1], + c[0:-1, 1: ], + c[1: , 1: ], + c[1: , 0:-1], + c[0:-1, 0:-1] + ), axis=2) + points = points.reshape((meshWidth * meshHeight, 5, 2)) + return [Path(x) for x in points] + + def get_datalim(self, transData): + return self._bbox + + @allow_rasterization + def draw(self, renderer): + if not self.get_visible(): return + renderer.open_group(self.__class__.__name__) + transform = self.get_transform() + transOffset = self._transOffset + offsets = self._offsets + + if self.have_units(): + if len(self._offsets): + xs = self.convert_xunits(self._offsets[:0]) + ys = self.convert_yunits(self._offsets[:1]) + offsets = zip(xs, ys) + + offsets = np.asarray(offsets, np.float_) + + if self.check_update('array'): + self.update_scalarmappable() + + clippath, clippath_trans = self.get_transformed_clip_path_and_affine() + if clippath_trans is not None: + clippath_trans = clippath_trans.frozen() + + if not transform.is_affine: + coordinates = self._coordinates.reshape( + (self._coordinates.shape[0] * + self._coordinates.shape[1], + 2)) + coordinates = transform.transform(coordinates) + coordinates = coordinates.reshape(self._coordinates.shape) + transform = transforms.IdentityTransform() + else: + coordinates = self._coordinates + + if not transOffset.is_affine: + offsets = transOffset.transform_non_affine(offsets) + transOffset = transOffset.get_affine() + + renderer.draw_quad_mesh( + transform.frozen(), self.clipbox, clippath, clippath_trans, + self._meshWidth, self._meshHeight, coordinates, + offsets, transOffset, self.get_facecolor(), self._antialiased, + self._showedges) + renderer.close_group(self.__class__.__name__) + + + artist.kwdocd['Collection'] = patchstr = artist.kwdoc(Collection) -for k in ('QuadMesh', 'PolyCollection', 'BrokenBarHCollection', 'RegularPolyCollection', +for k in ('QuadMesh', 'PolyCollection', 'BrokenBarHCollection', + 'RegularPolyCollection', 'PathCollection', 'StarPolygonCollection', 'PatchCollection', 'CircleCollection'): artist.kwdocd[k] = patchstr artist.kwdocd['LineCollection'] = artist.kwdoc(LineCollection) From 3115976bac3423183d90563335bd7cb2c7399089 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Tue, 4 Aug 2009 07:01:43 +0000 Subject: [PATCH 0005/1000] contourf uses complex paths instead of simple paths with cuts svn path=/trunk/matplotlib/; revision=7341 --- CHANGELOG | 3 + lib/matplotlib/contour.py | 36 ++++++++-- src/cntr.c | 142 +++++++++++++++++++++----------------- 3 files changed, 112 insertions(+), 69 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 4122a56b5cad..c47ba849ca7c 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2009-08-03 Add PathCollection; modify contourf to use complex + paths instead of simple paths with cuts. - EF + 2009-08-03 Fixed boilerplate.py so it doesn't break the ReST docs. - JKS ====================================================================== diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index fa167bc2601c..a9617e5158eb 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -8,7 +8,7 @@ import numpy as np from numpy import ma import matplotlib._cntr as _cntr -import matplotlib.path as path +import matplotlib.path as mpath import matplotlib.ticker as ticker import matplotlib.cm as cm import matplotlib.colors as colors @@ -499,7 +499,7 @@ def labels(self, inline, inline_spacing): if inline: for n in new: # Add path if not empty or single point - if len(n)>1: additions.append( path.Path(n) ) + if len(n)>1: additions.append( mpath.Path(n) ) else: # If not adding label, keep old path additions.append(linepath) @@ -579,6 +579,8 @@ def __init__(self, ax, *args, **kwargs): self.collections = cbook.silent_list('collections.PolyCollection') else: self.collections = cbook.silent_list('collections.LineCollection') + self.segs = [] + self.kinds = [] # label lists must be initialized here self.labelTexts = [] self.labelCValues = [] @@ -601,13 +603,21 @@ def __init__(self, ax, *args, **kwargs): for level, level_upper in zip(lowers, uppers): nlist = C.trace(level, level_upper, points = 0, nchunk = self.nchunk) - col = collections.PolyCollection(nlist, + nseg = len(nlist)//2 + segs = nlist[:nseg] + kinds = nlist[nseg:] + + + paths = self._make_paths(segs, kinds) + + col = collections.PathCollection(paths, antialiaseds = (self.antialiased,), edgecolors= 'none', alpha=self.alpha) self.ax.add_collection(col) self.collections.append(col) - + self.segs.append(segs) + self.kinds.append(kinds) else: tlinewidths = self._process_linewidths() self.tlinewidths = tlinewidths @@ -615,7 +625,10 @@ def __init__(self, ax, *args, **kwargs): C = _cntr.Cntr(x, y, z.filled(), _mask) for level, width, lstyle in zip(self.levels, tlinewidths, tlinestyles): nlist = C.trace(level, points = 0) - col = collections.LineCollection(nlist, + nseg = len(nlist)//2 + segs = nlist[:nseg] + kinds = nlist[nseg:] + col = collections.LineCollection(segs, linewidths = width, linestyle = lstyle, alpha=self.alpha) @@ -623,6 +636,8 @@ def __init__(self, ax, *args, **kwargs): col.set_label('_nolegend_') self.ax.add_collection(col, False) self.collections.append(col) + self.segs.append(segs) + self.kinds.append(kinds) self.changed() # set the colors x0 = ma.minimum(x) x1 = ma.maximum(x) @@ -631,6 +646,17 @@ def __init__(self, ax, *args, **kwargs): self.ax.update_datalim([(x0,y0), (x1,y1)]) self.ax.autoscale_view() + @staticmethod + def _make_paths(segs, kinds): + paths = [] + for seg, kind in zip(segs, kinds): + codes = np.zeros(kind.shape, dtype=mpath.Path.code_type) + codes.fill(mpath.Path.LINETO) + codes[0] = mpath.Path.MOVETO + codes[kinds >= _cntr._slitkind] = mpath.Path.MOVETO + paths.append(mpath.Path(seg, codes)) + return paths + def changed(self): tcolors = [ (tuple(rgba),) for rgba in self.to_rgba(self.cvalues, alpha=self.alpha)] diff --git a/src/cntr.c b/src/cntr.c index 3a9d637163a6..e515a353fc72 100644 --- a/src/cntr.c +++ b/src/cntr.c @@ -199,6 +199,7 @@ struct Csite /* making the actual marks requires a bunch of other stuff */ const double *x, *y, *z; /* mesh coordinates and function values */ double *xcp, *ycp; /* output contour points */ + short *kcp; /* kind of contour point */ }; void print_Csite(Csite *Csite) @@ -268,6 +269,9 @@ void print_Csite(Csite *Csite) #define START_MARK(left) \ ((left)>0?((left)>1?J1_START:I1_START):((left)<-1?J0_START:I0_START)) +enum {kind_zone, kind_edge1, kind_edge2, + kind_slit_up, kind_slit_down, kind_start_slit=16} point_kinds; + /* ------------------------------------------------------------------------ */ /* these actually mark points */ @@ -317,6 +321,7 @@ zone_crosser (Csite * site, int level, int pass2) double zlevel = pass2 ? site->zlevel[level] : 0.0; double *xcp = pass2 ? site->xcp : 0; double *ycp = pass2 ? site->ycp : 0; + short *kcp = pass2 ? site->kcp : 0; int z0, z1, z2, z3; int keep_left = 0; /* flag to try to minimize curvature in saddles */ @@ -338,6 +343,7 @@ zone_crosser (Csite * site, int level, int pass2) double zcp = (zlevel - z[p0]) / (z[p1] - z[p0]); xcp[n] = zcp * (x[p1] - x[p0]) + x[p0]; ycp[n] = zcp * (y[p1] - y[p0]) + y[p0]; + kcp[n] = kind_zone; } if (!done && !jedge) { @@ -487,7 +493,15 @@ zone_crosser (Csite * site, int level, int pass2) site->edge = edge; site->n = n; site->left = left; - return done > 4 ? slit_cutter (site, done - 5, pass2) : done; + if (done <= 4) + { + return done; + } + if (pass2 && n > 0) + { + kcp[n-1] += kind_start_slit; + } + return slit_cutter (site, done - 5, pass2); } /* edge_walker assumes that the current edge is being drawn CCW @@ -513,11 +527,13 @@ edge_walker (Csite * site, int pass2) long left0 = site->left0; int level0 = site->level0 == 2; int marked; + int n_kind = 0; const double *x = pass2 ? site->x : 0; const double *y = pass2 ? site->y : 0; double *xcp = pass2 ? site->xcp : 0; double *ycp = pass2 ? site->ycp : 0; + short *kcp = pass2 ? site->kcp : 0; int z0, z1, heads_up = 0; @@ -528,6 +544,7 @@ edge_walker (Csite * site, int pass2) z0 = data[p0] & Z_VALUE; z1 = data[p1] & Z_VALUE; marked = 0; + n_kind = 0; if (z0 == 1) { /* mark current boundary point */ @@ -535,6 +552,8 @@ edge_walker (Csite * site, int pass2) { xcp[n] = x[p0]; ycp[n] = y[p0]; + kcp[n] = kind_edge1; + n_kind = n; } marked = 1; } @@ -549,6 +568,8 @@ edge_walker (Csite * site, int pass2) zcp = (zcp - site->z[p0]) / (site->z[p1] - site->z[p0]); xcp[n] = zcp * (x[p1] - x[p0]) + x[p0]; ycp[n] = zcp * (y[p1] - y[p0]) + y[p0]; + kcp[n] = kind_edge2; + n_kind = n; } marked = 1; } @@ -562,7 +583,10 @@ edge_walker (Csite * site, int pass2) site->n = n + marked; /* if the curve is closing on a hole, need to make a downslit */ if (fwd < 0 && !(data[edge] & (jedge ? J_BNDY : I_BNDY))) + { + if (n_kind) kcp[n_kind] += kind_start_slit; return slit_cutter (site, 0, pass2); + } return 3; } else if (pass2) @@ -572,6 +596,7 @@ edge_walker (Csite * site, int pass2) site->edge = edge; site->left = left; site->n = n + marked; + if (n_kind) kcp[n_kind] += kind_start_slit; return slit_cutter (site, heads_up, pass2); } } @@ -649,6 +674,7 @@ slit_cutter (Csite * site, int up, int pass2) const double *y = pass2 ? site->y : 0; double *xcp = pass2 ? site->xcp : 0; double *ycp = pass2 ? site->ycp : 0; + short *kcp = pass2 ? site->kcp : 0; if (up) { @@ -677,6 +703,7 @@ slit_cutter (Csite * site, int up, int pass2) } xcp[n] = x[p1]; ycp[n] = y[p1]; + kcp[n] = kind_slit_up; n++; p1 += imax; } @@ -733,6 +760,7 @@ slit_cutter (Csite * site, int up, int pass2) { xcp[n] = x[p0]; ycp[n] = y[p0]; + kcp[n] = kind_slit_down; n++; } else @@ -1230,6 +1258,7 @@ cntr_new(void) site->triangle = NULL; site->xcp = NULL; site->ycp = NULL; + site->kcp = NULL; site->x = NULL; site->y = NULL; site->z = NULL; @@ -1279,6 +1308,7 @@ cntr_init(Csite *site, long iMax, long jMax, double *x, double *y, site->z = z; site->xcp = NULL; site->ycp = NULL; + site->kcp = NULL; return 0; } @@ -1291,11 +1321,12 @@ void cntr_del(Csite *site) site = NULL; } -/* Build a list of lists of points, where each point is an (x,y) +/* Build a list of lists of points, where each point is an (x,y,k) tuple. */ static PyObject * -build_cntr_list_p(long *np, double *xp, double *yp, int nparts, long ntotal) +build_cntr_list_p(long *np, double *xp, double *yp, short *kp, + int nparts, long ntotal) { PyObject *point, *contourList, *all_contours; int start = 0, end = 0; @@ -1310,7 +1341,7 @@ build_cntr_list_p(long *np, double *xp, double *yp, int nparts, long ntotal) contourList = PyList_New(np[i]); for (k = 0, j = start; j < end; j++, k++) { - point = Py_BuildValue("(dd)", xp[j], yp[j]); + point = Py_BuildValue("(ddh)", xp[j], yp[j], kp[j]); if (PyList_SetItem(contourList, k, point)) goto error; } if (PyList_SetItem(all_contours, i, contourList)) goto error; @@ -1323,73 +1354,43 @@ build_cntr_list_p(long *np, double *xp, double *yp, int nparts, long ntotal) } -#if 0 -/* the following function is not used, so it produces a warning - * commented it out NN - 070630 */ - -/* Build a list of tuples (X, Y), where X and Y are 1-D arrays. */ -static PyObject * -build_cntr_list_v(long *np, double *xp, double *yp, int nparts, long ntotal) -{ - PyObject *point, *all_contours; - PyArrayObject *xv, *yv; - npy_intp dims[1]; - int i; - long j, k; - - all_contours = PyList_New(nparts); - - k = 0; - for (i = 0; i < nparts; i++) - { - dims[0] = np[i]; - xv = (PyArrayObject *) PyArray_SimpleNew(1, dims, PyArray_DOUBLE); - yv = (PyArrayObject *) PyArray_SimpleNew(1, dims, PyArray_DOUBLE); - if (xv == NULL || yv == NULL) goto error; - for (j = 0; j < dims[0]; j++) - { - ((double *)xv->data)[j] = xp[k]; - ((double *)yv->data)[j] = yp[k]; - k++; - } - point = Py_BuildValue("(NN)", xv, yv); - /* "O" increments ref count; "N" does not. */ - if (PyList_SetItem(all_contours, i, point)) goto error; - } - return all_contours; - - error: - Py_XDECREF(all_contours); - return NULL; -} -#endif - -/* Build a list of XY 2-D arrays, shape (N,2) */ +/* Build a list of XY 2-D arrays, shape (N,2), to which a list of K arrays + is concatenated concatenated. */ static PyObject * -build_cntr_list_v2(long *np, double *xp, double *yp, int nparts, long ntotal) +build_cntr_list_v2(long *np, double *xp, double *yp, short *kp, + int nparts, long ntotal) { PyObject *all_contours; PyArrayObject *xyv; + PyArrayObject *kv; npy_intp dims[2]; + npy_intp kdims[1]; int i; long j, k; - all_contours = PyList_New(nparts); + all_contours = PyList_New(nparts*2); k = 0; for (i = 0; i < nparts; i++) { dims[0] = np[i]; dims[1] = 2; + kdims[0] = np[i]; xyv = (PyArrayObject *) PyArray_SimpleNew(2, dims, PyArray_DOUBLE); if (xyv == NULL) goto error; + kv = (PyArrayObject *) PyArray_SimpleNew(1, kdims, PyArray_SHORT); + if (kv == NULL) goto error; + for (j = 0; j < dims[0]; j++) { ((double *)xyv->data)[2*j] = xp[k]; ((double *)xyv->data)[2*j+1] = yp[k]; + ((short *)kv->data)[j] = kp[k]; k++; } if (PyList_SetItem(all_contours, i, (PyObject *)xyv)) goto error; + if (PyList_SetItem(all_contours, nparts+i, + (PyObject *)kv)) goto error; } return all_contours; @@ -1413,6 +1414,7 @@ cntr_trace(Csite *site, double levels[], int nlevels, int points, long nchunk) PyObject *c_list = NULL; double *xp0; double *yp0; + short *kp0; long *nseg0; int iseg; @@ -1451,12 +1453,14 @@ cntr_trace(Csite *site, double levels[], int nlevels, int points, long nchunk) } xp0 = (double *) PyMem_Malloc(ntotal * sizeof(double)); yp0 = (double *) PyMem_Malloc(ntotal * sizeof(double)); + kp0 = (short *) PyMem_Malloc(ntotal * sizeof(short)); nseg0 = (long *) PyMem_Malloc(nparts * sizeof(long)); - if (xp0 == NULL || yp0 == NULL || nseg0 == NULL) goto error; + if (xp0 == NULL || yp0 == NULL || kp0 == NULL || nseg0 == NULL) goto error; /* second pass */ site->xcp = xp0; site->ycp = yp0; + site->kcp = kp0; iseg = 0; for (;;iseg++) { @@ -1475,6 +1479,7 @@ cntr_trace(Csite *site, double levels[], int nlevels, int points, long nchunk) nseg0[iseg] = n; site->xcp += n; site->ycp += n; + site->kcp += n; ntotal2 += n; nparts2++; } @@ -1487,21 +1492,31 @@ cntr_trace(Csite *site, double levels[], int nlevels, int points, long nchunk) } - if (points) + if (points) /* It is False when called; we don't need the point version */ { - c_list = build_cntr_list_p(nseg0, xp0, yp0, nparts, ntotal); + c_list = build_cntr_list_p(nseg0, xp0, yp0, kp0, nparts, ntotal); } else { - c_list = build_cntr_list_v2(nseg0, xp0, yp0, nparts, ntotal); + c_list = build_cntr_list_v2(nseg0, xp0, yp0, kp0, nparts, ntotal); } - PyMem_Free(xp0); PyMem_Free(yp0); PyMem_Free(nseg0); - site->xcp = NULL; site->ycp = NULL; + PyMem_Free(xp0); + PyMem_Free(yp0); + PyMem_Free(kp0); + PyMem_Free(nseg0); + site->xcp = NULL; + site->ycp = NULL; + site->kcp = NULL; return c_list; error: - PyMem_Free(xp0); PyMem_Free(yp0); PyMem_Free(nseg0); - site->xcp = NULL; site->ycp = NULL; + PyMem_Free(xp0); + PyMem_Free(yp0); + PyMem_Free(kp0); + PyMem_Free(nseg0); + site->xcp = NULL; + site->ycp = NULL; + site->kcp = NULL; Py_XDECREF(c_list); return NULL; } @@ -1603,16 +1618,14 @@ Cntr_init(Cntr *self, PyObject *args, PyObject *kwds) } xpa = (PyArrayObject *) PyArray_ContiguousFromObject(xarg, - PyArray_DOUBLE, 2, 2); + PyArray_DOUBLE, 2, 2); ypa = (PyArrayObject *) PyArray_ContiguousFromObject(yarg, - PyArray_DOUBLE, - 2, 2); - zpa = (PyArrayObject *) PyArray_ContiguousFromObject(zarg, PyArray_DOUBLE, - 2, 2); + PyArray_DOUBLE, 2, 2); + zpa = (PyArrayObject *) PyArray_ContiguousFromObject(zarg, + PyArray_DOUBLE, 2, 2); if (marg) mpa = (PyArrayObject *) PyArray_ContiguousFromObject(marg, - PyArray_SBYTE, - 2, 2); + PyArray_SBYTE, 2, 2); else mpa = NULL; @@ -1751,7 +1764,8 @@ init_cntr(void) if (m == NULL) return; - + PyModule_AddIntConstant(m, "_slitkind", (long)kind_slit_up ); + /* We can add all the point_kinds values later if we need them. */ import_array(); Py_INCREF(&CntrType); PyModule_AddObject(m, "Cntr", (PyObject *)&CntrType); From 303359024332c76df90e067553fa634d5c4fb5c8 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Tue, 4 Aug 2009 07:13:37 +0000 Subject: [PATCH 0006/1000] Remove unneeded function and argument from contouring internals svn path=/trunk/matplotlib/; revision=7342 --- lib/matplotlib/contour.py | 5 ++-- src/cntr.c | 52 +++++---------------------------------- 2 files changed, 8 insertions(+), 49 deletions(-) diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index a9617e5158eb..928003c22cf4 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -601,8 +601,7 @@ def __init__(self, ax, *args, **kwargs): lowers = self._levels[:-1] uppers = self._levels[1:] for level, level_upper in zip(lowers, uppers): - nlist = C.trace(level, level_upper, points = 0, - nchunk = self.nchunk) + nlist = C.trace(level, level_upper, nchunk = self.nchunk) nseg = len(nlist)//2 segs = nlist[:nseg] kinds = nlist[nseg:] @@ -624,7 +623,7 @@ def __init__(self, ax, *args, **kwargs): tlinestyles = self._process_linestyles() C = _cntr.Cntr(x, y, z.filled(), _mask) for level, width, lstyle in zip(self.levels, tlinewidths, tlinestyles): - nlist = C.trace(level, points = 0) + nlist = C.trace(level) nseg = len(nlist)//2 segs = nlist[:nseg] kinds = nlist[nseg:] diff --git a/src/cntr.c b/src/cntr.c index e515a353fc72..f88cfd321788 100644 --- a/src/cntr.c +++ b/src/cntr.c @@ -1321,38 +1321,6 @@ void cntr_del(Csite *site) site = NULL; } -/* Build a list of lists of points, where each point is an (x,y,k) - tuple. -*/ -static PyObject * -build_cntr_list_p(long *np, double *xp, double *yp, short *kp, - int nparts, long ntotal) -{ - PyObject *point, *contourList, *all_contours; - int start = 0, end = 0; - int i, j, k; - - all_contours = PyList_New(nparts); - - for (i = 0; i < nparts; i++) - { - start = end; - end += np[i]; - contourList = PyList_New(np[i]); - for (k = 0, j = start; j < end; j++, k++) - { - point = Py_BuildValue("(ddh)", xp[j], yp[j], kp[j]); - if (PyList_SetItem(contourList, k, point)) goto error; - } - if (PyList_SetItem(all_contours, i, contourList)) goto error; - } - return all_contours; - - error: - Py_XDECREF(all_contours); - return NULL; -} - /* Build a list of XY 2-D arrays, shape (N,2), to which a list of K arrays is concatenated concatenated. */ @@ -1409,7 +1377,7 @@ build_cntr_list_v2(long *np, double *xp, double *yp, short *kp, */ PyObject * -cntr_trace(Csite *site, double levels[], int nlevels, int points, long nchunk) +cntr_trace(Csite *site, double levels[], int nlevels, long nchunk) { PyObject *c_list = NULL; double *xp0; @@ -1491,15 +1459,8 @@ cntr_trace(Csite *site, double levels[], int nlevels, int points, long nchunk) } } + c_list = build_cntr_list_v2(nseg0, xp0, yp0, kp0, nparts, ntotal); - if (points) /* It is False when called; we don't need the point version */ - { - c_list = build_cntr_list_p(nseg0, xp0, yp0, kp0, nparts, ntotal); - } - else - { - c_list = build_cntr_list_v2(nseg0, xp0, yp0, kp0, nparts, ntotal); - } PyMem_Free(xp0); PyMem_Free(yp0); PyMem_Free(kp0); @@ -1676,18 +1637,17 @@ Cntr_trace(Cntr *self, PyObject *args, PyObject *kwds) { double levels[2] = {0.0, -1e100}; int nlevels = 2; - int points = 0; long nchunk = 0L; - static char *kwlist[] = {"level0", "level1", "points", "nchunk", NULL}; + static char *kwlist[] = {"level0", "level1", "nchunk", NULL}; - if (! PyArg_ParseTupleAndKeywords(args, kwds, "d|dil", kwlist, - levels, levels+1, &points, &nchunk)) + if (! PyArg_ParseTupleAndKeywords(args, kwds, "d|dl", kwlist, + levels, levels+1, &nchunk)) { return NULL; } if (levels[1] == -1e100 || levels[1] <= levels[0]) nlevels = 1; - return cntr_trace(self->site, levels, nlevels, points, nchunk); + return cntr_trace(self->site, levels, nlevels, nchunk); } static PyMethodDef Cntr_methods[] = { From fe55936f3ebc3d5378369ed25965aa92f028ca1f Mon Sep 17 00:00:00 2001 From: John Hunter Date: Tue, 4 Aug 2009 13:15:14 +0000 Subject: [PATCH 0007/1000] get data example svn path=/trunk/matplotlib/; revision=7345 --- CHANGELOG | 5 +++ examples/misc/mpl_data_demo.py | 12 ++++++ examples/pylab_examples/scatter_demo2.py | 2 +- lib/matplotlib/__init__.py | 1 + lib/matplotlib/cbook.py | 51 ++++++++++++++++++++++++ 5 files changed, 70 insertions(+), 1 deletion(-) create mode 100644 examples/misc/mpl_data_demo.py diff --git a/CHANGELOG b/CHANGELOG index c47ba849ca7c..5ff7d301a460 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,8 +1,13 @@ + 2009-08-03 Add PathCollection; modify contourf to use complex paths instead of simple paths with cuts. - EF 2009-08-03 Fixed boilerplate.py so it doesn't break the ReST docs. - JKS +2009-07-31 Added cbook.get_mpl_data for urllib enabled fetching and + cacheing of data needed for examples. See + examples/misc/mpl_data_demo.py - JDH + ====================================================================== 2009-07-31 Tagging 0.99.0.rc1 at 7314 - MGD diff --git a/examples/misc/mpl_data_demo.py b/examples/misc/mpl_data_demo.py new file mode 100644 index 000000000000..93125742a2db --- /dev/null +++ b/examples/misc/mpl_data_demo.py @@ -0,0 +1,12 @@ + """ + Grab mpl data from the ~/.matplotlib/mpl_data cache if it exists, else + fetch it from svn and cache it + """ +import matplotlib.cbook as cbook +import matplotlib.pyplot as plt +fname = cbook.get_mpl_data('lena.png', asfileobj=False) + +print 'fname', fname +im = plt.imread(fname) +plt.imshow(im) +plt.show() diff --git a/examples/pylab_examples/scatter_demo2.py b/examples/pylab_examples/scatter_demo2.py index 70e520020bb3..44ddb8ea1fe6 100644 --- a/examples/pylab_examples/scatter_demo2.py +++ b/examples/pylab_examples/scatter_demo2.py @@ -1,7 +1,7 @@ """ make a scatter plot with varying color and size arguments """ -import matplotlib +import matplotlib import numpy as np import matplotlib.pyplot as plt import matplotlib.mlab as mlab diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index a6cf454e4ac6..14a94952bee4 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -487,6 +487,7 @@ def _get_data_path_cached(): always=False) + def get_example_data(fname): """ return a filehandle to one of the example files in mpl-data/example diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index 30e4e3ca29af..3b6eef9dac32 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -10,6 +10,8 @@ import numpy.ma as ma from weakref import ref +import matplotlib + major, minor1, minor2, s, tmp = sys.version_info @@ -338,6 +340,55 @@ def to_filehandle(fname, flag='rU', return_opened=False): def is_scalar_or_string(val): return is_string_like(val) or not iterable(val) + + +def get_mpl_data(fname, asfileobj=True): + """ + Check the cachedirectory ~/.matplotlib/mpl_data for an mpl_data + file. If it does not exist, fetch it with urllib from the mpl svn repo + + http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/mpl_data/ + + and store it in the cachedir. + + If asfileobj is True, a file object will be returned. Else the + path to the file as a string will be returned + + To add a datafile to this directory, you need to check out + mpl_data from matplotlib svn:: + + svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/mpl_data + + and svn add the data file you want to support. This is primarily + intended for use in mpl examples that need custom data + """ + + # TODO: how to handle stale data in the cache that has been + # updated from svn -- is there a clean http way to get the current + # revision number that will not leave us at the mercy of html + # changes at sf? + + + configdir = matplotlib.get_configdir() + cachedir = os.path.join(configdir, 'mpl_data') + if not os.path.exists(cachedir): + os.mkdir(cachedir) + + cachefile = os.path.join(cachedir, fname) + + if not os.path.exists(cachefile): + import urllib + url = 'http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/mpl_data/%s'%urllib.quote(fname) + matplotlib.verbose.report('Attempting to download %s to %s'%(url, cachefile)) + urllib.urlretrieve(url, filename=cachefile) + else: + matplotlib.verbose.report('Aleady have mpl_data %s'%fname) + + if asfileobj: + return to_filehandle(cachefile) + else: + return cachefile + def flatten(seq, scalarp=is_scalar_or_string): """ this generator flattens nested containers such as From 5f8b3fd67e262f9ea244ca289fb2c4ca40f39693 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Tue, 4 Aug 2009 16:48:04 +0000 Subject: [PATCH 0008/1000] enabled legend picking svn path=/trunk/matplotlib/; revision=7347 --- examples/event_handling/legend_picking.py | 36 +++++++++++++++++++++++ lib/matplotlib/legend.py | 19 +++++++++--- 2 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 examples/event_handling/legend_picking.py diff --git a/examples/event_handling/legend_picking.py b/examples/event_handling/legend_picking.py new file mode 100644 index 000000000000..1fb70b263876 --- /dev/null +++ b/examples/event_handling/legend_picking.py @@ -0,0 +1,36 @@ +""" +Enable picking on the legend to toggle the legended line on and off +""" +import numpy as np +import matplotlib.pyplot as plt + +t = np.arange(0.0, 0.2, 0.1) +y1 = 2*np.sin(2*np.pi*t) +y2 = 4*np.sin(2*np.pi*2*t) + +fig = plt.figure() +ax = fig.add_subplot(111) + +line1, = ax.plot(t, y1, lw=2, color='red', label='1 hz') +line2, = ax.plot(t, y2, lw=2, color='blue', label='2 hz') + +leg = ax.legend(loc='upper left', fancybox=True, shadow=True) +leg.get_frame().set_alpha(0.4) + + +lines = [line1, line2] +lined = dict() +for legline, realine in zip(leg.get_lines(), lines): + legline.set_picker(5) # 5 pts tolerance + lined[legline] = realine + +def onpick(event): + legline = event.artist + realline = lined[legline] + vis = realline.get_visible() + realline.set_visible(not vis) + fig.canvas.draw() + +fig.canvas.mpl_connect('pick_event', onpick) + +plt.show() diff --git a/lib/matplotlib/legend.py b/lib/matplotlib/legend.py index a50f7da7cfab..64764c7acfa9 100644 --- a/lib/matplotlib/legend.py +++ b/lib/matplotlib/legend.py @@ -177,6 +177,10 @@ def __init__(self, parent, handles, labels, propnames=['numpoints', 'markerscale', 'shadow', "columnspacing", "scatterpoints"] + self.texts = [] + self.legendHandles = [] + self._legend_title_box = None + localdict = locals() for name in propnames: @@ -240,6 +244,7 @@ def __init__(self, parent, handles, labels, if isinstance(parent,Axes): self.isaxes = True + self.set_axes(parent) self.set_figure(parent.figure) elif isinstance(parent,Figure): self.isaxes = False @@ -313,10 +318,8 @@ def _set_artist_props(self, a): set the boilerplate props for artists added to axes """ a.set_figure(self.figure) - - for c in self.get_children(): - c.set_figure(self.figure) - + if self.isaxes: + a.set_axes(self.axes) a.set_transform(self.get_transform()) @@ -432,6 +435,7 @@ def _init_legend_box(self, handles, labels): textbox = TextArea(l, textprops=label_prop, multilinebaseline=True, minimumdescent=True) text_list.append(textbox._text) + labelboxes.append(textbox) handleboxes = [] @@ -688,6 +692,13 @@ def get_children(self): children = [] if self._legend_box: children.append(self._legend_box) + children.extend(self.get_lines()) + children.extend(self.get_patches()) + children.extend(self.get_texts()) + children.append(self.get_frame()) + + if self._legend_title_box: + children.append(self.get_title()) return children def get_frame(self): From ffb1d239a419fd3825b33b9b97503c13026041cb Mon Sep 17 00:00:00 2001 From: John Hunter Date: Tue, 4 Aug 2009 17:18:03 +0000 Subject: [PATCH 0009/1000] clean up legend picking example svn path=/trunk/matplotlib/; revision=7348 --- examples/event_handling/legend_picking.py | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) diff --git a/examples/event_handling/legend_picking.py b/examples/event_handling/legend_picking.py index 1fb70b263876..36476345d9fb 100644 --- a/examples/event_handling/legend_picking.py +++ b/examples/event_handling/legend_picking.py @@ -10,25 +10,29 @@ fig = plt.figure() ax = fig.add_subplot(111) - -line1, = ax.plot(t, y1, lw=2, color='red', label='1 hz') -line2, = ax.plot(t, y2, lw=2, color='blue', label='2 hz') - +ax.set_title('Click on legend line to toggle line on/off') +line1, = ax.plot(t, y1, lw=2, color='red', label='1 HZ') +line2, = ax.plot(t, y2, lw=2, color='blue', label='2 HZ') leg = ax.legend(loc='upper left', fancybox=True, shadow=True) leg.get_frame().set_alpha(0.4) +# we will set up a dict mapping legend line to orig line, and enable +# picking on the legend line lines = [line1, line2] lined = dict() -for legline, realine in zip(leg.get_lines(), lines): +for legline, origline in zip(leg.get_lines(), lines): legline.set_picker(5) # 5 pts tolerance - lined[legline] = realine + lined[legline] = origline + def onpick(event): + # on the pick event, find the orig line corresponding to the + # legend proxy line, and toggle the visibilit legline = event.artist - realline = lined[legline] - vis = realline.get_visible() - realline.set_visible(not vis) + origline = lined[legline] + vis = origline.get_visible() + origline.set_visible(not vis) fig.canvas.draw() fig.canvas.mpl_connect('pick_event', onpick) From 1175eb057bb348c1f64a283b4e6446b6903bdfa6 Mon Sep 17 00:00:00 2001 From: Ryan May Date: Tue, 4 Aug 2009 17:59:44 +0000 Subject: [PATCH 0010/1000] Tweak legend_picking.py demo to change alpha of lines in legend. svn path=/trunk/matplotlib/; revision=7349 --- examples/event_handling/legend_picking.py | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/examples/event_handling/legend_picking.py b/examples/event_handling/legend_picking.py index 36476345d9fb..e4cc54cac0b0 100644 --- a/examples/event_handling/legend_picking.py +++ b/examples/event_handling/legend_picking.py @@ -33,6 +33,12 @@ def onpick(event): origline = lined[legline] vis = origline.get_visible() origline.set_visible(not vis) + # Change the alpha on the line in the legend so we can see what lines + # have been toggled + if not vis: + legline.set_alpha(1.0) + else: + legline.set_alpha(0.2) fig.canvas.draw() fig.canvas.mpl_connect('pick_event', onpick) From 274f872dd391a7d02b103203ba50cdf5d32b1630 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Tue, 4 Aug 2009 18:09:38 +0000 Subject: [PATCH 0011/1000] Fix typo in recent change to contour.py. (There are still bugs to be found in the change to cntr.c.) svn path=/trunk/matplotlib/; revision=7350 --- lib/matplotlib/contour.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index 928003c22cf4..604c322e9ac7 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -652,7 +652,7 @@ def _make_paths(segs, kinds): codes = np.zeros(kind.shape, dtype=mpath.Path.code_type) codes.fill(mpath.Path.LINETO) codes[0] = mpath.Path.MOVETO - codes[kinds >= _cntr._slitkind] = mpath.Path.MOVETO + codes[kind >= _cntr._slitkind] = mpath.Path.MOVETO paths.append(mpath.Path(seg, codes)) return paths From 9ab08da68ebabf69bef998114aa23da4e5e3c2d0 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Tue, 4 Aug 2009 18:21:59 +0000 Subject: [PATCH 0012/1000] minor tweak to legend picking example svn path=/trunk/matplotlib/; revision=7351 --- examples/event_handling/legend_picking.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/event_handling/legend_picking.py b/examples/event_handling/legend_picking.py index e4cc54cac0b0..c48879def1b8 100644 --- a/examples/event_handling/legend_picking.py +++ b/examples/event_handling/legend_picking.py @@ -31,11 +31,11 @@ def onpick(event): # legend proxy line, and toggle the visibilit legline = event.artist origline = lined[legline] - vis = origline.get_visible() - origline.set_visible(not vis) + vis = not origline.get_visible() + origline.set_visible(vis) # Change the alpha on the line in the legend so we can see what lines # have been toggled - if not vis: + if vis: legline.set_alpha(1.0) else: legline.set_alpha(0.2) From 0e99d22ae6eaf052c90057c361ff5ed82ebc1eb2 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Tue, 4 Aug 2009 18:40:10 +0000 Subject: [PATCH 0013/1000] Disable contourf slit line removal until problems are fixed. svn path=/trunk/matplotlib/; revision=7352 --- lib/matplotlib/contour.py | 3 ++- src/cntr.c | 7 +++++-- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index 604c322e9ac7..fd3b00915834 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -652,7 +652,8 @@ def _make_paths(segs, kinds): codes = np.zeros(kind.shape, dtype=mpath.Path.code_type) codes.fill(mpath.Path.LINETO) codes[0] = mpath.Path.MOVETO - codes[kind >= _cntr._slitkind] = mpath.Path.MOVETO + # Attempted slit removal is disabled until we get it right. + #codes[kind >= _cntr._slitkind] = mpath.Path.MOVETO paths.append(mpath.Path(seg, codes)) return paths diff --git a/src/cntr.c b/src/cntr.c index f88cfd321788..4f134d761c33 100644 --- a/src/cntr.c +++ b/src/cntr.c @@ -326,12 +326,14 @@ zone_crosser (Csite * site, int level, int pass2) int z0, z1, z2, z3; int keep_left = 0; /* flag to try to minimize curvature in saddles */ int done = 0; + int n_kind; if (level) level = 2; for (;;) { + n_kind = 0; /* set edge endpoints */ p0 = POINT0 (edge, fwd); p1 = POINT1 (edge, fwd); @@ -344,6 +346,7 @@ zone_crosser (Csite * site, int level, int pass2) xcp[n] = zcp * (x[p1] - x[p0]) + x[p0]; ycp[n] = zcp * (y[p1] - y[p0]) + y[p0]; kcp[n] = kind_zone; + n_kind = n; } if (!done && !jedge) { @@ -497,9 +500,9 @@ zone_crosser (Csite * site, int level, int pass2) { return done; } - if (pass2 && n > 0) + if (pass2 && n_kind) { - kcp[n-1] += kind_start_slit; + kcp[n_kind] += kind_start_slit; } return slit_cutter (site, done - 5, pass2); } From cf9960859e94bcca15e208bbcf5630d7ef3799fa Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Tue, 4 Aug 2009 19:35:13 +0000 Subject: [PATCH 0014/1000] Made cbook.get_mpl_data make use of the ETag and Last-Modified headers of mod_dav_svn. svn path=/trunk/matplotlib/; revision=7354 --- CHANGELOG | 2 + lib/matplotlib/cbook.py | 155 ++++++++++++++++++++++++++++++++++------ 2 files changed, 134 insertions(+), 23 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 5ff7d301a460..333bcf143e19 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +2009-08-04 Made cbook.get_mpl_data make use of the ETag and Last-Modified + headers of mod_dav_svn. - JKS 2009-08-03 Add PathCollection; modify contourf to use complex paths instead of simple paths with cuts. - EF diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index 3b6eef9dac32..6f0229737feb 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -9,6 +9,10 @@ import numpy as np import numpy.ma as ma from weakref import ref +import cPickle +import os.path +import random +import urllib2 import matplotlib @@ -340,7 +344,119 @@ def to_filehandle(fname, flag='rU', return_opened=False): def is_scalar_or_string(val): return is_string_like(val) or not iterable(val) +class _CacheProcessor(urllib2.BaseHandler): + """ + Urllib2 handler that takes care of caching files. + The file cache.pck holds the directory of files to be cached. + """ + def __init__(self, cache_dir): + self.cache_dir = cache_dir + self.read_cache() + self.remove_stale_files() + + def in_cache_dir(self, fn): + return os.path.join(self.cache_dir, fn) + + def read_cache(self): + """ + Read the cache file from the cache directory. + """ + fn = self.in_cache_dir('cache.pck') + if not os.path.exists(fn): + self.cache = {} + return + + f = open(fn, 'rb') + cache = cPickle.load(f) + f.close() + # If any files are deleted, drop them from the cache + for url, (fn, _, _) in cache.items(): + if not os.path.exists(self.in_cache_dir(fn)): + del cache[url] + + self.cache = cache + + def remove_stale_files(self): + """ + Remove files from the cache directory that are not listed in + cache.pck. + """ + listed = set([fn for (_, (fn, _, _)) in self.cache.items()]) + for path in os.listdir(self.cache_dir): + if path not in listed and path != 'cache.pck': + os.remove(os.path.join(self.cache_dir, path)) + + def write_cache(self): + """ + Write the cache data structure into the cache directory. + """ + fn = self.in_cache_dir('cache.pck') + f = open(fn, 'wb') + cPickle.dump(self.cache, f, -1) + f.close() + + def cache_file(self, url, data, headers): + """ + Store a received file in the cache directory. + """ + # Pick a filename + rightmost = url.rstrip('/').split('/')[-1] + fn = rightmost + while os.path.exists(self.in_cache_dir(fn)): + fn = rightmost + '.' + str(random.randint(0,9999999)) + + # Write out the data + f = open(self.in_cache_dir(fn), 'wb') + f.write(data) + f.close() + + # Update the cache + self.cache[url] = (fn, headers.get('ETag'), headers.get('Last-Modified')) + self.write_cache() + + # These urllib2 entry points are used: + # http_request for preprocessing requests + # http_error_304 for handling 304 Not Modified responses + # http_response for postprocessing requests + + def http_request(self, req): + """ + Make the request conditional if we have a cached file. + """ + url = req.get_full_url() + if url in self.cache: + _, etag, lastmod = self.cache[url] + req.add_header("If-None-Match", etag) + req.add_header("If-Modified-Since", lastmod) + return req + + def http_error_304(self, req, fp, code, msg, hdrs): + """ + Read the file from the cache since the server has no newer version. + """ + url = req.get_full_url() + fn, _, _ = self.cache[url] + file = open(self.in_cache_dir(fn), 'rb') + handle = urllib2.addinfourl(file, hdrs, url) + handle.code = 304 + return handle + + def http_response(self, req, response): + """ + Update the cache with the returned file. + """ + if response.code != 200: + return response + else: + data = response.read() + self.cache_file(req.get_full_url(), data, response.headers) + result = urllib2.addinfourl(StringIO.StringIO(data), + response.headers, + req.get_full_url()) + result.code = response.code + result.msg = response.msg + return result def get_mpl_data(fname, asfileobj=True): """ @@ -363,32 +479,25 @@ def get_mpl_data(fname, asfileobj=True): intended for use in mpl examples that need custom data """ - # TODO: how to handle stale data in the cache that has been - # updated from svn -- is there a clean http way to get the current - # revision number that will not leave us at the mercy of html - # changes at sf? - - - configdir = matplotlib.get_configdir() - cachedir = os.path.join(configdir, 'mpl_data') - if not os.path.exists(cachedir): - os.mkdir(cachedir) - - cachefile = os.path.join(cachedir, fname) - - if not os.path.exists(cachefile): - import urllib - url = 'http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/mpl_data/%s'%urllib.quote(fname) - matplotlib.verbose.report('Attempting to download %s to %s'%(url, cachefile)) - urllib.urlretrieve(url, filename=cachefile) - else: - matplotlib.verbose.report('Aleady have mpl_data %s'%fname) + if not hasattr(get_mpl_data, 'opener'): + configdir = matplotlib.get_configdir() + cachedir = os.path.join(configdir, 'mpl_data') + if not os.path.exists(cachedir): + os.mkdir(cachedir) + # Store the cache processor and url opener as attributes of this function + get_mpl_data.processor = _CacheProcessor(cachedir) + get_mpl_data.opener = urllib2.build_opener(get_mpl_data.processor) + url = 'http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/mpl_data/' + \ + urllib2.quote(fname) + response = get_mpl_data.opener.open(url) if asfileobj: - return to_filehandle(cachefile) + return response else: - return cachefile - + response.close() + p = get_mpl_data.processor + return p.in_cache_dir(p.cache[url][0]) + def flatten(seq, scalarp=is_scalar_or_string): """ this generator flattens nested containers such as From 47c1fd371bd5e10c8eab243c261268899b4b3ec5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Tue, 4 Aug 2009 19:51:08 +0000 Subject: [PATCH 0015/1000] =?UTF-8?q?Fix=20indentation=20error=20in=20mpl?= =?UTF-8?q?=5Fdata=5Fdemo.py=20-=20thanks=20to=20G=C3=B6khan=20Sever?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit svn path=/trunk/matplotlib/; revision=7355 --- examples/misc/mpl_data_demo.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/misc/mpl_data_demo.py b/examples/misc/mpl_data_demo.py index 93125742a2db..5594dcdba4ef 100644 --- a/examples/misc/mpl_data_demo.py +++ b/examples/misc/mpl_data_demo.py @@ -1,7 +1,7 @@ - """ - Grab mpl data from the ~/.matplotlib/mpl_data cache if it exists, else - fetch it from svn and cache it - """ +""" +Grab mpl data from the ~/.matplotlib/mpl_data cache if it exists, else +fetch it from svn and cache it +""" import matplotlib.cbook as cbook import matplotlib.pyplot as plt fname = cbook.get_mpl_data('lena.png', asfileobj=False) From dcc542b3589c2c93e9e7f3feeea1945c79c14082 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Wed, 5 Aug 2009 00:05:37 +0000 Subject: [PATCH 0016/1000] Elimination of contourf cut strokes: second try svn path=/trunk/matplotlib/; revision=7356 --- lib/matplotlib/contour.py | 7 ++++--- src/cntr.c | 31 ++++++++++++++++++++++++++++++- 2 files changed, 34 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index fd3b00915834..795acfc5b3db 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -606,7 +606,6 @@ def __init__(self, ax, *args, **kwargs): segs = nlist[:nseg] kinds = nlist[nseg:] - paths = self._make_paths(segs, kinds) col = collections.PathCollection(paths, @@ -652,8 +651,10 @@ def _make_paths(segs, kinds): codes = np.zeros(kind.shape, dtype=mpath.Path.code_type) codes.fill(mpath.Path.LINETO) codes[0] = mpath.Path.MOVETO - # Attempted slit removal is disabled until we get it right. - #codes[kind >= _cntr._slitkind] = mpath.Path.MOVETO + # points that begin a slit or are in it: + in_slit = kind[:-1] >= _cntr._slitkind + # use moveto for any point *following* such a point + codes[1:][in_slit] = mpath.Path.MOVETO paths.append(mpath.Path(seg, codes)) return paths diff --git a/src/cntr.c b/src/cntr.c index 4f134d761c33..87276135a8e5 100644 --- a/src/cntr.c +++ b/src/cntr.c @@ -1326,7 +1326,7 @@ void cntr_del(Csite *site) /* Build a list of XY 2-D arrays, shape (N,2), to which a list of K arrays - is concatenated concatenated. */ + is concatenated. */ static PyObject * build_cntr_list_v2(long *np, double *xp, double *yp, short *kp, int nparts, long ntotal) @@ -1653,6 +1653,29 @@ Cntr_trace(Cntr *self, PyObject *args, PyObject *kwds) return cntr_trace(self->site, levels, nlevels, nchunk); } +/* The following will not normally be called. It is experimental, + and intended for future debugging. It may go away at any time. +*/ +static PyObject * +Cntr_get_cdata(Cntr *self) +{ + PyArrayObject *Cdata; + npy_intp dims[2]; + int i, j; + int ni, nj; + + dims[0] = ni = self->site->imax; + dims[1] = nj = self->site->jmax; + + Cdata = (PyArrayObject *) PyArray_SimpleNew(2, dims, PyArray_SHORT); + for (j=0; jdata[j + i*nj] = self->site->data[i + j*ni]; + /* output is C-order, input is F-order */ + /* for now we are ignoring the last ni+1 values */ + return (PyObject *)Cdata; +} + static PyMethodDef Cntr_methods[] = { {"trace", (PyCFunction)Cntr_trace, METH_VARARGS | METH_KEYWORDS, "Return a list of contour line segments or polygons.\n\n" @@ -1665,6 +1688,12 @@ static PyMethodDef Cntr_methods[] = { " Optional argument: nchunk; approximate number of grid points\n" " per chunk. 0 (default) for no chunking.\n" }, + {"get_cdata", (PyCFunction)Cntr_get_cdata, METH_NOARGS, + "Returns a copy of the mesh array with contour calculation codes.\n\n" + "Experimental and incomplete; we are not returning quite all of\n" + "the array.\n" + "Don't call this unless you are exploring the dark recesses of cntr.c\n" + }, {0, 0, 0, 0} /* Sentinel */ }; From 0e9da872445fd708f98854ead02466879c7a4a7d Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Wed, 5 Aug 2009 00:11:42 +0000 Subject: [PATCH 0017/1000] Remove unused argument from data_init in cntr.c svn path=/trunk/matplotlib/; revision=7357 --- src/cntr.c | 14 ++++---------- 1 file changed, 4 insertions(+), 10 deletions(-) diff --git a/src/cntr.c b/src/cntr.c index 87276135a8e5..6bd21527a1e0 100644 --- a/src/cntr.c +++ b/src/cntr.c @@ -291,7 +291,7 @@ static int slit_cutter (Csite * site, int up, int pass2); static long curve_tracer (Csite * site, int pass2); /* this initializes the data array for curve_tracer */ -static void data_init (Csite * site, int region, long nchunk); +static void data_init (Csite * site, long nchunk); /* ------------------------------------------------------------------------ */ @@ -974,13 +974,8 @@ curve_tracer (Csite * site, int pass2) /* ------------------------------------------------------------------------ */ -/* The sole function of the "region" argument is to specify the - value in Csite.reg that denotes a missing zone. We always - use zero. -*/ - static void -data_init (Csite * site, int region, long nchunk) +data_init (Csite * site, long nchunk) { Cdata * data = site->data; long imax = site->imax; @@ -1050,8 +1045,7 @@ data_init (Csite * site, int region, long nchunk) data[ij + imax + 1] = 0; if (reg) { - if (region ? (reg[ij + imax + 1] == region) - : (reg[ij + imax + 1] != 0)) + if (reg[ij + imax + 1] != 0) data[ij + imax + 1] = ZONE_EX; } else @@ -1403,7 +1397,7 @@ cntr_trace(Csite *site, double levels[], int nlevels, long nchunk) site->zlevel[1] = levels[1]; } site->n = site->count = 0; - data_init (site, 0, nchunk); + data_init (site, nchunk); /* make first pass to compute required sizes for second pass */ for (;;) From d0268e43f537aad60129de28936da7ba66869d3b Mon Sep 17 00:00:00 2001 From: John Hunter Date: Wed, 5 Aug 2009 12:04:36 +0000 Subject: [PATCH 0018/1000] added a new mpl data example script to test svn commits on the data svn path=/trunk/matplotlib/; revision=7362 --- examples/misc/mpl_data_test.py | 13 +++++++++++++ lib/matplotlib/__init__.py | 2 +- lib/matplotlib/cbook.py | 12 ++++++------ 3 files changed, 20 insertions(+), 7 deletions(-) create mode 100644 examples/misc/mpl_data_test.py diff --git a/examples/misc/mpl_data_test.py b/examples/misc/mpl_data_test.py new file mode 100644 index 000000000000..1ae63887dd35 --- /dev/null +++ b/examples/misc/mpl_data_test.py @@ -0,0 +1,13 @@ +""" +Demonstrate how get_mpl_data works with svn revisions in the data. + + svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/mpl_data + +and edit testdata.csv to add a new row. After committing the changes, +when you rerun this script you will get the updated data (and the new +svn version will be cached in ~/.matplotlib/mpl_data) +""" + +import matplotlib.cbook as cbook +fh = cbook.get_mpl_data("testdata.csv") +print fh.read() diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index 14a94952bee4..2241c32eced3 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -89,7 +89,7 @@ """ from __future__ import generators -__version__ = '0.99.0.rc1' +__version__ = '1.0.svn' __revision__ = '$Revision$' __date__ = '$Date$' diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index 6f0229737feb..36d93a350232 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -356,7 +356,7 @@ def __init__(self, cache_dir): def in_cache_dir(self, fn): return os.path.join(self.cache_dir, fn) - + def read_cache(self): """ Read the cache file from the cache directory. @@ -386,7 +386,7 @@ def remove_stale_files(self): for path in os.listdir(self.cache_dir): if path not in listed and path != 'cache.pck': os.remove(os.path.join(self.cache_dir, path)) - + def write_cache(self): """ Write the cache data structure into the cache directory. @@ -419,7 +419,7 @@ def cache_file(self, url, data, headers): # http_request for preprocessing requests # http_error_304 for handling 304 Not Modified responses # http_response for postprocessing requests - + def http_request(self, req): """ Make the request conditional if we have a cached file. @@ -441,7 +441,7 @@ def http_error_304(self, req, fp, code, msg, hdrs): handle = urllib2.addinfourl(file, hdrs, url) handle.code = 304 return handle - + def http_response(self, req, response): """ Update the cache with the returned file. @@ -473,7 +473,7 @@ def get_mpl_data(fname, asfileobj=True): To add a datafile to this directory, you need to check out mpl_data from matplotlib svn:: - svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/mpl_data + svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/mpl_data and svn add the data file you want to support. This is primarily intended for use in mpl examples that need custom data @@ -497,7 +497,7 @@ def get_mpl_data(fname, asfileobj=True): response.close() p = get_mpl_data.processor return p.in_cache_dir(p.cache[url][0]) - + def flatten(seq, scalarp=is_scalar_or_string): """ this generator flattens nested containers such as From 057b4ca43a4224f58456d95af5e79d08b37790f2 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Wed, 5 Aug 2009 14:35:06 +0000 Subject: [PATCH 0019/1000] Merged revisions 7353,7358-7359 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7353 | jdh2358 | 2009-08-04 13:46:41 -0500 (Tue, 04 Aug 2009) | 1 line attach gtk events to mpl events -- fixes sf bug 2816580 ........ r7358 | jdh2358 | 2009-08-04 21:29:12 -0500 (Tue, 04 Aug 2009) | 1 line some fixes for osx builds on rc2 ........ r7359 | jdh2358 | 2009-08-05 06:06:13 -0500 (Wed, 05 Aug 2009) | 1 line remove dup gui event in enter/leave events in gtk ........ svn path=/trunk/matplotlib/; revision=7363 --- doc/_templates/indexsidebar.html | 2 +- lib/matplotlib/backends/backend_gtk.py | 12 ++++++------ release/osx/Makefile | 6 +++--- release/osx/README.txt | 20 +++++++++++++------- 4 files changed, 23 insertions(+), 17 deletions(-) diff --git a/doc/_templates/indexsidebar.html b/doc/_templates/indexsidebar.html index e7deeabbede7..5474897537c2 100644 --- a/doc/_templates/indexsidebar.html +++ b/doc/_templates/indexsidebar.html @@ -4,7 +4,7 @@

News

Please donate to support matplotlib development.

-

A release candidate rc1 of matplotlib-0.99.0 is available for testing. Please post any bugs to the tracker +

A release candidate rc2 of matplotlib-0.99.0 is available for testing. Please post any bugs to the tracker

Watch a video lecture about matplotlib presented at NIPS 08 Workshop Machine Learning Open Source Software. diff --git a/lib/matplotlib/backends/backend_gtk.py b/lib/matplotlib/backends/backend_gtk.py index 4dfcb08fc3eb..3beb86591321 100644 --- a/lib/matplotlib/backends/backend_gtk.py +++ b/lib/matplotlib/backends/backend_gtk.py @@ -197,7 +197,7 @@ def scroll_event(self, widget, event): step = 1 else: step = -1 - FigureCanvasBase.scroll_event(self, x, y, step) + FigureCanvasBase.scroll_event(self, x, y, step, guiEvent=event) return False # finish event propagation? def button_press_event(self, widget, event): @@ -205,7 +205,7 @@ def button_press_event(self, widget, event): x = event.x # flipy so y=0 is bottom of canvas y = self.allocation.height - event.y - FigureCanvasBase.button_press_event(self, x, y, event.button) + FigureCanvasBase.button_press_event(self, x, y, event.button, guiEvent=event) return False # finish event propagation? def button_release_event(self, widget, event): @@ -213,21 +213,21 @@ def button_release_event(self, widget, event): x = event.x # flipy so y=0 is bottom of canvas y = self.allocation.height - event.y - FigureCanvasBase.button_release_event(self, x, y, event.button) + FigureCanvasBase.button_release_event(self, x, y, event.button, guiEvent=event) return False # finish event propagation? def key_press_event(self, widget, event): if _debug: print 'FigureCanvasGTK.%s' % fn_name() key = self._get_key(event) if _debug: print "hit", key - FigureCanvasBase.key_press_event(self, key) + FigureCanvasBase.key_press_event(self, key, guiEvent=event) return False # finish event propagation? def key_release_event(self, widget, event): if _debug: print 'FigureCanvasGTK.%s' % fn_name() key = self._get_key(event) if _debug: print "release", key - FigureCanvasBase.key_release_event(self, key) + FigureCanvasBase.key_release_event(self, key, guiEvent=event) return False # finish event propagation? def motion_notify_event(self, widget, event): @@ -239,7 +239,7 @@ def motion_notify_event(self, widget, event): # flipy so y=0 is bottom of canvas y = self.allocation.height - y - FigureCanvasBase.motion_notify_event(self, x, y) + FigureCanvasBase.motion_notify_event(self, x, y, guiEvent=event) return False # finish event propagation? def leave_notify_event(self, widget, event): diff --git a/release/osx/Makefile b/release/osx/Makefile index 8032a181c814..99870f100559 100644 --- a/release/osx/Makefile +++ b/release/osx/Makefile @@ -1,10 +1,10 @@ -PYVERSION=2.6 +PYVERSION=2.5 PYTHON=python${PYVERSION} SRCDIR=${PWD} ZLIBVERSION=1.2.3 PNGVERSION=1.2.33 FREETYPEVERSION=2.3.7 -MPLVERSION=0.99.0.rc1 +MPLVERSION=0.99.0.rc2 BDISTMPKGVERSION=0.4.4 MPLSRC=matplotlib-${MPLVERSION} MACOSX_DEPLOYMENT_TARGET=10.4 @@ -88,7 +88,7 @@ installers: cp ../data/setup.cfg . &&\ export CFLAGS=${CFLAGS} &&\ export LDFLAGS=${LDFLAGS} &&\ - bdist_mpkg &&\ + /Library/Frameworks/Python.framework/Versions/${PYVERSION}/bin/bdist_mpkg &&\ ${PYTHON} setupegg.py bdist_egg &&\ cd dist && \ zip -ro matplotlib-${MPLVERSION}-py${PYVERSION}-macosx10.5_mpkg.zip matplotlib-${MPLVERSION}-py${PYVERSION}-macosx10.5.mpkg diff --git a/release/osx/README.txt b/release/osx/README.txt index 965e889511ff..fb64b724ae9b 100644 --- a/release/osx/README.txt +++ b/release/osx/README.txt @@ -7,7 +7,7 @@ Dir Contents ------------- * :file:`bdist_mkpg` - the distutils.extension to build Installer.app - mpkg installers. + mpkg installers. * :file:`data` - some config files and patches needed for the build @@ -19,15 +19,21 @@ Dir Contents How to build -------------- -* You need a python framework build , numpy and wxpython to build the +* You need a python framework build, numpy and wxpython to build the mpl installers (wx requires this and we need wx to build the wxagg - extension). You can get the three required dependencies as - Installer apps, eg: + extension). I recommend building python from src as a framework build:: + ./configure --enable-universalsdk --enable-framework + sudo make install - http://www.python.org/ftp/python/2.6.2/python-2.6.2-macosx2009-04-16.dmg - http://downloads.sourceforge.net/project/numpy/NumPy/1.3.0/numpy-1.3.0-py2.6-macosx10.5.dmg?use_mirror=voxel - http://downloads.sourceforge.net/project/wxpython/wxPython/2.8.10.1/wxPython2.8-osx-unicode-2.8.10.1-universal-py2.6.dmg?use_mirror=voxel + and build numpy from src too since the 2.5 numpy installer doesn't work + with a python built from src:: + + sudo python setup.py install + + you can use the pre-built installer for wx:: + + http://downloads.sourceforge.net/project/wxpython/wxPython/2.8.10.1/wxPython2.8-osx-unicode-2.8.10.1-universal-py2.6.dmg?use_mirror=voxel * You need to make sure to unset PKG_CONFIG_PATH to make sure the static linking below is respected. Otherwise the mpl build script From 32e05be229813b5e801d5b3b0f008c62a3e1fabb Mon Sep 17 00:00:00 2001 From: John Hunter Date: Wed, 5 Aug 2009 14:38:44 +0000 Subject: [PATCH 0020/1000] rename mpl_data to sample_data to avoid ambiguity with lib/matplotlib/mpl-data svn path=/trunk/matplotlib/; revision=7365 --- examples/misc/mpl_data_demo.py | 4 ++-- examples/misc/mpl_data_test.py | 8 ++++---- lib/matplotlib/cbook.py | 24 ++++++++++++------------ 3 files changed, 18 insertions(+), 18 deletions(-) diff --git a/examples/misc/mpl_data_demo.py b/examples/misc/mpl_data_demo.py index 5594dcdba4ef..eb34a92ceb4e 100644 --- a/examples/misc/mpl_data_demo.py +++ b/examples/misc/mpl_data_demo.py @@ -1,10 +1,10 @@ """ -Grab mpl data from the ~/.matplotlib/mpl_data cache if it exists, else +Grab mpl data from the ~/.matplotlib/sample_data cache if it exists, else fetch it from svn and cache it """ import matplotlib.cbook as cbook import matplotlib.pyplot as plt -fname = cbook.get_mpl_data('lena.png', asfileobj=False) +fname = cbook.get_sample_data('lena.png', asfileobj=False) print 'fname', fname im = plt.imread(fname) diff --git a/examples/misc/mpl_data_test.py b/examples/misc/mpl_data_test.py index 1ae63887dd35..572c8e7a52d0 100644 --- a/examples/misc/mpl_data_test.py +++ b/examples/misc/mpl_data_test.py @@ -1,13 +1,13 @@ """ -Demonstrate how get_mpl_data works with svn revisions in the data. +Demonstrate how get_sample_data works with svn revisions in the data. - svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/mpl_data + svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/sample_data and edit testdata.csv to add a new row. After committing the changes, when you rerun this script you will get the updated data (and the new -svn version will be cached in ~/.matplotlib/mpl_data) +svn version will be cached in ~/.matplotlib/sample_data) """ import matplotlib.cbook as cbook -fh = cbook.get_mpl_data("testdata.csv") +fh = cbook.get_sample_data("testdata.csv") print fh.read() diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index 36d93a350232..745409f8ff84 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -458,12 +458,12 @@ def http_response(self, req, response): result.msg = response.msg return result -def get_mpl_data(fname, asfileobj=True): +def get_sample_data(fname, asfileobj=True): """ - Check the cachedirectory ~/.matplotlib/mpl_data for an mpl_data + Check the cachedirectory ~/.matplotlib/sample_data for an sample_data file. If it does not exist, fetch it with urllib from the mpl svn repo - http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/mpl_data/ + http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/sample_data/ and store it in the cachedir. @@ -471,31 +471,31 @@ def get_mpl_data(fname, asfileobj=True): path to the file as a string will be returned To add a datafile to this directory, you need to check out - mpl_data from matplotlib svn:: + sample_data from matplotlib svn:: - svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/mpl_data + svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/sample_data and svn add the data file you want to support. This is primarily intended for use in mpl examples that need custom data """ - if not hasattr(get_mpl_data, 'opener'): + if not hasattr(get_sample_data, 'opener'): configdir = matplotlib.get_configdir() - cachedir = os.path.join(configdir, 'mpl_data') + cachedir = os.path.join(configdir, 'sample_data') if not os.path.exists(cachedir): os.mkdir(cachedir) # Store the cache processor and url opener as attributes of this function - get_mpl_data.processor = _CacheProcessor(cachedir) - get_mpl_data.opener = urllib2.build_opener(get_mpl_data.processor) + get_sample_data.processor = _CacheProcessor(cachedir) + get_sample_data.opener = urllib2.build_opener(get_sample_data.processor) - url = 'http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/mpl_data/' + \ + url = 'http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/sample_data/' + \ urllib2.quote(fname) - response = get_mpl_data.opener.open(url) + response = get_sample_data.opener.open(url) if asfileobj: return response else: response.close() - p = get_mpl_data.processor + p = get_sample_data.processor return p.in_cache_dir(p.cache[url][0]) def flatten(seq, scalarp=is_scalar_or_string): From 537e24759587598037a3f44046a5e7aac27a7d6d Mon Sep 17 00:00:00 2001 From: John Hunter Date: Wed, 5 Aug 2009 14:39:36 +0000 Subject: [PATCH 0021/1000] rename mpl_data to sample_data to avoid ambiguity with lib/matplotlib/mpl-data svn path=/trunk/matplotlib/; revision=7366 --- examples/misc/{mpl_data_demo.py => sample_data_demo.py} | 0 examples/misc/{mpl_data_test.py => sample_data_test.py} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename examples/misc/{mpl_data_demo.py => sample_data_demo.py} (100%) rename examples/misc/{mpl_data_test.py => sample_data_test.py} (100%) diff --git a/examples/misc/mpl_data_demo.py b/examples/misc/sample_data_demo.py similarity index 100% rename from examples/misc/mpl_data_demo.py rename to examples/misc/sample_data_demo.py diff --git a/examples/misc/mpl_data_test.py b/examples/misc/sample_data_test.py similarity index 100% rename from examples/misc/mpl_data_test.py rename to examples/misc/sample_data_test.py From 0868c8374ec7964c8786d05bf1d63b4f0fb27096 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Wed, 5 Aug 2009 14:44:18 +0000 Subject: [PATCH 0022/1000] make urllib quote python2.4 compliant svn path=/trunk/matplotlib/; revision=7367 --- lib/matplotlib/cbook.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index 745409f8ff84..e3197b2510f7 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -488,8 +488,16 @@ def get_sample_data(fname, asfileobj=True): get_sample_data.processor = _CacheProcessor(cachedir) get_sample_data.opener = urllib2.build_opener(get_sample_data.processor) + + # quote is not in python2.4, so check for it and get it from + # urllib if it is not available + quote = getattr(urllib2, 'quote', None) + if quote is None: + import urllib + quote = urllib.quote + url = 'http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/sample_data/' + \ - urllib2.quote(fname) + quote(fname) response = get_sample_data.opener.open(url) if asfileobj: return response From 12a7765695ba3b7dd34cc53fb0b0129c2488d7ab Mon Sep 17 00:00:00 2001 From: John Hunter Date: Wed, 5 Aug 2009 15:02:12 +0000 Subject: [PATCH 0023/1000] add support for nested dirs in sample_data svn path=/trunk/matplotlib/; revision=7369 --- examples/misc/sample_data_test.py | 2 +- lib/matplotlib/cbook.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/examples/misc/sample_data_test.py b/examples/misc/sample_data_test.py index 572c8e7a52d0..f5e9aab45473 100644 --- a/examples/misc/sample_data_test.py +++ b/examples/misc/sample_data_test.py @@ -9,5 +9,5 @@ """ import matplotlib.cbook as cbook -fh = cbook.get_sample_data("testdata.csv") +fh = cbook.get_sample_data('testdir/subdir/testsub.csv') print fh.read() diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index e3197b2510f7..561f23720c0d 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -349,8 +349,9 @@ class _CacheProcessor(urllib2.BaseHandler): Urllib2 handler that takes care of caching files. The file cache.pck holds the directory of files to be cached. """ - def __init__(self, cache_dir): + def __init__(self, cache_dir, baseurl): self.cache_dir = cache_dir + self.baseurl = baseurl self.read_cache() self.remove_stale_files() From 090842c6ec9a496ec643617c4a064f1b0c3c31a2 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Wed, 5 Aug 2009 15:07:41 +0000 Subject: [PATCH 0024/1000] add support for nested dirs in sample_data svn path=/trunk/matplotlib/; revision=7370 --- lib/matplotlib/cbook.py | 36 +++++++++++++++++++++++++----------- 1 file changed, 25 insertions(+), 11 deletions(-) diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index 561f23720c0d..3c35be1984b7 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -356,7 +356,13 @@ def __init__(self, cache_dir, baseurl): self.remove_stale_files() def in_cache_dir(self, fn): - return os.path.join(self.cache_dir, fn) + # make sure the datadir exists + reldir, filename = os.path.split(fn) + datadir = os.path.join(self.cache_dir, reldir) + if not os.path.exists(datadir): + os.makedirs(datadir) + + return os.path.join(datadir, filename) def read_cache(self): """ @@ -386,7 +392,11 @@ def remove_stale_files(self): listed = set([fn for (_, (fn, _, _)) in self.cache.items()]) for path in os.listdir(self.cache_dir): if path not in listed and path != 'cache.pck': - os.remove(os.path.join(self.cache_dir, path)) + thisfile = os.path.join(self.cache_dir, path) + if not os.path.isdir(thisfile): + matplotlib.verbose.report('_CacheProcessor:remove_stale_files: removing %s'%thisfile, + level='debug') + os.remove(thisfile) def write_cache(self): """ @@ -402,12 +412,14 @@ def cache_file(self, url, data, headers): Store a received file in the cache directory. """ # Pick a filename - rightmost = url.rstrip('/').split('/')[-1] - fn = rightmost - while os.path.exists(self.in_cache_dir(fn)): - fn = rightmost + '.' + str(random.randint(0,9999999)) + fn = url[len(self.baseurl):] + fullpath = self.in_cache_dir(fn) + + #while os.path.exists(self.in_cache_dir(fn)): + # fn = rightmost + '.' + str(random.randint(0,9999999)) - # Write out the data + + f = open(self.in_cache_dir(fn), 'wb') f.write(data) f.close() @@ -438,7 +450,9 @@ def http_error_304(self, req, fp, code, msg, hdrs): """ url = req.get_full_url() fn, _, _ = self.cache[url] - file = open(self.in_cache_dir(fn), 'rb') + cachefile = self.in_cache_dir(fn) + matplotlib.verbose.report('_CacheProcessor: reading data file from cache file "%s"'%cachefile) + file = open(cachefile, 'rb') handle = urllib2.addinfourl(file, hdrs, url) handle.code = 304 return handle @@ -480,13 +494,14 @@ def get_sample_data(fname, asfileobj=True): intended for use in mpl examples that need custom data """ + baseurl ='http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/sample_data/' if not hasattr(get_sample_data, 'opener'): configdir = matplotlib.get_configdir() cachedir = os.path.join(configdir, 'sample_data') if not os.path.exists(cachedir): os.mkdir(cachedir) # Store the cache processor and url opener as attributes of this function - get_sample_data.processor = _CacheProcessor(cachedir) + get_sample_data.processor = _CacheProcessor(cachedir, baseurl) get_sample_data.opener = urllib2.build_opener(get_sample_data.processor) @@ -497,8 +512,7 @@ def get_sample_data(fname, asfileobj=True): import urllib quote = urllib.quote - url = 'http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/sample_data/' + \ - quote(fname) + url = baseurl + quote(fname) response = get_sample_data.opener.open(url) if asfileobj: return response From 29c89eb189b6ac80ba89a955625d4ff9c8172c6f Mon Sep 17 00:00:00 2001 From: John Hunter Date: Wed, 5 Aug 2009 15:14:35 +0000 Subject: [PATCH 0025/1000] use proper file handle to the sample data svn path=/trunk/matplotlib/; revision=7371 --- examples/misc/sample_data_test.py | 15 ++++++++++++++- lib/matplotlib/cbook.py | 15 +++++++++------ 2 files changed, 23 insertions(+), 7 deletions(-) diff --git a/examples/misc/sample_data_test.py b/examples/misc/sample_data_test.py index f5e9aab45473..e59eaf0704e8 100644 --- a/examples/misc/sample_data_test.py +++ b/examples/misc/sample_data_test.py @@ -8,6 +8,19 @@ svn version will be cached in ~/.matplotlib/sample_data) """ +import matplotlib.mlab as mlab import matplotlib.cbook as cbook -fh = cbook.get_sample_data('testdir/subdir/testsub.csv') + +# get the file handle to the cached data and print the contents +datafile = 'testdir/subdir/testsub.csv' +fh = cbook.get_sample_data(datafile) print fh.read() + +# make sure we can read it using csv2rec +fh.seek(0) +r = mlab.csv2rec(fh) + +print mlab.rec2txt(r) + +fh.close() + diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index 3c35be1984b7..d766a2aaa512 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -418,8 +418,8 @@ def cache_file(self, url, data, headers): #while os.path.exists(self.in_cache_dir(fn)): # fn = rightmost + '.' + str(random.randint(0,9999999)) - - + + f = open(self.in_cache_dir(fn), 'wb') f.write(data) f.close() @@ -514,12 +514,15 @@ def get_sample_data(fname, asfileobj=True): url = baseurl + quote(fname) response = get_sample_data.opener.open(url) + + p = get_sample_data.processor + relpath = p.cache[url][0] + fname = p.in_cache_dir(relpath) + if asfileobj: - return response + return file(fname) else: - response.close() - p = get_sample_data.processor - return p.in_cache_dir(p.cache[url][0]) + return fname def flatten(seq, scalarp=is_scalar_or_string): """ From b08ae0b67c7e19b93c396a4123f96c74f0b11d4b Mon Sep 17 00:00:00 2001 From: John Hunter Date: Wed, 5 Aug 2009 15:37:08 +0000 Subject: [PATCH 0026/1000] make all-in-one sample data server class cbook.ViewVCCachedServer so it can be reused by other projects svn path=/trunk/matplotlib/; revision=7373 --- CHANGELOG | 7 ++-- lib/matplotlib/cbook.py | 75 ++++++++++++++++++++++++----------------- 2 files changed, 48 insertions(+), 34 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 333bcf143e19..c0781ded6bc9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,4 +1,5 @@ -2009-08-04 Made cbook.get_mpl_data make use of the ETag and Last-Modified + +2009-08-04 Made cbook.get_sample_data make use of the ETag and Last-Modified headers of mod_dav_svn. - JKS 2009-08-03 Add PathCollection; modify contourf to use complex @@ -6,9 +7,9 @@ 2009-08-03 Fixed boilerplate.py so it doesn't break the ReST docs. - JKS -2009-07-31 Added cbook.get_mpl_data for urllib enabled fetching and +2009-07-31 Added cbook.get_sample_data for urllib enabled fetching and cacheing of data needed for examples. See - examples/misc/mpl_data_demo.py - JDH + examples/misc/sample_data_demo.py - JDH ====================================================================== diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index d766a2aaa512..eeced282bbd6 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -344,7 +344,7 @@ def to_filehandle(fname, flag='rU', return_opened=False): def is_scalar_or_string(val): return is_string_like(val) or not iterable(val) -class _CacheProcessor(urllib2.BaseHandler): +class ViewVCCachedServer(urllib2.BaseHandler): """ Urllib2 handler that takes care of caching files. The file cache.pck holds the directory of files to be cached. @@ -354,6 +354,7 @@ def __init__(self, cache_dir, baseurl): self.baseurl = baseurl self.read_cache() self.remove_stale_files() + self.opener = urllib2.build_opener(self) def in_cache_dir(self, fn): # make sure the datadir exists @@ -394,7 +395,7 @@ def remove_stale_files(self): if path not in listed and path != 'cache.pck': thisfile = os.path.join(self.cache_dir, path) if not os.path.isdir(thisfile): - matplotlib.verbose.report('_CacheProcessor:remove_stale_files: removing %s'%thisfile, + matplotlib.verbose.report('ViewVCCachedServer:remove_stale_files: removing %s'%thisfile, level='debug') os.remove(thisfile) @@ -451,7 +452,7 @@ def http_error_304(self, req, fp, code, msg, hdrs): url = req.get_full_url() fn, _, _ = self.cache[url] cachefile = self.in_cache_dir(fn) - matplotlib.verbose.report('_CacheProcessor: reading data file from cache file "%s"'%cachefile) + matplotlib.verbose.report('ViewVCCachedServer: reading data file from cache file "%s"'%cachefile) file = open(cachefile, 'rb') handle = urllib2.addinfourl(file, hdrs, url) handle.code = 304 @@ -473,9 +474,41 @@ def http_response(self, req, response): result.msg = response.msg return result + def get_sample_data(self, fname, asfileobj=True): + """ + Check the cachedirectory for a sample_data file. If it does + not exist, fetch it with urllib from the svn repo and + store it in the cachedir. + + If asfileobj is True, a file object will be returned. Else the + path to the file as a string will be returned + + """ + + + # quote is not in python2.4, so check for it and get it from + # urllib if it is not available + quote = getattr(urllib2, 'quote', None) + if quote is None: + import urllib + quote = urllib.quote + + url = self.baseurl + quote(fname) + response = self.opener.open(url) + + + relpath = self.cache[url][0] + fname = self.in_cache_dir(relpath) + + if asfileobj: + return file(fname) + else: + return fname + + def get_sample_data(fname, asfileobj=True): """ - Check the cachedirectory ~/.matplotlib/sample_data for an sample_data + Check the cachedirectory ~/.matplotlib/sample_data for a sample_data file. If it does not exist, fetch it with urllib from the mpl svn repo http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/sample_data/ @@ -488,42 +521,22 @@ def get_sample_data(fname, asfileobj=True): To add a datafile to this directory, you need to check out sample_data from matplotlib svn:: - svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/sample_data + svn co http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/sample_data and svn add the data file you want to support. This is primarily intended for use in mpl examples that need custom data """ - baseurl ='http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/sample_data/' - if not hasattr(get_sample_data, 'opener'): + myserver = get_sample_data.myserver + if myserver is None: configdir = matplotlib.get_configdir() cachedir = os.path.join(configdir, 'sample_data') - if not os.path.exists(cachedir): - os.mkdir(cachedir) - # Store the cache processor and url opener as attributes of this function - get_sample_data.processor = _CacheProcessor(cachedir, baseurl) - get_sample_data.opener = urllib2.build_opener(get_sample_data.processor) - + baseurl = 'http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/sample_data/' + myserver = get_sample_data.myserver = ViewVCCachedServer(cachedir, baseurl) - # quote is not in python2.4, so check for it and get it from - # urllib if it is not available - quote = getattr(urllib2, 'quote', None) - if quote is None: - import urllib - quote = urllib.quote - - url = baseurl + quote(fname) - response = get_sample_data.opener.open(url) - - p = get_sample_data.processor - relpath = p.cache[url][0] - fname = p.in_cache_dir(relpath) - - if asfileobj: - return file(fname) - else: - return fname + return myserver.get_sample_data(fname, asfileobj=asfileobj) +get_sample_data.myserver = None def flatten(seq, scalarp=is_scalar_or_string): """ this generator flattens nested containers such as From 9abbd2fe0818b4ad47bf1c505b87a2a0321a3ca8 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Wed, 5 Aug 2009 15:43:54 +0000 Subject: [PATCH 0027/1000] move demo image into axes_grid package so examples will run from anywhere svn path=/trunk/matplotlib/; revision=7375 --- examples/axes_grid/demo_axes_divider.py | 2 +- examples/axes_grid/demo_axes_grid.py | 2 +- examples/axes_grid/inset_locator_demo2.py | 2 +- examples/axes_grid/simple_axesgrid2.py | 2 +- examples/axes_grid/simple_rgb.py | 2 +- {examples => lib/mpl_toolkits}/axes_grid/demo_image.py | 0 6 files changed, 5 insertions(+), 5 deletions(-) rename {examples => lib/mpl_toolkits}/axes_grid/demo_image.py (100%) diff --git a/examples/axes_grid/demo_axes_divider.py b/examples/axes_grid/demo_axes_divider.py index 2666b7b6b214..64a2f0c75fcd 100644 --- a/examples/axes_grid/demo_axes_divider.py +++ b/examples/axes_grid/demo_axes_divider.py @@ -1,5 +1,5 @@ import matplotlib.pyplot as plt -from demo_image import get_demo_image +from mpl_toolkits.axes_grid.demo_image import get_demo_image #import mpl_toolkits.imaging.axes_grid as imaging def demo_simple_image(ax): diff --git a/examples/axes_grid/demo_axes_grid.py b/examples/axes_grid/demo_axes_grid.py index 329454f65b4b..8eebae755b27 100644 --- a/examples/axes_grid/demo_axes_grid.py +++ b/examples/axes_grid/demo_axes_grid.py @@ -1,5 +1,5 @@ import matplotlib.pyplot as plt -from demo_image import get_demo_image +from mpl_toolkits.axes_grid.demo_image import get_demo_image from mpl_toolkits.axes_grid import AxesGrid diff --git a/examples/axes_grid/inset_locator_demo2.py b/examples/axes_grid/inset_locator_demo2.py index 37bb1f72b69f..391cf561b5d6 100644 --- a/examples/axes_grid/inset_locator_demo2.py +++ b/examples/axes_grid/inset_locator_demo2.py @@ -5,7 +5,7 @@ import numpy as np -from demo_image import get_demo_image +from mpl_toolkits.axes_grid.demo_image import get_demo_image fig = plt.figure(1, [5,4]) diff --git a/examples/axes_grid/simple_axesgrid2.py b/examples/axes_grid/simple_axesgrid2.py index 16e0495a5d48..0f7a547165a4 100644 --- a/examples/axes_grid/simple_axesgrid2.py +++ b/examples/axes_grid/simple_axesgrid2.py @@ -1,6 +1,6 @@ import matplotlib.pyplot as plt from mpl_toolkits.axes_grid import AxesGrid -from demo_image import get_demo_image +from mpl_toolkits.axes_grid.demo_image import get_demo_image F = plt.figure(1, (5.5, 3.5)) grid = AxesGrid(F, 111, # similar to subplot(111) diff --git a/examples/axes_grid/simple_rgb.py b/examples/axes_grid/simple_rgb.py index 92506545713a..3c660c96f142 100644 --- a/examples/axes_grid/simple_rgb.py +++ b/examples/axes_grid/simple_rgb.py @@ -1,6 +1,6 @@ import matplotlib.pyplot as plt -from demo_image import get_demo_image +from mpl_toolkits.axes_grid.demo_image import get_demo_image from mpl_toolkits.axes_grid.axes_rgb import RGBAxes def get_rgb(): diff --git a/examples/axes_grid/demo_image.py b/lib/mpl_toolkits/axes_grid/demo_image.py similarity index 100% rename from examples/axes_grid/demo_image.py rename to lib/mpl_toolkits/axes_grid/demo_image.py From e45f34c8b7acea1388f265f0e097acf2482194d4 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Wed, 5 Aug 2009 15:52:29 +0000 Subject: [PATCH 0028/1000] moved the mpl example data to sample data and ported over the examples svn path=/trunk/matplotlib/; revision=7377 --- examples/api/date_demo.py | 3 ++- examples/pylab_examples/centered_ticklabels.py | 3 ++- examples/pylab_examples/scatter_demo2.py | 3 ++- lib/matplotlib/__init__.py | 12 ++---------- lib/matplotlib/mpl-data/example/aapl.npy | Bin 437787 -> 0 bytes lib/matplotlib/mpl-data/example/goog.npy | Bin 75329 -> 0 bytes .../mpl-data/example/msft_nasdaq.npy | Bin 9824 -> 0 bytes 7 files changed, 8 insertions(+), 13 deletions(-) delete mode 100644 lib/matplotlib/mpl-data/example/aapl.npy delete mode 100644 lib/matplotlib/mpl-data/example/goog.npy delete mode 100644 lib/matplotlib/mpl-data/example/msft_nasdaq.npy diff --git a/examples/api/date_demo.py b/examples/api/date_demo.py index 5db8b42793fd..8729e2d58394 100644 --- a/examples/api/date_demo.py +++ b/examples/api/date_demo.py @@ -17,6 +17,7 @@ import matplotlib.pyplot as plt import matplotlib.dates as mdates import matplotlib.mlab as mlab +import matplotlib.cbook as cbook years = mdates.YearLocator() # every year months = mdates.MonthLocator() # every month @@ -26,7 +27,7 @@ # open, close, volume, adj_close from the mpl-data/example directory. # The record array stores python datetime.date as an object array in # the date column -datafile = matplotlib.get_example_data('goog.npy') +datafile = cbook.get_sample_data('goog.npy') r = np.load(datafile).view(np.recarray) fig = plt.figure() diff --git a/examples/pylab_examples/centered_ticklabels.py b/examples/pylab_examples/centered_ticklabels.py index 0ef06b7de2b1..278ab18f0c84 100644 --- a/examples/pylab_examples/centered_ticklabels.py +++ b/examples/pylab_examples/centered_ticklabels.py @@ -15,12 +15,13 @@ import datetime import numpy as np import matplotlib +import matplotlib.cbook as cbook import matplotlib.dates as dates import matplotlib.ticker as ticker import matplotlib.pyplot as plt # load some financial data; apple's stock price -fh = matplotlib.get_example_data('aapl.npy') +fh = cbook.get_sample_data('aapl.npy') r = np.load(fh); fh.close() r = r[-250:] # get the last 250 days diff --git a/examples/pylab_examples/scatter_demo2.py b/examples/pylab_examples/scatter_demo2.py index 44ddb8ea1fe6..6c06adf27980 100644 --- a/examples/pylab_examples/scatter_demo2.py +++ b/examples/pylab_examples/scatter_demo2.py @@ -5,12 +5,13 @@ import numpy as np import matplotlib.pyplot as plt import matplotlib.mlab as mlab +import matplotlib.cbook as cbook # load a numpy record array from yahoo csv data with fields date, # open, close, volume, adj_close from the mpl-data/example directory. # The record array stores python datetime.date as an object array in # the date column -datafile = matplotlib.get_example_data('goog.npy') +datafile = cbook.get_sample_data('goog.npy') r = np.load(datafile).view(np.recarray) r = r[-250:] # get the most recent 250 trading days diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index 2241c32eced3..d525b9586756 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -490,17 +490,9 @@ def _get_data_path_cached(): def get_example_data(fname): """ - return a filehandle to one of the example files in mpl-data/example - - *fname* - the name of one of the files in mpl-data/example + get_example_data is deprecated -- use matplotlib.cbook.get_sample_data instead """ - datadir = os.path.join(get_data_path(), 'example') - fullpath = os.path.join(datadir, fname) - if not os.path.exists(fullpath): - raise IOError('could not find matplotlib example file "%s" in data directory "%s"'%( - fname, datadir)) - return file(fullpath, 'rb') + raise NotImplementedError('get_example_data is deprecated -- use matplotlib.cbook.get_sample_data instead') def get_py2exe_datafiles(): diff --git a/lib/matplotlib/mpl-data/example/aapl.npy b/lib/matplotlib/mpl-data/example/aapl.npy deleted file mode 100644 index 538006f2126fa5477b918f4859e0ff17b26fd372..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 437787 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Œ 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 La$I$KY54yGjsIZ0 diff --git a/lib/matplotlib/mpl-data/example/goog.npy b/lib/matplotlib/mpl-data/example/goog.npy deleted file mode 100644 index fc0f5d7e977a68e40ea8e5a3f699a78f0d94a8d8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 75329 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 diff --git a/lib/matplotlib/mpl-data/example/msft_nasdaq.npy b/lib/matplotlib/mpl-data/example/msft_nasdaq.npy deleted file mode 100644 index dfc4e38658a158c49648f47ac10a2c1cda038bc8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9824 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 From cffbe8ae6150cc16a6982e229b51196f36345a75 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Wed, 5 Aug 2009 15:53:11 +0000 Subject: [PATCH 0029/1000] moved the mpl example data to sample data and ported over the examples svn path=/trunk/matplotlib/; revision=7378 From db2124d584d4ad1360bd611e48f5996967418333 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Wed, 5 Aug 2009 15:57:31 +0000 Subject: [PATCH 0030/1000] port more examples over to same data svn path=/trunk/matplotlib/; revision=7379 --- examples/api/date_index_formatter.py | 6 +- examples/data/AAPL.dat | Bin 256688 -> 0 bytes examples/data/INTC.dat | Bin 317712 -> 0 bytes examples/data/aapl.csv | 6082 -------------------------- examples/misc/rec_groupby_demo.py | 4 + examples/misc/rec_join_demo.py | 5 +- 6 files changed, 13 insertions(+), 6084 deletions(-) delete mode 100644 examples/data/AAPL.dat delete mode 100644 examples/data/INTC.dat delete mode 100644 examples/data/aapl.csv diff --git a/examples/api/date_index_formatter.py b/examples/api/date_index_formatter.py index a0afbb4d7110..d583f4716d33 100644 --- a/examples/api/date_index_formatter.py +++ b/examples/api/date_index_formatter.py @@ -6,9 +6,13 @@ import numpy as np import matplotlib.pyplot as plt import matplotlib.mlab as mlab +import matplotlib.cbook as cbook import matplotlib.ticker as ticker -r = mlab.csv2rec('../data/aapl.csv') +datafile = cbook.get_sample_data('aapl.csv', asobj=False) +print 'loading', datafile +r = mlab.csv2rec(datafile) + r.sort() r = r[-30:] # get the last 30 days diff --git a/examples/data/AAPL.dat b/examples/data/AAPL.dat deleted file mode 100644 index cb7b40580d269f9f8664bb78fc2a92e87700cefc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 256688 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

--i1Yo}TGlZ#~nyo_eM? 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 diff --git a/examples/data/INTC.dat b/examples/data/INTC.dat deleted file mode 100644 index 98572027033ccafe86facaf53c0f00325cf7ff4b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 317712 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

odIP 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

$3jBmtFMwKe+Z<;`$5M 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

oeSV^ck*yeTF;#^cilxE-zd@^m$pIx4u5VXWG+e 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 Q_Y6D#?;W;%_$&4QA0}v)eE Date: Wed, 5 Aug 2009 15:59:24 +0000 Subject: [PATCH 0031/1000] port more examples over to sample data svn path=/trunk/matplotlib/; revision=7380 --- examples/api/date_index_formatter.py | 2 +- examples/misc/rec_groupby_demo.py | 4 +--- examples/misc/rec_join_demo.py | 2 +- 3 files changed, 3 insertions(+), 5 deletions(-) diff --git a/examples/api/date_index_formatter.py b/examples/api/date_index_formatter.py index d583f4716d33..4eb2429741ff 100644 --- a/examples/api/date_index_formatter.py +++ b/examples/api/date_index_formatter.py @@ -9,7 +9,7 @@ import matplotlib.cbook as cbook import matplotlib.ticker as ticker -datafile = cbook.get_sample_data('aapl.csv', asobj=False) +datafile = cbook.get_sample_data('aapl.csv', asfileobj=False) print 'loading', datafile r = mlab.csv2rec(datafile) diff --git a/examples/misc/rec_groupby_demo.py b/examples/misc/rec_groupby_demo.py index 432d915e988e..3c1b5192dd6c 100644 --- a/examples/misc/rec_groupby_demo.py +++ b/examples/misc/rec_groupby_demo.py @@ -2,11 +2,9 @@ import matplotlib.mlab as mlab import matplotlib.cbook as cbook -datafile = cbook.get_sample_data('aapl.csv', asobj=False) +datafile = cbook.get_sample_data('aapl.csv', asfileobj=False) print 'loading', datafile r = mlab.csv2rec(datafile) - -r = mlab.csv2rec('../data/aapl.csv') r.sort() def daily_return(prices): diff --git a/examples/misc/rec_join_demo.py b/examples/misc/rec_join_demo.py index 6a5e70ffc248..06aa9190bcfd 100644 --- a/examples/misc/rec_join_demo.py +++ b/examples/misc/rec_join_demo.py @@ -2,7 +2,7 @@ import matplotlib.mlab as mlab import matplotlib.cbook as cbook -datafile = cbook.get_sample_data('aapl.csv', asobj=False) +datafile = cbook.get_sample_data('aapl.csv', asfileobj=False) print 'loading', datafile r = mlab.csv2rec(datafile) From c1e12be2e5f43b551f1770b4b82f32a2d8046b01 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Wed, 5 Aug 2009 16:21:23 +0000 Subject: [PATCH 0032/1000] removed examples/data; ported all examples to use sample_data svn path=/trunk/matplotlib/; revision=7382 --- examples/api/watermark_image.py | 6 +- examples/data/ct.raw | Bin 524288 -> 0 bytes examples/data/data_x_x2_x3.csv | 11 - examples/data/demodata.csv | 11 - examples/data/eeg.dat | Bin 25600 -> 0 bytes examples/data/embedding_in_wx3.xrc | 65 - examples/data/goog.csv | 1048 --------- examples/data/intc.csv | 66 - examples/data/lena.jpg | Bin 27428 -> 0 bytes examples/data/lena.png | Bin 302635 -> 0 bytes examples/data/logo2.png | Bin 33541 -> 0 bytes examples/data/membrane.dat | Bin 48000 -> 0 bytes examples/data/msft.csv | 66 - examples/data/msft_nasdaq_d.csv | 2000 ----------------- examples/data/s1045.ima | Bin 131072 -> 0 bytes .../pylab_examples/date_index_formatter.py | 5 +- examples/pylab_examples/image_demo2.py | 5 +- examples/pylab_examples/image_demo3.py | 3 +- examples/pylab_examples/load_converter.py | 6 +- examples/pylab_examples/loadrec.py | 5 +- examples/pylab_examples/logo.py | 6 +- examples/pylab_examples/mri_with_eeg.py | 9 +- examples/pylab_examples/plotfile_demo.py | 5 +- examples/user_interfaces/embedding_in_wx3.py | 6 +- .../user_interfaces/rec_edit_gtk_custom.py | 5 +- .../user_interfaces/rec_edit_gtk_simple.py | 4 +- 26 files changed, 47 insertions(+), 3285 deletions(-) delete mode 100644 examples/data/ct.raw delete mode 100644 examples/data/data_x_x2_x3.csv delete mode 100644 examples/data/demodata.csv delete mode 100644 examples/data/eeg.dat delete mode 100644 examples/data/embedding_in_wx3.xrc delete mode 100644 examples/data/goog.csv delete mode 100644 examples/data/intc.csv delete mode 100644 examples/data/lena.jpg delete mode 100644 examples/data/lena.png delete mode 100644 examples/data/logo2.png delete mode 100644 examples/data/membrane.dat delete mode 100644 examples/data/msft.csv delete mode 100644 examples/data/msft_nasdaq_d.csv delete mode 100644 examples/data/s1045.ima diff --git a/examples/api/watermark_image.py b/examples/api/watermark_image.py index 5d2f71c5cacc..2320d5c8a41a 100644 --- a/examples/api/watermark_image.py +++ b/examples/api/watermark_image.py @@ -4,11 +4,13 @@ import numpy as np import matplotlib matplotlib.use('Agg') - +import matplotlib.cbook as cbook import matplotlib.image as image import matplotlib.pyplot as plt -im = image.imread('../data/logo2.png') +datafile = cbook.get_sample_data('logo2.png', asobj=False) +print 'loading', datafile +im = image.imread(datafile) im[:,:,-1] = 0.5 # set the alpha channel fig = plt.figure() diff --git a/examples/data/ct.raw b/examples/data/ct.raw deleted file mode 100644 index 114849128c7ab4febe65e0ad0ff1fb1433aa3929..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 524288 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

=`?RXM7a*>+SX)u20gOl}oX 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ⅇ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�L3`zEeH;osqD8C+}U3jJpZ!Z$K7Yk1SlqqeqED{z9Dp7xeHmX#ak2 z|ND?NXM*!;iO-`t)<<`KVHmQl6}WT`&#@rT{yd>FSFcEk$zWeYu)sKh32IV<&w8%Tfz88Slf_oT+Y{jptws&G^Pl?zwFD?B2|h z%;lNKGtJ2JG+RkejB}5^Cd26=@O@Ll@fQ*CpUur40GqOxWKYa~pQ%L7Z|EAcmUZzy zuTIR=Nl$};>z|&&8XTJV@%txOcMj-yUalM@wFc^6t4^Z3N6U2(3u$cvH zhw$bw06PJSXLYXCb8S-<)BDh|PDGiCjDI2fXL=i-clw8O1GJyD|ASTzcE7wmOcMA< z02JEa!OItB45`h5^#!Sv5z@d7&Bpw8(br>Nmi~uSJlnvt7eLN}kWom8a68!(y zk&9I)`YQWd`szgg%VG2)`0cX(LOE4fov0_#*MdzF_<)v2b+Q^x<*b~?c{Aca4Wx$- zf7V(JV{-za^Zo1rs$8%;&?VUa`U9@u{~MY7ab4z4uJRA)|0fgQp3^Ap=yGj>@YUSg zfKT8NP=7nu`62lK78u?VnBOX{ycqy*Csn}qr_lna0gE35{(nmFe>oaCrs8)XHt*@^ z;_l?0oJ{mT6~9AYia}KWybTg>hOv&pgVhcXw^$F;=k@-()yDVL5)apzu=0*bfq?%u zaNY6nb#GUJhVL8m;8FnxgT`)BCnebO>F&27P}6 zsJ##E_!#{EF4+4nw(acARp{WQy!Ify$BJW1&ct4*hVOnSvA;!l{zfBtMzc-gom;6~ zdK{m?65jm<9OQWXimkD$&%qj*O9sHhuz{@{>pFPB&GZF)7W`%6->?zxWF=gVT=^QA z(-%%t4IG<&Ym}oY=xxVe=MQUz7sC&61b>TxMEi{S&Y=J01AfYkUA?0xBRx*#){uMk zL3K|ol#R?K$l{He1Q&Uou7s!K0i1&@E*d|IPqK1kH{dSFk%LI~IC}*ZjSVvsGbtqg zA6dOGCHd_?sS(@F^|#O0t*i+nfOGNuE#Y08(FcvPpJ$H9j)(v20a(i_`hZvN$_!60 z1@l?}(^-8((d|b4)%8}QPXPb+1+){eGs5i2>YV$Mv}!^Xaq?275gUt?_Vr#B%L>VuV__qEzX|F6K;kNCTLcwhpB5O&liC~_l8X0kmnP$wz@e?=ri)~4A0;P^i#?vGY4ftiXmKV;j-`+UPd>e*G0Sp!Vzpe17fXv*SMay^0f! zdmX>`ShCZ;MR%`*r%r(D_GHbQ_16$dA``HmxP1g#;N3b4^mhdnEm_lA|Ju5G;p`4@ z4Su-;R05ACvwas4?R(JP>v9oj>jclO9GioG2FQL*0<6A)gi_9T% zuEs$!f`8-xC&BUq9K%y&=^qP{M}z3nxB{&U3j?m-GXg?#!UIuh=`56wRa{&Nme>3y_+3y!rk$hOZ% zab##SH2=xqxdh%vD|75OY<}+HaP-4?M;W+4@QvEBQ)@s8Pzq^LmFwWtUNd*iNos^# zox|~DU?z*$533%>#S6jzAZ8Tr!TxAUB=lA+scJ;{7G=N849Zl@RLTser_p*mL!lnv z2)M!5^m}@otM9yDS-w-?uSQR-1^+it?f(T;P#3@vWdLhfDetptKFzF6ZwARjSeciy zK1XxEcY^;>f8#&&1s#k$uy$2{fH?wv-~;FJ|Cx!dKNG2;G|(g9d{DK&835HmPsoQW zk0z}G7TTnb%|4PlAND_<9GeB%?c^V{Libh#J)+W?q5Av+O11v={{^qwKV5+I33wCx z+S?%-5b}hAU(in&=`-)ps6uhR*KaM94&pN~1+5FMj@snf49j#!HZ6pU){cJ67Gzc= z3?@jh!1=|v3_xk6##ai2496fH3hjS?yAt}p4RXiIxj&)t~FUFBVhp*v3&RN z+L)yN?=3O_^t_FMSNDXowqxx#Nti&r#Mjq|Z)}6+?+E%kaIY0sKo8dI04)D8An`J= z_h#-e@;#=3wA+X&&ftAR;N#Px>h!&fsG=PY?^o~tn`qc)pxw!%m%;FFf~oA{*`Mhq z7Gae&!zWM%_Hcmb-UZno;W={xVKcPk(Nt|cgFkI0pIZT9wv#`61pb3x@eXc7Uc3P3 zDMuwjC%lS1;UW{!?$^Nm?*VmB;Rk)5sK8%QwYUL#_W>9}7TK3Y-aH6js-4)_VeZ(G za2_WpTKBI_ZZtlR{cTT@96US*`Jq>jvcd?R7`2DDdArW>Ed@`oiE@$*&&P8Q3 z;$1}lj>jjW_Mc94a&~F4l?1+#uprJCK>YA>b zeI1T{8Ge}ebAz*M;n>a5y%j*Cm{(7W`hSoupDsjIq5hX8g!gDEh;*?W9c~;lU%Rz7ITKX=9ClkU2rR z6><-s(+Y48$|5@&az5<&so%sJi%U7n!#S7AP^+l4xh~=?Ph|6+^*{FinuG55?@OtN z(?#fz_a`>|bJ+M>!1)dkemfqW>%sU6B!DyB?@#o<^<9tRCC~<3#?`m}djp?&3h5EE z(qx{E;hgQ!jPH{BcP^~^IehQm;_=!a9gL18@3$Kf`2lggID`Lx1A4U;TKQ-6>{9I1 zN%*UV;nVBEitUu-w^;FGRPYoqZ^lbIaIFkDi+9-vXnf+Mn~e|d4cLEcJbdQcr=q#& zyph=M{g@4MI{yE4FpYNn(w`vqeNg>O!tocw@E_xoUxLEoSO(RpR_Kinp$llQO=fbI z*w_K&SOY$L3SPSMFo3uC#AevTOL*u?fc0)<_8uF3g9Lbqoc`m;K^TXf-4ne&0qt-1 zoq1gETaf|g1AKu;q8;1k*c6}Oo4<_Ao9kc`-8gG@2U5%1f2#sI+#D!-ZvH_e&Khf6 z+vs2`lXASzYP}-d#Q#xzLi``iyOk2oFSC}f1Z=?Q#Snhu-CRR3@o=L32hxRQ2KIk1 zvM@f!A~*+$c?Z6R6ZpnGgd~ z>mENH`u$c>@t&e<<=vtc@u=&{v2 zJ2O3tcUA?TVmfGT(ImR{?guZQ$QDzD{|fOQn7^-C$)_gQcPPevP9&)E&@s}gXZ|AiqxSm^hbq84j55fwJ|6YT9xS6ZHok(x`Z~cD? z{Jkd{^0(Y+T!B0Bb^U-p{#m@?FSGiK#8t@0>5_D!eI5OOF*2exTK8)ZwFC|@9c?}e z?^Tb#xqf@lu0>$Bk9L1su-_3McTe6k7C)VFuBk|Y*}ti)@O zgEz8g_o4sG;0tLI-wD6C1S#fpWOMmW1*c^}Uy7{&#FdAOSL1Inp8JdJil34kWMBQ0 zd*&m#nW>{Uz`2Eb2JBd5Z^7^mdoWkUQaT@x#Wt8pJL)iZl3#oZjOe`hl6W3+xFXp{ zS0&j88#v=t_|EUSn)9=xvXeph$JqiTkp922{BM4+UDcn$61;`=Aw#qW!1b^|XjdKza%6ZDCYE{MQ9j0eR};vUN@>2^Llz9;{PpCFISIg+;4CZyJAlt2_NV91KHxHfxv4)>Wi#ipV!i+5WnZLErIy!JT#U#$~b4>$1Y-@s??kZUm|)( zkUJ9BAuok<+ z?|Xufj^MvVf|1j~e!GMPbR@rUApU}xy#F%f!1;V;9ZdZMP`(JS-!YNZyj#)q=TPT* zI&rqmAoUF5k)^=%Z{YWS-hU&^eI+c9Kci3aVF5b2A|LYt1I#-2#dIBDH1l+4t+#9dxO+;hL#XC6C)39Jx z!MQ524`zaV!u9-wsxG7d)&N+0Q4C)48{hptb)sPc*fMm0n-d{c!WCv90T!Ywo`4~k zBXCEO0WcvuB-12)C2P_=l_Ig|HCx!0U+J3U-ti2_uD)0 z{N&ws0yaOe8SJ+t-&ijmcP<2gu+J{6FaZ;Mr5#%Rquf;4dn(j179M@&I#xt0MnealVFeKF4r=#-QzI zab5=@Yps=V7KpP|^Z{I)`1`Iz0?g*V*Wp4wH76CP>t-gRUq0ZPncsU0y8Y>-#!LV1 zRWN`hT-}Ylx&vGA5o`n}SZ;+AT*I}#3LRh$(BtU;U$e)sice0sdVhTC6~XoONw(>J z{w~7Hw2a8tXW%hM_wRiC1DP9 z-vPU#HBrCQ_`eqx^96Vr>=a;6(CO&&4|CE37$~VQ>=x^g6e1RInf1&q( z1$GhmZvcazMn>NZcz$ns7FR|J^oQ4NA;P{skslY4=dqM{|8pGojYR%ef&VATM64SB zjAU6rq(pp2Fm?TR#bEc}(LLZdkXsVOnf;&@?*t-y24(-w%GDPj?v(;gDsfJM^NJ3E z`Y@@~p2a!7wK(5#IzG;waIq7)8jq57P$n)*=21OjFqg)6a4Q!-#<8}-0=ofLRT=#I z%~~4P0cuqk{Z|q>>&(1BI{=AqC&OIJ+E~UqSI#nVR_N{UPSbuKaLBA6~ogi);%f1%<+3W}6 zd?4pt+SOP7Y^ID8I7X+gPEW~xoa=%7?G;^-dp1)s-G}#t*k91ZK{KnP_5F!r<-ifi z6yZVvAo{!oeJ|G!HbCI}$`4tCx;-#A0a2nasCOH=Qp-_F)&g)L^4 zHqUj+JcJGp^?ynxS%6Z+{R}p~QY$b4Ig8dxus8G&RssKQLAka5GJw&EW*?RKOw5%s z%fju^D;4lq=^R@ola%%$v=tvx}C;ERR zzP|~`fXR5bmcej8C&#rt**&MDvk!vV*I4(1h_N3_b?x1(^0Tn&8{ykyCKT_!2WhjF z&H)F&zxARV_6 z_rH)FqlfYJZHD*Hh6^|YbSqswKjK*L1pT-2>VD3^$Lz@>{BnBrog!u|KaY3K8ATD# z2K*b zTaIvM&}O3i7{$$CQvTfdeUsNSh}2^eu@`v){?|p8L!83!2W9J1^1b(3hw%SX@C$W= z-`d~%w-dvg4xkv^%L*9(Z}^IdRrC#wtua*s`o5V^Kr3-91iu%EL=+*hK0Qo@eCc6Z>(ov?=MS}i8uOmv z@j>G$^niV^g6*JV2GQ|Eyl5R_?AOHOY&_dKcOyIk!q;^NvZccfsNPzFByYn>WM-*3R^RS@AuTsNn~7EEgm$OoCVJV*b_gfcO zajHXU4c?{vYw~1At~K${FLg?JD^;v0OD&#XkH}UN|EgjM8gN}T0m=(%pK$40>I*F6 z)%B$TX(rN6j;C8=%@2gI#C@^HRqfvX=R8vTg~i}sI5Rtd#RaW#z^AbX2Gu45DCRA! z$J`_A8HG-MS;#iEKjQyFrS4b1Z#-TvF8{~m6r~bKXB5*={Lqe1w=GZrE;x}DQ_imM z-;HfD3Wh$HY=}X*eoF;V1YmLtQWj(pOs+%TKRXo=+FMC+l=}R%$8T?rj^?Fnikc=Z zhzFSNYxMx@G8juRl#BKQ98X1ZDSrg(N3;J_)x84zpXSYF1P^n-vj9rKteZ=@++0VpRoY9;Q@PL z!dqd=YrLwM89b&l2u$SF*J;jG8!~&E_1TR7>kt8y^x_IBW#59EDsY4PTpCel(3d>^ zeDHjN$>GVsYz^Z4g6MW}@!qwuE|<|C?qF+vr6#WmQM>li-iq(vMh@TvwS8~w5c+){ zynRh9L>qX*06uRk*yESv`)(5<>_^S`1>`r!5>>z+bs*}P!K)nt3l@IVSgX|@j7vTR1zh8rYb?y|Vrt+el3Vrow ztlCOGMS8l98c=(weE{R30+dFHc*WW17Gzd2XU_%YngOJILK5tcc!@5Fx$QmZ*IufZ zz<(4BaTjW^_5qoICzwGj*b)BUkH41_JsxMJtj43L0&ssIP2i*T5$_|+E4$YS%u4~( zbb56GD-Y0>d$o$SOGq2=ujpU(znT=JY@sgZwuV@UX53nt*g$iD^APnX17z2-C(d8-?Cf{TWQlPs?xXpTVJgzwoGMiR;JUT#wT8 z#TxXUx@KNEp?8~f1l0n{Cdn2E|6&SBiC=!VrU%jz4UfRvRJNP>4}xNoQP8W(jz~*T zy{|rv$vm1Ig;4`^pOlVtR6gV(3-SZULa~#62H@X&a}33uR4XOjv??sBF~?SuKSqJ~ zQT#ucA58=qLJv@4tBk)7tnnOYYd&1f;6DnjU;BV+mlw_cTgmx8#d$qIjqn95ge?EB zUUVRJP*XsJfAN2Hz!!$UAEN_vHmm+4Rc@MVGYF2a=`){+L8IaR$KeHQ;l!&!#X?Z3 zis&}P+y7AcK8JPN41K=^-n}EJ`ySMP#j7d@SQZXY((C*C5&SoXDGViYT?LkJk;BV? zAFsjXJ6@>(T7Eb1b{5_n4JJo{=mKc@FPZwWAN+5kU+6CE|2-DqA3HJkRYC!1f)*iL z)d2=jln#NL*oe*Wi}t+R_b`wGs1J?6$}FCp0Q_r~V=K_FJ)K$*4g89q-N3h+j@mID zJ3k2~uo1f#$?bpeY1Z+1{te!TH8{cPFqxE~IUaca2lPL{duwL^&EZxaU)(>o=lwN< z%!eHadB{w}t+Dvg{)3uUsww3!K>kw@stDqZ7ej<&triji6~GF1;d5%Qxc7hf z*OUm=h>oHbaDwLxBDr@TD@b{v8$9Eiz!&~ZWZ~O^>?R&BRmV>=P~ObLyV$F6uNeT+ z1hjXJsR7hZ;B~PWjak$6_-!f&)GtuWi~mcYe-|JJkiui{+JkSX?}D{2kP!RYpH-02 zF6EEHN|@STlb=`CE+!XXqHN*Xuxp`R|AaMpbYW8e>tZa2?lD@u@U5R1?3>3VfC0o@ zWCOG>xZYQpz(k-j!s-_Aal8lPZGNyj(wmUuf3K(4*ZUcduiZUN1%k0bVgp9^(>(%V0hEO|9;N<5w!omz5LH|EWWxwHS!zs}az5)F|z{Kl=-xhe^ zRoEZxdc6#eTM+f%CewJE2!1mh;4JvR&(95hKH(<|V==TdLkm7f3$%cOVDt*MVih)~ zDV(DWkxgD~PiyM`)?#lmz~Q>VTN?4K7FdDi;A{-vdJ||@wciph3$cQ0VLMwm3X8$u zQM~X+qJiH~547`EHR>g@fMm13u=X8Q_Fff#ss)J0Mclx`%bRJWn$IcApa?*J#lc3gn@{aQG*Qf#!~N6X|C2ZmiH)A{ z4ORWG$Y0fl33%;9;6D=_B|X;2Auo6X?st@FFHzwCGzeeCDp2fic8Qgac*_u z=LLJ3bdjIGR0~)Z99HLERrziM&-YmAIjQig1=no?Ci~!*2k?43sXhofcTgECq6)?$ z&V9sVFHjA)2Nm!H@qZ*g((_`I9jFRc>hlUsIXmC-dVVmv8_jPde54{4NS%!}VgGaB z8?WqaXar4p{P&*4sm=e*IIqh=|9QOpQ82#=F0clb<0w(kRw95XZof%?!g(Tr=6s$L z)DgBNrpSyA@CGlgDBs2dCj^1={bKuJ+@k#zv>$ma&+iMJ;^?vx@pzO?-tYzZ7xRCO z{%7&L%y5g5WGv!%S&1Ro*o$Ny!pQfh#{QloF3Sk}|B6d-w18pooH{&9^Z)e9^8aE0 z+RZ#8wnXa0J&=3~Z0~{V$pRck6%zi{1wIo$Fo@p&!K@igggt_Oya+vMJ^BCJ%m$e1 z?`Lfz!k0$f4s0vxZ^t!ZUOb>Fm=?cp%Gy;PK(Rp!5C5tJ5dT*!TN8VrU2W>~m!^Oh z=STZ`Xisk;R22Y|eIKj`fy`LquH#;(%^gi)=q22gtq1^a? z69EW~daS7p5c(8>%LB`582>MgKq|kn5PGC+fnf`JjI4m_4D=r5eATQHfxGq~d|ks} zJA0J>GTMZggZ#dU{Piy8wPGR;y_)$XVg!0UWjZq8|EqA6%&aeItJ>ka58hq7e`+_i za@dEe94*xcm^#3I_VJZ>faKNMxZMs#BqgWx^U1 z^P&LaCp5WL;P@KVEy?h7wPEi)@%j^qH6~+Uwt%+S*r2Oem@iQmtl%@e|7CC=31`?$ z4q!0~*)kZ%6|(!9kk@FSS6iuX_B;eRLhPaw{y;@O^JC=Wxi2q&l(PDc%ANo>wH z@P>-8O1~#fZ)dW$ze_vQYX1M)l z5UvVevHXPKIt1>-^`-S|*C5U2kOmN!i>iK1gdlz3GiUGx7wuj20i_@*cB&!Siko&q zG7XJcZGRC3g)sp!8CBR8_V5)Q84aCAL<4nU0K1jPU8;Qz^C zB(FX1e}wbA9fo+wivTv`1?2tb@p~Av|5}p+oQZdc0{`oXALoGob7&f~0tfx8tV`%k z?XUrTJv(4}Q&qVpzAv>;OkY}-Sb{7<6Igyd{FpicgnrEetAkC@PNC`vDh~FGdHR1E z&>{S$L=&6tbN%lE*;xfWQF=Gg{WF)xXzq_D>zbNc;a8|u*3T$(!j$3fW*;z<`8PNg z3QaU_&@Y?{h2|op$~PO-3h&YcbTRRPuIb%WL6Deuy)+ZRuG@WxhHD2q+mrlPh)pzo zK&qZz!`L0YqKO2IEiej#UPnLD5>*XQfFsh1qZt9}rRS@%Pn~{U!Fv;qRb?*KIjY(V zKq`yo1IkLM^0yDRVythiuc|fHzl7Cu07NeV^M7)Fk7C<5parP&NB(~%n$CXC|1G@# z-&pj6)B$Kd(1ic_f6WHp4nKGwNDMl)?^kznPE$a78fIV|0oCL1#Pf-Yx8Ms;qlUi) z3%l@%$6>@%zV*?{wW%j0~KV|d$W{yL5pdDhcD*YcPM;)Wtvn6ux?k0T29FtpkRn%XTi;!QPi}0_y_R66DEAOJ{U$uQk(N985JdfQ!Y&#c9Odk|r zW)N6YcuZFAiP@n?k+fm^2BU^u%cJYM(f`FIWF=ydZ9K4v{7n~udVTav`F-<>!lYhT znqQ0skl#0+KaAH;f)Y{0N*g$5cZQu*3wE%l`ftJFjpY&N7rJG244aU>F-${N#(W-= zB~&IeJ(E9baKyyzwVRjxzWOP8prNS3T016dlB)WqG+&_|j}!~gZs0?BTp!~9<-SVR z1phMl|2{Ch2>-9?KF6@%n>}lwNp5C8u!HcpCs+Wn0CB%voK@8ajfMYD!osW8^DR4H zWTUF(D{AsWu=<4b`DJAW&SEe*mq>gU9C!t|R1M%ue&5DB@5f6I=V-`p_d`X~oXqb~ zVK6djLW)IEoypfLVk3CF7)j02BQ`@tO)z=i>=v4#Q&J}eUlo4 z7v%n8JKF884^|}@d`{)>YM!GBp3A|tI(Z|gAf5pmxMe$FS)Dtj!Ez>)f|qm@pGPO0 zPj0+7T4Nn-KqE2}L$Dl&sV%apB}~QZe&zZ9++-GB(qmIi%#L_xGw6T7r-;G|y&(s2 z2L68%=6{kJ+--d85q#@9)Fb_i;yD$qvk3N0>|dQe^7E?m*DOBO_{st(&u18d@NZCR zs)MvwnGb#b9gh%$h)d@{Jz|u5b}IDHCR8G<=5zSzIZA;4&j15>!m-cg3~^>Nf3yR) zjKd0*0XwUDFL;z!0 z6^GG?4-);WmTUud;tpKWq0=pcHJ^1lh#z?mzLW!K!+LGZk8)V;xk&#r9l)9d zSjDpdnh2_?z;%gdt9r_RaTq{Ru$_zeKOKls-aU(Nov(;LEq$k5IOBG3L}0Ns1ce|w z_}7eXo*C5p>1%^`yy^1PKU6KA* z)GuogpLa^e%%bdc+Z?t#;E!s+|EKt)sbGrX7ka(_q7lPBOf(@yAm-ESQ)ut6%-~;B z|2yN!2ZR3z(67ng+Gkby6V*t5ht+Jrk(HXFy}mRZyf-T0An+f-nONW}Z~f|Dj^{YY znKSs`iY-uu|1z?CngXI7z?X5$9q@mX%Y80a;RtJBeVYHK8L(4e2q$0>$>HfaQ0Rux zGq-~I_MPeVeMba51Mj~AL~MlhZ$|-3>P_VQh(FYfoKdJ~+PSkk9IWvm@VB7}XkKA46v+J42|L02+!BR#S&fQ5k&L8v zA#8{hXoC7bjX8ifPyj44hk5z5<-l2r-~*zFf2l#tLL|@x4se1<{}oF6OXeS_=IJ`0 z?KalnH2HuH9FrmB48DP-UdGZ5#Jc3>TdJmC^?qj0ky;nE?O)3PzHh3BbFU0@}(+?u-Qg z-|;&C@_w54qn%bXe@WawF1J3$i(duH>ipDhpQ-{sjpn-8zKE){$Ku7UR)eL zhD#ge&3IhlRsZDug>!SOtb%Zi-;$<)6YMqli6|dU{b&l)Gd^!DXC@ z^qId0`BUM$6Nmx+Kpo!|d=@NB<#{vK;XV*M8e7;F{@)tESspAY3txq9o2MYP9Xelb zyuBt}hzUy(*Tk#T#LHiT#e6l@Z{NGWe?0Cz`JIpM=(8={4dbX4x{pI;#0`~3;!*#7R|5# z?Y;LsiQRc^$0M$&Of^qQY6a9)tcrqrwjX9ckWcf3dPikE!pO3{MTtlb{_cVQ6Wq6g zZ{C5pAsIP_wPYB(p)hFbxZ-``{~dWe?LZU@d*H_dn|(=5-M`8ID+dtb(XtPEhOn<4 z%Tf{d84KYcFFgGJ3lI4~=HKP>QZL=I}@Gr^dp-79+@RDnf01&>tHsU^GTq6TL@1rtMzw zZ?}Iz>uMjIVDDfyaXxN0*2SohMlUo~iSa#qpw~AwhWZ>vE6{%8#W@Ns@#BN>IzIQ0R~m3jJhhYPLBBiqiy}Sq5R|c&zUNaL>d|Cdk0tTaDu+7Q%=R|{2 zf4e3DYXXj{<4jj;TTruwI$s|iw=R0$cKqsIGVJR?*D)@az+MHqTsAxPoJd|ZDOs*4 zw7%86@(fTt8-=_V(foYW#+`WkFkUAk6#@zA`;8{2a0G6#iAZ5CDuebT?1HV(p2R)D z|1y|C6uE@>Ud&JnKb|0Xo5yd%mPDd{rp52>;F}8lNj*05iq5|>>_XyqE`rCSFrgvn zjCrZN-whL)Mum}Pe1F0BQx;y6$KMh0s~$(OzjVF#*Z@TaW|uB8B2@yr-XlI^D-1g@ zdyD?TaY@Kg83*&)gzE4J+{Z$Vd5Hx`Kn@^`D!@OS%k0Te1%}q0x~mHC23eO_9AEAG zot5LBglpRMS7-htG2eRp!)DI>UShyoFo5kI{^#R4=CKyWdh0~@oFj_VB1ts0xo?o6NtF$8{_Y6w*y}z=qJe)XkfL)|L6810QJqKzzV3|PAHAh=nSTf z=Qa61;ZaJS$-#*=7~gIXE^M1wU#53JRz!H!y`~CKb%Eminh&PBBt2W!-%0;E zdl)$A6kK4R^*dH!K9i=0$ok0t>oe*V|5GQ7osmi?yCn9nJpgmTetv-KYj+PR|LW)! z_ZQBaaeOLpq_nTHcz-u;llrIW|C;`x+8@;cFYz_8*7~=z(oS$@SHJ<*a88e+@$cr^ zQm&i5TxN6YWxT*O^108!zir=UHE7SrU$~5f_pQP{#PZbQG%$8*+wsJmSYcJ2W1NXT zD0APVt9M83+dvK=J2UzEQH8n|4739UHBr#AqR%O!&Q4~$82?A%!|IUt5626c*%nf} z;=oVEP;=wsdVtLRU@#%ten)C+R+D|NO}?uf?=yqQ;s$X>XZ9O>L!^5RMxF+*et~+v zT`+*L;B5?cY9yV?JMr`f$O;6gAIbv-NR&;J*v>Nq<#<0=+oAGhwLHqfCWV7-^?7vqixA9+mPqn^`~tlK-ZfCDh0E?B(h zD3JrvAVy$g2E#BafIHO#Y1h#=T(l#H>ibpS`xYCZ_+IsbiLkYau!yDy*dlWO2>xX) z5>O}634U|i4(F)M<#_Mm{jL)WB_ZD*Mn)zv7AZ&v<}!8~+(0MbCoJ=R_`j(vPRQ{N z=aLCq9vj~A4BmH%6>)$yumS(RjWd6gXy5^BVITNk1kP8$6MuyduE8>#CsMo$Ls0(z zPq^e&s!8fIQDl~N7sXlm{Wh#hQ|V`>ewtYyX8MP^Qk2cs9yaZW2h_i!j$rKr@*Rx- zTR4E~+pFW@v^UVV)BxlJ`||7=sRw@Jo8^zNTY~@Ltf0h!N>)qae?3AqGrA~}7K0a7 zg*o9~*X8H+x2k`PZ#S4Vc0i9X+*^;7?J&=ge>YV?Lcg>EW&8B1s{Pl!suI+1JtG&p z6YOC+Sp+M!eQ>3H!ynr!=%HHo8pdzlHRfG(yU_%7i_svoV|ZqCgKywXZ9%lWzrnwb zou>S^=IH!@ZSBateLT&zH@B(=Q2NUdl)vF#t-yR=LuR--(f z_N7)WjLCZ^MQ5x8B3F4)dunp^5uEV|xchmK>*xAFyxv3De^2L*LFpQ-L*4e?0xk)5uDW1Ff^j z0cbL4m=`moLdU;H1aZcT8aDCSZ`h@YN3Igc~r$QOhD;JOj8moYI^OI(NkBCYWtq?`z0*kBS&A|Jz_yZzl%k5y=dW+cV1k$ zQB8Q!K_;0MC!eyEcl*tfiub`NzAF5}q0N%|m zKvh`bb%_B=qk>7@S4C_%_xf4SBbl&01=Vv0dw&+P8hiN9_&>id@2O0iurD^P|AjE& zOz4s?76Qe$rS=)WuX_~%2-gOg2IKP4irh`!PBul)5L+-YWtQyj+NhgKchX0N61o`cZ#V{(C0JipS-`R{mDk}b6Ji}NAH*^@2|aoH2+h1 z05bu+BUV8b|D&ji8iBtT>gD;R7wGSPzJi@{q-*q_*dp(HCP-?)^8pbW+A8_1^%ZHGbn19h8i%FnZKKPjSIvc zso@oI$Q4|q-|#Z|f<1hK`Q#Hb^KFm9L6nDhh9)UBvJSf+oI!E>gcdrSPkk2!vm{3> z2h}=5h({*DY3fkvB;NfArR5ozf9}=wJ?DSz(IiDc^S{IZOm0vegzvEvp8_Uxn3vbs zL3Sb;RY_yvL`Tp;u9JKGn`(>_WMncDfjr`~G;-cK>DeK@4P2mOa2Fj`nj@mvKL<7^&Jr?+y$X@u@w6B${k;(AEP23_s5e?>*Dcr^?xkfY) z5!mRDvJzT<;N9DMT(lz?H}R-;1ZV;$&~(5-T(m!}*neACtf~2z=3fJUX8QgW185F# zbx#2(?d|N574EO;UuAt^)+zrYyC>eDS8%RI%dOWHn?D^tz@-D7){nZvyTT!pC){1 z{}0 obG?>qm{>IB>37zX|O2F^P)5;UIsohyM}$wZzxV+6?|5;?4i$ENc4K9&Gnv z?EG^4yLS3q>1A@+$q~qa|wXbOEhJ2_M4Qn1_C z9GG`MGIOoTb`8eo?Z*#=s5nUu7tPNc9NU=#Ur!7ELd>9xO?}>J)UZV$tQTB3J3dI- zzb4tJSKj#l`z}JP=>M3ZzdZPcRbv&x8xi0sqrc z1&+cI_Q3OB+bM!MP!`@2Z~sjd;Z1DH3i<`l+bQ|Ro5^rQgFoc}u3-lXqqyH-2ZSJz zPj@Dc9KqjbgJ)+TXVQ!3t$>xZg$;y*M0NG(@(l0)0_4B&@ULzmWd+596#Xk+_j5Mh zqP_(2*GXX$Q?NyTj!8?r;6^fzFX=Zph~^L^=FdwO@Uh2?W;vPMeC|zl0ZQNytDv-~ z+b<;+Hwzc-zmgG)@EUKh4*RdkFss4zUb23Ffo^e;8?2f&ocrZ?iiJF46_z53mGGD~ zqWa)H{6u-2acJPM|Dlz`TEPnK1k$xnrRn+8RO*&oG^t8Fwht@0D-1#NYnu`GOB)oI z)efMV3udsd+ID5Pv=^Xu_RH?!KLfX=wVt4_4GjJP=Nx1&X6v@9DD1Ki>HyNk%+xYU zok5)Gu{ZY`ybAM%<;xe#tLq}ZApGlZv3`T|MBY6nKPQfm0Cm7{e(`^UYpDWyrEuR7 zUoU?LyDPf)z~CO+7YMgXVLQx3A6XW|9Hc84o22K*FbZRz^!YOo(P+=#mRL*0@qIni zs|L{Y^$Yuh!1pLFL$D9({h8{U!LDB;ImW{OFK~j9zNJh{+w9-;|KWct=kx$pek-`w zzRp|F1r}iA_i;{DV;YSWh{O6!Y~N=c%!BofLLuD4YRE)oZchA0Mo`X;-ga_1O_|Mi9F;1Z>{&AWXa zxLtjQ`SJK6-b;MH40Al{k$F%QUxb?RmM(W2mI?<=AC153c|nMJ4SWXI~g8fDiYH3oxX+vwFdt~ z_)*j({;wUrv;$Z_tb(HaUp%Z2;{S2%^feRw5B1^&_5Y{_c#*HQwH^H5h1tpbOW8ey zUb~O8sk6Eg2DgoK`zNC~j7+l^VChtp@tvVUL zOsq$#Qd0et|JUT}1gz77Abl{A`wRH@9Z)k7Yfy~{R+`{0I}uuc4-^(vy%a`+cuB6| zHjH34wfVo}7wVxBRt6t=L2iArkAvU^KX6+uvT=pb@h_prPa(ozf`wU4hG8Wcq``+I^k_B zRWvHVG0=Y+?La-lzXtC46ZyZl4zVURk+Ku`HhF68`lH-mTkL^YzdC}=+ zdZ(1|kR86p{-25eXV9N`#7+>%4gOWpqgRy8Fu4UiM?ZQclNm6dRGNe|M&Z9CIg!>N zT@yVAfMw|>y}90(pMf6s<@r?)JP6)D){6kfa{DlkG3Z&nssCwb?e=fveEr3FUB~Yu zoWUp}7 z;9}>p``%6MD)&AH&pVFVytUxp0{_|Y{h67|*_TUJXB~*lMeZ#>J~K5s+6uC5_0ae7 zvl`U}=Xi>j$#uoT4rGF>Hp3HdCEvaQX5J9StoZ=NnHn~n7(5qRLq{@;>v^wHPCB=c zJJorBHP{CRm!Ltmfe8#DBT)@iVlTj?y>SR3zeW`e0V z$jk&)t}qd=(+S=38anD%*udXlAcx`qVbnlMhkS<>Q2o(kc11YqWah{ucK;$8D;^w+ z|JS_HCs*iM!K((%H4v9JM#%L~uR zus|z)75x>cPnf{jiL~PdzVPs`s9y|0USGB-#`Eh|V+F)9{@Wca1Nbk6D$)k53-=NH zuf0|Dm+Am}fqC`$_u&|J;1r4kXX*~WPKX@CAbw>p&$Lp!C zO%<^gY*;a`y518JWmLr9k3yFl0uw1gteOpfr5%FmgP#!9IPIw>9E;Xa(7EC?a;v#> z$$Q-=8+V-EfZt&PEBJpXbqB+-5gV~fBeS8=pi5K<_ z_{J_Y{u_2I)>aiPRRFD^AUy-$lfNtvpD4udx^3=J6ZftP^@*IN$dZURLuwUvW_eKvRG%n1Oh| z`h;ALj>Rzw@LRP3sfddruwLiLWfUT_GL|gkPL#hlSi*n#4EKlzBHN@S;paVbXX z436aID*pc!JnR^3#keX@6!Cs4|1f0%$UI zPwYS&9;3-WO|b)whydjGRRyR@U@3r_4yZZ6d0_VP${7?RSfv9GiT{V;OB_3ceb?95jczIO^HnjgFUP6 zzb8mmCfp&imBOX|cg?kz4bWVhAHBJM4Peb#JjR+1TU3yqz}Cdx`9Sd?&i@SJ+-A-z zr<5DZ9f|T4=3D{wGs!@1B^JK`E*8=ubc5XZN_evN<{SxUXa@t3bxVpDF9VJTzzRx% z(|qUx58wj-qAq6Q_P#KDRr;18)@X#L*a&OV4NUg{`NMgw-|75|=G8Z0`)2Tt7l^=* zQT@hxY9r#%*Q5VH`NVGW#Ehwq*m}Pzzvr z7EyT+%?Q!%0I~=UwnDkTiewao|Mzf|szd-&sfRj>*AJn$JOuaq`9!PuzZy|dL$|$K z%soPGGDWZ(pFw+yYiHqbj%I$&XCWAYZQlgrOY!|HSRdQ@dnc$qjaR>lzu)Uc{F(-$ zm@$&;2eB8=QG;HwrlMFmk>mqz!4l&HzVY|AZZLtSJGfRwpBTL=dsXpk=6{&osx%wa z^sqGr_1YK2%m>#jaP9x89l8)hXN(Sb(^`+eaB+6Sa7yMMMo|6AkX ze+_J34B!xa{y1lII~HLL7JnDF9E91O#Q!HEUcGDAM_bzor+3; z516cuG8W63>=p~ncBeR}!Ad)Pk-F;p6NB#r74hggZ$xcyd#9H(7CVs883x82a)57n z{q1vK%$|Er~y}6APG%z~o>>J7)D}DqlT5nda_qWYT?4 z@@+S%b7@Gl@ffc^0Cdj4|6L&?FD)z{zr*mx+xc9YLO7M@wt&$W$HQw9_*7nHCZD?o zKXt)S>hVVd~!2s?KH9lABO4}-a9A6-aK zgXO8Z9S9a@Q2*5jJ5`s7N0U)5G-D$*%%&`}Q~D6wjKCID_UwXm4<8D@G(f3*0q>Z^ z!&7JCS(+NG-9UtY`Ty_0zw}8TpH&lzCt`a}c^Ox~bBS7j4cNeq@PKYa{}bF%?ziqi zm_httd(K>Xj$$~!({mm*$GHd=I1HUv-F(vi#09spF7^`(UIXVRVE|{S4Y~l*53q7H z_j4cDq*A;B^~ZR;@PC_#A$6d#zrPht4oWisO5AW2ORjfKe z;otNE*GK(R)o&Gks$vOL8C;c$pQ4_=FZDhh_-|v?3%s{~rS7RjkU4hjudDoka)0uk zdX!KqWD8veS>pJ@tk7(*D^4JYJjV58=823`gy zId$EA?ouLvNarmPP6v)>8eUE4*PdZ{h^Gqhw*&q)=|k$!Hh7@+hTY40xQMcM20L(( zim-F6kVw{wvI9H0^#%BU#_j47-H)BP&+Rz^b^SxEd#KQT@I&(bn&Yi`p3?qQ52!d* zb!xvpNLc*+a3=6Xv1llnglyz7`M)>l?QbN^KTqo|=f7U2)#|84%IWc4Fq zcN;iQ+pz?vxEv+|*arHyVA;=eE~7ZdcLP~r_T^EO(mL(%+|Tia2QR99RWGb^g2`B`)zIooqA{q?_#hQG zUr=qIg1CPr(Mq164PS{xl->m9Jrq{_Z}2Op7FCF~s6%*5Brq2gujI4s0?Q+?0_)() zr}5x_6TdIw-X*;9Z=T0)hV{NgAOB43LRSzxk19LW*}M-Xrn3^^A#%Z-T< zLS#28!huGk2nN~zxCS}63FJguU{(GgVu%y`751bZw*BPWEWCJi6qMiTQl9K(LcZa< z#o`z!3K0I4|4#)zwKGaizPtK^)cxy6yDv+v!Zxoax&X(05}Ly`kgq=Evz)iR*hNiZ zco>}NM7WRLJ?{7J4k{DFf}J>`NjcW(zeu{e@UirN&Jo;B_NZ$Kv@huN591bWF_ z)7TNi9Ad19sRD}QAy^T;;SDLkH_touFQm{x#ouD;8Z%_)e z!TvGS!bimG=TQ-E;zKpX;{^V55;z_Xk{)tvBsd^d6sJ+I{ zwIDB$7wzy2wLu^4^u*)Cu_&?;*I*Eu8Qha~FbxIqD4sqq-zhdc{}njS$~PZD=b>^A zH3#N#t$g;_`eD9Djdf$kCw&)>ybSciXC z=ihFA4zNO^@EUjM0=Nki*oQvQhxs4BvR+QHPX0jyxWYO*2y48;WA+A020HtHv!1fz zGYX1h4q3ssvZ8at5rXBXua}obHHNQf#Fl^L+`D*!oVcul-WDDf& zjm9T^PxzC*r)TLkVvujVy&k7$$Vw#hkSt~(WxyzahEpg5IK+3ydKM_fIvNiC8wT22 zwY+yxgkac&n1tdGMG-N#D8Hc3qfe^rfHDb1Id+=(-531JyDR=THB{nHW0-_A3Eyva z`yIwH?L!7&1nQsZ0aCYcEA;=N)>-2J%b;B7-^2g=INwJ(W3VUB>Wk6c!OmaiJm#Rf zZ7$l;8s`(WqxZCr(gzvcf~uOmt5pecM)l<=C6CG z`*&d!eqJjMoFmLx597E*9o{Xz$!{E?>3HQQc2TUwLwW)a5D)xJEYS=Na54-aNpJyJ z&daw9f@BLE=11XJU`LX1SV=8XUE+g;;8VH&_aNQJcm9Ul$4_V;Y2iR2FA~Z?WHg*C z#cMkg^$fp*`3FQKib-z3SFU4quVCjUU~|p|dpb4UBkoK$y*t?1K+d%xum6mEV?tB~ zS%4hGSzn+B#^ToV_=L@%U;I$|zjlB;#;tc?`p@A9$5|<31I+?IG5<$%AfA$?cnR*0 zd5=8pWeVyA#`+gpFY*7%R4evWcaQe>{Tbh`ovYNTqUc|dtM;(e)G9L#Soe4F9_G_yV_}QwDQm*;{MgL*}^5Djc%f}iP zFVCyYo2-D4Z62fFdW7tP!M~{;HeCV6Uz^BYh!txvwjm~pFo-r4fb!;w?~{YR%hql1 zKOO)7-fkc0Vb$hc%*9|{xYw&2&A=#?%1i2XjRnyBzwB7Q2B3Q|7?+l(A4U06{p8&T zQ|mJU9;IEEhT!*2K2Y`lniOL832#aL&#%@^{Qnuw>Q=0~E_<-xn&7sZTh?&d$~EEt zJeqGx)c+;HLG+E~cdNSz+#$|wR@!4S&Qn;WQ$XN*dtvZzr%LE!sA zg)5+yS7F7QxcVjRycyiTiC2?epKL&8B88&p?rEq6NJD+@LOkCDkkbka@C|WAHP&cn zqT6=-odNH!>C~D{uX>ftc*BXX`w4h#)!N(y$w!FGOHv&)25mA6k4*?qj!(?ohC2Jh zR1Ovb%~_nnL>`Yp_ildPfXsXRe*&ERjTKnSXIE9gXqdrDxbr@2#6Vv4GJS=gh%k=u z*I6DJi>aE4QPKT){i~<|55ZdBU^LlD?MpNapIq8gMF!gk>@UFOeqOHupRE*?&(-i% zyvAI9+eNtg9G_NxQ z)@_8npAL$2FsXKY`loQ9kFcEg^d3a>sh(p6R`PCBU@PA{DcwnKU+RAvIuq!Wt6;z2 z%tsNqr{rj5=aL)zXW^Aq=X01_3;-z;s_eiP0+8IB#&7=8}a;I109(Exe&GZ zA)oL${=!TPJdFN#naP05{Tr=!9{-mH)r-|Cbx-?xXn!j0Pcw+MDevEx>&>wastQz9 zfaU=<=TQxbc(t#krhwLl1(f&l|Aqb+|7XDe5B43iP6fWg!%U%rtZ1N|RTFI>3%Hl= zuNWYv_eYpFeYwihhj|Dz8h|W-xftxr+ZqMXumV#NXxM@*gRu|hx@?B25|lLBEY{sNlcfp$vT+o0TVswUg?lVnb6;=bjXYSYYP5N z#MGB#)*ZgomRqEsbme%e>!%k-unQJq0@h$G*jGKE*p+IpJ99*r`sQ12{98GL+p+Ju ztl>N#z@lpgn5uwv)>YGS9aeCG2z;W=Y)vPN+twX~1$aRHPKf%xid66>Cu7!#b#}o? z7s?dtn^&wPsaegi+>2h)!tBQV2L{K~`H zTTx9i9NaG8tPKP|H?bRG&N<#k-L#*B;mp*|PfcSA&~^}nttY~1$5fvVL@*6KjB1*e zCYCgT(}!UT>yqsV!gbQY5^8fiCK4Szgd;TNF&VH`n!TF~@BTZPl+##&{zT(a0Mrxw z0(8aVF$FjdWnuiuz^J_TcW4HY@S5yc+J>-{ZP>HeoSk^|J|%QMpaDL_TCGF}Rb^zj zbIEDuc5@TC^_&60UGR8E6y30ygMunhigqC7OZeXJ{FYE+tVKaR4I+sy_-Tr;-0`doIQ21B2T62Ch<*ya% zvA^fZj5aN8sy+U`JrS+`Zh^no9zaqJP3OPq38;epr~03~9>%2rjP_l}yOu_+nZUWv z6ewy{!~bXfpZ8bijHv=LIRN9`gAUdP;AYL_!ti$i@Jv`Ox102jPVhf#! zz?S<~GmmT^5!_a|{#wrQa+F?Wbu|Ov3^qW#z|8(VixvMEXifHSlvCT?;2wA9x;5PR zbddF6N6CNTzfXcWoqf&@cW0mv0zO#GlT|0teVd z%&`cRb;bYm!7df`;(ApuD^sdIzmZHJc*LZzNdA9n$LAfo^18nh4LHHAs1#NCb~(X! z3fMp^Y9UWz1EddX|2<6se2biz47#}#~KM4M3 zfpcZ1B0z%huS+{ttY+8={rZtMrQSfPTmAUI5uCpUHb7H?rT_iN|LO;*K`p>{#Q&P_ zl^OP*gY3cw%V$?anf-yC zI)Tt`q6@vQu9;UB1JHXa6PShXToM1TUMeA8M@=~sRsX4aN`GtDZ(Rlv^N$Drf55#a z(FZV+BP|=zg(JU)cqs*FKaE}2T-S}@UtL_v_FcegU&7L>hU*;B+yykiXMti&ydbOQ zhK2Hn5{J&a%iZDRkiy)H)V0lb_Bvmc26UDc@F`a~Q%kIN#e0q0={M#0;w!+5)+Z~e|> zfEvUEW$}46s1;gEJ$@HZ8y9b5_aEoVTq;~cx zoc|_~_GiA$GraD6nD-j||9z_X3gGvXV0|2rD;pG_>&0LJL$Cq^;5K`)1PM_henUZA zgCdyqzkIcQS zg?$~5k5}dYNj_B&+gy%IPQZGXTb6V5r8+(d4sj~FSFz(!&br_UY{_wI{Qd;Bny{v9 zY6jjv1J)&I-+>XX#l!!}3i*rGa0W*I)x>v!;Cs>GETmU}3C)`T$hZqLm$i`d1&MYmTLM2Q~Wv zX>y=AKy_k(FUjv`0@)eC`5a#Ye^M{IHaNJO?*BAac_L-){ioPpGeV4>FAp9Q=c{u^ z=r=6DU{&ZA;*BCG`yf7GZZXQCVggkX3ZsTM7zS_re+(}$8ABmo@rPcewQnH`WlGl4 z1TwVK$WS!%v^}9*R>Va4`b+O^R7s;Pn5iXF|FrLSQSzUPo8;e>^Ao36_Fr`XLcX#B zI;uL_gT3yb-#GS@-~uCI2GRhf|84c1va)cVPGYG|kM}CX^`GS1Poqn{he4-e0@WYRIVNLNaiT$3OV)51uM0;t_Z#2=i$RNeVv67e zTT&f(p8DLsunV(M$ac_!^A$er6e~R*T>cFBD?vtm26{nk^8bXXd_jix1_*sj#lN3CUMVb74eI;TQ?0BC zLw^zLpWu9{;=Pr$^(Gq2FKO7)8 zwq*zQ>m+L8FT^cPIRcsJ4rvd2_ztcz3wuxrOsdmgwf>s$t4{r#*q6N6i3TvFLwv%o zQ4-g~^564X8?jNlI2td5>8NxlLC)bNs)XXAp?vl!=p=opjLsfP9?IrEB;#5Mlnddv zIXY(UcUmlqX0O9vzqQ>6RvWr z6vHSi!F?t~ZSpU*?!!S9-zzSa{@)lpXlAV}fO6M^Sjp;O)x0{*36SouIia;s{G}60 z12DVVn*9JO69H(tZ+g(L{V?bH(otRaGv{M?aGia|AF@iL4Q2)PQtve*B&Gw{sQ>b) zLb^e_!JzOg+hDSM(*1>X*#+U(T!hOQjo?3KApb89EhL*ujGkz62eL9vebcSkfvjYX zX3;~!%w4M;mce8b^=VACkaGSe>NlTFK0h`0>9tdO`2UhjNHdO(^nFeLR!6mBe^vi$ z!q)(9F?|7=^Euu(h1n|;JsofWRRNm+DgAXP@lt+#{0Z>C0pzdcJg+8d+s}Ev$eDeN z<<{i4lbp?K+;X1yu%o>!SjMd%Iv4WAdL7ypY7z!z}z zBPigrKtfr#Zb7{LBvf?mX4{&u}7RP%E2@p<+qc(-=wjSEXJOx;C8_|H5( zS7IWb1x)yw;6#&|?Lo|S3dQm`3?LagOHOo(>sW)mM8*-QEJMi*{^0{>`zF z+RsB773lz`7f|zk#}MhO#!psNRaL`L|3-m+?Y$s9P&F7js)wjXCYEli>- z+S&*rkGbdu(}_h!g1Mvg|EW{x6pDK>;)51wn{8k(HK{ImMxLY%7Ap~|onm$=WoE9g z%WXneMq=z-c-;v2{bP7YGc3S<(3%8q-I=Mp2bs?O8dbG7tS2|0H5JcNZoqUxgn`bY z}6hR zG&+PPy5*d7!FqIZECIb&s3K0nJEa2s>gCj)KrcKke;-Ibi$8b-=FMJ&F52J|?%U3M zfW@#zDaP6(RlFv~xZ37}I^rOe7yRgW_KnnbPav^1l$tL2>seQOqGDj0jL&O)4)oT{mVl%ENrVMZmX|~zr5X?C}%|QH+w$Q^^4&B zGjp%1{$g}|+J=21pnFvu6G z#T9g$>`7zaIBRquHQs*#O84PFq}7*CZtySPZ~VToF~)}I7HNL6LVB$f*s`3c9yRda zre;!#zao88<mOX;se^soKeH+z>= zoXHhj+r@c(MJ8GuXt#NUVgz*tp2PM}v(E=}(S+7AG?brop_6WZH;;SWnaO<1Sk4OS zTI9X&db2h+d!4lJ>4?w3YW|XS_c+)JmGHi^mE2!ybiqG`(^=kNC;@flhwtqpVDu?sY50Hk~ z-(=I2AvfCjKX|UVpeF~sxdu^14}AM!IQ|p+9Bg1NOnLxTp&OM4{fWIh!6e$F<9DNW zXa?Wp0DNQvkBQ)xk;Lya$u5q=R=j53#z!nkYI2tusWiL*E?bhDOUnBzW|v|o1wuR| z0sb{D%9?tm6}gY{RQsZEh`GcM38{-71c$oEbgp@PqsMsog5WX6p`O$Up=Q%=)=(?)!D3@`WoL^iNmJ}!xr?C)=;Kf5YuFc^rn}fH= z)QmyH8R8TTmbcdj+6TH21Kgy`OA|?QaSXHaS>t#NK)XMx-tRt$e*p(ET^X;qei7tr zGLU?O*&|ZB#HlxMEndZFM~A5n807D0MUsgc0@j6e#rX35>Pl5rs;q)yS7oX-B}BEq z>IiJiI{nG31Q3>=Ep)soeop z{V$Jix_b>r7iNuzH*vPmta^Qu7mPuyo+aNa<}W;(7{H)e=$BF`+hG`hymL&AfT=~c~Znux^YBEv7^=cvB$ed%w9Rabq7 za{pUl0P6bH4ln2Ml`Lg&bD#KN7kQn7Sa_Y!LNI_zQ~<1WFT1DkHb2oteuPS%ykK`6 zQK(B*;9jQCtU`lZhR57Q#Qu!QIB&s8Qmn(_U{$8zq^2+LPx5~4@c#2z>r<$V@5S!) z8Q=v^SheX{!M~%u-2|7)Yc;`}m2{>ODa3OvcNw|E+)NS3jq0wwJ|3gmO=Nn=3gY^& z@w|D!OmeWMNg0a4wMX7t)~)dO1$9aTJUssiyC08EI140C0@3}zd`B*wsG|J?&cBwQ z>D)en?+|Tk&Tw(M6po`j{DMUo%A=H*oCz2B8_TfQzG=sSwWokboWM%d07Z#-e;eG# z!UE}NYIa9_u$&$2E5lY48#IqPA9N{K)db^zGJx|FvP-#1f! zHJxGv>{Jn}eAFPA>u4;1cCpfAFwFq_5eA@LL9{2h_WrF)9bjdz{=Ya#5PH&L12Pi{ z9QSo&x=vfXYbzp}#{S({1+i;WnWM@b;oNw66V=O?3-hKzS02~!c;)_d(Hy=Q?a$y) z*Gw0&@NZav!K$o=VF@uxfx3_KdH!g(jtHZJB1Z&d7ANhZ=dd&hG`5R(*ee&d_0EyT3SNo3P}{;b_jw8St+)`<`=u3Ld9@f%b7m_reIq z+5>_=GgmLIn}rEKhpFJNNFHnpekCPQ^C}|dU#UbJ4>G2s)-MJ<2l1~Lu>%k71at!| z4t_&tZhNf z@Y_Xjg%V!gJ(cs0eBDMEUtV;-q2Rwf{y#S{wv>0x$on12N|cYEzSbo$084{;G2uztU21xzOsv96 zX#e2{sBce+b>6c7S9vsqui!sN&>)LrZG?U)0A_L*K;$ze!v>Xxr<5iJsfiWYf*=2q z%7_ibHf5-Zp3PkDXpZg!n0uz+FMK2MnM@uhmuD`|@x5n<6YY#cc|1T2w9Gl|{u1gJ zigt6mlj&$WMWz1|6v~@qDRQB#mSO7ebE1KFL`yGFD0^_k#yY#)wV{2XEp7&9gS|8G zWgu1{VW1X~d=if0e6-d1*oX#%zUZLFiL#Qq-oyLf!Q3#+j|>vFi~pOgVm)_MfjR3D&y zLYjbhsf2A|yW0EPbPcKYr<_;+m!D`@b3N4kTiExvZsdm*!M1)2t9p!ZYNCDF0$rCEH@-ZEIS9{Y z{~jT@CLQ;U0xtUBGHO%r2X0s+_y*E1^t#d*^lb5e{U2jdq+IIR=C!o**SGM0GyPZH zJc^(OdFYpQ9Z0M{0kwY$$X7;XlBfLt>O}>r|JD4Z)*Q)R?EXE}KN*Xyc|WoM+RsH( z|FsLqc_L+@<_%}`G7MoC=vS5SHll%?#J!W5CtZ(dz7c9wz&Q>!N`Qg2#H1bI>#ewS z#-9#gb&tme%;TP|;O+uEAUP5D{9tY7&&;6$^*c8j?mwRhUi?4 z18X)CO{_IjGsE0l&UWJBm-zp8&N`yxdQ1)|=5gC?XbXiw}b) zMF8p&Qsf*L1XY2@rzPI+#Tht3o__@VIUJvzl1p5Ab<)A%!?_egfvCXW|M02T5FdO= zbUy}VV+u^9ILhPKuz_%|S~(jre`{W`FlV$W+5B$Q^km}GEI^-=@09-UtK{OlmF3uO zgZFn}6`h3P|HEFM3Ecvr#i2@}VeU~BggdbNC9r~BAU=)L6uY{FYRkOTE0iP$lh`>z zg~GkyV5gfqB$P1L)KE@$Vz8;bCeSEQA#`0RhMR28T96<|x@G;1K3;H#O zA>gfx8$^ZL3+O4|Q7lW<$=a#pC2El>$Pck{E@Dq20vS=df4Zg&K?IR&dr)sG0F}#X4*tzFaP0%i`%g-K7x3L?`adiV|57(d z1(Sb?mm82@6=F3%M|}XY7iQ*%@Grz0zpt7bqx}ijCJ&&9UKiuT4XYQ*O;%rz6Yhn6 z^Ox*}lml6d7+au7Lo7r-z7`XA>k|e}_xS&VK(sXy^rz?Xrd~iXg8tU~#bghSs-Ww7 z)s$Ged{qC6zqjLPssdQmlbZ3PT434KAslDb{7k?Sj6rjmiVgUk{Qp!KfOHl!cYTDf zwzb;761EnJzn2Br0`p(R`BI(tdCs-;<`>{!eD1KP?`-4V?P!9v@Q8KcSv&AQ3yA8g z<0}tQ1KgP0dO7sBa^$yufI+sv8uW)Pk04H-foDAck`jQM@9ix{T{#@>l)E4>N`E>8LCpP%xe9LX;un;eud~QiMEjD8% zX}-t*`+0v^B5@FX66M#^faVh1+n89RKOAX0Y$FpIp7!ZYf-bUvqjAD{?R-EB_>0QQ zMRWjYPGC+ve=BN)W)V*{MD2V)ypRM9r4h9}wL=p_FWr=G53e?HFR{dNY(svO)}79K z=NaluZ89z25iz~unM>hJW#C{R-It+^u_}d5V`mlbaDj@(KTc$y59;!VQ#{&`u@h@(iDH2!ElxvE~Oh3f%XX@OQFKvi`clI~#D( zTrbo2qfC|dr7@HLRnrpT`KWf-2UDr4xi-oJDEFs1pwj;}4M^EP&Grx~QiK1;z7_s4 zb{8tOY6qzf_0J+IkZ%=k#Ko0G6BjW4+<0uEOA|qaeS?1CPaaq}7qd6m)-_`b{=45G zRre_OCu<<|%hu?TdKW2%2LGl5xu&naRUz=)9*y4nUGR0_p*7s|?Ru`sH5jH5qXd}u z*5}v7L?D{}SIYDMnwoBU{fEK&wXdh@fYlW+mTaGDel-DnGIdeEksF=IZM})R%#@&? zxu+x3(svTCslQ9r-COy+34Cvd?;j)HGy6|G^?05-fE6cbD#%_m^dFgwD=a5vTFwhp z@I}PJ<;Y0q!S^b%EkGPznQlF4Y}!310xmEa-+P`ql_aQvRbZ!sok4E;&;z%)d)zs| zq>j&27T0!ryHj8WUECz@X{J;@bP~BG+*)o%_mXqVDN3fXJGsVW?nibP*bP@MLH+&= zYG}gP!+sfdrZtvF>^~Wqw)mh<6LRChVbfs~3gG=`+j+q6q~NdMKekf{Z+H*&z$W+j z62$BykAEISPh<6u#UodM?Y{+W8DNy1K=^j*ey)*6TMsX}LCwG&JoYQ<>@4Rl-)B9Q z1Cz;4Rwv`}1pi+d7LtZzp;$j1_DFTTiLp%b<3(Tqb>T>3$Q49kUy7hvEu*3!322^A zKIE3;cV9XqsV|-co0yMMn2%>faMU$*ydX70Z;1L!lQT(=hcDvh4wVV@BQDD7JR%=@ zmq;QlGuEa%QP@-$?lhjLDi75bnuIun>V`>t+wyR*(xF(f-i6|00WK1eDvn8kJ-^Md zxlR;)0sI%>ldJMT*-KS1sqfk*B6#XWj+*%W09){c-*>n?AO?6umhe35MbZChDudGo z#`xb@HLN47$1bpX`SGTBclGxwhSf9*P5l=yHPdUf50KWWR;%WNYeJB^hNTA7^s0c> z3s}mV{iB+GRrVC}z4Pt$Pq#I<<@+FY(f;Yg%BF8#9yKNk5RPIzw<2m~*bH}o2hc-DB{oT4U20DBi*RGOJ+VhCLj$w|daB zUo)X3J+}+*#=DysMV3VGq|d3CU*Atw#dI;`r0=Z_L;(>&MWjIl zX_0QEySqEy?>dk7{r%sU^BL~FGiT1soH=Xnwbzcv|CZXe`*`FA;Qt>qJfXh;EMK$i zRrjk+dU-zlZB-aaH?+iB?Ef2_VIL}E4yu$6a<#`MoA4I3>?(e7J6`@*(5zmWA!r&! zsHv~VZ)SGE18NN}Q#G`QJvHlNKlb7tD%*1`hiu1B*onH-4!y-1X-1LybX$Yo(%7H0 zoF9|>FG_VnCC*MO&fp@VDF-!T3@qX)HPk(c{%@gj6rekAE!7g1|1%t524}k)TFPA_ zg%8N!AM|pgkn}<^EyYBEEB7u=e6{DS$ESgJ^CNwlX=#-Er{6<{q;f?5Xg1!%(#E|7?w^KQb0Tvp-GcvYB&~ zCsK(_g7PEAdYYJjIA~YzUw@E4j+^QNdT|?yEto;)^?0m97oMf4OY1K$jx4njhS^&2 ze)a#W3RqK~))N6}^%hNcJca&$i|_M1-}Esoz!o0Uq?g@%%Pu(A8qs33S}$7lBC57E zb#9s9lNGu0>th3&g92T@gJHXiQO^EF(Jzh8fdPo`9qVN%@(%&VFev}ez!e)6CY=s1smYlH`1Nqxa({O!m1cg@5}f(;V- z-w8c`PO#Ph3)PLR-EjJ8YM?%>rpsTtS=3ig>?U-wGx+l-bPpZiZ>>^%3|22YFck|> z4}YnZ^i<<>f%>|~V1GYT26l6l*>HtT*n|M&y@3m?B6j!?<{aN!Nrt{WuR00dGZ3U# zBQ7b-`zu91az!4g%DHKZNB;o@^0`|UMsm^1NQKmFI8P?xpU>bxNrN9yLEg`^~+{}$bJG(RiBgFGUn<>dOc`f&;FJxrJ8X)>+L&{T(0TU8K+_Ac*u z4mx9V@L!Ji*ofGzEF2(JbbfSH^kz^VD?A_N^^E^caGj}XBfLL(*XiI<%3Z2{QA&y` znO?*AEu#IKA5&+Hq~FcFj})szXpSz@+;t>!(b&_UlL#ph=+B|5N`o*;Bk(zOiT|k@eW#?rL@2 zBHl6QkTn3iAk-PODk2xA74r+{x>x+(_imoTzmj+_gPYKv5oR#7m-!@mP4f=)Ze@uK`!_L# zEJRvZPfaYL)=!guq8gtsi1SBt?vz>Sj}oAapVnCrKNtk^r*V_2s+Cq$7p!ifja2{U zdwoMt_mZg5ThRgb_GxZV|%A)6~BZs-{_ zqfY%U8M)TWbNy7}YOh5$OtHY{@ZFh2#(z*3lng(#!yDlbg}Ww;j$s;gjbIF3>}HTO znmzh5SP@JQ=5y;B)MQRwqhN3_FX#p*{)Oz=8$S}9@&Dvn9mzF6ix}ir;*8q7VmiE) zwgkMJ`21CZI^2%LA75g7MxsLOrVD>OJboJy|2j~<6F&S0Jww~D2RG5j&x7Wz@Ol@W zdJhf51lC zQ6;dJdZPJZWYQ3JQW@R9AsR&;Y*HJtheOGd{6!>H221kTEA98DG9q434Ldg}_$Bx_ z@Zj`KSg~(1y@GG3Gbl`*(Vs*Kt-<~#e=GPN3r8qT{&g``5tZQhHCcE49D3<}o zD6O#|70^jl1GJR*WH{EWE9YJnl(n&S<*+vKqSK;7hyvyYojKoAIq!{`-T1XPhd3oU zmQ-^`EdE#a@*TYYePTn!`qGAub5&>(*uSVm+hK^?L*}T8u`}3$zRpT}yH&!>t#@#s*P zmiSW_o~N#Wo{`;=yH*vxqmyX3n~3Z=W1xRYr~sO3AkF>NoR;hpHlS~L z54Pb*_}w4o+rN&!EsaYxLmpR&R*^1hM5^?x<4_{Jcj9~!+Zz;^cyF>h~t?oIzr zP&aBbFQ{iQlc^N9z<(jG#r471;A^~KTX;Yd`U?7TyNjOHn)<=5WB}%Z{~c5fTt|8T zod}~Y-c|E}6JmQ(!$p!42b6$!3?MF;MdUFZPy8+T&xTI78x$`=1=|jf-h!t;PIb&m zeE)s?`vLrLd~lSW8oHgt3InN_`3J6l;lFDCxqNp^xL>n`r=j+DBbHDvllq5mV=+b& z$+shqu$ot%M3>(&VvdzqfWdV2Gy?Tau?p>BL@h!8DBjUR)cnhCQH~gpN9{$H^Ci_4 zl|kY(kl281$9Gf(+5SQzriv&Xy?9qe{TX!d-k?tCELo9Ws30|&qVg4;R1?V^u<8=p z-WFIv112q3Bv1M-RY2->{0+A9EjC~nR!tR_WwCARSeLLyP$arMx+K~;S|<8lv^847 zpR5e>sW%d(LRCllRyAi>Hq~)&gLQr55Ah7@47q?-beULDm1NtvnsnXl=E^vSV$|Fj zVo$K*TCuI<%>P>+P5=?>SH@a%D2Aa?>$+9tj}&Y(na)i8Qb)U1u9gm{iU2VIbpdHL z@G9UvPssj-ZROc3M2a%~|D;Rp9||)%mGu$0H&cI1EU$>%0k#Bc+{C}aW5W-@k~MJiQ7Sq7uvNkvfHP!1dQ%wFdX=9=l~6>_uN z3&>z7hLOFI&CqL@S2tEDMuCv^knhg`{_~RiXu~-%nG#fj>NT_^1Vr`Rb|f>Vt!QsEv9m74d080@aiV?6DN+Af`2Z+=bsOpXr5?=Xu{}^T>BM*`cw%t2#T_jNbKNma1e_c z!8Ulc9&`=tfd9wwKk(L3ZCjOB%MSNX2JThen*$x793FNA@%3Ni@YYd<@H<(^Be za=yi(;BgjRgcmu=7WQ6FW}z=#jETLq`2LO51Uw?<*bE1l0YhoWJ8Dl&VLNO=N4WoF z?7}iK?MJDQ90qf54rV9ew;%d08fQg1sXFr6Z^LuCQ|Y*YD#1n|cRQ?oC8}OJVxUwg zq3d~87tp`Vzl3UN2e(*d=tsH$YSDpNjIAtIpfoi>7vV4SIpdme*q5A1EzW<3@N7)- zCj|qePor<5&!fp=rHOSQYDJg%wY}b)$HaW2rtdfk`nC4saeT!Nt_9_WPlNrKiT_$R zaviauI!UA;ALn{1=X9|LS)ne=h zNd}LK*yWw|m)N?Qwx>D1#(N97h7$U)urdCLQgA_$pYw^ zvJSE!LioFpq}FwN2|3F7`2SLFL3B zhnpgRcfn^-?yZYjI2C_*%#Gr=o1n7W{$KuV^4EoR!V0-lsONF%WXMAwPJE)~^Wkj2hj9M| z;Jz=J!B0TzA}qz9sDhty-yD2uZ;-SMeQh!pp|`~6mF@!L^ND>vM+FuB zyOJ60!e0}qvH1ndw2Ku+>Y&@VBTqMmczqsNUg;n59nL`+s;eDxA(N=&S%n4YOB_-J zFP}1~gfiNK9{x1J1#G}BGN)y@FK)1%Gt-uApVs>>NPR{H@_vf{k7At`@M))EzXp(} z=*;#JpJgig=MDc^up^o#R^?bdWA%;|Kb9B$(oalZKqjoYRv3H^+Yi8hl!;(k-SZHr zS5L(?u7H9zg2I#vIttJHJ@$^u9alp3fxpf&02DS+QJ9$8*F1^Ix+R$WKazo(;? z40FcPTPwX>NRrnVpBExc#h&qmlYx?to#WSdA_7DAri*bkvtiof9jh7ssJ z$O7p3iu;p>EM2dqh{8k&+FuG@=}25O%HOD;TY&!u6W~7^?=WVzr>u%tiaEY4hT;d^ zWA-roA`{%F0p~*X{mPK^!+uUj&!5D3)RaH<_)7^;O@%4~R9F2ewo~(#^(<9j4v8eQ zTG(U%Q*lp%f3w27CcS9tm-;v^!0;Y}?ainGfAF0j;oDaImrb0nf2#M;`jpqgea-ek%3BwdwAejan6#Ox!Eh_n1g0VMXHIo}_t|Bj^_L*HYc|Ee6iV+(eA-C<$Hqbs9tqorfjh;^De;vD|Jd~c~hye1DnVS9}T zXt{T=_v#K;J@sRhA9Yl|;L13NTBIp*VgPIKCYt{_*m-Q1qVnfTWLab#iqo&?P?}k# zI(1XIqN&uH2_#D(?`5h1%@iB6R;YZxW?ZT(xC{7i2-0i7qzj;&8?G#DCPNkMVtwQ! zfS1i?`paj|7gmeV3(IetT%7PEjA|a2CUR*rYjg@_LVA*j{u#~9Fm{7P`Fyh(#&0x! z!zJXGWh1nYj-Y5n9$oh74t2e~`1kdppZ|mJa3g5nLu98FKaUa#tmV7i&)--0TguNHY`$jI z-Us(up;Bv8s;{;f$o~YDeJYXfV6N~cXmZuq%8&~XJ5LRttO*7d;gJ(lC)*UCxr0gE zZ~Wsyt7x}qBRbNSM-MPrU<19x$^8M;(?3QZ??(nN9x+8{o;RHA)>s&CT7McU`&?p* z0$^X$>ob7=47|d-`2Lx6^^_+U*PQJ6D=Ouah4pynRM;a5?#X6N+E~VxfHWSrqgSp;lz%47~E+CqwWB8p-#;pHxyE3RVT55)&Nq zf8y+Xz_Wc+gTx>|F_uyl3cFA-*ORmO1*`ihYC<#KyVfrmjzuX9f9Mz3(U#GLWCLqP ziv`;`x7mp3BCG-~Kky{v0P3RFdW28;>nT^jL#%-Gz;iGHRfwocbPKoLc#F;S6#Z+b zqx0t?YfXK_^q-kro9gfp;?CaBhXws!wTfF6w!8pzc!}# zwL0tiEnbi) z#J@qGFe?UbFllr=X?(^4h@~668_zHH9-}I1HDc+G%G&D)dI!e;7mvJ(Y_z|H|1acf ztIrCBOToWl6chKGE9L3ZRs)9-HDKoVWHHd_y|EZ5kD&N;cQ4=_4nxi@l z{Hx1f)<}>^EAyL`^u&wURE#Wt}jo<#}d(?W)n*Fct zpA9@NwO?BQ4W1+9YehP9E!^dv7j)GYhS`2c%&S`e9bkM6xa~>yy8-ym2P;=?KxP<0 zSM<0;lV67S#|JwviT+bFpX@I9{*#*~8ZPJ9GpPvd zLPTDQdZvWj+Hv0*Y{zsyRY7KY`q+iaURv6IE}=hY?a;k^?$t#7y*URx$X9B{@z_~6&HHakFgTg&=&9S!CN$a=_Op|0+wq(O2BEExeD(qPzt857<=sFBb4T{HgT@w9cpT2AcMBl50h40Ug5cYc0?N z;D5E#$k}Ko1pimzr}Fr!QB%E&P_3R{>DQY4Da4P0zmDUlRtr7 zGy_D_f6LSRr`kTVu9vEM+e9W z!hhWV{J-JdCi52K`HgxgoW>|~hN;UQm{>u+TJ}LYoiHu*3;()DHT)^jEbdXGILz%% z6vkX!x3RqzZ=RYx^gP{UO~fXQuQ&0Hn279wtbiWL$i#CgfIUz~RU6ek%$=x@%47i5 z>!&&k%}~@i>mHuLkFf*YL(b3*4RvOuueHbCjE6tSw` zK+e27JbPj)e=ec=e}e~Xj1E?xdaU}eh0lqGf5TIr1v9sqPml!WUkJn{@t>0`Sb@fO zp6EfdG&Ji=(>|JznTx{}=Y|Ym4$N*ow}DI)D9LyH71cV0$OhhIlEEs_|Cnh)e`BA% z;=ItSf+jeSpS{>d5hKLsy=I{Ua1l9+B)-1^x?eK?DWBjNxIY={6iZ<`%dr6a@c%P;cP)umic^Kz z7rgufzbWN+A*MJ%wPjgqE9kTEp75=S?OzSQan(q;n}p*q*Ch3P2MgfU>Cn8AGNmtzA~2U1YZPtCN)~>dBn#Voo)y8hBFNEOd)c z>vt373+Y;yLz_B)VwAuHA^sIHD7H6IfwVpogU2A>L=-V-7biFIg?NO)zp$<-LQ1~! z{`z0H3xmZk3>1mXMm z&QuK`8@>lyup!j^_QL;9;`wzIJmkB69%_H;@p!;Bp!I2Q^V=Kd#+JsDU2wD0wO<>* zUW#k}5#D+O*Lq)6zoIa6;Xf%+dMWt%SggYfW_OJyv(^CJ`j=pMv`Vanu{y=-8GYdo z@|wHDoilcQ`=NElir6{r8unPbpwq~m!Q`6e{!Os_oQS$Pcvsbt>e3RU{$=CXU&8j+ zc~z)*OYiUJYCl2r?)d5v9EG1(=H(n-HUX@D8yen75LTEz-zj+gq4@tkaDnD@12n@1EFllD0Cn#t{}>#nvcCW(JDrH( zZ#OlbdM$as#r_jN0kuB0;r{)Z!u(C}7qb}ZM|(z#kTJ~}%;&vkrOr1F*+^9?uSJnG z5zAG`^uN`wND%aLi||6_d2V6Tt+iM^9JMiqeO88K0Y?1yy7eya7+%!ji)s+se$`|4j)_lH*EHdz4U|DSM_)cD;w zT>mXlmIiQLwTE%%;Of0WJTQTLS9zGf*0@s-ObTkso4|rEx~0*)EOPoD5$xb-{#YNy zIuz|59Hs8$gj38}h<5bMx^BI&65HkNZT2eXlB*7x{c!H5#L~Us5<4LyLBUu9CqK78_Dc+@!@p$yvO33&ZFR{D8_4=+e8F&@kE zF^}$m4YcFPt+4?qP#^M9t6YayJWDh%0~;^`3(y7oSc2^jILA)*5di&@SqLQ{jc!Kd%%B$ zb8Ivptv;fzFxB^&X+RITV$}D0gPX3Tb38{Yf^T-lIH{ab_5-V(bpvj%t5TKcokB09 zxs>Ae(*31Q_YEKgOCx=!3Kd)-^d({aU#LIKXsQs!2G(12Vzxbj5kJ0snYBPIBST-D7**H^8 zB)cGwZ!`$KhQYtsg0g=?uJPx3c51Q}DY02+BIE78Zco_Q0I#px&pyB>$O5KyG(`Z$ zI%y(!%P?SrFAmsX{`T60M&m{ZxudAO3C&_BAD`A-R%9{3RQq z%xRl&|IVDN2a)?$4!*ObWbE~gDx+ssmyH#E*DtW_;`cAXwrc3L%9iFrrN)D6rMTq$ zt*P32u7yoVkIFZbexRN(?YSsyUl4z5nqCs`9KAuk&;iv)>V`RkH%yt%PyTxYwK(Ic z0Qv+idpR>j*G9jKt_f=SvAwG9PNx(z<7(TP?eum=yO2H7e$Q#*Rt0f$LC{+iwF%Vo zXACpa0r?2ct;~t)&uS!ITWSP91Gh;~?{cH_A4AcPFb6L)EMO&`I|@c(`v*DFKrBgd zB6O_^Ru?UD2|2juMEwcKHkKg&mjO?hgWrmgNlQx&U2>SjP1yfGMENVw7nXsrap(q_ zs6W<3?@PS?9aR6KAnpgUY%|$+JC?p9O2H`V2HJCev|4Bf`lgOi_p_LOq|s<3A7Bx) zk+&#J&g46KBetW*UnD12)z9uFcDp(`oRm&(rw)j^>U5-oYNa=l6+AD7*q^{z8yGDe zy-W4<6>uB}tEUw|{>8I@%ljAz+CL!@`I7fDozMR}_~=QFqAwO|4xi(;my`@)^RP-# z-9$IBiix~Y@U=%=9~Z#$6DNu-Q2eh=YmME*FUUKb$KPvR;s_Z+`H?H^t(mb~i6Gap zCYbH?wy#?qtoy|O@;g1?@2&A%T8mme>(T*)e_>q69|8+d{#q+m3G?!1Qn^*ts+d5l zT8s`gLglmT5eKy4(Vk?sD-r!3x6V4n_>7wV`@~LRl>}9am`&`gh+GIYc{=F;2JvR< zwzNOh0qCFDxUg+v0BQOr4wnax$;tnZSD1aZe~fCN2t8xCr@Xp}6ny1z8AoUGh(!2WB2WpSY{oKvllA`2j8 z&v1WDS8WFN>#|=B)Y1>JxKjVLhJqMF8_u(5y<->0j%UP!CIsE8no9zzQ-JZ5A-;w1 zgxnH`cuyVnu4D)^>}GylR#f-Y>>=)*1g=;D|8&)Dgje0nRW^&OO&zp(!%WyfJY3c= zlk|WqMj7L{=yqSz&C-T?yPDLi_6sft&(X5S68SGi!N2Hqb}rk)?3Q*DyOll8PRW&b z(rpT>u7uWh3}xYSI7J#>8-T+{RO{OU|G3Kgh}yuR;MK>2*P-rh4>A7t)cQ9hB8d9i zKzJfF@#lEQIrzYOp?a4Un=%~4u7@+X2s7!ZmU z;X73WEGtqQ#p4lG{ISV4M&S1aP}Np)ym{z>SJ-DDzIQgNz(RQ6Zr;If#PmtwFqg;? z{!G54IZQ?qelilzG-lpFF{1V%;D4b%$E$;ubZxo9d;$*+9sLEyh1R$u|_9Uop$oQWu%(A0=8XP7w=Pi^%i_TVta@+c#2(6ZU14=e$R1uR5gMx@%^V^ zjfx(35>KvhIyyJ)w)Q2f8}&c4L1_=J&#o}iRv`nGr!rHkg@4n-Vk!X!fq&%z%=*=z zaAhk?Fo|O?K|{>31k%iU>%#0T-Coto>;e?0z@~Tc`MwDb{wk+IFhe7 z3ciqJJhXKGmW(t|LUJuxbfY_2AKSwewSsCPuET8G&u#sC8YA1Dm~5UlQv<{ zuUFSIHHAE1n>%O zJIjKH&P}(MaGj0cv+#&ku2I*T`e&70(>1D9ca&?Bzsd!x*IcTUaDyyV+RvwZbQssr z5u)RTu<7<7;Wl-5eW}k&!!>j(j4aeu_}GbqzO;~89FtiKXetvds*t;y}mE|J2jf*7>->5dy*83vKrgb6ip!&jKXx-r{y{4Vg7xohy4mqe+xfe z03GZmKCmbF``3GqSprG?on+76g78EC>EIoi*i)ETWi*lUUhX|X|JxH#@rn-E04$~A zIdNdqx3M6a5&nqyU>~ad51@YqY-9o7Ugti}e^hZh`U8Mfzr&W`ULgadTLmgV4_rr->hCM&Sdt<7tV=Ch>skGT_^&2}5R z07}|n>pN?NwbCkPCw3aShrJ5){hx@QB4^i`+KC~-RX$?|{Qn88+g3i&53r75@S3l| zzE&w-#QU9uEgFtRT!XDk$UKl12tjK+=B~hR3UnBdX)zf+jUZwVFvZo?=t@x!{ zUny16|1|$!RjQ*x&#xJF6T!ABgEbBG3mCyPkiUkB)qhe+@GC1<{6jU-2_}A>j$DiE zi_Bx6eUY?wY_|kgU3c$0_aFNW6#@p=!lgW^(64*MvdvG$*``9r#OWsgZ|*b7o3RB( zhl|no%p>yBI-)t2ERAe~UL|>mQdI!Rio{qGDS){n+arza@@{>+!C-H+JJ~+Xj3U_w z<@Lk>^c-0%We{XJ^xnleQgKXi3h{(2%sqV{9@Pn?%W`U-dRHugswR{t=@zmq%}J<( zPEvswz~EoZOO~QFZ0i_nf84RRJF1t}+BE4veRjI{^Kl(!<0ky8p2lp#emcJAOA-0Yc&Z(sUbZgPEpvBupNV z@&>8Mf$w+AfrZQ{`s0W_eSZ}A|C7r3>RfTdm>YA@zHApEmTZTw%uHQ(LNe<+(8^m< z;g<_`g6vKll9D{Y5%+hmAC<2o(Cqer>&8Oj(v!N{iy#e)D7=K?0y1(Z* z)A6t)K=p@g{W-d(3z5SN75FXe{~g}=2VV0G>O$0i99ogl*nqf9EFVn-Py|~l=9Qn{ z$HSzW!Qy+-?a

pD&cJ2B`VW|g!8E1A{XN@mA#n!7i>u0h-A@6kEYe$iafZ>a_T znph<^)=&99)ilrIoy`OFD|jd3Wk2$*d<`R7kBX6r>Z%3IQ~icl$?4zV-8F;1tVNH^ zPdsJx9%()Az_4E9`|rZsRO@jOgl|VTeoXG)=6g*W`iexvcDK-tjF!BUwE#*x+wAx4 zvsQQO6<%8?*G=80{X(=GmamRKWd_HvY4(?<*^EFhR27Rf!Lj5HX5rm8gZ6#Q_*@xT z64^%lnvRabXOYK|DC>%>VXteEigq@)I^RMEZ>amDeTB?g9B{7gV9oy)dW}9WKQF(p zs$Zl2n;fC|f&Q6%p5ks}2}~>?t6}hLn7$sBa-fJ^8iKJA+ABFeS~0y|Pn%dmV(^>^ z&%H5H!!8c~=VFzoyYubq#Q!EnFq4U7Tf_x~bfXD~YbbxH*k4CV1rI1j&RX#0itJS7xk*rftYi#K&$lN5i)9(;Z>z^-$HG)9cqC zZ6FhmKO$;80&_ggPtB6`@O8t`%!+}VE%4;$pbWlC#mok#=cRGSIq4kFsfO=w;U0G5 zp`2@N;JsALv_LCUr*FK_L&b+l>~rUUmfcJRO71Tq1~~%$@8bb`k%6xR@;n%BQU4@} zSO+rx1g+ok=ut9cYvIIyf$N)a=3PARJih*wmmbfb5UuY9J;66a&#&14$FM7^0ayi^ z{wB8H1IAbI{N>n$3%uS{?wyJ?`IXl=j!Li)JHH02@eGyo3a|1D_&@B8Rn()oE0w66(;q9EYT~Jzz5zD_giP3UDQ5leQo8TmiBI>l(oU?VYhOA za`X9L1jWeywU6dUJITdN)%vg>S*~lm+x1wgKX^~O`CLbMx9ean3phJW|HbAGW#&pc zW(MuX^2YI(lgYHag<;3Px_qSTXw3pmPQDN0zk>BvrROCqxK@a|5GuvDumFkquF`Q0 zM5z?I7%GN)$tI6;a4hQ#&>J`^(efq)N zuT|>@^ZQrWf%#Moug35HLk;mktiaO9?~wzM1XgXUrj^2qV`Z_DSo^r1U8|E_0c4FO z@6yv9Yo7!sLcekV@~lFuiT#CD;Zj(W5@<33MsFAX^{BBA$`P9VjL(mW^^Fc-GWP!$ z<+2>A(l-@A#`o(l`S$eKguGa)a&|#xP)vt2&UBa9_lOCMr`LQCdH)!$A*>q(Lfk-8 zPR*1+t^ZYo3aBQaSh}fdd(_jfdS9)VChjk^e;C$DmM2qM9VVbPQycI|JJ8>P-#bN) zMpju{?BV$07qB?ha7*Ql1y18({R4iN(yvt>Uh$Z+KezeLPqY6m{(c9Bu4y)616qw+ zUE!Jymyupyt*^I>)jLkoZTBmxKn1R9tzUT)cBrnw3C^lC(V&L$cxf<4_BD5S6htSSi3YCuKqkMGb7oZ(dK73|U_@UK<0&$GuNF!U>^+6wy5viAkhy@Ra53G#)iw{`sepldgeooC-)h%3eu zS7ai>uHe7IzHH*L+f*NaYDI<6k5okz2(51xSXd2e0yZ!ecnGmbTojQm zZg*#mUD)19E-gL&{{w5QRn5L@?{$)SU(magB3e9}BKi;A02j#Pl|bK&OV98_-tS&) zoK{2E3JGtBDJ~L^c)ZWrXr$?aKEW_14V+~1$5Cb%z9ReZ0XAK$dP@I&6l%cg@HmUr z{+I9m3fo0|yz0U(!t}Qi1w6xpB!{_Zh2IYtX_bdA#IFTn+1T7qy`Pt(Arq18^Wmy2D3JPt8|3~;u zzYB||azM}5ee(QQ#Kkz|&9!d~d)FF1nc(`%A|>pcZbf`VPmewr z`w{w|kS&g{SJ87!ra||}ZkY%`8h|PZWD7FF87h+jX^-DGol%$YPu**AB==zOW+f|*t+u+-#7I+Qaz(0p8 zL#?1IU;)#iC!j&kLEU}g2>tP~74iAz)fe`ftL2pw8y}`B|61W}%hp^^MR{C4yr9 z25MPaaGwerkQN=_nS0#(o^F{jc)qh>QOtfd7@fvB?n1nK25+9xKY$&Wg74mg7NE|Z zjodGt{1krs9TY*WmVFzXZ6yiLV^rX!Nr$8)lIHK~WVZFjWqS>Ia2ttD1KRn%qsQ<%|gZ?8WyxWUSc zzXx4{S9A}Rqen6}w(AA&;{>1ZHB&&#qwu$8mE~&q`YBWt2V@ZU23M#Z%oWUJ-##$4 zZ?Qqyu>7j?QB{xXd~f3MFM{c#p!ziaUp0T%un1b!dlU2G4&n>qV}}#tEo{Cs^@|QjrM2sfBmg@kO9t6 zCFK8Rf|@ja^;Ak>=^SFeMd;&eq5V~&Q>rW~U@a7b+W37iPCTaoxJ3hFNALb6? z{>Kw+{JbW_$u=Yi=H&kiXWo;*X_Rg{^Fd&=OOF)%Rf!6ItzE?KZ6C1nu&z!r1dwF(PkbJXrxLhiaLMn>yO5H94m-C8J9UiQXF+tq1!yC? zm%~M{fpoPhhYGvtoN)YRvW9j z6`u@a7weck#_a&JtL@cwJJ>tI>EG$_#F;>mYJXJiFCT4GKoj$e-3zn2ne4v|fQjn$ zzhVJl-(XUToHoM)#0ZQH_`lr1>@B1ke=a=B7Kpd!0hB zrIeKt?=Y`u>Id~1Gy&Yac3R>H#s6(X@81K)ua!~SaqGsWJYRb_fL2OugaS}2oRv}; zOHh}s0r#m3unu;i6qOT=Ih#4~Ch_cwRN4-(N81za$!rtt@%9+Ly)U@Vy4zjJI?c8B z*eC4`_7uCX-N#;Fr=Ys)0SHzUpy{@hq=5UlU_Lp2YZj2E0VD{SK`b77iSH2mKg?D2 ziZ~$=YGDIB|9Nz-H{N2fzn=AImj@l_U+)bYElq9zZ`2Zx0a?$8S+jea@sKUaBjiPi zPz_NwEX3#38)jqLMM)-u^dN@S8n?^g=Zna(52VIr7RRoS&pSZag>}dHLEimi z^8AOW5?%_I$roxaS|6|~mBGJ|AM}Zbe&(}8y`QlP-#IVH0Isl~+b!wSdf*hNJ8CAe z&lA{u9A+Yo<8$2S-7Q90n8x-amg)iLs2kH#-uk(ir7(jDYdNB|=oolP|KMt>eR_Bg zsF|+IHJ@VTFUJ?zDG^{*#r95!Q`Ge(t|V=P?4hgfv*rH z?q@a7^3DnSb2}^X|46HdbrP0ubbhT-AnDtFZ+;!T-}pR;!BD*7^hnkRBail4U!;&{^|6DrOD0p}hhBpAPH` zJqG^<<+1^a0p!8WCgkfrQ~fLa3xUF+(fEymFAr@peu^A~Zi9dMeeJD%#Us@1FSX80 z9uR+*W~VHEW^(s4BJs&mR6zfm=xub*+HtL-yhAB_W>!IrJ&}b`45DMD$Kz|liP_R{ zlrkV&>Yu8iv{tIB{8b&TI)Ee}ELP!NJGY(Gj!hlT`*v%hxp?*+>yq`x>TD-tPJnv; z5`ab_KM~iCvezGlE62Rg^;-&dpATKTBpy36`)ES6$MszhMW7AUZ|9iBwGeK6!vBn} zlk`me+Y=1rDjwk9#d|lP8h4i`PJM(N-9Mp1mIKb8m?Om|awvvsUfFBmmm=zY;SXcZ zjiT?vU`128r*nk4U~@P*v>N^_a@x;{ryIZkegvsm@Vk}C@QZ&}2eZ{dZh5-o)#dvD zM(`BO{0nlHpd6}Gb^u4y>fd9D$R|+Iw;V0~FqYy@m=Sy$^6azlkV@dJ7*%_l;0brJ z35&_K%|z9>N_VXjRQCTsb}orhy_rE zuj<5A^K%aNe;Nf)^ZiX_pk}`Kcz@LeYAVbXV!Yw-$G`C%Y3=>iP^+kQ9v`o+6sLKF)UEFt^doOW+N{-vy z8bEzfHk806O#fNy4&jPw?Ui>c+bi&s(%iDKW#%_=aDzsJTq%Mkcc-3xqv8qs`e$&i zdyO3s2QYqJC{N6>3?I<{^4Q}1I)W^Le705{Q_jJ#dHHrdlA3ojITF|rvXtN8+5U0w z*~zS8A@Yq)F-I})Pe+#3Fy7yA4iklB$8*02!d3et|8M4^snS;&K}}ca2<{t$|8DG6 z8?Ij+#UR3Lt@Lsb`G%K&~9&cwwv0; z?RV_Q)>G@2waJ=beP(q=g<5NMwF|@lw4$Zhep(d%Tp<4tSL?gvz>}lmZ=*kF02Qv& z@h*dyc+mjv-U6RJkxrLuZXvMn*y{u~K4Iop$!Jk#(2fZ*1;2y%UlkppnKvS8eN2ts z4r*kJU|&?}ryAtAaQ}X8O{ND!$#CMqW#*k+pxdApXXAtyhuEkos{?OlRe>UKtWKP> z`DFY@l5O2cKXMr~hg6{*H?doMeph5CCZM`sb^BZm)n846yNHsbo{=*sgidHDr2Rf8 zAE?@KsRNst`-XO+qL?P$?hq)Hw*?~@UN_&@&L*KNCBJ#`nSOO zuaW6^6mhJ0mSf!l^Cuz~BDd(ExxjWCR^VG1tcF%UB7n?RTCUCF&UW`JvY1W1B5o1; zS5U82L5r|jZUJmSy8jom%Ja#)8+}h|pfr0SEasmODC~-p8x_u=QF#IRcaw*Y;rPP0 zI(JQk5rbOcU&quDQt_-Lc=AldH?OTnP7b1!K}39y?9^6i-erdH^^C`tt{|Li)8y}r zq4$reI+g{?jAmF7eXl(n!1VaFLGN#cxBrMNfTk(8!^_u41JJ4oS|>r?zX3PlzaG!5 ziT5vu0#FQ&l!rYhvUXA$tDg0Rwb0s)1xRjJvOlqBQh9UGK5G9#r}yFNV7hx4cAS}nj;Gz=Zz2U8z%RR{j}te^A3^{9~C7ZaFH-;PxTb4NdjW{A!R9)QKW^ri&V%5U}t5VMwK3f&fXe<3iT=@Y8-O9+Q( z;->OG^S4m}J3ROf)IKGeJ_0Jm&3}cnuO=$51@782Q+yLK`5KV?DL(uhzOo43zAEps zHJJaLc)1%to6~RC7BBgZe~gUT0#K`}`5ySu5`2mbRQTp&%T2A&dsvZ4AX^!L+u-~x zJm4mlKve^|{Pz9;R@z7c2Y-%sza0O&m^!4LR5%|ZGxrFrF2$Em=J>y&LHT<%{WSp%U?!e_5{lp-T#t`cqZWAs z{$s=LpGU5+MTqp@zy%IR&T!JH&?1-$0ewRWo#%@@> zjv-qjPo5DgG%|9FD&@4`f0(!5eQBq&-eup6>>)d0bVeQ1yp~jh3>?j5|7AyHY0L^B z^}&A^HcjxPV=IOn7!wlN3RqzIbe zOzdkK@=Bwuzwq=$i1An3_v}op2-%()j-{M8_K$WhdkWvhS`?d^d;{&QwDvB$Em3`3 z@R)}=KXvJ1??5b?JSZ1r3C`iyF5_?25jz_!bwZad%^DM(VZhtbzAJ~T)t6%C=UY~y zZxMaOx<1AHvDBWc9`3dqkL>iHc+z|1`*Onfm0{F%nUHFex^&W|@fQYtqA!>RUKYiD zKmJj%`F;?tJpFYvypGh+m!+TeI@kLvYH=okxHzDo0d>KRKx%t_>k{_7Xx2_=SU>?3 zg!xovHl!OU2U*Ajy!vr!nwC*+*TC8#aNk*#0e+h35ChV&G6$g;joSWxwnf* zr!-v0$J)h%?+@Tri}1>n(u%7tXWeBy#+(R9_fo(WJhNzbF#GYr@wclFHtd98S%T(zxcjrcvedI+BWs!HJn18p}$+?9jk^9I-e~0sPNV zRDlDm_K^$EKi(Q_Rm3XfwJun#or^A2b@X4obR2scsLF-!F9XvpL&hvE_*AA}I5(9$ z(gT&>H!6TSfn)yt&$G)Hi`SbTU=x)qjxbEXJX4%NzS`hd^|~4G^wRvqD$FDRMe&M7 z21SlqJDk+8vgt%~v7PKzMfOeys!hI6F~7mT;rga_$y5l%aDcSb5tIYp>HzEr%Wn>T zTY&Vg_)Dw1~w)!p;RQnPG z1a@QlH~W=cfr%TdV0vfJa~3np<+WYY?!zjMpYXa%sX;kpHL-8n!%*|n;Ge5gIWpC) z<8@$~*Ept9)c~1uz*Q5xP8PD!7tqa@Qv-8>E4eT}vOlOe%ZfikgL^@>XoKkX;5UC7 z{enX{Rs**@Q$Ets4e+Tq1HC{sisGY5h%~aJF>H31dYPFTTtC_}=ugGZ6S8EB@&3or z`{IO|?mKwjBFqgu%QXG9czW00$*UhA6IKT=Uk*Q5n`pff>RU%_KyP?JGa`tKaO?`O zkF%(1YpKki1*6f5qSaVgpaGw+HC%ZHwMKEUWvUsx0LHI^uj{Z6o7g)o5yW`3{#96< zykr;t#`^8@^7~&h!}m*GH4f^6G6pw^9yX%Q%MKhQ&Pjt;jxfC^b&%h$1|$E3Xh*B= z1mpr5Ilo6?C5Z5B>Oc}=b<>7532Cqa zG2I}_`6}xxyO0p891V2>b&x#<`(g%){);*{nAuR%eq_zJT2QHXhB}_X#Q*Bn(W+I7 z|4oPgDEz;;z&O0hESSKT{Jk@hgv?$eRt+eHXHQR!PYOIw2CKYPhMxzhqS=f7U(Fh5 zO{Tgqo8?gnaKY;A+;K+{UFG-aR<}ljIN`q{*MB28K>85p#^;*~0LAjM0YdZX?<>!46nPWlE8;htKz2YggJl^EVvXLfo?hhug?`loD~i`D<^3XCtTj$5qQD>d zCQ~{Et;#$SqyMRESiE0W$5;U|0ND{S3v-{2Rv_g6Z9r{XaNi2_x8VN{C;=abdVuBv zXpJ@DU%f!WykdY4*bM%QuwFtb&W@&!rpGQ-LU&ysdB^(DT5ct@Kemt9`9c3St_oFm zrNHmrMe!}+v}KyZO7K5{eJ5K!S%O^5c?nSEtCH~_%oMvM%$^_3N*!MWt(Z`ek5zpB zCHK_@tmUAeHZ50avk-ILxN^T?jf%>2vgVO)8e^UZ>1{0M)@{51b+P(3;iwICNqO&rd*dVrcH4PW`UljP*m!gSZr&psG-9H08u zZ7}xqAfP&Ge61J z70~&Mdna76LsbB0hyXM%@Ht#QE?LC3yy5}+=-cy74#5Bpd8t5dSMIM8_7AGN(1IDA zf~Oq79{$7g@4?|$``v<(tc7?T1n*};P;t(>Dr?H40-kl-bMz5xuHT$`;oc~AkKHdp zc3VE-OFDsCvkrU0U=Fd(T`bO8*wAmp7~jEo?&JNtu*UL9Rsp<5B=S9$ZMEdMAlc} zBpaUXLtg1iIB%v9S;DVT>7~?(2k56k-2c!o1yGz_d+Kpv(ZuCO=~EmL6H6ElAat5o zUwT1We5yKtl)aZ4tbpu+G5}p+2JN`FE%#{?{%gSdn}j(*t(;U2^cUsa6vQT} zvM>V{r5@-0NF*O;JQn%BTg3K@V00pllQmZD_9mRrXFQ&@EbEKDgnj$tyOdIC?*b z7c{0zw>+4x1E(lPR9~E`-RF4JcyQgXz~NtkaPNGu;H@KM!fv5QVzSyzyWEYB%yHM8R8T>|*Pc;ALC3TM}crUG~mAOV1cPc8yarnQm ze483V2j5zpWBv)w#*){6j1{`=#Y3H}9==|Bc+eYk!dF-e3nu;wbl!jgY#^4XM1F1% zx%m-T4Q2tO161Z6WG4dXMulVn;*43LMz9u5BE9zxy+gy%PuueuGq766$Y5bGf&BkL zG9jupEXn83%~pzYGYCF%-_IOW463rqN@B8vlX!2d=~7+`r^y7bQj~9z@zaD)lgUj4 zvXfx@l7-4{<`DZ@*-_mdS+EJ}RZ_Mf1y_YlXNUR%H4WxEIl`ZvW==ruZ%?vGM^OJ& zpSKvKYkePe`>JbAvwbw{cR0L%Jm^;kz(m%n9K&zJ+535LvWNU)j zpARK)BV9DlxKi6#W2l9y9L5L*tczA3hpUCNlFi%U{B89EQR(sfUod%e0cc4R`fQ{4 z%V!(aPJUaP?85*3r#++*#CTqzQ5ZM2Kzqkj2gIOK=vS^!C|0e%{I*!VxVy9fdD+}p zz{S=gCmH(xEb1+DIVJG_>h_62zft|ntC~t;>4=6!$R>%Eq`{6<2F>#Bt;4LJbb$8Y zy#vf&eSyjbwuTcl;d3|Qrl`Mhs1Y_r?W?7=5>Q5p5Jwp0L92?C;_-PAn+V{AHPC)$ zccv0B7TrVU{^zv(a3&7uL_pz6g zwf+|QKQl*c4OxV~WDlt6CK6AHc2)(>kds-VzhNOh!-D+6k;kLq)q>fV2(i`)pTCHF z*CVO|zlCoU!ZV*jdAr~>1?`>T{?hw8qt#93*>m{oDp}+6yiyBtlLh$H>UvZqgGE=H zrrgL1XyTc=VbjB#n-N{#a~osDPrx=VqBvXw(;oQG#d>_-u>RKXyh79bj7%eAMfs`QLp&<=3F!)BzeM zFa+F71yoJoDs=u_c>d+qIqNF5&Lhb4cO;L{mUV>AlLLInqYYvI-;j;UNp|3EBs2IQ z?!0vAswJnv9CGUuu#y3tdnEXuLG+sv1RJEwcMHG&>kKxk;Qz(Hs)UT5XKDn^a|{O; z(>EN#Xa_Ozx`_!4N;Q>CYMt;e-A?mAg#SK~Z>?{gIOLFKQjwD1DPz?D-x+y4rsGdh zzVI(zAWmH6w9^6)i->d3Rn!mb#)B&h@0Qz4y)d6Y6WUZFk0M_3G7NB~7 zR$&BC83mv?7CmU;Ks504wcPh*Jl3T!PozN3+BmNnK z0;&xCw|;XJz>3kc!FhilO8axBBMtO>PzkWe--TWn*Hf4L8d(1e^8HJ_60B^uJ@_!1 zGunrBz}NZ5SuOJjT4GInS_ypLH~!z`xqbtGzfcR?1P_=F)ZIcMIN)U^3h#sWF9kN+ z^ZPv39{7jq=MnU9NBSIK%}3`O(c6P*Ly|p8E-S zK1>WC4IrVP9zAj}Yi{m911O74YKS*30{8C&DnEk-Wb|*s86J~|$i?renAGQ!7r2go zSQ{@r43xfsBRwKpVSB4kRK^mItYw-pGnM?Rc<{flT*duO^cp8-hDS2EMlRM!>5Y~B zI;a)g$C~xWA$PUlZQ*#CAo zWFh+s`QlCdAb&XqUz=G`I}z7I3cmfTPB-Ug`xJbvsdd5{X(yr9`+MdE?uPrN zrw^CO6aJ9kVUQ+Tg1p}QtmUzrIh9^857Z?h4&RC@HjqquJ1oE@*usawW7eN~j!!D) zPw|GJkL{e zn9a&}GqDEQ$>rUrjwgbLjRos|^Lh&gpb6OWZ<>JnHmrImieEmA-not%pzHYmv;2Rb_nsJCp$Ck6C((Kx zUZ)%NeSOjQ|EAL63Vh@TG9PhZ{x-ZIJq#cPx=00Lm|R3J+o^=w8uSRRfnm=dMTYJL zGfnO?88{ia$jVsC!{9tqupXOH!n;Tf#W`=LpNhGkEr|cC1#U0{ts^Zwqa7B23F_R} zhe+%=bHW~j`?S&A(KOM=L}ew3Grl3$(46?9DE2)wpZSY9*^>KalNT56wMoDGzv`cQ z0L?^iVbS1Q`^TtqiUYKV(F9}gDl4E(_QCY)DgHNeK$OSJ%EqKFbc$E#l(Vr@wVira zgU~jZ>OwIIW0mv@>iSFnp9K)=)03;qOk|Ob_`e*Sz8PL#v6QCzs;gS7rI{%}T2ZwF zzFt$nq!M(%^Q&5*J!;7N*p4dbhh@nDK zM#5>pzB0m^vz@@bgaw#KWmjjca|b)N(-H1tx%@=K zrHT1#qYno7=!#%|5*R%PcUT7U`j9p6fwq`2RJ2sf?zpE(TH@2+XU^z+>Y)Fj3c4C+Yb3T|6&}77Rm<&BCclU4cY-GsiGCMcC!WdY zZD!WtOs_Q-uLeqM9##sR44?RiJjYJ#Pz4l-Q>^aWE%*al95_%L$>2oa>l{}UZDS&IZugT1E#Y>vwj@*ci{cX8;BX* z#P46_f2|BSfy%#4b_YAYy#lQZ zrQi2nBt6Q1ZTw3!s}|~CaqE4ihcv$X7S5Q%a_Mw_6!>kw)LAd!K5*+Kl~}A$LN9v---al|K;(`|2n3* zndu*f3uy0TysFj!Gag&sU+*I;=w%Xz^`Y~~9ZD@qQm>=a)@ls)O#P2}Jss0nk{HIX zm|qM%8@xXsK07yRT`5qkE?!wqpG7##M$cueg&&mKdtS_nX{|PlHH?gkjc+-J;&Hhx!kFs#*oa#fh89{cgx{|kRV z5#t2Z#Y|zut1De<*rWf@u36_=kFig=`Fw4O6Fwkj&lLPjyfm6m z@{E0Jzyi);F^{4#K1TH%%#`Gj(S^YRe5PUD+po-wj7Kp2-|75ZPbGJE=N8jex1#9Aq3&~% zeabFH4gU=%9pAkwlH;Qby4=+3mypbV!0%=TtU5bY_j3*WUxo#Ca-K1(ER(&4{=CQZ z>h^_we#o`h0`DW`Un^57PyIO-U|6X9t1nQq0kkeqKXid*sC$J$_NR0X^~b}Px5}dR zx8t{lRQu0>^*1D=aFZ3Rn!*9n(EaC;9Y}0%g;y*7zvDJ>dRTQqjbd-{YLm$`e%|Gryi}A>Y+si_jm_Temio9|Mni{BQ>KL*FG5G?`=#T-)XC3CkpZ|#&^F~#i%c5~+wr!hXGBD~<5v&Q}1 zo6Z`x1B2DUqacb-|0ifZj+aj8t0#3o)vQyff7n5;a3ubGOAtRAM1LawPl@(j5QH>? zFLVzY5~JSo|Mm9}rLTrRU&Pa;$10S7=Z?c`yZHG+Fziq9r@NSnoiW%+#J!i?$}b#y zGa1&!WZ!P!n}xF*c*XCCIA)>0)q?rQ3yLvE`!JsHV{ac5iVJa-Cj-^0d(re8&Aw9y zyz1Y@{}l(^<8RG8*4(Q&_{}O{P%BQn@bd7=WzipshjT_>6AQ$}K6N7BQ3d43BKvS2 zh43x=_2cuz3zDGIH3Em1sOyUp_6^qHZ|d=3Lu-OXV75k(oSvbH9HAC0;zRU`4Xl## zOLP%g&))tRG6aL%xo%-*cwGShl>%y={BhJxUMDvh8*RS_xxd&Pa{-*A4OZoNa1LhC zI=G3o`G)@Li%tu&^aY%}PA2C8h`q)t-IvjHzq0OFW$6EUV}C&MPY>6~DvzO_gi9e<UjJ%)cLiv##w(@3*Z$N6$MfD`GD#G z9}AG%%445#5^1U?aZxp=wN(Q|%Hu0m7m^H4<++u^lfov<$^RRK|9{c12tbj6(G0Y= z@$ov6^f_4r^%5%gFWhTiqbQi;3Hb)cLa;25*6qwp)Lz#r;+%9pr<){=*Wc-GeZZsY z|I<5DP9i3PkZm%Z1bV)H%SMD=ka(t0$OB4)Wm5sHo*zwA)%-u9UlYKj0GiprLVdF^ z4ltDf)xfwWCg-E}SKU#vKEl7Wg>)RbCHiVp>!mf%u1=L{a`=BCu7LDlLw+&93#j`h z6F-MJKQP@rhrQFT#wtDUb1mg|-edK*&&gI72d`Pt{T>9l;G7TXGq1)vw!aeB)&mdk zP#YhC_l|uga0CM>=f21F7~Vv zY+(X6ZeZ{uRZ(4df5id|uD+E|w;Sakd2k|F%&fmf!ALqJ9)bTEbWkPZk-|ZK7{xn& z9q%O57FW0jm=Rot$mG1231;y#6$0;}4vwPR*M}vfW!r*`$-?swD?oh{Au>*Z|Dd6=uln< zdq0fo{y98URVS)Fua6yQ$JMEkHM07 zwY;iOFKZB!xih&yGqvM?z5g+G!07*aj&8!Zu^6%i2J5DJC?*z=|Bqn;W&(iG8H}zc z{3~{^6DenN^G(0~Cp1&BneJ(6PDbA_# z{mT5w4(RM@B>-guG#9u>__vw&*CbR6H376PnUHd1{tLk-GKUPs)EF41q$r~d-$-2R zXRE$#!2sVnnhKbMC@?erQN5w^kLtZo>+WN|b51)BbsmYB4N%xg;v{tP(D@OUDLvCs zt8V%ef=togC;+PNzl8!l7%QMI)$Jg51=;L0R0+Kex}y@5VZHAg=w!o)lGDNQN26Bn zB~ncoJfcV7rGJ}j-W3$Iqu{&+n%PS)Dc-go_GC8e0nLRy$3pFU2isB@E8x(@bBg@p zN-Fs$5(msc3DBIbX-r)lhE*sJ8eyg({~N z`Qo7tmLy8gfkJQ+R5v6hkp;MmuTITY5`8cSlYDyy?buop*B1{;v6Ulx|0$h&bE02H zCj@h;EGWa2%PGuGOOEalhlt{5at77t<@=4Ps((?Pkdse(+RF@cn1HoQ!P>wDLH|ag zjP>LeUpU2`Q`B#7vzO54o!TA*o;q=5bY#X>bL)XM&dyC;SFA7#s_uT}L)6`^iXX** z@xZ@U{?Ifa&HUBG&sBJV%XVe^XXFudT$Js}qf0*?n{(lLqAOl&2XOZ%7g6vcT zTXX`{v15}T`UVTI(@pJ^2mj*VF&tmMS+#y*==y2UDkN(HU~JX{{Qv(G8ijqKT4*#3 zUwk2k8R!^>Kj=96%`grjNa(>ORzfJhP z13at_>VG+oq1a#E-^>{_)yF1tnH{$9Po$Y;$uH3DnF0MjFIyfgfV4kNdrk!($n4&P zJC>s}upYAkVq*(#Gm*-N159%Apjq$oR{Il!64CL|ADB`-B|0kFD_Sp_89T6tp1mJ~ zNpzxbW(vi~=xHX{4vhZG>NPvz z6~@<2Br-TguCF>d^cCoD70?4(pub%J`&&W(EV7LK;e`D_{&K3~v|i5$_&^bIh+krj z?%|blkOM1rJOIo18QL@4SczD_OSL$uSi z#OwuG?e9IJruMLbnVhY;+ztojqLb0^iqW^51FpZD-k|@7viAU!qHNZ`r+d0*x_i0E zIp>@tXNe*~KoO9nWC@B0C{c125F`gdf*=``ERsb;P()A=B}x!P2@*uY_q+RX|DJPw z?|IL8nQNB~v$H!rPgUJ@*IiXr-As7It0*02WB+Yk-__2gy(k7V(_?iFt;9f>$n&v` z@f_(pqxC80sRSowOQgA#$v%Uw`x;xF(qQXJ zv3=$H+OZ%cVC-Lefv<8tj)fcJcBA@vIr@uTg&q;lS`HTNNXFla6Q?QkPoX%`#JUb4 z10b9)6d=Y=+PprT)E>nD*EzGJs6c%kxr6;D<(7ol?$F&+3#NHEJ?fjS{nk-yADW_^ zbQJx8UcD|pA_?|i*=lQNcAlgAZv?z%ELzB_9wKlPzZI_&r~UsEqm5OY`u;z?|A~IU zWD3Ui4QG&O@3KylLnPiu^91BAbU%}Gi1(M>D;p4c(EU}%t3`e7p1s-W1w&K9T^5~T zwfp;Lbl=43WO}TB)PTwlN9W_+OQOZ39zUbbTTR;&x6}n;Rkn+zi0E_#E0&HvuF(OanQ|04loo8 z-$-`!CwiwKHk#h+1otAl$j&*bdDb`32QT7x{7LTMpd9FekErdw%4F5E>{OV72iR+G zX0uuryNC5TaiTgW=6qzO^)8hl&ucgON|*6MK9)Mxr6?`wht+VLH6{W_zX{W*k_I)HQfI&aEd`+*u3k$>JK zw@-o}u~GIsj-<9q!v;>Zengp?+D>YpqUSfI^%E>XZt{#g^anj66L`}u&i0A{roxw)@? zpZIj;?FJv{H>AUYvygkIu+G>Eoi_NX((cyiQmYFwSPZ|he`yZ&HyYN`bSfJpkb{U_ z7VCc!>#xB3r@>R5Lfo(IDLq2WFBVYK)5mgM2Zmo&CxEy=UExl6;HKyRg~uAu4OkaH zP!tp(tRgR9ersBMLNhw7nplp#+wRY~FM{=JhDRY(U>P|R$$6iR`2UE`z;^ZzAcf|f zp}F>l_C|cb2|F7dAcvd_?$6j*c4pJA_X59zKhNLfZ}m6(AN#BQx&E7eBfqBK#GmAU z=b!Z_`ggtdu+y7CsUL!$E1}5$Gd7g{R=dbrTgJ0c@j8l4>_ye{F4gtgod0Sl3CDr` z2ZH-Yg7L4qWnl%b!6Suy85jpA%E(G5cm7 z{APgmRhup}>r@pjsoAyhQfS~&nB__vs~kYPPK6A_2;AUa2~HPW%?4LT!_N4CDj-MExn{FVZ7D@poxJ}mo8Iiv~^Ws*qpWr3y1Zru3;%P@e3OE9`!Z6`LIL!y3Pd3<@a z3cKxb%qbm8XZfM%W~)2*Q}h+XC{3dAQ~FCywxSF|{6#JpyK?x^Dxq$-IR8I~ZNGx$ zE0cPitFFC%eYv7zxJhNzo3E$?xII~dHm`Q!`nSZ(YyZld+~ZBKK`n9$WdXX$1L)c6 zuN)S!m<7;^pG& zc&2`KMF&2E>Ukq}aMz}vw-@(Wf%Sh%?O{9ip9VI3JsOy*Za+NP10wvN*uSh_wtb)T zu1(kKZ&ww-?7zN6^uNjX)GMc~K(&B4SL7wKozL8N5YDHLpQ9F06a=EaK<(d~L_F$4 zrE?7SzmM1+ff?9KZg30E@Ed$Ua^dz^Y9{yZAgW*GD~IqB1yLlAMA>(j>PRJOp)J|< zc?8Yla#YW=Ven^ANlcFhaF6>ezqJ*7L0_1H&+$9^;5fT5)2A`>e5atCCm*JBl;KJ+^g*yc2TrGt)g|KvFLa@^>0C$M=e?}@>tF0_}syc9$^}~rk zmr)57fceXU{WrH3*zMq*r}4bUI-8iQTL!C9Og8qb*lZ^BinCX*ugM2w+fwuXtAD}= zCf@6(6LSD#r+N%^6N@`Y!pFL=e2S?OY6Fn!|0e!xHi-TT)!EDAVOQF3In8;Uo^;Pd zzp#3Ru~$DW^sm3zc%(#MqKra4fBEsG!u^%Gszv_h|Jq^wLj3))|IU1D<|~cG{Kd=McYIi=$ zh~jM=K4Ciee<(_Tx@7;wV6vu?`@agS_C1+(6{2Q_*ku^M&Rp5Dbm+d0?X^QEU!IEi z>&)|*3?f(y3$WkK56gZ64Q%&VM)xJ2kLK204=wr+>|W^KAb|(Of3x@cE?-yW?*_J@ zK3Ubi=WbCZh|tIT&OkzeQWZrcjN39UMN0Ok^5gJA=AmD_&sn@-u+ye}u&>4z`&=Hj#l0AP@Vvo6;AsHC_cKWi%-1ResM-e$QX9 ziwk1i;>XbS9wSHSj2`+G{K6%E_b#%HTW(Q2DYZiC4U35Wi{TrK#&0%nqwp5WRfmSwuic;H zsTgjBfxNE?|zqWsq85j?uPF(TydIa5)hFgQRK_rn` zNW>PZ;;H9H6UX!js_7}ZYJXn^CKt`M`-YyXw#)WyYXINV-)X#u{$}H=0KQx=b8;@>LLkkiFEs;s72J@wD|?@lRC%VS@XA+rKoxLI%>mMX`%YOxkJTHYF0r;?vRo ze2EXze4q_*4Wm#x4+>T3L-_0?Fvvt0$=;xo{UCsc*m^hWnyR^yzO z2c=fyrX6&xLgXp@KbSK*k@F=5peBIG2S^D#h^$~Kr}Hb$=S8Mb+{3=_h38aX$$%c{ z1kWC6MJ=!U@yvNO~x;)GR&Nb-iGrt zm|eNRzsml#2mGHLL3S)ZASO}&D@Ok_NmxF`r~%Bqq&SeTNc^p0@T9KEi#I$MdE4&B zUpfbj7C3jTQ6W=cvI%)5^PBX0lt;)ag=3^2lm{pa`&T~ns+w!io-5voxGxW&4vOLA zR1-s7rOm0@`K`L3xK(|o3Bi+LS019A$^xqzpwQUL&pZnYkd@yeER?7^F3u}?6s>X@ znEjnZg!1UbE06(X!}g^ER1T1X_^^T+zz^`q8|;tB{`cC)nI)bF9eI6Jz|7c+PxL1E zMT2*P?}B?+f4YRs3Acl#LBC)@a5c!BkS`%;LL^~J&?30)_wjdoXPE)?6FKjecp9&^ z_nOzx`wUDy7*#+XSigZVY&q#*jWbJYE4F_G7XLJ-y$v?w!+xcKb<_6R@>u^-&h8aVnOVi6DQWdMF=n79SnIA0NQ3-{xM_ z+l#kojHj#}|1tiC_ldU&WUzqSM82C8FEEszpBJbhE`&ij!quD%i&~UN?*J?LA{v3& z*!ky9gbK7apEu+0(^TTO`1lCDmQNDhW&g488HyDN@Nxyo0V{^~UkdwA?_7&6VlLD= z__%iD;uASznnt5~^NUz}eXRaTcz@OXp5oRptOGs|0+j|(`hQIWH+?`O@B(Ic^>C(y z3Ylux*GcUA9=BUm1AhSz6lRaWXH2NgWPgbkAP<^9iwQv$!2;>62a(>^kMA z;uZhR^gnS1#;P=nI4_oaG}7H}Or>H9*FCe7)Sk@OwVllTb^3Yzy?Qj+qwL@K0M-BV z!2y;51E>N}oB01Sv0XJlF(U)f@Q(a!Q&tx-lrx0ZwdwkBZB=w(u7u>Z2`wDGA41kCq)6=lF=>fD7;5}rg=R2}7BDQaXH zso-tFR`OBrKS8zo3YqmdHhSN5_Q1;jX%Q>HR<6LqHb3Z)$U~Y zJW!1 zHadYp_=82>T5le8gNn>odk^2a6ok|o#ZyYuXBEhcYBM8vEU0Kd`lzwY1Y5?8)*^U$ zbwHY_?jATGIbYFs^77nD5e4$1k@zI~Wb{2$gSE)|2NQ|f5i!(}+KD*dB;=Uukp(ma z37FYanm*SkWB_}B0hH|<1&|QHC~gBlumhO?w}korAA?K}M^0h)zcZcMWx_{slzyYE z&#i~n18XC?-#qC4vvHCe!8-W#81=P&w`V#nxxVGxl1>eK12!c#?VlK~h$@wTVt%d3 z9>(VWyYm0PdIH1Bn|sL@B(eb}S5HI{LJ5ie!iv_qpJsp0w30F-D z^;Ei^(phV->R7z1w1G32oLC4Y)hOmBjHI8U0osX2kuSgu&xHuUC;-I|a&D%$yVLem~2!fUVK(F#o4Pi(Rn?s#x(O-bz0oeBavO zr{K5XK0e@aa632@3<2?vg$eLM13QA3gM(oID==Nx!K>woZI_q`;(EUjy%t~@Ps9tv ztI@}rfj;*OamQPRF6dQQ!RN4yKj|v&N#y?$)$cN}{RZr;wEHXezt6eCcHtL^!JFXx zRQDT67BH0SzQJuBt478>F;)^CoF?EHyH@NM_E&6o!VVXGP8ozq$gjl@2p2ry`^pJ4 zDNjF<9Bb&pl+%>xmfFYH;E85q`F&v^yQ4f9#mA$Guf1XBI}!IQGKoA5yNsHFNoK(S z7Nh?tFLlonY(Ksg+X?Fbh&snf>KtR~Z2FXs|BBT>127Ra;?X+# z|3Bee9%1IUSpFnL`HplF@3F4JHJ@b%a&4?X4T{C*(Epc(CHy5a%t{tr?{vk_mUh!R zIqe15oNUrCeag~hrHa}nqc&N*$+7=6`j;Ot(cho|gUyYV8tuPf=*(|P8v1}_JifU} zudjN)`T&Ilr0CaFpkmBHEMRAHw5Pa*Tf?bouO_M+Uy(Q|)btg~6Xy{F0l7o_PZBZ!LICmr+W)G# zFu70(l|@NAl5SNCYiQ^_=U?|Lf%ex02ZJNQvEVEmz?tB^AZ0Mm-|jaEcH#>r2N{Fv zetxfIyckx!ie8m(iEQ7}wK^3I@Xq)b)Bw*@N6hSf6<>=6W@T(6(A7SxvdRVd6%nRJ(YJSg&*q>PZ ztGu=i@$c z%}*7;^t{rkc#ZR6^+iH0cmWvCi}ZV}vG;?($A+4+=df(`n}}~}%~x9SzvfQK6KL;b zGv1o;(MuqNUPPv0*!)ON%9CPV=aoe8g@`nye! z&po=+U#C`i2X3G!JU}BWH(Bht$Rw*^^bk6X!Cc#$(FfKfEXCyHLejE(!~7Y(Uol$I zTiQS2fdA>AQ2;16*GG!&dJ`Vd|dONY+rUOW=#_S-;X4< zeRSKC$pPCto$Z~l?W(`)o{I9S#G87Y=>#&B1aW}I8zkC)J+PE`y}lvF9~L72cbT3t z5&IVhsG5q@)$j5Z?N9$X($4zE3eb9FqBrv%I;y42RH%h|azFQL00PjY0o4G_-<*e6 z>qMkKwY}W1MMaqtQ-umZ79v6n#H_h68DNRk8=jeyQ3VxES0;D8M_ySJE!)?z&GBX4 z7(d`djt%y}@_!sG0rUSDte_Fi_iLgHc-Ai#j0&0syZp0s|BpuDcAW0_A>_Jsh=(cT zNx{=2=?=OcFX|2V)_MKtVEvxlwj{kV^Y9H%QwjSL1{?;R=-!7|yMpR|Pw=(H6p@Ec zGO%C|>i%EC_#FfVOyzV8!tY*lzmJWK-;BNEPT)jm9-wW%Y{s?%y&0AvSLj z{k7lbJ|D?1$WQ3|>WE8+{XYW(*v~yp&*NjN5&fB1P?cL<^ms$a1!hr`%0O&A?VNW` zITzvDa^e}L@b#Hg1G1yv^W(|mC;5Lk%-u%tK-Kszbb+r^x37%q_iL0t3FQ2Psp6ht(qN5{`&S2)JYY&*Url|mQkZE~r>myB z+mF2FaP)*V0vpu!Um*Zvuf|#pQcvXYWwXKs|IQET3&ym{F}TViIqcxH;0&;hO;#VPJ2}h+l+q!`Y#c@7Ay}=5a$;MbAoN$8V8O1$0+ZM zGasOp?*!NUX8tm-i1&ynKO2^6I~}=g!V2G$boA_r8oGbVfFb(C zGP>G#nHI}d_M==tH+h4!c)x1k=DP03con9W z(oxVH+kc+iqYGL7I1ouq_YU)VH=xV^0#@P{+T3>hEtAnHEk_gZ77Tp?3Wx8={riyn zXNfnWmS2Sqf!gtdaTgxsY3~lzibilA0rk=E(fbyMF-(UVIKiLnrw#@OhhbN|G&j-kmS)Ec227gXf`iQRAXX)2RuM?PGr}Rb?QN8s(ExB zL6+(PXie-_CeRxD??uEK99q6KfI6k>02l;grR~*S@CvK2ePMuuV1M>w(fiwpDc|du z1$d8%fTO82UZr;RM%AB`MPnfg!!H;dkR;?4W%I`V%>+QPcgD8G;N`(S&sis< z*@;#?nB~66K92%N7(pEZnpji_mcKMSfqL`B7^>D^AhgUhd|x}n#r@R>PqpFNz8QK^ zbx}%FF^l*=hG;JZkn;X1d~GUk$0Dy-#qH1G^0Ttd^9HK#q3rfbzyr*ot16Rq9F)+Q zM>Z;8@fMl+t*@{bXpmLI&Pz^T5~N%nOHYYim^~3bih0e2%Eq~9<*apbV_Rq4e5mub z)8Wp%AMcTO%kLGuPqqIboZkn*M&kdRAR)N#t)Y6gJk}#V91PIJKj=M+s{Ju}za4)q zcAtnnjL7*6^^ra(b}}+Y=PEsc1F(QjRKDLu#g>YBIwk39%}4L|>TlJy3+4J! z1B?CFBz#5rWZW;#{akE9-7o5Zmxs{)quk_09kFTV6kwmlV++9heX;s}cwrZC5pey-a7L3 z0dy5aVrQuu{6f!PXJ(i5rF&wfSAuLm9`vNbl0KnSLh*zg+;S%5PAHa8C?QC=1{OFS zoCFIrA?NDprH)@B>Zb_pKObB~W^h0|*jmU%Q(%lT(_N6Iu#huXSkc>Ni*CS$FJM^Qd0ND|F<|kpCzRmlQ-1_qK1DXFN?0*cz8YRB>X3F0}(EmQ>&3|oeAYvt_-f$9SKt{6H zM`Q@A$rJWiL!#H57peAI?)%Xd)+^YcBBt>EKWv)G0%Wb?0`#VP{JVdKg)@(2Dgp8U zCVx-`&}e|90@BTR7^!%q*EbVDgr}9!>npkN0DU7ntu4{yAkm(5aP71I!rs*#D2e}#GgHLa*3ugAm4 ze5u z!OCE2FdQuUC7PeX!CgO}pWAzeuAZjxxVMVlfQF#@d7%DlRK33jkv^n<^<#S5=hDme z9VosPs-1gi_BA0V6O%7m!d%U9U!beyFSN7M>9@%kJC45pBW(OU)wj`D*VCNxXNbSr z+xH1s_AMrLZ=)u6#(fjD%_maIxP6IdIk9wYu2bxn^(W)JtIt^zux0Ni575_T^ZHD_ zLA7yp#OSl6#K!`#9zQr9dY%07F0ljHwYm;9i>^C=OD#7yO8xEF{{sBvSI!M5JN&>% zywQ4C_p@{@9gMX^0nnd(raRh(W7z)(p#Jcjtahha^ga1yk&E%=>}G9;u*co3X}dA-7S4w7kQ3~Knk_d#q9*8hN- z|6QgE{s42ao~&&!vz4EMy(xsXtFz}mIZ&MEoC*Y>Dd2gyRz>lF$I<#8N9*?!{8M&L zNnY5fnw-|IVO)O`E=qiKPq4i7{9Qv%utS&)h#!z%MKi#Zt-iy#RpcMWZA57QBe0Dg za8@5;)4xU@vG*?%o&Tfh_gw+{U&AzvI9o#$H*~jYV;ob zUvKxZ^GP}a6qCG@ZZ_LY+jlHlQ#%U7#twKAar3AfWrMr zxR2iJQ5EksyUXANqXJe=pOafRZ0fzJN4$E={lvLOr$Qy{TC966n1HfWOIqVQH5;Wr z*Gn6G>k#iNgSB#TpDf^liez0?!JnUad ztR)4fUQ=Q<153Pcc1}zKre-%}ip3=Os(W;;Bn8`VjIZ@}`fmhl$ohu_&%*-r!2^s5 z8Uzpg0sc4M6W%^1)}A1O74(jwZ#jmlw|wkJkn=HTJd^caWD{mJW>dCcEA|+?!DaS+ zRR>iUasOib$1=FRHO%r|MAywkFmofiYyU(yo093cF7`JY@A@Y3_ieK8CGh>f;e2-R4gjuHsNp2fK^Aab8-A8`llzyNzE-KR<8IT#SRki3Cf9eA6dO}0BNYRREU6tWko~A|f3J&H}ev91L)q=#h`PPcK-*$q%)gE)Vu!4f}sHJaxmd zVD-%msRKs>M~m%WXVoT+Dx8-sA&@@sopySkkB6BK9Yt?pKbv zAAN}VFTwOTf~_h}tojLF;7{t<0kgpOlP7GVU*I=uIX3kMx8I%Dql2x+Sfk7 zjkZR4yDZhjYsKt;_b(AYs885fw&J;%06n_6esKxrH_5+9Ss?qDTF`79RPHYgzb1L+ z;MOrR+!_>p?2Lwq`oYP>29T%tu4eER2iezyHSI(WH3B8XN_4toso`~l>0@pH9zb5A z5C}orJ8OdgTH!B;a~(~#KOP*Q9qQA;0^{%qQ+bT#)JEo_jhuxI=Os?%iN*6w2~3Tk=)3YDxUZ{+mRdPC?1Q#p+|h73x%; z6eyrnd@GYOJ|jQxPT$I8cKg+XQ7A&p(ew$;ovy^`AIx^K`EEFkUo&?M)Le@dmh5|s_MKVE@`|p&D2WAK(+^lk$=9zSuui3seUX7pN`g>A0#boTP4zSXr=7r`Tzt z^9q=U4^bTTqa(+sFMk_bLsk+0KS5{ryORTKvWr|KIdeb8qmyh8*Etb=-UrxpZ!`f_ z&^XxferWtt)6dd^Yp>1R>BzS7@o^bEK_hm9M(HV99ebB9%TwMyzjNRR`gR$MMc)~SA@bTDU8{%Jj0t#;mH5Y!Rt~!|uc*$AxfRB)(lFP4X|!^5FZ+F6djpdcvsedt z-Rj{1^6;9rMT1eqI&4j`TQTvXF!8@6XCO0nk(6j@Izp1+4@!_TzV7^pH!DiL>MVNH zrp&H6f>N!UpDlP6W&b6Aq5qm+%eVar>RzE6=yz|7XED9|S1h+R+McdN?~h?a8jy|d z#l9Q!+X`V(nm3Yy-Xq}_zwmI+|z@?p3CD=+{bkOjN~e#k)w;1kRM z$wHUyBckh0yufDc><2pS9=X}*7kG)v`DSwIoNikz$xO8oqba1Xd_D*xzkX+`(Eg=< z5z0@%2T1d8WBpPEh$ApLfP6$METp`%*jeG8j|t0^ja|h9ZR7WU1kNi9X8GD#hyAaE z1=z=gLSCu?Z{hmo1*)q@U)&p{5m*wI%3);%LQLpUTE zI7Etl)#IP0-r|61PR7o{wa%x@qK_Z*GLkvGisxMl?ivy73jRQI@kj72nyXl_!T-qr z&`;}Mr4F!z>R&Sa(ro;9IUX-tSoKfJRnV+6&HhzxmxtFOCvTejf0wPp#iPUQiPi_4 z64k178cTssyKv@qQ?Xx1b!#CVywfsN%DiT#fw{tw~I zYjTx%>>)(2?QniKi0?b`Ckr|KU%>QVCfh&AzL^vFgNuB8lHH)`!3KA^_Y8h!E_rHM zrvGGv{cG=j<5Y}3XFZKI8q990e2Mjc`2hI?;dWX7|IGa-q5|2kvHO2)UR40uzrLgF zz)TU*V~Yt;{;!PQC~0(^R6CFwAQzFfQRFGBSoCYB7ufKY(>dD9dI2x`ELY_q&-EkBI;{uS6OUdJy!ApZMlAd4=kLFIw^%rmz-S&)X@u zPg2lr3C>_PVxne$#$ksZfDbcqZkljDCpb5qnQmp2D={$a1ZwnkyuZ9nesa+0C{Ei} zy4G`fZ&TC$Fjj{dHnulDewz-LU$Kx~WaPK07apWO-^z8}HDLee!5aB^bZwUtzD|mL zsmf4@zr7r>>Sb)G1y#IfsS`A%9=?+Nc`cc9el)=8u&46$2G@Z^Bqr%VS3-k9Yo`U3=J9YJQudz3{%QTxv(Lg3`kZCkO-BScxivsuk#e zZ3oNGwvHU+BxRXnGAryvK8n&n^@t+wZDRgLwutT~cR$D8kfdnu-lEf|0Do&i>KD(^ z-S8WH=QVUhji?GNh8?cVK9Vu`yE0sPO(snUf2aNy?Lidccmkxfz$w92gSPQ$UVG~N zS^bMtAl{9q^DDr)OhjAp3E97u@Q^ydkl>-e*k9mp^QZckyo=#0@PI7EgN3dbUTt9^ z8!eP(9NlBWaoVu%R}fr~pVN{Y%s3<(iB_~LSv@(&1_$SYp{fT8U4pLlEOofgu*q%2 zX>f0aE$?)9E(}o1GcvsoMHAEc5{CU>62hNNj(=ncam7XfmgMIyvYTZfp2| zEsuN%Uhp9JAO8RcrDG;6Q2kC9sC=%$?l<8DH)6#L@vi;B4VvRo59=>SwrSe0( zoVUko4c1@dm+_}F*>frA_AV!VG!=sGv8Uq7k#oUl^@XWhi*EOpn=F?+V0() z2s#EvVi{QVj;(U^$HQYSm9=8a>Z&G&)d##s3@l3Pbz@9auazqbw^VPrM%SD*CymN z_{bV4kM}vF+|Obqyv%+J=Bt$Oda?)Tr1!huk&J&{uz^mi+d(wpEb;%YKgS=-+Z4a1 zzuxocwMrWA9h;Blze$)0Y2(R5m>o?z)qKO`JSTPh7U7nIiDB!}{2j9IQ+;ntiqkL=%e0X?E-k8$5{*(p3iSsk7to8;3}~x6?MOrc#PLTz~RMqQZb zVG^qW$}Lh6?UnH>_M6Ql zl;Ih%cJ6rmh$b3K?JrH=V>HY9CtZ`gjX?pLd8d8jns}|Rt0JKLm`p&Np}dF3eLQS3 z4cB#`^SnEV$;Y|kpMmPr!$iJ|%Bv3bzqCC2zwle7=uNIc^?xRHzXJUIL-AAfx#wB# z8Sr<#h>EHo8~>gM=}3obp1b%+;SqTxp|5+e4@vRJ6}VDTTULv0iEs2$`pKB0;Gz}y z#@ptXVb;QUIM)^MfWOm!F#-HP2TgDi`eN} z&Y}?h(9rJ3hw9WnH#c!u;pP{-x73j9M`)paQI3Sx(U%X7=`g*S$g? z-&}6nnEhHMI+n>FG3-8nnER#YyvbS=`E~N1B2V9mk}c|f4~w+k$wL&!3gcb8@4eK1 zCBLkH*o%2Ni7zQ*e^7s0NfpeZ5?+9=mNv0{SVbrJ@r_KzyTq(srtmTSVm`{2_d)DW zx!b6xmjQK%1I)oKJGL+Gt0Z`MvJ-iCAq z^akIBSW$CHKpj6Qb(RhOrDEHRnNV>Hj}zKH(Nmc{!k{tE>t3s5~!Ur`-Q z7HFz}Q5Zn=1Dk$9WdPyQjlb(Ukn~k4qP2EC@gkn6i&b;b_u=Rb^ z@VnBJJ0B0wmYJZp@CZrV5mZ@9@yrYJ_o?D2wne{DzhCHFwcs2C znzH+-Bd0;V9WK4l*O+o}5BpExn#=yx@0;N4WIn)E_~N0~a`+)3T*bufu-0|K|8wap zy@gsQ9T>6*`rIfiy>j?jSp66*T{<+O{+aOmGda!5+sA~Q)lg3GaIk=MK+B2k_c-&j z`6>B}X`JN+cz`9`#4CIRHn11DrXNV6rgenw-&SPQ&E5XaO#1|NNoDJ@ zP{RWl_Al{c)%{hy`*+HpMC*@W!D9N2wabg>W^{$h0hAq>slxi2Zt4)$6b)Its`jb` zNcpG!y*&8KLy^9AD>gR_XEsfKr-FSDyNxi>WGYCiH0Zu&sFdmevY!kGc!gPL%nZUm zw!{aFKRfahUeMo{Y;ANoq!{Zg*sGPW*!$kkd%7ez|;r+#b?=EUR%Q!D!C z<2B92N5wg3n(8NP=d;sm9~Hux(RbM1xQ0z$SHOR1i9iK7WzvA_9NL@?vE7-dLcQs% zBo5!AI{z39aDuIWH{6e6z2bT4IQ!YV>@B6=>>emzv$(``4nzT8nO>Yq#JopXKtn8H zIvk#+rXR1uTbxj zvPWElVxXR*Y+cqSCQ$xB_#<6tg=Sl>dImHpNZo+a4T%Lz3a(m86>t=K{?^n$H}L#- zlk@bZ+FzI6pY|Z0>F|52@q3qv*^8Ng{24jQYfSFSz*OGSJm>nnLYl6Vf~&2+N0>`> zNyUD7097B|BqaYHA9DSP#u*RdiIJ#xr@}cr8!{pY`wiN#S5S28)@w z(48vGJijyOzoK8nKkv2kzN53ML2M|Vc{8Y^K9N2>zfHdF5&3@#u2T_CNI87KV`jQM z8U4)8V>huTQ5`nQn)KLzVOXio*z=cIW(NB5%F|a?%gSy21%JPrb2x>wIhr#%gHyhM zx4C>Y1%DvcdI<6CEza}Xob-vD?RjJof093J=ANn#PR0XB)jEyO#Aod#$AHd2@xO|n zmC8UnLq3Rfv;62%BC1Z=bIwcl4s6fV=M<9@XLX37mv!oEiroL3_9xK;sB$k2pHTss zN7PT7EJEJE{4Vo|LIe6p9RQm6EBvoINnYOPg1svYim7H71u>5yGQ8-#Wk0}91M4hU zrZV2NRG8scq8`u~>mExE@PORFwzh!rJAn}1!xxSv?yI-51r?Q{T-&K!pV?UaN)W?( z@`ZJHfrZ?2B^lXxtG!*BX^z>k`Mli3=*q71|NXJFUE1m{E7v(QsvcE-aueq>@D=gm zruL=I|CBt=i>SqSI_i1*~KgC?VLd^Mn%%+a4%&2`0MAi^Jd{@*? zqo}~ugzwsb?YBkaw*))h!!*1T%)XwBs*Jj(}WcEwxn6C+fD9)6SKHU0|?@wpy{dsi0z36)VF~npuaH*&!Yg9(&hA$Eys&q=i1(iy}`ub?D3pz z{W=%##$@HJVEuReYknhgfj)Euo$zP-?LYv9{Qb;g9!JM~$)3JrZ_G`m_a{%6Y{9DV$lO{!tg;@bJ5;drgMxyTF+}2ahC9LfNM`_1OQTzCNG00pV^&5We9JvxBLQ?Hoh z?69A(exS$kYiznS_WuO8;@nDdU8{lw`rsY3-^jH-<+=9fdTt=fzfS$X1~maq_In#F zG>2=u9J}8DW4Ioiw2JFDjca`zQ(IgM;M1S@8)1sy7Pp=qTUUoyQ6gAT zB9Q!qW_>2b?_bA0eh)LwB;mPB32x|*^{-)4L~rL?CK-%_MP5cEzX&JSlU)22W>s~J zkBjX^zuN<~ULlyRhMfO3MET;dVsGOO-U1n~!y3N9`oHD9_UFc7!%oGXqr;~&Q$J?G z<`0J}`z1!`T7Ul_3YtrTk@P#>(exEZSvEz(@Z~A0AIBCC~vq;m#z*V3^t_g(cnt!W#4}Vm z$GS_IxO9M=XFJz16%$equ|@SXo6;A0Px`0*r-Rl(iQut+#GgrDa4vrqvz4ACOQ{h1 zmQ1V`s>{#OSM(!?$;a=GaxF4*7Rtl8l;^}moh7hD@7Z^lxH+2BDIUydMe}lA8)2)T zlEY@CGq(?lyEFYVe!+6{qJ*5XLE*y048A7n*XVZwG%=-FoKi3 z6Yk(XJmPx3ryVwm@!AtK8$0+J)!#$d#d&;96RpI0jR9q>x4J~nIBybDiqrk~yY)7f zmi=!JAU%#j<%aK9yf#=~{Kfz6pTYdf8BEnfh`@LN!wCor=q64eSvVIg1&^&B9&I0# z?nnD|HUF{xwqG^22khIG9+Lz&4)z~`4nNMhJU~9sA0IHE+V}xfdEXNc zH{ct#fCL^guXa}~2g?4DbiF2t_oFH{mgrP~_>>g3qzkW@YcwvF-PW z{|iI=7gIeE+tuzr@q?OKEiW*e6MGZ{a2*8jHh8xKkF5IPBu?~EdVX&6ei1*Rt=DhB zed}kwi=43*qW&92M9t$Ki0-s{^Y`W8uQRw^Jb)s9qF&c@=;;0b^`EhS!~3b`uYMha z1xz21cm@52#ON=dqn<&j05wf7clh^6FIg1q)FZOSTF0)UcZq_Bol4PpR5OxTAK^u{ z+ph>dLOnl)$rY3}6eSbrLsY*+-N3cZaXq*2jKAdCJrDn9I;ux=g_U0|!n-b@Ub2*r zgtBIke|;4xZzb5tn9QM?Q4U_y3f%H>S})PpcLEE)ffZ9-%s@yc#|41@}q-2+AnKUy8 z^q&kX*hLQfF1~LzwZGk~=ggsDC(ler6dL)DWQ#3n~VloP{#nD+-H~zj{Aa7OQ6sHyMh2M>0 z*XRKLFSY+f|Dc~0*QdTdv7V+M&@ckBdBZB`5rzF#0Z=V4757yQQ1-9CNBut~i0m&! z`dM#8ef(8l_kz?4R^tfBuA-#l1j^8 zT&Fj&e@$NKh#wSJB3^YCS8+Z*K=oB+Tp!?1Z=e8Ph6YHCZVJ$SMPAR$u>L3D`HnET zM|%=_#w)l`P_Fi z_~0;=f+!3@53-0hOz3)re!tJK?m=Y8&ygb+ge5FR=Dd;(!L`|rRgUR+hsghjaN-Lx zce^2RG(EFJI(f^yt=@j`B)ZszOc6^LkH&nr6Siq)_?Rg^dVVJQ|HZS5VPoR)6m#VV zQgd%*{X*Yj-<5Nl4d^MkkF-F-|LTO$wtz=e5Pi5gp`@(j(GQ$#vEHa4Pq6zagExyA zM(45lnZ*6R)GVi>S2}_sp*S-PDzJsH7~I5GGKC8;*nztM1!PekMa-jYUo}7FCdxaM z!R3dOs{`+U)7j_Fh5;EJ%N9F;w;IJO!)`KnpDtb$f0yg&x)3TXAi|7ZV;IGr=Ge^mq~ z5WS`P9|8s#gKzkppFbP<7M5=-dF&eQCv~uNfnzzxU%~xdBKD0z3)dCKbvMswl= zbZRM?Ix!eM$z!Kew3F2;jGQL>HXcBHh3r=`+Vua3$NRtklLrxEFcScj`HS@vm!QZm zy}wZe3S|fh==S`RGHHozrbR-RM2XdiFcvbcPyocrMZCd!1nPI-QBT|Je zy>;2urpa|_$N-8HNv=}gI}kmJwQIg}1T=e@xqZj6_LJEEZTMeh%D?h8+5atAu4J6P zGDQD(ozW=L8^8kWbJBv&UxD3fMuy)GRKJw!G zKSK6%2mF4WXL_IKFJ*(cPsLlsT48>}h$hDl^pS9Z@@~}yWsjPR`6t)q7S~T(0>zT* z(KQn^7uC^*?#$RP@lU9QtfMCP4O999e1Nun?0}n`P37-X;(mJed^I57sT%*8zdaXS z5RIs)_9E`)CI+X%2Pg~icx?Hk3_P+nvNt6Ii@};~Vqf@IAf($c0EfAXuYttQx=rww zUTi6dtP5P}19u!n`LXeu-W6ss`~Gs2KdqTIupbU3Le*g{Sz7>tsK=(j*8Byl;A^(v z!SaS^Cp+H8RE+{>YqU~yD%1DVT7!s5c{tCSQ6ZK)GtsIs_WT*yW-)SrCpe!^SWm$M zmISkYhcz$cOwI$DsxG|%%NDDz9)NM6`#!|@F))P}K>a@v?$L zE4u*epGDl4!fF;@o5R~;vZfu(M_tQVRUV%UOGpa(KOFsn_SxoO8+%_xptv?i#3C+K|u8BA-|N{ZHb08>0V3 zs?(WKwoZoSixH=C#Qq95bH58WFc;06ZY#k7o5?{x0RemsKXwY1EIT`}(qb9qnW<}$ zBky9jW)E`wc2xaWQ(-SmeqW8LSwGTqTn$w59ofTIAdK$hySL)^y;c5UbgmWr4OrfS zSZ^w8m9Qr1+cdlH0ng_)wlCE42cJpBmy~Oe4r>zvkj`H5U-`f6PU;`UVuQz}zZ2rO z@gX<4rm6zm3m;b##8sV3Le6}^Iqg=7cl0bjyZ@8didtJwI-RnixVei5n8M#ZgIxW0 zo=KbdaQIS($p&>|cgdMz?sRg9;#}=4_yEmVlQusmmR}0RMnkUs2DGl{m^V^2o-Y16 z+JPh3{}rzMd=UQ;`mo!>>fPdsP6u1vblb8?Bo{r;jhGkmf_DI{(F3fMAEkw+rHw;- zor^sIFULB9u`itwNSu&yv-s?jReK_#uFSSwp{}C zFCsS>fn|?^F&v4FE61NtUT_4&`yTZGO|#a9``%y!Rm0ar8d|&TPEI|dX?yx4kJyih zqKJEkyY#fdI`%Z;6B4&yp)>88~D_G*n44a1-Tg96vZO%>Nf-`!o6IeXiL|uI@X0XA0cxGpKo+5y`c`Dj8=g z?pzKxH!A+$519ewwTfWUmZ<8TgpaR*|9{2@+yx&ba2CrF{nt6C$#0K>>O0fr`W{)= z8}zt0;MNAVe>fSaHrbx#Tot63cO$+0$>8nYBF-E|wUdnbSO?L%j0c&{#9K_|_CD2v zl_3YP7#?stS^f!%U!9nXmmk)?01VnK?0*DNts_W(0g>wtdvR(I{qJExUC0UU@e@br z2q*$J$OYET(M|xd33owQ>JH3A46g?|zZw6p$oMnFzr>r3AQzYil1WY;Gmrk?{AA-zQ82#;&-oF09CiDa#^S3{|LlMw@D1{= zcbrAA^a02!BiTew9%)|8rJlN(`rlQs(>ku|A^dMk>Y?%27x>^U)CEhDah!-fOYcJt z?X+To7^#=b>Ll?N8+cHqXo1kE^0$oE7pmV>0$yQc$ zy7MgPr=d%?xP1sqDZt;PN!H5I6ZJc$PH(aRb?EFgJlFf#yT@kUi- zW)8{z#RjC}o?-#bG_UmdB~|$MMLOC|ociQim8k$0kDfu#*c;`KY+m**1fVzRh4OMM z0BR5pD8;Ql$Y&WPtp051tYdw`HF`btk+ZS-`Mk}>tIp;BIiYVAdK!;6xWUws@9c%d zJDvRqDz6J6xA%P*-S2^aRZ+^oxfl1Hme)GMoVWAbuJRMwcA;I+RXKy-I_deVU&da) z0duZ`*YCrX@64?S+2>5ETq(enn_!d9gB1qh0h02%3?@I_f{ot8JN!u8nM1`uQ*vKr zLe6k_gLm-=Mv2!h5kC*neT>Wh{kP zE6v=03(G0ZIX_PY{AsVEf6$-r|3K{jir*G@dxBw86R&0Oiu&qrRS%=){>p;Y&!;Xv zRoKPwsrye@AO_Bt9zwGKv;|jLfzY_{xIBRHztI0J9`h~;K$?Qb+#ZqxR6@yr$88ZG z@0ItT^DTc28&1EVKcYD`i;vMLw55At5YOi-T@!PeW>$k*Tyvhqhv+E|a^<>X_3f#! z&Zg7biREJZtoM$-7`d_@*q=9s4359y|C-Es8y<2t(n`?%W97YcnT&UN~i8t ztbR2atm@P2UZE}E_} z%A@L*H)H^dVExJjbSuV{uFG@Z9(kH=$aBzG%mz8Ufv=nizLHOs!boL)_`&@BURF}gtY{qrCOAzCSaGs8Mf zgLSG&R=JOj_1a`P9~*w1JjU#}o52aRQStu>uJqiQaD~l?SU$dBFi2q)82x)Zz;%4Y zXJq~pVGNsxQ}W&b9}Fau=)=zqMKSmx=dm{P{!_#76(DcE$_~r5ME;e``@9mnPmQk_ zwX^EX|Jy_Nd`B|i@?htI)YNLy{W{faOfOs!Kb`kkY%P;ON02e6!)8rHSBW2DZo$*=n5EGDjfC6C&+OAVFo6fiZW3ba z@RoO&6SjnY;!V!aPHwKybTXqK-M`!t)ax#@6{sVb(XSw++gR%yeC|^0{1+6Mr?B4u zBtHaCk{$;3dwQTR!2smrkw1VlZ3WlZIM$7>-;HP~es%6Mx2ZN)ei+w%2CwFY(4!A$ zZtCaG3!ouW)r7>s@-^i|)zi(fU>1LydN6*$vP9w%lWVC z{_O0ImL+Ft7vg{A{RQw4xwxmQe}zKZe*(Lg8sG`ummt%s&$WqIGnnVw!}=M&sJ`mS z*uQlDAB46q)%0AlBk_Xr1q+y{FwUB6_a^H9N{)Xl`aSP|g6lhp4>%1PxXKBRaI!OC z1<66SSNQ%ZJj2cKG|LBMhVx&`iFpy+eh>>iOC~=Ht9^yHVa)wp0(ShGDLlV&mI}Gs z>C`Dl9y=TRe;#Zwm^uE*gIpWnU+-!8McsLpa@SV9z#!rTc^acX}<+xGnVR$4^sV zd4md;ru?Yxr_FuZ=& zb;Mu9`#b#XpWunBJd!j8(gQ2Y_=D?J!_gMh;>_{d>fQCud(*ta%sj~xp9^1^m0qQM zR5ZH50_I{G=>)vlSMa8(=*xedj^Rhl2zcP+<(hm%)>MpVI01i{GTxWTN*kH4avkpe z1Xq6yRiu$%rtMhz??mvwm?pLuwzLljASb!jUGjo!uFc2QK~HDVMLnj{zZ@Jlj4JL9 zwtfZV8`*xDPt@3bQR zCv`VO*ICW6I!)g-_Ae&hbowWy8^{kkf|Q~Er~g#XH?uqy(M>KO|6;OzRTB*FZ+@RX zR|X*equzgY{;3;CleMzI+Re1)MiW544P6Tc@GU!=^(uC)IR6AWKtAk0H(o$lfGl5I zRLy&352aCDw;`u*%5<)8$h5x2#x+q%vll+#dcBXmF9J0Q56lG@h!L2|HB4fiw2sr! ztBC&<+}~j;`^T~VpF&S?8e6{`O##=F4V-%yk09pnB32@ui_UX)&cp$yG*Nm6(R&YQ z{wr$t)4=bVWw{#E{w-hG&37xqVUHsESD{X@oP41@D4{Qw-IF-Klqiz{CCnva)=GYI zAYW}qCfb4;LTmg%AHFgbKC3S0_*YJRDt6=k3Kwt)7Hbm`J|KcNiTB20h7koH!v+qg z^52{3BbQ^9h@-i@!?6F!{WRYESRHpL)y@n=aoOarJQvfoBkX?zcH{cr+6Pttj9p9F zr7Q!3&=B%4UadW zCnAggEA#vgqiL9j-KPd66^C{2$aBgGDxb_YgKzK#>Vlq*FKomtkhWZhZ>ZnZLm|9{ zS%-C*5qL3vfE|CI(cyR$FR85}-FZI&cI5~f>RZJ6mZ+$I;F>&(m&pXjcPUg@{)l(T z7j72YO+|JZUa=Fmp-fWyoIK?WUZ5);`7W=?J9y(F?$>-bCtg#!2B{^@L@+U=>c|Y> z0{74>(vq$*k9o3Z?eFcc?7hsDU1iT?6J&d~^p;|y@E-Qebba?mVu#dio**rQ3Du7p<=)J zErwf=-6x_9c^+W^WB*bD761vHxXiDl%Ie2~lpyqc9^slYBe~>R+ha)V+vjM4Ip z+wo7(2aMyqD~=AK_Fu#M*3034;!Q^HdyV`fKUQoa^e;TWdqinPXI1{Bbx^O{tq}i9 zW0Q>YohGz>MR>7adJ`9**#|oP*?5y0K#ZXGx0dK8*8dBSBURzO5M|s5>k28D&vC{1 z%Kb5RD!$dLKwy(Hg#YHTZ8|P5b@u~@@K&6odeC6 zfGLKvt{4`nSp7uehz?K)xe4cmlOWve+NI zLVNJJ3#qO=rc3Ch*d7!HtC-o+6ZK|WD*e;x;`kc-e+&NbCf<7-_%1Kq03Eq<>iUvm zLi~n0f;EjHJ9P>5k82`SF23@Rt9X_=@;>%It)WX`ShRUGSM-9tgk9Z#F}ZUHIY1>C zfMeLd$^BQ8v#G{euetp4(_oY#M+fwVm-QBnlV9q02n}de>Wn39}s_AtiLgu z7tP4izRT&6qSk!-87F^;Bo8@RqJ^yzMBPl-ovc!voa|FoIfDXZkN^ABpMT{YOw~`d zKBN6JiURfesk&fxizy2*zQE)i(gBGNP~^{nxjy0+@|YSPjS8&8lFhW6SeNn1DUpqyRd`tM@JcpW+0kMpv2@%y$)3aE5cO zde%)M=R@+@vYeT-PHkAeUa=6~4gRPO9M%Sy ztEQm-@4yD@@c;vfS{Gobv&C*=|DW@niDUuVjyVFKGL+Ld2TXC!tx8gmDYpI|&q>-{F@een9;0?pUawr=bo-0>5)UfPZ)zf*(0?l4vfv-Y4oD^G zhWx+0$?y0QDGBfJxZ)RX@%yBhd;$be9<}eY@mIaNY~e}k*Yg&^XzZj;`4ot}F1h-m zn9nY<1?)80N-xfR;`lDm{0{#AgL-B@n1UW)n+tSS&5y4~^SGR9$5<@C4cE0M9i%US ztLEV=P7?i(;{~22{x8A$J(PV(>9xGXV@>ADYTif-9_s-ctA~&DZ`bm4#%mvFj=^XIhF@iR&g`Zu*iQwK1ZUq0ra-Cag)oFtqJoRYsqYJ{BFb8)P@ zAeOkq9!xB41p{{5p)$_|?ncD^;#j*Fe{q0{`NhZvWclVZF#y^QP!0uVeK?mS)~9Sl zw(S?Kec=BY*u9wmFdxkHAy;!X*Hl@+%n%(c0C(Mp46qv71)1t~4BOuw{fsO?)_)Wn zAp1{?*B8rkp3i>9I()-^6UdoR>oh87rSJeADu6HH3THCi=Lzp+6n{(5 zxa^K~bVpJ}Paa0;Ynta;ue@K{e@#9! znn1;Vd4L#KNspq(5R)JtP}K#aDf}b!1Q}pVK69p0slO9X!Q7n}U?qOz?~hXf7zhd& zgbrXAv;W^Er++TKimLptpzwoX1@t~u`HFam?%ZcHI)UoURqRPF^lWTBF~1ty&GUtM z`}17$<-86*kTdOpziUK4RCju(ENc0gsSn%>G5u>)ST50_If%zxO16KW396r>;vNqR zu$@;aBUV2XjHYa^4f{bh@#^Kr{!O*>54`8a5aC!{2TftptrS;R8zGD`Ng9Q0e4dm4 zlRHMl7o_SMo~$Uk(`mJ zfPe%+KqX4fB1uX2{pN2U*SY8Jd!D_QYww;H5S2 ziu+S6V6?z`RWobASb$i)p=uAB3Z9tkKNGml4S$ylJMd-TJsbPUxo$_aWxM6Vy@SRL%5&MJ`qEi8a?fRo&p|9?TP=OQA6Z-@>Ovg)T2@h1h{Ww8OdVXX^uM3M{S zpib6`$bScj>5I=S!cWtXAz0|>mNQ$hShzL2-u4LZ2*m`mdhLl&gK!zj_3wdt$7i#& z+lOKR^#RBd$O62i-vS#kol5_A)ceYZ`oMbLWKPQ0MCcirl>CCIJum)$7*W&#{QoI-6FWnUKMj>+ z1Pn{IV0!q(C)8R-;b%Hvf2EJ=$InI+z2zhixI%4l2N~M$ZWe6HSYMAZf}A3rx0LRV z%)Dz=Gi=V6vLz{J@aKJI}y%kJG*_I zI#o$30N-H&zGls8RW8RvX=Q%G{nK#&4~YGz6YI}orS>Mft$<3d5jp-aAN^7RbtfCp zzJjfN-!Jw5U|6pcfy>r>*uQ41qY_>kH-kMMhEFlMtbjbSaIeEuz&zwjY?=IN#%I;)4 zsnr$+FfTd3>Hae|K)zqSK(Q7;zDai_Q zlJ&hqUHTpjU=h#r_Pbl$$ISiy5&SA0hTHM5HH*S-3_uk3+KxCWdU?3))(^C_ow~<_2g=Dm}-8H_}#~UzJ^{+ z*q5!**Zbhb=};M|IZEXrlJ-nJ99Z9*f)X z|BZ;m;^X}@gZ@`k1eal9OZhVg_j%DMk2(bJkP&obf0P_(BYp$@Z_}mO3C>|T*I}yUyG@7OI^T1+ji4zZWw8uk^ckkLY zt=@Qb!}O~IP>45ufT{;dH>~e87odpG0G49@XMGUe!1C;C?31(!>#04!<`M%avickg zt0-%!UkUi@k)>o|HaS^k`@Y=*zD9d?ANA`2+sO)!fCtOHMMiKM22eGvSJcLn6WM7# zKw&)l7FJ6|cHnu12JjBO?px_NDMaMz1Q)Z5+%Yt2U47Nc4{ls`n5znxJ%{Yzd$QU! zr~{tU;X9fvG=K0WtkigX{u-=8Z{mQ_D2fhy7M7tE{X<)ccr%dumn8;B9ZH1`xT>%C ztxoNG2yFQrynlJv!AK&4Jg9`K^XPf@39ZFcn*rg%;p(AB)F7&YH`q;@F!QG*F%-$RsCuN*<;Y#7dA?+3R7(Sy2xqkw*K{Mh1N>H79=!MYY z#ZcAk9qjD)3aw(&$s;PEQN%&7sO^;ve#`l)N{yfktjRc(6dIRq8=&Pzoggz`Gnl8iX7Mg&6F)fL{Qjg2BV4pigM=rGB30qJI)?w z9>DMT>Lc{6?k5J_fFDx!zl?jQ18?YOxxoF8;QJ?F0S4jc-vjCW!G9mBewroTg1le* z-E|=j(A*Er{`r7sC$~Pd%ixh(V$a^VBb{MZIq~)k%I1 zC3aPrz!#iVv49KsP7#5+uf-6qMM2!kdTmXmVXc8Pk(~fm(%tng)tq)%f@kDesFWJUh;Z(nERg|zAhED=im12t^ap5-RWil~+}CpuhQ&ifSSD*P7?03ylmHiBpDs5DtWg&=a_nEFc%}t~acH zRJbI&65K|A9|5$@@2;A1MEXVD2hq%Zn1^Nv1*CyX1s!kIgS^<9Ck zYCpNXN6%Fve)}agK%3WzK!tgO^E(62UL5qFrCaNoTa)~&JAH^Pi2)`PNA$=4G$D8H z2K%}Q{A-`|)*xvn=Pn!XSsEw9kE;414n&iYWCx|0mNru7Dk&^$I&!V7zL&^{|1Zyx z$Q{RCVa@Ec%$BZ&!u@+R0LRhsZifR{Pj;&KbhqEv{)9*85zqGr(KF!uTBC+hcfa-! z7|t5+N!7m*k9G$AW`ChBLI`j!31?(HemD;v4@fr=fK<%V07?m9G62Q@>If``t*8J8_yP6LPpyMi3|$uUv7i(Ayaar& z!S5>$SjJgi%sq8qEF>aO=Y`3-ex`CV+e%;$r*<2rio1_1)xf@G&!yUT1@A9?kY)o& z(W>4y>3{Q4(XUNq{|7gXmzG%-N8A@~H!91?QLSWVdi4-u|C!7Lx#%Xqr&NZKsgD0& z%G{q~RJ)Tf>HZ_K-tMf-O?a)@e%^W-pQ9XL8qfO<|6eTFkqBWfx$%$00AZs4jAZyJ z`I-f5P!hlSL8!lvolIcAENXz#@Bod_(ClH?p~!G4Vt|P7+o6M4)mp4fRp%cN0o=wT zYhMd#S(K}527saf@ptM9(tel9?B(ea`RF$lKxGB;{!;&%PCV@wq{_dl2xeBMxCHSC z>Mjue6$j`qJmr<+;~)FDCA=ZQ!)SpwGZ}GOxGNKhu2b{t9O@og6N*E3P$#DLW(oB{ z7xXr&fN?N>3*kT;5~~kH`MipmK3}14T2EEv3y#Iuhu-i58G=vA_>WQHe@@5LKZp#% z!3$Vh?SqyATW}pVbu=~Rlw7NA^!1NJ_4hvKcrLH@PVf-d;8S?li9Rno8RV~osrd|# z^oVO*$@l;2laPJXJ_oA(Wdi4#O%z}+FxgH`Kvn*vJ_%JvGV)tF{pvt8ztNA00rl*p z>@Zb^2>&b<{xd`XJBjsIajamS9zykNSwCYBv}ec%MD$az1D!y+b_D3nW25=n#@{(q zF~25-YnNc{HQa%fKF%ude1{ipijr=u`<49=G)9nVOKqbZKz?6rp!j;#|HK6RYaeFz zhvEQ(ec1zL{^I_HcHuqtvmyXfg_IgNG0cB7z5FHl&yvy=J;bg@ZM;7DRs>UvD%!V+ zaWwxYhmU?${-hQZ`m_DX92WA?pWlxnN>L-Jf)e;tppCVeoe|Sn>(NS21K~?S|2l9l zEx;1|zaoGoSOMh%OZmFcw*ZT=!#A)2gP8XH(7I(UVvn_1RyVsj$XD0@X>K=I%~G{# zZCl_VA30tHG<|)k>s`eApJLwayF`rB$VZow8#F>ywgXL>^8Us|ozcwyXiR+n2b1or zu{!%xo4Q8l%L}~Ld?M4Wc&;O41?mG<2k`gAusMh(dV>J%>T!zcUUyLZg_!dt)o(H~ z{bHc~9kPBW6reXS2Qfe-cA*%mfXShsLJ7n9=(Kss+<-$q{uBH7*Ni{SHh9SUP^Ytr z{Doi5J`s|I)!(TC3jfmgn%Q5PyPJfYx`M^~=_i`MsUAY%`!Tjfae(T6<}9i5CzXNf zCeqGm9!PP}lm#|FU+7vWH=e#UbJ4T01JYi2|H+|mLh-^)!V`#GMuv8wV$O?}aU+$^ zUBv#)gRS90MuFEw`0UZJ_q~ap=3*VTVg)9%cTyRYL~QLEOv=6f@CBLCRRqW%Y7--* z3jPN7HyVB^f>>=M{n}0FO8VMu3&>L&M6=_`~ z(mzcOa0sSPy+DdhH=_8}M6cs~KLxD!!-GwM8;3kOt0R*hJH;0R?M#>mIsvY zH#j#xG4?=wgW>@lN%^nh@qHwS)lPnyu|gjP64(KHV;hsZ6rc-mEpq_d6WNOa%mLyf zc~)j{pWV*^a{8Dr=;J?%XGsNAnhI$X(3}SJud(V;VO3Z4LJ+Rn-!i=Y5-fofmuul$ zR&%KCst#;T5u42MIl0(LtiV&cFAnj%q)ZA*>Ffe4m#_k7sRD}gm3LE?8-XW_rXQ^+ zE4n#5@hP74(25nK8t^$;ZZutX)2Su@K{dIG*OqLv1iVsX)>Q=YW@qC1jdbU`p_y<~ zXNdm~5S{KN=Rbi5JBl6n4(9tdY+??7j^{#ZdMBxl?FS1Nn3Z`tc#FQjr`Um4)Bzt5 z5g!R&f)|g^#NfE}2@IU+M!^EFjz~@0I^oHC)WU&We1ae(w+N%SIaIuN0H7urr$3kr2$(qte#g zizJ618ajf4?-m`(1YF_o>HC>XP5)LXIy^NzF8mPdHU-3w!|J_4)i48mw<81S4;L_y zdv)>I70D5_YrsIP!#Eyq2wxHjn^K%;U>Ltq4@;o@VGNd{7}ftH;J+NPS_DiQz5Rg9;9!S0$elMlftR0 zmZE;qr}&6pIJ*&e{`{;9O$#c;3dun?`5@<8yM+DN+Rgr*3FrVii~{W&{N7Ghr}(MG z+`Ea2?Il0?9HeWnAnjl`2=puZA3-!b2E;c4>3y*b!+1tpJbzu#uemp^m=}`Wegym1 znj9xPKJ*uYs`WyiI&lpXCm;QiAHMz(J6exI>sts8 zxDMSum*JC>z&C4_R3Y%+5RhPB;hmU<}eU$+`=G_Rriqqx4nHI?*?VcXjsusT|tZU+rX8MTzH=bWz zKbrch-xcOf^byWl(vJp-v>T8hJ;XkJG%EJ6-6 zSE+~^>cHvsWq-BN=!snlk6xD;)C@V|o0~|pK7C%}orzZ6 zfCthvn@GslTrOq&x@RWz{onWd`M=u-F@UQ7iSZZHr+cdO>1JvHCOgox3|}CNkcP;< zG7M&4Zq>kcS*8FLa`wA*vACU3E{}H(SaYcWs;fE@zpr@#SwX&(KT-pz_AeEH@_#cC zq!`&mW#XV&Ob7kQT1KD60kWl0oHf~2@&3!e{RVC;{48LppZ_Zd_zdPm`-D%x4vh6{ zEbU=f+Y^($Z#A~-paoL*&rjq5cYP0e2PWVS>sj-Eiel%p5(7rEl6o-2&IRhff~`6W|8#;h8k8VmT_n$6)?DR^Vam zz)iAOn`g8n-ra@wUjPp_l1#V*>v<9pZ*Nw54OH{JIQsKiQ+VDI?81v+68OMT;J*d2 zbfs{O&};85UMxA}K3y`EyE$A4N8GgZjU1=Ajh(XfB-EptIs4F~b)J;7*MIQ<~Z-V0*;AUS>zT~8)zE*aqQ zkHP4b!4}lxeC)(7b|Xrt%^7P91GtT9UJTx)JeD{vQT+tYNI7uYi7HN6^xDI*p^c~$ z+~dseB@dWD7JbY8kSL)rv3wHV?GtdXK9GypfQLj!N%8qNu?R0viY6r&QU+kb3zUE_ zsKDCD>FdX?JA>IPq`v*g+GR~+KLG97eE`qDk3)M}ijn?;uD)xa-=TkHA>O^W-_bt= z3(y1n_hntq!AJEZ%kPC}>V*wxPtIQ-4_XstP#qY734zuWBqx$XmnR1O(oOCZg#EL@ zqwufXU;bV^yy^e_JG{TFgF(INBQ}3QpXKZ2=l{wN^qA=p)C2&{{pyBw8%q?^#K-WP zz;Sz`TMhO5P--yOoK*HfI6cMx%J*aYf5Zh!3zUyn&^$0R5vUNaP#9|wjVa0?b#l~S#HKLgdLn-S_z$< zM9UX_2H*;jz-`d42=I5Vc^=T8%fH5|mPK;KwL3&Qe1*85GW3=0Mp<^-{go)dp}L%a z2w)~^mMTQ2^HJ#zz;nG~wf%@%Wjp?V10FvJoBfi={}S4t$Dsc$d|fjXKpQw_!ghDT zr)gKuir^q8@ohTdgJN|1mkrh@T5ip2uE1l)g-wrPm#?njz3}V(LrH?ak?*D?g1zNi zFVz600utIyJ|HhHudn>ysDM-l&~)%OtZ9rCESDyFnvUOqpZ5pw|EeHJMs(x*o$~wCC(K zfor`>mA?^H{%UBWbtc}3OxBC&SKu$AYW&d$&9e$PPvCsuo= z0N=vX3;Fw~{%^-43I9u3wU3zQ|AYv2G6?U&(Vx{g7|i!#UCzS)55pGpA`|G%`fQEw zZ;rQ<1*i>zVz3{3te(zsw+!zuqu1R1)IN{z4}e8Y-I4a!%;b>bSFmy5JVgYH5jY?3K!bAZX@YJJ-!8cOp7)W)a6fyq3KnJ@5`v81Ej#k-=a);TT zRR^q#_0P;L2dFomKcD~AC;*iOC>BsgP!tPL0b4kksY?sdSyr@mQ7;*W7FZTQeE?zu zmGf&Z*nH40jkWMEt>rB2tLCq22WDxjn{t*91QuGm{Tjf}&H;{-T>UHffM3Y-9>Vcx zKd_wmhIB->V#UmCh~%i`g#W_merB`Y&%y#+aDQ>Hq87@``#a#pMYlEpX1_Gblru2> zEAjT{iT6*i1|vXsX}V#O!DPw5B_gA(PS4vi_=083{p&?dFaitllIpf5RXkzkzvgog zgfWLK@`_I5jBz<&` z-1FYaU^kflWmtgb=$6`sI$#5afc_3B7phUsyc!zBtkBQHfp9CPotz1#pucfn=p&{B z&%yd7;mkbXo!{hL-yvf%lM)}o`rpTnUS{rLRdRtLWJBkP0p@T%+7d(EK^ssGZmA?Z zOaUh2=R~uymi)ggwfZP_4w=Ht%*Wm^VyLpgQ^aCz(GzXKW)|^vecF9JL>6x%!7IG8 zAm~npHB{^)7W6mH<#X}?O(ZPH3eY~vZ}1vTob7f|`>wTz%2Zco06%0Giv6H}8`MhVI>YH((lWfoI!*-65RI#Eq#6O)DX~HsRTW z;SSQ;KRR*!+Fx=nzMIpY7YG9IL_Yq7OZk1_Uc7%I(D|R6`Sl;$3i*3g`^5YI^R6JK z&nPzk7xqAW5iG?5e2B#z>05zbWLoX8%T=wWb|b&~e-LeuCWM}Y3sjfzZMe2oPz_X3C7>h*Rqm&pEPSni2{BB z(XZgfs}u3pBBD(|ZQvO_1$l|_XW{?1!BS1&r*Bd3J`9_^1J+ z8*1d=!Ve}yOP40Rh8o*9p_ajnUKb+Mr+x%;7sLzmx40?(SB*~bzG3i8F0W`n{Gj~5 zvUmA;%{|e6-_rUkN{|IG_!k49SzqE3R0R-|DE#ZQVvUFVb^`q95I2(ATwL}cItijD zGV8M;F+eTUOYboYs1gdsNbZkkmy%U|YVJP+fB5!p!!a z!VE|41eKRO;A6Toe)0-qT|ea+X}wd-7L3Ba=fIjLB>yoJ;4TyI-vZf*z<6TtZ{`8$ zeQR=@l)qV73F?D>$tvmOY_#K3@%zl0Xmup>e+}!uAC=!WkiXjZMa%fQg740tLwmu` zri1ZrAi5LlcrdG1UA@{LXfT$up8t<=2;P1%&jZF}NpY!}p@B*{pS4Z>g$;2k= zv22eecon!~*-Ux4jRx>5Y60J(4?e;DGsFQ;x!&3nI+uTFPvEy%C&GU^-!3RSC`XNH z1>FI=nO`%4{*p^%nuFU`l}eR|J)Oe>dv!U|RfAm9Glw*ZR&Rqxm8RuxP?ktXsD z_oRyn;33Vc7z?1xLf&8Ofm_6-q@Q`bMftxx(RR5GE)J#P6JgQzAq(&fH5oA`}O}>BT%yZ5#ENT?9{~EwY zWwipPTxpO@DT0FFW3UZKxuF5o?w3*ndx-!KZg6mu>djPU41|G z>HTZOttIPJmBG*Gp}#@?+?dHS?Ytk|_nmfDS>PE4fAaliDt8+2CkvoyJPH3}hyI`b ziK#6L*+yTeE}z&Q17i(Tca$AapFmP7`7wc<)=BFW6OkvuUqpldGJyhC*x81HW)%8& z&pY5GwD(~dOthcFj{<~x!vxAENE09qpdiRE&Y?b_XnLjV6FFTAd_)8=+PX>fKaTu9 zb{4ppz%Mvkb71`!5Nk;Zyx6Y`F7q>h$((OZTkYAEhC3m%>;sPc#TB#(KjagU4r*32&-0&op&C>oqgmj!2ddQq6q)DIBs%JKHfzC z%G%|*<;nG!Dgui6#qj+B#&y_4I8y!TF%v7u2B_Arud)N$MMNy1s*L(8*Z3>a{yy{3 zQ6DAb7H?g!3;)+9c)uDTzb2l)1e(Sa%mNOC?gVeZ4IV<>uro9>{5(7}yq~EC(}{Y1 z33h}bC==QVvg^a~=i?kWuz&H$lyYG!vyvCYhfUG!-&EMZu4GF$s2o0rKU{zw;0{){ zCK~K=`2MU za0fdVhly}MlLzWu>)omwI3CwOJ+E_zXI zRj8e*#6~S69=IOx&;%bMQXP&r*F?`4qW!U~TWM4$gZ~k%YR&s<0p^?eoxkss`8W5y z|6sC+&#mUpRVo>MuwJv>tM*$~j(`;ifkSoO$o~s{u~GWp=lx|YgnCo!lch0L25}71 z`b+Pt$zM8>`ngC-xcnw`IW5IQm$hcW1r!0*`N?2DvwJZGpg+?W3V7+=fwp74M`Uj- zfZ~AcSb1ofZ9p9H~60!NJ~#)T6(xIGt*%cdxP)c>k%S=^Q`JPU_Apd zUk*P4&|YEc_cY!=2Noe4M{(9sJ0{2%A~wi_hk1oYXd;!q`RL8lv*STpGR+O%b$W&# z;r*{LIb<1X^b_O(&#(#yLAhoCpW*fm9{wTxKzjUtCRX}I9@|F#pgjW?ga5U@9SOjX z6(j@hg=R20YIis{+Hlc zRziKj+7-m}Gg~R)6agsnSG`}VA6Ws_M@zi1{CJ~D(4k-J|PN&7Nj3s#2ktqEy!3-n`RtEno(Fn(7CejJw|Fpp$@&C2x5l&0}uLNg41q?t^ zssIDw>og5jy8aYY?E1J%-33%B--Ev`#1+d#G_MTkSI~YQOkV=+uQ`8PocXMZTfE~~ z_Qd0L;!`7(TI?$Cd7X31{)u@sF0<*MGRyxkINyb~S2e$lczWs5Ho=0e<0r3~f$=MG z!DLY09iQHXuamJ6D~V9&`pnb-EJ7=g-wez*0snPa=QW4{lqU>fVqn-l?W6|%-Bf3G z+t>%dnsoM>wqZ27(&ot{?d1P|f59;Q#=69I8H#7n{y*{fFJuQ2`uNul2^sLy zO9T0>HcU+%4`#FRNOp3c-gYNf6I{9zn+IIbcH$T=x zk-xluXF!m6CBtK<_WnYMC_3}7hsb2?~W!}&Jd7N28P#Q`cFSVSx!Wz`6>DDB3i z-PcE8hX-Q;24JygSWE5ET=#QS0%QSp69bt3z?WEnx52wuz})1J**VOvfvNyz2}*F-p|7c)b|XV71@22>2g<>D)ZjO&qWp*Y!3AT&`-pft4e(F2|KRL0L3H8?iX>ccXQ^~ z;Q43yoT~N-*37kOpuHy^f2^M^X#d5L*bL2E@4+*(S?TRauIf#C12`4{wp1d)hHLBXL0%zG`=2^?wJM0r3+!DTjBl@IQ^Haim~1zIL-w zk!ng`z-V~S@nHFxmx8%Bm%;xlIIUlZ|L21InRu^HhzvGU;W|o`5TNEA2mbIW_YcDX zeog+rnrBX=%JnhNy33TzUS!ShhW4|q@fqoYgPFYUL?;2iN-h3Rxw+T?v2)7&jSAo; z_*F!!I6$l3R0O0FR=2<_9#M|3j(#)U-*|n+{K^5u0!sBGyQ0irmP3r-QztpLFBQEJ ziI`P%0;OL;a(&G$Z|To2Egtfy?u~@0Z-X{EJHGux*o$OLFxW~bz%OL-cYRe;G6)Fm z9X1vV&=yXl4Hf&^u>DQQdEO;13RAoL-OG;>um`og8^Jdy2YbK_ETfv=$;;rKbT_!i zvAU0`$lBY3P^u$+pA=1U z3Gx{6?X_V8^hjoQG&*M|B+~sH-`EBQ=8jX^{uyPEvVP&-DF4(CXgt3v0lHU&LnQ9g93oL~us0LF4ThbfYpSd4LS-;Q7<8M;ozRK6rpm{NN zVLNrM@44*&=iA5^G|?gw1za5TDi^3I9OgMws4n(~0b0QC7DE-gJ(wC5;6(X~qlqUSAA=URR2M-(U`+K;9H@9y<~oCHo&t|87d~Uz(abVE7d4|IFu;9m1aToo0LWV6D#M(Jw*&Sk|HT_U;HrUL9>qEnHu{Vn|VMji7i@y|NdwyW)RCy0Ow0N>nn-; z$AIwBV16pO)#n`Zd=aV-Y$vm{o8otnJ=8drBM5x`cCox}jA zvG~6d)l2QIeZ=K6^0RjGV+W)Q%FN12&x(={dBV!M3ZhD)5j=(}@EX&@&Y=p5La$ki z&fqTeoQ~vJNbG+VuYQb(buHFVyub}Otq0@-fAEvNsAL>dWT@N6Jv|i1$di7a{x?@F4hJp&ewcPW$cQ2 zmDj7nC;Uq-s2D*%QG_4M6$<}~9>fW%p72*Zq5FyfEF$c7ZelO7@BMd&W})+`O$T#6 z{C{UAm}Cn5i28OoKD;ta-dl9)xG_oC0!6_sqAk<|NJ9- z!8iQgM0x;fqLNAvLz)9tFdH*fJ|mWxiT_VZR?z|c55vCJruugR{7-b}!^0j&_q&qp zzdG?*HnRK_AYJ%R;qy89xrX_O-=zA{?q}Nl?LP6|1FrcyuzGFS$>W?g-!4zL_-Xur zEP$rQ9YZCu-I?j+cShP9tc2Dce7tJ>;+>>E-RvJ*cyuw@y(awafEh?&CAQA8O8XFT z4kJ?4G{8?-jV1=|M9%*{*stTGzad`V94(0z)E6|6DpgH8KFZ%7;3mJ9n)z8P@x7!S z)c?fFOQCNnbmHKW|1)g=w)>{`Zxp^#0>}aw#$PtaXn|xA!~!IzCm{z|El&qf73^A7 zEZNz>AJ$qYh&QYP8anfNuA9f1W=){7FP|^3FQm%~2=D3&Fg8KEh@08qng${+pagY; z>YzLUHO9Hr7`EZnrJ)k%HxJzRBkLGIm2WcG)_gGa0Bbh5xc{M8R8?QqYdwkxWiZFq zKu>Fg-IMEl9?!oC3$V%AK?I;mzy)H%w5%4*c`^9U!^%--h`0d52qy8@&#%~zd&I$Y znK-?bn&3ue&D~~ZKzaItTl;kTNN0k80BoEngR51wEL5y5Hj zUy&?V8o&sCk`C5CFKVF^{Kj@(;TJD6(eXl}=6A`p_c9OQ4)rq6YfT0a0{`OtGzUm( zJy`=~0_ti}ye`izCO~xn!|RJBGU^VyW#a)!2p(q|0@;x4Nu-5<`Mex7hqk3U89lRXx>Jkyo zD|7?V*n%0p-(N;NaF!Y8H?RU*u?r1h_{*TGYD(p=BUa)BRsU7~&S=kxB%TocH=xpz z-n&4Re*k@%AA|ixXnPxT-Ex5V3|Q$z)B%!melq)9PByH1TE3UwIRV+hQ_j~NEWmVU zojr~Dy@vvot;g0Ub{40_5gZs zWF5B$yA6o`d%!5qcQ#wyK)waGLq6K%hvoa(@YM(-*}~C3}in2F*)z)bgdV*0sE!+$D}<@8dbS{n%fMUvp^JAXNd( z93T@7Xjjl!6+j6%#d6q`qf7++f_|$9pnDuq|6IOmqCyAGURTcXBoIH7vptK?+9z}- z=U@A&x8UcUuo6;Wsn2Q*J%QJ(=k_*M{aJkfm*fCD$n*AM1J1DG6A@Pz;}Bz15dW_k zP`UUl?MQakRti>-ysqNy0FN}H`)mQV@U`xF_`kg9wQCT$&4S-sNblKpa{l#X^8I{1 z;1GWOI{w`TYuLx=Ys!-qNv;4lYeRTyGRgm%F%KD`NP)u(a0r`Hz18M@QrU=T{ zO9vqI3-dz1q5@eJlPM^+c)%+qVt#f)FMco%UH*%y`gg*!k45uWF_ewUpG|dgBK?q> z(O;MqkOPh1EM|dSV2*i4-ths>hIUJPfD$SPaejL`f5-ZEU>gj_Pu$k>-DD>DOyTx1 z{ZVH?{$)PfWEc-&65{ z_CUB#3^NenGXM`bWB0KBDcGONvqs}jjgHzI+)ti-mg#fBW3 z^Qnnnjk(_(F0i$K)8tR>GdkaT&pGY(K{?+B&0;dAq7_Z&j|a@dKK^6paH#A5U+wt+ zk8Ovtf2sWB?S*|E>IjO}{j2&QRd7nYe_A4b?dMaN7(hz<4%QI&cz9?;=kN`xvQelQ zn|MjQlm^B3mOXTt!h5?GS#;(aV>R%;%*%iPv>JiDf; zXotlQID1W~u#Dupshsy|!~v=gPUG_g5Z{Ay+mc%suD~#^isr7ZWwKZs_@3){fL%-r zT?+@W!;b+@@`wd*tc4_ubQUOpc?J3?cJJqE==t~wbZ89!g zKn@h?Rl)nmMD}axJe!Fos4L%VFRR5IyHL2X2vPlBLl5*VmB3?g{BNOwNrw$6L%!RM z40#n^bU0B#F!%${x$EV^TdpSJ9za+9d8X{zu^Rw7ij8FZoKUnZ+x&J+}|Yp zerx`x0cd|RhhEXEuoG3&FgknMP}i@66{t;j?}tJhj>w*M_v!XJov-tevi>t`sL=H)c%@;XnLG(le^ue0@&9XZnv_&1fM<0&NnkZwm3Wc z&9}ZL8#rZsh0d=#y8*@{nqR?snhxSsV_Hnysr_fia+?dvWeKz=)l#B}-=eN+W#4K|wlcyG&kZ0=hEMF6q|E%9%yu@9Y44yLewaFU@T8I0HL;?A>g z!k5LR?&fjRL@s6iCIU$8=LP>UhX1vnsJbBkFJG^EgUS32AE?Mf|AT(6iGi9Jrk#K? zkq1-=d}fsocBfF-Fk)P=20rIn+v=2lfvVZx1d4Ho0 z%E|gl4(>E5Mt$+>9H_{CmLu7D?va}g^k<_Q*qAJJ7Cq-f-~yTwuXcj9ngc5^5PR^o zzoXqlcz_#l0LQTi2eAa_Q4AG@`|3`A&?3cuD1(3qcJjdh= zCT~z(LCk=xiXw#H>62|ql*7z3SpOAFDy-tGek#N3KPFCJkG7{9*pETA*qhHSh~g^| z3FL(ZJc<@d@4p|B?O4vuT;ii|h=tOU?dPQWpA~yCnyTSR_C$L^#&8Zh@H!X~io<&i z_*H{5Xn(2@|8M4;CiM=Wz^uY`aA9OJf_l|$#nNQvJ8?A`xn5##B8mGg6h6`|KIZ&L z`EwrIzutLfU$h?KBRX+(Av2r?wl{;~A5pK|guy-m($9M92Sv(v!6s!ZxJA4TLj zoX4~`%|fDr71RQ5u>18DzOEux&?N8)WTtKK>QebO^J9MDyd7CUOP}*IGk;t8c|c1Z zZ%d4t+L~+EpmU}-J5iMO3b=LcgZNgd{o{i6RA5aOz|;W$J-L6Z)lk$ge4BjV_fq95{N>c}Hj+g3;9jHO)X%)^wU%1ddVW45Gz*S^zjPsiuVng#qAjmKy!kWGnl=-WJToj z^;@zI(iIpULEUioup1!|wZfg`eG+Vo;&&EmzckDz|Be2HQ_S7@jI5;>41E(g{Em41 z#_WcWn;hm3GXAaj{ei54-o7Ga04w4nEaEcW*=4FDS2-7Nyu!o^AA#}pumD?qPT*G} z|2<4g_>sKe5Io@+EaD5QrXQmHJwpFM5s!AQ~>MA{72w+j={#|^b)wG>~FwJI=pQJH|5^q|4nax%2=rWTfQ3a zt{A{5fy~}Nn)eyvrrkfZ<5*n2Vt>O9`|Y&Sx`R zz*ksqFO^VFIbN@ky;5h04Ntj7l z2^R1@FkhDm73G;yRf2cl7>nK$Zt#7$>#oECJ7NERX6@et0Y_QW-*Yd37O*Xh*HNP1 z%|y*j;m_4gyaAr@B>I4gOa>axq^%g{0Nthru#>-sT223DjNws1X>!9uDa?=oTOA?M>gc9$JM^rPCxOYC)8u1a1G z#c5J%=EQ1?_0P@yL|901o8oNG!tGze|4($b*^5|513_eSu&J4QiUT^bu0CL$^ujL0 za2o*9#WyRW9Ph6$sm-->*Eqft{y(Q;zX{$yzLkpV)VHVs*0Tl&;q#kfS6cGQjlh3B zvVFz*P5Ih{LytA!v#f!*fY$u&-b@j6iArCg{Ou0M5zo8mWVg>#Es&~4H8(T)&-CUg z7ytKuD9(@uND3g;{u6+E?ffkpAT^RKK*;AN#ZLV5$3LuqJDV(c5!`qQc<=>i+GEhH zCwKZ-AHwGqBfeL+kD2;yDuJr_nTkMOY=bnw^8Ts-$O334Xea6leZl`~E1C5P*G4my zCW8CVvA_$l%8JuQb4AquJB2GW9!oABR=rk(xssX&pew5V*B8>EP};7ECwPFuVxYLDUA;z*kWG zpFs6e9leX{0AIlZXg`9E=zwpAI)|%;`-D))u@6W(Vi5UvG4zT8bV#kIjy+}U(gDc# zNev)1kNK>K{vP*Dd?00zdR~QfA?2xWQB?0&Z9%W0S9{}Rq4%MuH#yi7CDJS={GJ4< z*-dy^2H-b-;ZAG=WKjw>c+m$%mG}2zJLlg`c?Ph)W2 zibvi<`STv0zY!LofgcknLTG~pXph|)AIN3RLitx3R5oo!{sJoQ=O5 zNhiiq=MnpPRR`7iee4VA;saC-G}Av+1=K!Z#r*8wFoDtlNCi|MU!RT13+JsC)*%qB znTq4F0JDjkv=i7kVlH)A8RSd%YifS|xuSis=$$yzU9bSs0u4h6G~L>6FT$%`2lJ`} zt|KShf(1B8Oz;Q$1sUC#DgjaOfzkp*5?Q7K^BGuSvEQpdD2M;tD7j1 zxPi$2Gcp+UF6=?=R1BWt18|y&cM|};+Cy==pZ9mdDi-7Ym*u>CKs|H>IZ=Oa66fFo z6_M0*JEr9Q$3Zhx16vRZ-bW+x(%&A5~%*pf&RIy!EWGP*stwJ`KH=e z5A44~C94u&rTI}z&=Akxp1&pLzYo0hcq`Ib=eFdmbb>?b>xP|i)>>Yx6!@10N0qm~ z82Nt(=KuHCRIO2VCsyer1#qkaQ0$|bL7H{*~za(d^g5L|&n=EUhb;Fu!-39x7 z!MC_RQ}>gN9?!WS!B3?15!+ne7U%(aV;5-11x{u7j5o18UN z0@uIY6&3Ya0P%qNx#b1*+41>F$hozfm>$(5x%@SkpA{EPJ!&j!lsF*1 zBv_9I>$%xIAPam|Ja(x_?WLj;l8n!3hzQDHAwELye;8d*X8e9M*>W22-kQjNBNeZ^ zWYyD|ikT6;zMIFHRy$BQ&Qcd%r)z^p;MYIw2*Mhzep zfGU8h|0ybvPZyu3jsW?5MFQ#pGTeZ&e|7rl_oW_CMi9p8^>WL21A^0;>-!CgzkVom zS5T#br^c3jz!g49w@ytsfbK-{S?TN#qTp5jGLvY36whepb0Kwz1crkC!LXy#i46B( zBW`gH-r(sS^iL7^_$;9RJAdcTH>e{@`WoQAuz&G`SIHJecnQ4;ob@2Nk0u+Z#?LEG zivsh?`E@O{S65D=wYaFYRO`PEo}6J|MOe*l!0CJ9DUC zyc_Fg2y1BSpZK4Jhmj2sH!v1EFpkgTSw*W@=NYZyME}>(mdqr!?2MmjiGLUR>-*e7 zy}&ot57jk0mKfg-!J~ zgMaCAQW>cIn?D=vkC*_X^fmK;Vr_!ZAIk%n-XPomf0FZVJ7Q7Cv4=@Jn@Mp*Ya__@ zno|P^I$fQ6tga>)I7 z|1YTpu7U^L<8uHnQ34eJ<7O_PyuJL26aa})ki5lLO@!7SG3pgio=}wDph|9Q^e9K% zo9;76kvH5tCQpUg(e79DLDx8Lp%=XG-r@To8um(D>q&I{--ZW|LNQYSb)5QLCsX}W z)qEBA%b*JQ9hJaY_`(###&?1nLXDWKzb(`^Sj6i@?E4l-kc#ITK28yUYJ2ki$^~w4 z7IETzheJ8{8ZYZSJeHBF=unN7Y@A+so!ZXR$wquj~LJa939DzdQ%hFfF|G+ zk+{Y&ZrmpNV#4_pD~`+WW63uY{(hf8ciee^f%WjA(Y*bCc|8RV;HQ{2CLGm4&@}RW`F~ZHW@8Pc;UB@{WAQTTL^*`wCqKJ@UW56Y!y}sO*Bs=F->V18n_>sv zWepc$O&7%m{NvAn-E=oQiR{Zft0BLY84M=% znLjgk>%Ry80epW_Vh+;-U{r^uBS?LLrUoG7YeIl>0~h=|Jija%k5o;&(K7dPGzoMN z_CLnE?tbDtMMtSF;ljQRFnT|;516ch^ucB?U`+ukip4C!q4>W7R&xNo7fr2wzW*Nt zng@YnU8Bidoyph%S%cAB7h|7=eQ`I+0)}!mmHkTzJcMJUZwGz|Y-g{M9eBly`2Cg6 z7brm2_&q`2v1$^qel+=6TEM(uJP+}|`T$acH)%`Lb7bZ@Cf_UwK1yN%-eDH)I3@)x z0WC}2HRu8lvNy%o>>jWZt?GOp`;te$Nr z6?{oGYy!D(0ixntex8tr%z8_(O(=7C7&~jd49+0~$ix5g7M}1C-d{5fV>5q)VfF0G zBFO(g=CdLKGsjoazwj@Hz|{Us{IBm6JBUrZjg5GX&Pi3yW>~XA@Q-;hXzw%6+X*i9 zTJhi4AdZ(#`MFmM?9Ya+8%Xs(KN0+8U%j*qluw55Sj@9JqXmh<4s@q~{~b7iRoI8C za3Hr(L)?KsctAe1lUPUAZXc@Yl`tQtu_E`pq^OBAk@=4zGQPkWuEd#7%N0?iuR4uv zuyosnxS4D%C)UAX$G7u%{&U25N2&b%1oOAY-a{YXB3~cU5A^q7U9`hr*Y{Dc89W`y z)?0(gVXUO-p#KxBfOvp8f3nO{42@>xjit`Vz8qx!kMRA|u?w2$*M*3^A=sD3uP%5m zM?9?cUYyljg`XJ3Pe<0G>QO!Yzt3wK3@92Y^*qGfKvGyfTSQ#(*d*ie1LX|l?8a0Npo%8 z_Cx|rVFdfqDgPmRhxJ3J)|9>HTXD2yg2)i&Reg$T@D#fWWFnuP4+b)W{1QaYIf?pb z&>xd9^aRyUS9G(f@TEa|gep^CTNunqA5bUu0~{Gj8@$6_Kw0^3g0O&^)1gRLoSpo? z_&ZhZ6v->f7uI#p)cB0Q7rU=q!PEux45J-VZS*?7`-Fa<2;Ofr8rzZHzTmf^MBxP} zkl%yZUk&obV=SRQagIqHEy>ZxW3l>D_fLn#Isj{NklNoID*ltH`45H>t%KJeL*(Cv zV;cVbDRKXOBK>3332smWJq(*Lomc*vn#gkcBsEEWE3bcwTIpRPrB-zNe#v<)#+8T! z_r>Y?Ex{F1rM3WvBDN@OvaCaVV*e}T`zOG@x;(GL@FsIo*oCZ(;CUEWRW8_v7(gDo z9#%k+zvgww28jI|3-X2f@vNBf#Q(AbIwpYs4`H4!g8s~C{=VT^1NjZH2pxGHgYkNx zpeU<3A2Drl?$;&e*DMhA1#6$Lo*eCo7kcu)+zO<$zja(JV;{~?Uazpb%+6~K#)i}Y zDQQ93+dlL6-^2a=WnaVss^j2o-@_Z+E8iFPl^+;xK#%JPa!bv-mB-c|K9*I@zD`9$ z`>=H(`e zPzG;0_>}W2)0Z7kzHhqy)GuJTLOsv;e%XYZ947k@!+7LiwoYmMN0wR1xGb-=BQMYSLt>3FHNuds)&-Zk<5|Fql^nmX-Ur!v@H2R|NHi z{H!*L9H1F-hH6pLtSRT$Y-(AGcKp40fr{28h5&p#mj`cG)UB7-jvx|>;*$UZURR+hR*@6pV zbp+h2umBr;24DwO0PP_D3u@q$tTUqnlnPL*%S@8Wjn`K%Uo2Dcc%1pa zyQzMUqXzaK-Smy&))&DG4$V*8bDP8)gNrZc4kCnf5AP9_iseiKT~KU8ozSH1%TzxAJk)uge!U z=kE+;rD|RF_Ydv(r`i8qSdDuEUs^SsU2ZEZTo-Dj)7*?i|DR!(YViu0eEe(rr)qzH z@4T=76Y>A=N7Vgq{Jzkiz{kIQzj#1>C+=UWAlZck#0nWeZX~yoL{u{a^{xHPGEK%+ zZ_5fO=2dZ5*}1Luf8t-7A65SJS!kCwP|Seo5jN;o^b`gD8-VV|fwERVa)2_{CA__2 zEvdJ4ExU4Mro!pW=WmW857VBj{kdwY*+{uDjOQp{7zp|YWAkPE`*Woi1S(i{?fS&Y zFJOnaFcV-6QNTv-?II_*;&%kf(-Z{z$~BG7T#;ukJbwgOjv&rVhQHCQu-vS@Vyr}I z2Nf^m!Ujl>qG>|euo6jlzQz1W&Ekz9enI&>bFUKk>5lqu8av_5 zXD6UT>@B#Fym|<_ns)I23+a}NKzp|?bcz1E`{dc_y$^WxxYPlSHy4tX11Pc=%dg$L z#OKNXivtkC4dZX}f0O--FI1h(;9t?g3&#Wf>6oUu(VgN=#QWD|r^2t{_!^^BZpk$M z`Y`hy(EN5nnb4ERC!+_Nj&(>EyiUDxCrDln%ID$1`?3N`;k`4VkB%bRX+cgn1)r{o zC=<~FbcgfmMHci8{NFun$9C+-dhq`NRl|4qjimUFAJABjV~4h~oaKUC36pQ>d@JrM z!7Yj_Q~;}+0zTvh*Yg=XDlhFb ze$9A>cK062Yfa)NPD=ZJNozEK)%iS-$G+es;w*^!PvNC@r`VBJU(^Cs!9zOV?~4D^ z-D zBWH)Tn6o3LpRg~FZ;)R2f1y9t_Zu~!_69FW1T_G4)dMoFa_k3?*xCt}g=p1JJMwu5 zSLJh#say}~{Cja5$eA9G4Nz9l9~&Xn-~bN!eyIYa_Bt4tYAv&;zyUmkA>IfJu*%2( zPG1XjiwaXFR-62OL2z9JFE0h4BKZth08N|GteMn46OhZd5PFuW4o2ejv-m8bEP$S` zy#-v~2E6iX@tVXLA}**x2f9H5%#vJO9Y^{m)J*fvY1?>yKz7>2( zT%g@MKc*616tDjj7WET2llE>6aGsC4)p(fRsa9rwk5XX*yI4>{GvjxMV%G_c#tpksZv05&kt5WCttf1b#C<*cAs* z&|i1z2vGDXeMv?TlEkkDr1g0~Mf{o{B-Kzsey)BLSpcI+*B;Z!u^4e#pPDacSoWL5 z?CLov>Gp;Xw7|+an8502XltQ_X^S101j6PKS&#CO*By&+lWBN4nYKNG`TF@nSPO3z zImg@BmIyd+&Gc54UwZVdcpr>je>(ic1blxJ{?}?u?`i=069muV``1(3pM&yu5UgJ$ zJE>m4f1l&?O(vyerD|B0xV{%LVRu%=K;nZgc!)kcUwViebVV(N1sICm&<>wVU{RZ3 zBcnO1%EMHRDZn)-M)qHV^Bu*zkM?bWcJYlz>@V+s7~d~8=L8ji&zu|fb*6aC1I3yJ zryci<|5tygx^GqcYX_DM_T?Q0`z)X7G8xN?>d8&IvJcVxq^B3X5z|07(eVM(#6bl&UPqsi=fcQVd6Dl*1Ev<%q z?TdQ%ejp!xK>Ik0>f7kdm2AN|9>~=h58jorX}2}0{RZ%zx`D>)Z6Y@`MtCEyM!fl>q?2PJP|0aW7`zbqY4E^6r|GYY^u~b#)14f^0;um#48UDpUtEBA zeNDcWI#_(aG`&*y3;AOIrS%tUa0}$z;*pnlf3cs9+3{$ZH<%ureR%ms)Zq)G)Jx0f zroU1*m~RPm zFPfMjBj;8-Bb(3@4G7(hN>^Eg`JspP+V_-jLT zJn6*6ArIoY{rD`tSU!9ZQNbs4`quZe&|gshPw?Z-9=uvTymdwDee(X&t(4||CGam! zL3w@$*!)^NqXOQqJ$6Rw^~GpfDq0`fnb=LGH+HZ;>aeie)lLdRD)LGNz)^CLr`>;r zuK$@2RRC0hP^C|?zh)1aih$`1P*5JN$001KunHw5|Fx^0!4JdnB13SBxETD>|J%Oax?#2~t zz&Y;DRT=`)RiPQiqq4L8@$VC`35L%Zg2m8tlzpi?Kny^CzS|oZY<+A`@R_osSb){s zw)?8!4XmBhc+4c=J2xv$Qvs#;GjoAt3Cvsop*$1OKnk9xxHO7qs8*=;n%TDx;t{1t z(`<^wa0cu|tOUoC#PJz(qpx3kM9Cs9uw+Jb+D>~;`_9hmm&h? z{IR`0vJ=`bJP1>n3EpoLoK$B1gGuE4>gb7s9{DaTMJ8tSHl`Zc0!2az_UlZ@?EV~7 z=;IK(A1Cjhibt=F4)PUyDUYFR_#b%c$}o5RU^=#-d~i`j7seY@Ln~dAm7#v=Mfm*X z#QjU*{D;62MiDh^!SmPWH%o9<)rXY<&Lkn{FC*8W2#=QHvlM@-`iYx)n=^U`e}9}~DFDMg9+VfBk?Uf)2TuPUKt z$eBrU>NWp1kcZg-Etz<|pG;s9&+Co_X~^r82lw(*C0YB0`CO6w{XKrtko8%cmHQ4W zSgX4NS%=g^%V7Ro>#$YS`P{9A73@q7biy6xTw&r!Q=V0nC|W!ID#q5Nz5l5Xv3;fk zP?Nx90o0Kw=1;qiB;o&)_fOA%n1W~}E#IkAC=WS%b29QCsB9XL+qPm&3?vrJ;EuP` zTkSYM2K_oC>iZY+#s3*wpvTlDD4QS~p;$msKq+kMAb5ZpR$*%wSE?I!Tm99V^COl; zU4i4V-}3*RxymE>PIJJGNqNfm`6^?vXXB4!DjuKwSYF zU;@v89Qngs;6D#2)`SqLe>EFKT_@53s@Fs;Ku&OOW(SG=Q%`y(@GovKANNymq~&=@ zS*dUNY~b&pPxB~##LoN(`f^eee4C2dIrQ%-!2Ccswa=N7(~|Dj0(jW6XoYK&Yfpk1 z%)tDe56H_8pqTB;9#~_kG-jkCp}nj${o8naY5Bzi{_&^RS2Q5iqm)6W;%69tO$T5( z^1E@tSY}@93ntNh=aqol*Di)`@IGps19a`)_0qxkNBJJVFsKiqP>h30;jQ3fCK>Dj z%N^;04wA{vA#Tr0!~@{@oEs#!f$3O^O8Oo;>5N`MxPW(A8AFH`X7hWq=?EG`E>H`# z^cDVoci;1u@XxlQElu&$etnUgWzA^NzTAq+6d7b97kiBz{gH@&FV}4~-v0y@z?tmb zbKZ)uz5vtR@g8khGh%;ZK%vxm)rbPbAFGC}m7$toUsjf|FP2{Sr5cl7XDG^{H_W1n z@pJzr{D$`UXvzAk3;v_Qy=q@l{N(3eC0@M-7T`U+oxFJ&VggkJDv=WmhkM@5q=8yi zL%2U1-meAcp@`Sgy5i&kA9EhMt^G`|rZ>+m<}9#g^8OU%E4GitzYuTcfyf4^ zGN?>Ik%1xvGaX1X0qW6dk>9FK$JHp`%WDcyU9zt>pnfP8KWoaulFeKeI&P{GDp!zQ&`gS~_$;vi;sVpKa#Qdu?JkrA3!rJVzvFvvQE4~_OZ_bjAIIj z?>wyBdMf^!RgeTdLK<#4$Og1u*Ka5QBG3d%xBnTQESGnWSidLuj8B*DMNs$)e>IHd zD@>NtmAQ!n50L9GY~u(>wCYs=bd-$*ZhCA z@O9F}N&6>t?cYD?`#%#+#7+Pc-nA!~dVn?>qJ#`7!AS0|9Xygm!@Vgd{g_*X}OY=Bh3;sS@W zqjx=~Gfg8-5__vkX)W*{<6CTLI!zykcv+LxO`tL$-G*WT)c}n`XbM+!8jp>G(`jh6 zW-izxSb$SRjw?A@DdMvEBDuQP*wJg=1i7A=obE!=Zl?^Vo=Z2PhwfX zbl@_HZvhkqC<_n|pr~AEyvScQIyLPru#UZ}+L8rdA`i%qzwZFTo8tQ`5p#EhWvhV= zXhu}{-q33Cy@T8s)OnZwEcR- z8)g|LAudUQA1#SSaT%SA4Z!k25WSz{5cX&(ocw0r|0_F5g#}1W^8 zmU>?^FEP{k#`1q8V>*%WsQIer{0!$My6P-s>W$f#XF59QeauX_^8c{+p3zd&+q-U8 zRX36bK?wqqa}W?wlAvU>BB)?Q6htt9Ibp;Mh)PlcK>m_Si5=NvF@6BxGn zJWoy5-RItMzMKzt{M}*I=w6+>y6QLQeCIn8os)hqmgwnM8LQu#7-33(pDXbe_96Dz znWHGv(j?cO#!MS?uS1UbyP^f0(c7NKDuUeJ2dQn~T-}G>zL%W8_qcahHZh$B_Mgnk zu&VzAE~D@Q*mISGlMjK5`{ z5T#uY&kin^!VKCiWGcAe>cZQF*~wk$9Hix2*3SK4fMwwSm7qv_1FT^+{mkmM`q%iA z4D?Q1I!^COY6b z*6<(M-o-m$$p*uMt;Pb^f_F2@z6be%N6-}`*!G@0dIi(;wq-KbLUM!Ca*q&2`wWk{ z7vEPG4O0z^z7>*Df^D=5jyZm!0cU>y$bWMK{(yOO7H9?bsUE*zd*t?9GLn8Tb|V@+ z1AqJ;{P`6~|6OdW@c=gBnQVj4Umwd~zT7V*bCd1#@e0WQdXW3iuziQ4gMLKz*TSEy z#-nf85;EquXmt%4=*MApM_@WDm!g42p~K>CY#*W%(s)J3dAFPsPd7=ZNmLBh?w za3*5|ep6i#m3ZGHtNph-!wx)F3mo+xX#ZKh%dW0V@c-WgbzGCZo^B*ZZ$8Lhme^_B z^2LXZ^4{C-#G!)S&hlx*Wvr8$?bfiYi=*3 zy&qfOE!S4~^=D;A=gQt#{l3V&8et%>RRipShBz4e^DLEv^OGehzY4iHf`~}XQj6lE zv}bY&&+pFKZ;A}nK)&>*|L6a-?jn&&xy1i7FWB6Gn#jESYLs`_f~OI_EoYr*Kr}?=KC7;3pUXF-^dOqs}7EdAwH{~=)^HxLJyDr zdSXB4_x56;d@c3T?-Iv9htorLUL%RLh$WHn;rXL^Q#l zg^!bRSmAQTPgzHIZ;}6%paEHc=doZvVkH~0;;b?YEua^mwQtLcwh9fHP;dBGNs(_-(N(tngyEfNh8djwLs6 zAXfi)ShpeYZ>^EPuJ{IP%58ul+#me?5?=Jqr5CZSyRjEFaxA|!es^WQxia4((*F~V zqnPW1lzqu~)Tp6*WG|C8p!3VAV62Y+elXGKE6Ltj#I}TtoYmAIe?*s}ig5h(i2-a= z&iee1$lw2!>ZG;wI~+r2-glAdF8rQ1$-Q|T*NF@GHnEtcr>@$|f`tlq4lIvsrmDyG;IjT)TSsn98zy6g~em+NZ3GMYIM{X_1 zU)#TwGiLVI-C4t|XL<-c-TByoA*>WT{fxwB90Y22U7UoiI1l;191U<$jtk}f)dOd< zj?CqE1zE{6iq-Q=VFcBuXM+8gqDS@thg#KZq}nWXC4E;guaa;7+Rphc>wfeL!~=4J zecAee7cQfEVE5$Lq$knw0m#G={L2Vd&*i@w-b*idjM4D*)04{C>GU=kPgKWBpq9mXX_sU?SiUpztn^1G z(C7gaHGn=6U4iTt8ri^QHNstx*qTIOf9A{{%<&q7j@}=wa3Hsh@ma}XM<*k%V!l&3 z$M$fYO%~xbyhkKxUpJ!wmm~Xj4Y&jrpi8nxdNi__6<=c|SrH_QEEo77t7`)&_FL>% z>m2zzb0|hvh+PMAa z#krb* z{7)x?=Qi?qHxQS5j}9O9>TC%1-v-S85jOuhw9|*=`A?+7!%xL!SpMyh#izkd4$BW)=j86wc|bT2xRzoMBev7BkYA{*cID9fcs|lYyZu!R_eRv zuk}`BWwqm2R|VU=$9Fo{d1I!r{oA@_#HVB>3Xdtc~ag zg0R0CKwb|D_W{=pdDXWqC`!gIlg`zEuJ$w_B&{>HG@Zr=NZ+?u zuf^FykmPdYUpC1u;g5mNe;^;AK62|!(5MNBKB3BaEo3T1mTDpK_3~HQHPE_ry==MK>u^lJxlr2*QnF|0!#lV^52xcToq9s-{bACf)89lrOx?i zo#*izI)lSs%Td1_71!X+IA7U(!msdgoUNVm{Z;t3T44Ex9GT|%Q49{X9n#(#sqc^O z+l5>G@noV0yB@#wRFU<&3%At(_GM_y{@carMG*h;>^7wTHqO&4=;|}GN77gFoS##% z_4eC81S=61-CCW<1~a#T(j1+yQa;FkN@)6U0JUS@FmtK<+HJ1yc3X%qsWtZo;i7c z@{Rk06WW8Po%2xznfj~z#q8gR|Ch0srl1+J230q=v(J)Q|(k0-ll zHBJG@zED7FhCpbc@(V%us)zQvi@kH9}|IY zNBVn%{OzYG3o`^?&3sEMe5|)ntLxcm?XSWT$N)^?mh%C%`IjL5m+_c&-gb1Zm{dqR zu%0Tw#IB$tz^z!6JJA5<1>MQ@YSz}*VCV|0;fBbJ)j?(bftn-rDV)1~X)1zp<@vT_ zjW<9Jv%FKca&1LzRUQehP5;2GfXEAS2E8@9n?ULXWVSna_;Jwq2sFSarRr4K4L}RD zAR1Q}sjrI$*oti1-%6Euq$2$>UZHAcGF*Clcz_$|*V&G}bRK4gZuupT1^mM28XMFX zup^KWKf4(3Oh5hGi=UFIwLjH3bK&uB0rgvl_ZU_A?}P9&qWhK6GBv60`;#1i&&bug znaKS(eE#aC2dQt~hAJvO@YU$aRmkHrc>Ql<_w6F|8%L$UH;F!~^K0vIWa{M}ee~-! zbFvfiy$iU%H#S~o-|Kd{jx@8{9Dg%?t@t(5Kl-s)<@*umpsoxWkt@3CM+^FX!tRsfq5q8>2TXVu?@{6CpBbUd;@9xZSZYa>Zc zX8y#n)DO*Og$=-pcgQ7L$=7;Wy{6np7YkQt+x%ipyZ4-Z=_{>p?Zu})TG%JqH(imv z4a+(jw6z-(*1Nro(NR>5qBI>`+pRqrgz?eU-ZW5owL?GF~*lJ_{6ZX3< zzqL0x(<{Yj48ODa-#;!oBVB@@T3-y{)ykBFIM~OVH!J zD;l(Y(hn>)6m7XT$lojr=czhL*=`?3Yt7cai1TU2zcYX?2L(*QE%8BGT5A&#ugG zv8SK8KEe7&=TEDEf8qNog0WAdTkAK)TGVKbgmt_No_`6J{V8Pp5qy7R{##@D8`0OZ zI>?{iW7O&_!rSPF?7t3M--|te5zD_GoBuTU`zfsdOQ7;k_+B#${59qH<;EAc;W+6V zHQ@I-si!I4eS3~%R8RHdvvxtk&FAlwqo=0W`R+Vwt#2>%gZ94-dbJkE_eb!>vuK?A z(9XAIx1g<`#N$|;H6e~Riq&x{{=Rj6(UEHi-r`U+!134zBYtLqixW>qON?jDm>Fd4 znDOK20c!u~sdV=roJ>l_Bw2C`x@32-e^)F~tGr@8Y?YI3U9~NFOxX|As?4ha+Q8*| zTa>#!@_i*4CwDQ0VhB}V$DrL0B2()3?EJJizI-$mcrzzVF{N=Sfp0F`*IIa@R2 zL2lcM!U}8|vJ$AhGWw%2oZMwpz|;WQuY(Ef0@iPZ?XQ9CmypFDk^W~u;twISE0N08 zMD5I<>&h`+1sit|`&I+3^i7V!&H6L{&#d1+_>FF@u>C8kLEeshoIOFK*CF|j@>#3+ zz9&HUxA56t(xIp&@?V8qpLg;1m!M^iqr>5MpoXK-W1k`M4wp>7H0455ILXz9%dQ=G)GpR?F zagS**gX&d}wfe#18*IQy%mg|FF81;~!n!9K-~e>Zfm^(QW6<&Tc9Y39w@aG)URt?DlY6(c&CI){DMqds4cMDwI0z80m^b{IE zhrz#7yKDaKu4s{pU=Vu+>tTG8OMk80uJ)rh(PDCO>az+Drr!QCQ2k?g5--z{Lv3;& z+Y9t2koQl^eL-dKVqSAB5rQiC{FC7f#riwFK|GUPY~90k3_PIV`)eE?+H7 zP99BnEH(sfnekM+)ULQ9J%FsZ;b7RV*v;z1(5-{O;`TdmuIVq0$xOx=SlPfT#{8up9f6^$}jVhLZgbG;`pgM z%QzN~b@T}82y%E1RMseeyN_kz@a~&>D60eL7*p^#r0DB3#*(Jp6VEOSHJnyHd z4a~;hgKlDX;|cVFLz#)6{|tQm7i8XL*yPH1k7zeU9USblw_;@^?_r;x-oT)&9ze+l{jm|P>-PHPEdL*zU3Z_4w# zx8YZ}$?bbfetZ2b9)M95*?wy*JPr{xsRu6bv7JHvy|}ik|8`)cf8c|?$v55$CNoYW zLX(?$HJgm$!O$%_v9_mz+U*PT7T`oJd_qmxfk;X76=R05(#dKr3%Xy{(!GAhh=}(U;U&! zai(R(eUSb`$bep7yeX@he#UnX#hP^@@~7Yb*TVi~nn;#UW}+^ZUh8jP5<3N&{}Vky zw$6KjYX6&a1a?919*EC1zi?9WCiBhOu|Cfu4$!$Yu=r@YdvYrJRB6|nvKOe*?osu+ z;}*RsG6)={o(*i(n@{YR3{Bp~^Y4NWusb?nPqe4K9L&l(1o^inNQu81Yj4LTI}=}s zm7m3S4R&AlUtaK9A_I#+05^g5?E3V3;d8jz^evm(M)`{ecExjX}i;WCndiW^NZ&&UIwvyb3E{fCc=M4Bhpx@i$O4I~wV4LN@SA zWYSD7o`46iH?j0C?4#2QWdyh4x*c)0V~dw!`=6s9ab>D?hQQ|Cj2E#Md;b~;!0BW5 z9sdwb^J?DFV-c^|w^Xh4GTjTu5vAJ>4f!>e-acE;u^H!o2kCzo*3UkpKj+bo>gX?j zZ$)rX0gYCfy=aLn@5DYhtJAz`kBXHQZP1{B`U4F$MNjlZQ`zgQJ4agWT7paYh^XST z#2A<0^DoS8|HEjW58(ki(Bbz|u>VEa06oEDkasi058)#BXNNyg{;8}55&xKcUHEA9 z13H~Yk3;^Q3w91!I=dzp!uo%~y4XLD-dWq@gz6nxk!3uUw#${P?FvTF)f|{Wz2L=} zx9za)Bgi5=Ke;ufcLYrBVI1}PrGtv!q~|1a(N2TG2d%){%dW)+p<~OQRo|)`cH-=m$N~5Rq_#6YlX+JI!2&}$iU*>p?day2wx7#Y zV0|aBn<;Q6od0AP|7qyqsc42Px$gwgnC>VlxPV?`1Cl+{gIU|-V~ zGrb@q)g9{Q@FtUjs?mA+MpC1g`&>ys>@JrL*wG?}PQbiHO~Kc$52K`74r# zb2rHUBw_%)d5@V$)*o-1e_92!NgejK2hsMCa0`p6(0zw)#7+6UadhLj7JM<2YTRpy z0NzY3?{aX(jqs17OMOaJsmGs=H`0?mtp=~?bTIpjzKu3C&TkJ9Ym2_ia|^8_^q1A- zf7P5BF*;J>p1&kCl9Jz;`)2o8BViV`2+7!>@zGA~=PrDooj)4#PMK6^`D{P~+ppzj z^zza?=JyGY4b7&eOPR%W4KlAcDC6&DgxH?3CxZjU{MPk}0L1#n`R)8CD)9N!dCVET zCx8g6VExA=RgxRAD?PE^JD>xM^BL`vt9H{?$@8_y?}_t`4FpnEN4Q?Yy0ybfT~J7q zKa<0$l5zgb+Bbwy-OLQeK%EjK}$?5p=z{j(FXw%&T6i2BLWH4QT#f z3BAw+1kiyawmWCyDD3OiNyThTu{~bqx%~F(rH;kN(*2Xu&=J9x%8~?@3Pweps+Z+4 zRL6QuB!RcgM--=xNxij5$+}fiCBP02bnBF2v$2KnvVWj_~8G z`Y&0}ve>Rz=K+`vBopYmu7_mX<;zah)(lxaWKDp%0`?4$FOd6JSGeANR6SztU^5<( zHK>HWE|1l;Q;@kj)p&ge@&m^+Yv4&Zf%4domZfIo&R5T84SYck?LAZxo`8K1raUC9 zJ{CA7ufYsFdANFfe|z}0{XhZdlZAT+@B50BqT1wVHRBUoQN^<(NWU+KO zVLtaLyzn~gRS|3M+>x(gI{tyo+jr2(0(Lg~l?Z7?UQ?alWk%$-If_a1S!F-rdsIQr z+n@nj^Ba}@2HZDissYwrc0gSy8i+hU>-@TLyCE9nN50W4NppQ4;jAp+yevQuyvX;z zot=}%{40|cG8&0DFW>oF;sB9={-C-3M*Hj#Wu1>TKGy#0@jHn}tzd^<=W@N6gJ1tT1 zFcL5LI5IX*DOSs75c#v)?{2(aKiWB)f89T$fMqOzQHt6*0x%aaSOH0&t-u3~&;YIY z)%xcLa_p-lyQk~2cZ*JcIE_4@r|5O`3)Rj8a?R>opy&c_o?n@~EAeGVSJ~I63cWCh zs-3=c1H6m(??lvOcdY*29AP6qhoMW&1~{DauHPS--DZE=>uDS|UoT)T^~u+v4YUO3 zfdb6^kS&~mR`{jx4t;?hh6OAX-_0?A48YAf6JTDDSpg5C8J-1;{tix%;kFmBF#)TC ztqRbR*(Ka*)b<24+GkF%^6hQqU->XgKwGCb>}NzpK}+PI4j7;YGG9Jt0*w!tLsN;* z-5#I*NH~GZsFb^r%$*r@5}iUM?o#q_#*j_hH@Eq1(I-uE8LNv#eg{7Pki9h@P&sRi z&e*?bt8wVZ?Zvg@*s)8CR7M3v3)wKBx0uoE}s z0j&G8vd7vl&$xM_`T%zAj_zG2a4)9+jpjXP72YcBpPWU%xmUUE~7r)#`)L6res()qqq~1KW9X5rs8yHT0J>8&-(9% z-VjG?LI28sX8joZGx8TR0-_Sw$F`+2K*lfd@w&MN=!R|H6ODRzVO~-l1keG^cQ)8{ zr_#P~0R58FvEO=C9y>FCf;ZLP2W|>>CE@^PQm9Y22lL-l=zwqb9NzxUe8V0{|Nfk7 z`#Bws^!MWtxyLb_WAnJ=ct63-W~Kegz-wl+Yd0?qvPf z#LIn?e70MWep!H9L7mnH$^*y+u4C<4W&aO!gK7 z+lzQ#f4~*5H>}La1T@W`i45UJNQvKOsR0CM!#w;eHq3N6e|PREN8&VxGN)ncNWG{^HZbvC%JG3;s5t8 zT~chBElD2WTMuT%cEF#uqUNvu7xjP6B-Z=aAMlnsKvtk~9s#JD`v(m;Vx2(fB7pPh z;k{qVj9n1GnQ%#CsaCl#`;rO`JDo-*a0ia0_FlZ?d=T#i?iWe5V2d-*7Qf;OGK=?t z>p22e)*8#*bLL;>=1??2KXk(0Sb-6&fl-`eD+9-KoR8*~U4Wbzej|+Em1t$xf)Qc8 zgcH#R#(q~7PE95u3-&h#U{26t5P+<+IN$+RrFDBB5byef8bNyinZ44H zb*vmTL!Mh8hst8q3)vmO>|t4h7WqYvV0&Jvychv6dr%(G9O0HoU33jFvQPp0{|Dcr zt}!z1>@mAvMO?K+9 z4O%eLVrH;elXclQJFV#RTix4<{jbgQpJMqR1L@z3-CxdGxH&%;%Rpuy;1k?So&SLJ z2x@1?ApK6;mccukvu+<4rQg2$ac=F_cU-O)l>D;Ef35)I0BVm>M1gB26Ot>z{)_P= zc0w+-_Q6N%;p>-*1+-MgrekZtnpN7>25Jh|s$M{_**#fZN%DJgWOi%OiO@sv{WllC z$wsDih=U)&itWiOw?m5ln#}+ITPM}VPl>8u@qfK7n!rv)bzm?2Q~n$ADtm%=Mg9*! zE>{$8N@{1P!U2pSOXVDV*X@f-(!R+lcvoV6BcMEBJ+n}`S(C4Sdo1I_Ydbh8|fJXHk1P%4-PaN(5k>0c>N*( zeZQFgXx7(hcmrP-RwWzKC1m6t6_uBk@ zGbXKmD93Ly(kWYL4;6cU$oNMewOUC3XZZY2ApPcG-OUldC1+#r#S{1tt-B`ci4>g+ zmpl#|dl(om@_xo~-})~z`^ItBMTXAZI0nt&l-?t@;DfQeCMrfpu~H6&|4Bgp*Mj}m zuwJ^cGPVCvc@i1DS}F5T0uKcLFL%|PmDy^G-HNPVSFQ5DBW%R&g%fk;zeI#~6nTFg zOP3XQ$nH#5vPahZ?!>$6AVL2cf7bjuA<+MB+J7s6%w6!W8jmy}ld&N84K|BJEx zc6_jEP+Q@IfD5n!b&_A;ET1FSw;Vj+8rI&eITL73;9_o@9k_ta?32}Cgx7KnP$jo; zQ5U3DY=JD4%?ghCb+LdJKOzFo2MCTne1hso_;1L#)>2Q}Zb8vIAo2q3)Z-jtu|?Q; zV`j>t9=+K#b}0-FLJiP@*Je~Sh@C&;xA?p)WGm!a`Bx{I!5Ex`kE@l`0df}R=PLc% zvLDVrwxU3*FJ|#`tjvqK+xA1y_BUnE8nU@hdiC}@iM)rf?|!mcstNmLUO?mqT7le% zXY8yXg4%`ut$F9KWD`6O%D*4PzmQ{o2U>R_$NermuTS70*OTveUV2^f4yaDcFOw&q zZbL|0B@`hajVaIrGfkNfr=WdWrY;$Ze9<>EhE^ ziLOxBrc;v8fb3Pv9QQZlUUSxcD^{%twk@mmSSDCx^q5&#+!F@;1knFK;A2mv z4(42R&R`^@1NQQNvd`E5o!+q$AbS1=10W}8RJmxvdruYX!3!@f8^YkETa{M=bs0gNtk5mFHn8qw3D#*f*=Miu+J9i3&2fpz!OE2k zpweNMkXBLz5IJzc11J$Oz1kRf9jxJxaAo%JbyklPLyB9_v5Z+=B&7ke?uGNqHWtoV^x%`%8B$%yWXG0}F zHW|Kck?x3hM*o9gH`Fyvd39~{m7UIHH|&rcyrv$3aXvMMSfK;oCHJp}Fc-quhgpEp z*TY)B_B@^xKSKXn*?&8Fc3ytujreQ(KSo2ol^vct(vY z{uO$svU|Z(>zy`c1#7RGpaFu>ZjTkZzHmHQe=W$haw49caIP$NXCB5XzI_BZ3l|z;h5agL}a!?!*Ml zhgO*`LI=#vHGpwJeS%wa4e&4;;B}(l-($JAMLwNIACW&J0NOmeg=lZ>4yp`BpRnjE ztd8(CX6yb0r}zoz_G2uzpO+xvjq-QtQ-t53PoexbM81s?iVLbDsS$_J#}H+-M#i>+ z`+FRWqWo`z<@Q^Hg^2%JY?(Tv4KnxYn2=l9JF$nGk{?#uXuZ0p%*U|HiLnf8dbUPS zh+5?F^nlbP;)y^PzDp0tqoH5ajORo4gM;Xrvko$UJMekss4Q5IUe)%icW=&*_08D+ zCt+Qk^D#b~pWc~lCX++f#x7oF@<#tx`@#9>>F9NDnd2Y5A?yPzLohr?46cV^NdEw| z!;^*GlFO4(@P3yfvs(PJ%D(7T6Fi@}{I0^_0mDWG_urP)-kdcrgVmT-sZY>~l{vcb zbD?HBHG7n-zvIvVhmxW7O*TGlPQRZK=%W7EuolSwzt*2}9~FVJ0HS|0g9HDY0qjJO zMr`^0yjxlBfxF^4kQE!Iw-ixg)(6n_iRLlMOKbOOW=PSdSuqBLcVNn!sA&J3!d> zo!m%Vynrn>8rTJ?j_g1!ztcoRa)Jv~8)!X!g*C9sR5MU#g zKL{34{2(sZ+ujz*x58&L_OQflUn#Q~++t%S@&`26O7?FhpH`7)W!UVTWfp=GYVDDJ zy_R0>wP=M;P4tJ{gug~_qHX>?q7tQF z+4on6uVB2xN=j?~?BpHHe@Bj9IdY3%;D|b#)l5I-U)#S79^-v}?YmU@-?4&%sCGEl? zCsiib?T~lxHOsBKt5FRgV)fb;DpJr=$pXj(w#Z*;MoT}kRZmaeO8XU?lSefg-@jYw z3Vi>2vHoM(he3JdzvaJ{@Uyqk7ck}$TNmgwkXpq5{M!mmU^KwkK$Bbp>K7zhFo6WArdb1fU}8c^d80}0qOd?y+^&USwm;T z5N?&cm3)-mOSW%yV$jcm0TyEY=jAJMF1K#Vw?)_{d4WgrXuw<8?}}JHr8+FF5^g5D zK5}^Ifr3K==&ze27@VCsb7uelgdTBDk8)iR>56(8a|PUF2JMVj4MzUUyynJE|Gz<| zZH@KS12=XkmUs&Uy^OuP3winlBolmt9m!?rs`5?$K!2FcqrXuAO++Q4)jM)?v;od_ z!nS;)Qf-&hKq|pH7~_y1^gFF{&^w7=8FDUOk(p4_S?e1fhgw0*&>Ai2G|!mjEB^1m ze*K1Ze;!F+j_fZ-vs&Lj57y;Akj$Ix=f_m~+?TGSDtBfs;YN2wZsvQ*<#?X${BSz@ zUhUxgx3hWNoWGIiem#N1vAyR048}*?gVj`rN}tPdB%S10&*C%)&KLcMfO_6of|#}W5Gxb#i&b2!V!$(4NjP*!pW zKC^x(U&#U73ihBCD8rn9emRP;*V?X} z(}A$6)&=xK{s(ZJWq+&<)c#v1ATM|Z8o*v)7lQtyR@hoWYX{8~J&T-x+vyKpEvXvB|G7CAcr$BsIi0AUVBl-wAd-gq0@#*o~&*LJ_ozZ?Lz8KRxp3OLb zjG!EVT;Cz!|B>K;2eEUj_m8_T9oTE;^aCEE;>+YbJnxGpZCgE ztGCNgYf~&zys|ZGZ#LHdwR9i)xt&Vx%dup>OenU1`G1&i9|1engSGpwDE-R0^ZxV$ zto^lOdFw6mpW+Yb0hj}%573m~*aw+A8U#=&*@aqwchQEY5Ct5EFZ2fS+dt6`W%+%w zsm4-7T*0rXi`A~`0grim?EO(h0Q!&vd@b6b4rjzl0Ozmt;+Wf?(eA7JpxqBZ3-l)< z;GEaP(YVHco&0LFa5O6?dWDGpLkDOjtQ~T*3VdZ@2)T=Wu(4Ycjd~qKdUG!O*Jn56 ze!x8L8x1fcxh|OiW#5aDcds~fn+QFE7&(N(=qmWwnRBj<5#UXpq(q5@IDZ`@B*Aln(9 zeqjH9MhDb*R!145)CbT5krRzhYGMKX3jK&`WD35H^xsQ%#hvI{^DWH0UWgW0!>|1f z=|44Fkv@%MG7bLD94~YClz)5oPeA@-2DEIBbGDuId328XkI&EiA!z;sa}UtoK=$$+ zPWQJ1!T$S_k9r6mq}jc)d}8|TS&89)hE-A*nBSv!AM3NsO1VbO2WZ8bZ^FC80-f2f zib<#R)@*G)=VuJo|I6YlWc}4mCbCzR+6D-6J4oR2#SmnNIi{fqVJ7k>&qz+R;bijA{5$qgX)@biQB3#>1@YK4Hux=jAX zT03y&?k=*~9W1IHSNrDp-x-X%!UGu9kqw9nAt$~?9QZKge-Ow2SXRje ztQqG%SuNze@RL|c+7YXS$8-H^VPbMddL)ung{aL_*rA(|{aM(5ebV_{mas{Mv5Ylec-u~6{{ecbS;;o948P_)!FGMAf{j zCD!-}Hv4%v$7i`bhUa0w@&}Qe4a6bd$~^+(=H@NvJ!-Ul_j z$>+V#_9^@O1)9UEU1xu{;9HF_s*hSA^I{G?hI%|_xAWlcj5$UWFe08>c)bI0Oync@ zizCt?=hvK1vwyF>)2yAg3P9G-C}0&Zj=j=e<2S58R~co!jcpP8zX)CMc%Hxf_w3^A zq4Zghzcb*B=a0g=pPX+_>u|cmC0x`3cJV(3O@AN}Vf{ZNgGaLlm46>Qh?UWs=kF?X zO{UP{>od-F7uK4Y{_23p{Aq{0yDpXOuuJyzvBp=4*Xqj##4F^cjQi>Hw&c;h$$Ghs z&eB8av2ZYTnJ7+2gno0Z(lz8}Q%U3q<@e^v2kzwH5_7O?lP^MLLDm5>8i6S;4I zZt&R#xjuCInfW=VgWDUX)3X)Sv!8(ckEdJBPuVyoA0Evy7ju>Ie-Q=n_~~oA#@IcPuhOIhMCOhBz4x?**2LLQP@JGGjEta&n6&{#L}!8D z`MkIC8kkq|Z1~k+`X|{QL9(4(vf20274nT*rftH&;d=0Zh|zBpgm*KS7?BbW|3NjoAd|K8T> ziwz<_$eD<(xNVM)I?x`TRlzbp!{*xq{Zr8W8|>XZ96@XQ7jQh~Sr_uV9%bL0@OO3g zO8PM!KCb6H$?H4W)f^uu^?4qx@Ui=&jP6rT2a5M67 z1uzK=a6V_vJb?3ZRA4OdI;ugl3DX9kqW<$Dj^ zvH=NyBA0Y;t>*jgM)sE>HFvT_V6vVloLoc zfNY-T{`>d^MiOE+Ky)K94yaF19UNeNUSuyD^ABEMpI&q$%V+m4;}g~xs@K$S{-UUY zHX9-yGY7B^7JoBx?=M=HYqGzg$8O~~D*5wsOl4=kN7z3r|1V>z$8Sl8WGPzNKF*gS z=k{`PQm^yfF66fL{bq1E3*sc!hSh-f|2PsfU?so^B+vM8U*xkt(Sw@FCG_}enal%G ziu&dFtudAHkD8PgIofyai2?KmuX)Bp$Fuzw&z=(Dr`u)XA`J;Icm$C zk9~^Yr4y6+c%pXuYWFWM{b~TE+}_|~0QvuvEa19GzjZ=(28&)HW&%3NdkE*}lfple zld`4c0bGXspIvHE>R7y!df@YrQE`_?ScXMy8eW*kH8KG`wz31Az(M;+lrT?znul8}byOAs3|0=R4Lr!L^$QjVg0${TS0YtrwMuF2of)OPNkO8)lsTwjXZJJabBboQyN z3cJ6U$0<5+hR0#K#kU*nv7GB8S%FG_XI98Wyz@(wnN*TK%sOx?r8Zvlu8%3^jJy=_ zzJ93KQ}#(c&^*@@Y5?;AI031ZvmEnBsqV((JT47tbY0;$?af|(TYMJwkBPOV1nhVf2kIgxGZ3Yt+=Ft|!(LRN^>(&bK|ycdkMk$?`42=Fehs zuUKjkI!ZS6U5?%>*|FL3^tGfplB&dCO4jBy^0()4W+rhjdObV2$IcIBoWKd7yXXNh zgcT4S0S?M@LtP`MF!$-&3ZyvC? zG}yv;k6D4OdEWu>(?2I?;OFj#pF5JSHx*0m>3VTovWWdV7+cr|zxChaFQx%T48UJh z5s9}#(C$Fi1&RRbW3}63oA=~QjHH9#>&d>^BxWFtqbuM!OpzE_te#y5GBO@&^<>ll z$pM%{sL$mi!3K!LI&o$ng8^)kECky-p-c=?m-qTyNAyTc7wyWCmIpkLGqMNY?-XXe zfDt)1RQ}aSW5A471t{rPV_&XB_HV$tT%EIm)6oI5s0zP6xjmgqgsmpgu{ZGowEW7x zS%C3>9?~`g`=#abawqcm1XlJfd{<{+nt!9bge*q~LD}($3Ti|35P}^y8lVQSKdw?_ z1R-h&TB1qJO8y+{t^BV={_kUZFwdCL_Ai4yvuDBVY$p42J=$pzGH<=|hhS~_^`%@M zM!KG6?_S6~iVfJ|=aDo!99!pC8Nc7yy_L+Z*n`kiW-E#8cdcMP}&GlEdBj#tlN#y&sV=WmEG_Oag4j&-0ea!LI;;Sdr7Ul|zAbeFX_HKOg zQo2jAF@0}OChwHi2Qay0(a*;Od@;#jFjr_;t1^j`5d1=^Lofy$ykn{Hr~x+Dx(_rJl5iY;9EN& z#kUt4fd|)fZfo(KF`Kk5XUZ8&R&BU-Mmtyw=oF~E`F1k|`*Tkw&>YYskp6=?Bge6V zCL-_GvDpjMzF;?U+xbxT3%CxZs6z67@?m;A{`@xN)xCnXT#k)38*m}3_ZH+`9zajP zEMZZsI^eDxRli7_{%11qwS-EDteC#P_q;7m4pi;4O1(NlnYS7*@Idq!3Y^dm9gvcd z@F6m7uFL~$kL3UF$Z@_=^INu9e?61M$h-0LO-R)GTu(fL^sk2j)ZTvpn)m=r@k1U1 zv`=?)a7Oem3ogGi@-G%C^WODH^i$k__e=jjm`i_`zs$$t*99YJc5{id{3&w(F?#C- z(8t60EWukW;5dq>)S%Om|J%Vb8}LMaU=I(?W~Hl>+R0tWzPyL`@jrWCL+9u}!lzzQac|f}Y89C_1YAPjN)0Nrl%=kKojyEGpS*c2KZaN^jhCLd@ zE4KePl74?m%>S*7^xFZf8n%Bsq+Y+gHabA>pbo65I zDZ)+-w=SS38o=|vC%1Rz(OqBy2P5}(hH_G{y~CXz;+%k}3NRLMBj{2DATKzBJdW9P z9ojjmn3l(WI^o0k`YKkhYc`nwh1?3?brCCg2D%`+hTM@y=AK2)enSH^L#~aME8At) zqT{IB732GOXa!%X;``JHpCDQjMGXE|b#M$6Kl2=d_KR^0z>w&aKSDEo+7lD?1s};dAlYvV_`^NF~ zQbZ*_>#JjbmHxmv{zAK+89%H}KBBX_UqYtWpgmWzkBgD|n>boGa;^N^arFlN--mwq zlDNQ=+1}Zu={-r+WCdqJgnuH^Zr;{~=z(+b)~@8%>G=Io^>Ze-&GNPD>yb#l-oVl5 zfdjA?c80O0w=J5XeDXl@DDmTKz=uwkb!CY&_4vj6qWiKORQbL3`F&So)cNWIxJrGM zxHPH))B!#Cwl#$Zk|s>P+?6`Fvx#x_DqUXenLV4l!2S;ff$aQmCjEun&f5bZ&E>xm za_<~7`9FIER^?(u(5`^HqK8Lt-nLGN@ zR0pb|MP=p*sfD|8j$eZTs7ww}CnSIC{9@)|L(Y+}*pb)tge86TFobJss?Ae(=q#@fBESy9U02q*cVa%I#}cy$&ni8CeQHKq=R9D(gNXGZ-A3 z8bF54$Bhs)fC;cd=MN(Hn~;^Su&r-`sFi-vy{zCe_T@G-!O|R~+>NiWo>#2I*MA

kW4Lx08Rnepm-sQMBl~A}KHyX37 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 z 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 diff --git a/examples/data/data_x_x2_x3.csv b/examples/data/data_x_x2_x3.csv deleted file mode 100644 index 521da1453204..000000000000 --- a/examples/data/data_x_x2_x3.csv +++ /dev/null @@ -1,11 +0,0 @@ - 0 0 0 - 1 1 1 - 2 4 8 - 3 9 27 - 4 16 64 - 5 25 125 - 6 36 216 - 7 49 343 - 8 64 512 - 9 81 729 -10 100 1000 diff --git a/examples/data/demodata.csv b/examples/data/demodata.csv deleted file mode 100644 index d9656f9da605..000000000000 --- a/examples/data/demodata.csv +++ /dev/null @@ -1,11 +0,0 @@ -clientid,date,weekdays,gains,prices,up -0,2008-04-30,Wed,-0.52458192906686452,7791404.0091921333,False -1,2008-05-01,Thu,0.076191536201738269,3167180.7366340165,True -2,2008-05-02,Fri,-0.86850970062880861,9589766.9613829032,False -3,2008-05-03,Sat,-0.42701083852713395,8949415.1867596991,False -4,2008-05-04,Sun,0.2532553652693274,937163.44375252665,True -5,2008-05-05,Mon,-0.68151636911081892,949579.88022264629,False -6,2008-05-06,Tue,0.0071911579626532168,7268426.906552773,True -7,2008-05-07,Wed,0.67449747200412147,7517014.782897247,True -8,2008-05-08,Thu,-1.1841008656818983,1920959.5423492221,False -9,2008-05-09,Fri,-1.5803692595811152,8456240.6198725495,False diff --git a/examples/data/eeg.dat b/examples/data/eeg.dat deleted file mode 100644 index c666c65053bfa37d63c9bdc1e5337e18484ec688..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 25600 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 K!XE3L)$l(+tI0zE diff --git a/examples/data/embedding_in_wx3.xrc b/examples/data/embedding_in_wx3.xrc deleted file mode 100644 index 220656d73534..000000000000 --- a/examples/data/embedding_in_wx3.xrc +++ /dev/null @@ -1,65 +0,0 @@ - - - - embedding_in_wx3 - - - wxVERTICAL - - - - - - - wxALL|wxEXPAND - 5 - - - - wxHORIZONTAL - - - - - - wxALL|wxEXPAND - 2 - - - - - - - wxALL|wxEXPAND - 2 - - - - - - - - wxALL|wxEXPAND - 2 - - - - 0 - - - wxEXPAND - - - - wxLEFT|wxRIGHT|wxEXPAND - 5 - - - - - wxEXPAND - - - - - \ No newline at end of file diff --git a/examples/data/goog.csv b/examples/data/goog.csv deleted file mode 100644 index d886b666165d..000000000000 --- a/examples/data/goog.csv +++ /dev/null @@ -1,1048 +0,0 @@ -Date,Open,High,Low,Close,Volume,Adj Close -2008-10-14,393.53,394.50,357.00,362.71,7784800,362.71 -2008-10-13,355.79,381.95,345.75,381.02,8905500,381.02 -2008-10-10,313.16,341.89,310.30,332.00,10597800,332.00 -2008-10-09,344.52,348.57,321.67,328.98,8075000,328.98 -2008-10-08,330.16,358.99,326.11,338.11,11826400,338.11 -2008-10-07,373.33,374.98,345.37,346.01,11054400,346.01 -2008-10-06,373.98,375.99,357.16,371.21,11220600,371.21 -2008-10-03,397.35,412.50,383.07,386.91,7992900,386.91 -2008-10-02,409.79,409.98,386.00,390.49,5984900,390.49 -2008-10-01,411.15,416.98,403.10,411.72,6234800,411.72 -2008-09-30,395.98,425.08,392.32,400.52,3086300,400.52 -2008-09-29,419.51,423.51,380.71,381.00,10762900,381.00 -2008-09-26,428.00,437.16,421.03,431.04,5292500,431.04 -2008-09-25,438.84,450.00,435.98,439.60,5020300,439.60 -2008-09-24,430.34,445.00,430.11,435.11,4242000,435.11 -2008-09-23,433.25,440.79,425.72,429.27,5204200,429.27 -2008-09-22,454.13,454.13,429.00,430.14,4407300,430.14 -2008-09-19,461.00,462.07,443.28,449.15,10006000,449.15 -2008-09-18,422.64,439.18,410.50,439.08,8589400,439.08 -2008-09-17,438.48,439.14,413.44,414.49,9126900,414.49 -2008-09-16,425.96,449.28,425.49,442.93,6990700,442.93 -2008-09-15,424.00,441.97,423.71,433.86,6567400,433.86 -2008-09-12,430.21,441.99,429.00,437.66,6028000,437.66 -2008-09-11,408.35,435.09,406.38,433.75,6471400,433.75 -2008-09-10,424.47,424.48,409.68,414.16,6226800,414.16 -2008-09-09,423.17,432.38,415.00,418.66,7229600,418.66 -2008-09-08,452.02,452.94,417.55,419.95,9017900,419.95 -2008-09-05,445.49,452.46,440.08,444.25,4534300,444.25 -2008-09-04,460.00,463.24,449.40,450.26,4848500,450.26 -2008-09-03,468.73,474.29,459.58,464.41,4314600,464.41 -2008-09-02,476.77,482.18,461.42,465.25,6111500,465.25 -2008-08-29,469.75,471.01,462.33,463.29,3848200,463.29 -2008-08-28,472.49,476.45,470.33,473.78,3029700,473.78 -2008-08-27,473.73,474.83,464.84,468.58,4387100,468.58 -2008-08-26,483.46,483.46,470.59,474.16,3308200,474.16 -2008-08-25,486.11,497.00,481.50,483.01,2014300,483.01 -2008-08-22,491.50,494.88,489.48,490.59,2297200,490.59 -2008-08-21,482.92,489.90,479.27,486.53,3514100,486.53 -2008-08-20,494.72,496.69,482.57,485.00,3982100,485.00 -2008-08-19,490.43,498.28,486.63,490.50,3046500,490.50 -2008-08-18,509.84,510.00,495.51,498.30,3333900,498.30 -2008-08-15,506.99,510.66,505.50,510.15,3545700,510.15 -2008-08-14,497.70,507.61,496.29,505.49,2918600,505.49 -2008-08-13,501.60,503.54,493.88,500.03,3625500,500.03 -2008-08-12,502.00,506.13,498.00,502.61,2755700,502.61 -2008-08-11,492.47,508.88,491.78,500.84,4239300,500.84 -2008-08-08,480.15,495.75,475.69,495.01,3739300,495.01 -2008-08-07,482.00,484.00,476.41,479.12,2773800,479.12 -2008-08-06,478.37,489.77,472.51,486.34,3375800,486.34 -2008-08-05,467.59,480.08,466.33,479.85,3584500,479.85 -2008-08-04,468.12,473.01,461.90,463.00,2487000,463.00 -2008-08-01,472.51,473.22,462.50,467.86,3007900,467.86 -2008-07-31,474.56,480.89,471.44,473.75,2865100,473.75 -2008-07-30,485.50,486.02,472.81,482.70,3490700,482.70 -2008-07-29,479.30,487.26,478.00,483.11,2802800,483.11 -2008-07-28,492.09,492.09,475.13,477.12,3160000,477.12 -2008-07-25,486.49,493.13,481.50,491.98,3183500,491.98 -2008-07-24,496.70,496.87,475.62,475.62,3540900,475.62 -2008-07-23,481.61,497.23,478.10,489.22,4894100,489.22 -2008-07-22,466.72,480.25,465.60,477.11,4691500,477.11 -2008-07-21,480.88,484.09,465.70,468.80,5901500,468.80 -2008-07-18,498.35,498.98,478.19,481.32,11292400,481.32 -2008-07-17,534.16,537.05,524.50,533.44,8787400,533.44 -2008-07-16,514.04,536.50,510.60,535.60,4742200,535.60 -2008-07-15,516.28,527.50,501.10,516.09,6071000,516.09 -2008-07-14,539.00,540.06,515.45,521.62,4424800,521.62 -2008-07-11,536.50,539.50,519.43,533.80,4981400,533.80 -2008-07-10,545.00,549.50,530.72,540.57,4331700,540.57 -2008-07-09,550.76,555.68,540.73,541.55,4154000,541.55 -2008-07-08,545.99,555.19,540.00,554.53,4932400,554.53 -2008-07-07,542.30,549.00,535.60,543.91,4255200,543.91 -2008-07-03,530.88,539.23,527.50,537.00,2400500,537.00 -2008-07-02,536.51,540.38,526.06,527.04,4223000,527.04 -2008-07-01,519.58,536.72,517.00,534.73,4959900,534.73 -2008-06-30,532.47,538.00,523.06,526.42,3765300,526.42 -2008-06-27,527.68,530.00,515.09,528.07,5436900,528.07 -2008-06-26,544.10,544.93,528.26,528.82,5659500,528.82 -2008-06-25,544.97,557.80,543.67,551.00,4122200,551.00 -2008-06-24,545.14,551.19,535.10,542.30,4672600,542.30 -2008-06-23,545.36,553.15,542.02,545.21,3635900,545.21 -2008-06-20,556.98,556.98,544.51,546.43,5983100,546.43 -2008-06-19,555.35,563.78,550.81,560.20,5683100,560.20 -2008-06-18,564.51,568.99,559.16,562.38,3381200,562.38 -2008-06-17,576.35,578.07,568.38,569.46,3462900,569.46 -2008-06-16,566.50,579.10,566.50,572.81,3542800,572.81 -2008-06-13,561.49,575.70,561.34,571.51,6184400,571.51 -2008-06-12,548.76,558.00,546.88,552.95,5491600,552.95 -2008-06-11,556.24,557.34,544.46,545.20,3812900,545.20 -2008-06-10,549.56,558.82,546.78,554.17,3657400,554.17 -2008-06-09,568.06,570.00,545.40,557.87,5288300,557.87 -2008-06-06,579.75,580.72,567.00,567.00,4734500,567.00 -2008-06-05,577.08,588.04,576.21,586.30,3916700,586.30 -2008-06-04,565.33,578.00,564.55,572.22,3363200,572.22 -2008-06-03,576.50,580.50,560.61,567.30,4305300,567.30 -2008-06-02,582.50,583.89,571.27,575.00,3674200,575.00 -2008-05-30,583.47,589.92,581.30,585.80,3225200,585.80 -2008-05-29,574.79,585.88,573.20,583.00,4845000,583.00 -2008-05-28,567.94,571.49,561.10,568.24,4050400,568.24 -2008-05-27,544.96,562.60,543.85,560.90,3865500,560.90 -2008-05-23,546.96,553.00,537.81,544.62,4431500,544.62 -2008-05-22,551.95,554.21,540.25,549.46,5076300,549.46 -2008-05-21,578.52,581.41,547.89,549.99,6468100,549.99 -2008-05-20,574.63,582.48,572.91,578.60,3313600,578.60 -2008-05-19,578.55,588.88,573.52,577.52,5604500,577.52 -2008-05-16,581.43,584.68,578.32,580.07,4274100,580.07 -2008-05-15,579.00,582.95,575.61,581.00,4342700,581.00 -2008-05-14,586.49,591.19,575.25,576.30,4375800,576.30 -2008-05-13,586.23,587.95,578.55,583.00,5163500,583.00 -2008-05-12,574.75,586.75,568.91,584.94,4863900,584.94 -2008-05-09,579.00,585.00,571.30,573.20,4484900,573.20 -2008-05-08,586.20,589.30,578.91,583.01,5122900,583.01 -2008-05-07,590.27,599.49,576.43,579.00,6613000,579.00 -2008-05-06,591.00,592.00,583.00,586.36,4629300,586.36 -2008-05-05,598.86,599.00,587.13,594.90,6281000,594.90 -2008-05-02,598.49,602.45,579.30,581.29,6998800,581.29 -2008-05-01,578.31,594.93,576.97,593.08,6602800,593.08 -2008-04-30,562.21,584.86,558.47,574.29,7903000,574.29 -2008-04-29,550.83,563.40,550.01,558.47,4346000,558.47 -2008-04-28,545.88,556.81,539.00,552.12,4008600,552.12 -2008-04-25,549.02,553.00,542.73,544.06,4164400,544.06 -2008-04-24,551.29,554.49,540.02,543.04,4135100,543.04 -2008-04-23,557.94,559.31,540.95,546.49,4921500,546.49 -2008-04-22,537.57,560.83,537.56,555.00,7938500,555.00 -2008-04-21,539.39,542.59,530.29,537.79,7439700,537.79 -2008-04-18,535.21,547.70,524.77,539.41,18235600,539.41 -2008-04-17,455.63,459.37,446.52,449.54,13353000,449.54 -2008-04-16,444.40,458.28,441.00,455.03,7620200,455.03 -2008-04-15,458.13,459.72,443.72,446.84,4577600,446.84 -2008-04-14,457.16,457.45,450.15,451.66,3842600,451.66 -2008-04-11,464.07,467.26,455.01,457.45,4151500,457.45 -2008-04-10,464.96,473.86,461.85,469.08,5072400,469.08 -2008-04-09,469.13,472.00,457.54,464.19,6048100,464.19 -2008-04-08,473.04,474.14,462.01,467.81,4547000,467.81 -2008-04-07,477.03,485.44,473.53,476.82,5943500,476.82 -2008-04-04,457.01,477.83,456.20,471.09,5897200,471.09 -2008-04-03,461.73,463.29,448.13,455.12,6778400,455.12 -2008-04-02,469.90,475.74,460.39,465.70,5999000,465.70 -2008-04-01,447.74,466.50,446.87,465.71,6093100,465.71 -2008-03-31,435.64,442.69,432.01,440.47,4446400,440.47 -2008-03-28,447.46,453.57,434.31,438.08,4376200,438.08 -2008-03-27,446.00,448.61,440.49,444.08,5832200,444.08 -2008-03-26,452.59,462.87,449.29,458.19,5214200,458.19 -2008-03-25,457.46,457.47,446.00,450.78,5831600,450.78 -2008-03-24,438.43,465.78,437.72,460.56,6763500,460.56 -2008-03-20,427.32,435.70,417.50,433.55,9900400,433.55 -2008-03-19,441.11,447.50,431.67,432.00,6179000,432.00 -2008-03-18,428.98,440.84,425.53,439.16,7237200,439.16 -2008-03-17,427.99,433.71,412.11,419.87,7888200,419.87 -2008-03-14,442.98,449.34,430.62,437.92,6574400,437.92 -2008-03-13,432.67,446.98,428.78,443.01,7726600,443.01 -2008-03-12,440.01,447.88,438.07,440.18,6651900,440.18 -2008-03-11,425.26,440.15,424.65,439.84,8826900,439.84 -2008-03-10,428.83,431.00,413.04,413.62,7987600,413.62 -2008-03-07,428.88,440.00,426.24,433.35,8071800,433.35 -2008-03-06,447.69,453.30,431.18,432.70,7470100,432.70 -2008-03-05,445.25,454.17,444.00,447.70,7436600,447.70 -2008-03-04,450.95,453.36,435.78,444.60,13621700,444.60 -2008-03-03,471.51,472.72,450.11,457.02,7554500,457.02 -2008-02-29,471.87,479.74,464.65,471.18,9425400,471.18 -2008-02-28,470.50,479.09,467.36,475.39,6586900,475.39 -2008-02-27,460.13,475.49,459.64,472.86,10121900,472.86 -2008-02-26,461.20,466.47,446.85,464.19,23287300,464.19 -2008-02-25,505.95,506.50,485.74,486.44,8350800,486.44 -2008-02-22,502.06,509.00,497.55,507.80,5515900,507.80 -2008-02-21,512.85,513.21,499.50,502.86,5677800,502.86 -2008-02-20,503.51,511.01,498.82,509.00,6662200,509.00 -2008-02-19,534.94,535.06,506.50,508.95,6350400,508.95 -2008-02-15,528.31,532.66,524.33,529.64,5240100,529.64 -2008-02-14,538.35,541.04,531.00,532.25,6476700,532.25 -2008-02-13,522.50,534.99,518.69,534.62,6624700,534.62 -2008-02-12,523.39,530.60,513.03,518.09,6662300,518.09 -2008-02-11,520.52,523.71,513.40,521.16,5826000,521.16 -2008-02-08,509.41,517.73,508.70,516.69,6828900,516.69 -2008-02-07,496.86,514.19,494.76,504.95,7928900,504.95 -2008-02-06,511.14,511.17,497.93,501.71,7636400,501.71 -2008-02-05,489.43,509.00,488.52,506.80,11203300,506.80 -2008-02-04,509.07,512.78,492.55,495.43,13157100,495.43 -2008-02-01,528.67,536.67,510.00,515.90,17600500,515.90 -2008-01-31,539.01,573.00,534.29,564.30,14871300,564.30 -2008-01-30,549.19,560.43,543.51,548.27,7939600,548.27 -2008-01-29,560.47,561.33,540.67,550.52,6283000,550.52 -2008-01-28,570.97,572.24,548.60,555.98,5816700,555.98 -2008-01-25,591.81,595.00,566.18,566.40,6966000,566.40 -2008-01-24,558.80,579.69,554.14,574.49,9400900,574.49 -2008-01-23,560.71,568.00,519.00,548.62,16965700,548.62 -2008-01-22,562.03,597.50,561.20,584.35,9501500,584.35 -2008-01-18,608.36,609.99,598.45,600.25,8539600,600.25 -2008-01-17,620.76,625.74,598.01,600.79,8216800,600.79 -2008-01-16,628.97,639.99,601.93,615.95,10560000,615.95 -2008-01-15,645.90,649.05,635.38,637.65,5568200,637.65 -2008-01-14,651.14,657.40,645.25,653.82,4447500,653.82 -2008-01-11,642.70,649.47,630.11,638.25,4977000,638.25 -2008-01-10,645.01,657.20,640.11,646.73,6334200,646.73 -2008-01-09,630.04,653.34,622.51,653.20,6739700,653.20 -2008-01-08,653.00,659.96,631.00,631.68,5339100,631.68 -2008-01-07,653.94,662.28,637.35,649.25,6403400,649.25 -2008-01-04,679.69,680.96,655.00,657.00,5359800,657.00 -2008-01-03,685.26,686.85,676.52,685.33,3252500,685.33 -2008-01-02,692.87,697.37,677.73,685.19,4306900,685.19 -2007-12-31,698.57,702.49,690.58,691.48,2376200,691.48 -2007-12-28,704.93,707.95,696.54,702.53,2562700,702.53 -2007-12-27,707.07,716.00,700.74,700.74,2942500,700.74 -2007-12-26,698.99,713.22,698.21,710.84,2530000,710.84 -2007-12-24,694.99,700.73,693.06,700.73,1628400,700.73 -2007-12-21,697.88,699.26,693.24,696.69,5382000,696.69 -2007-12-20,685.83,691.00,680.61,689.69,4422200,689.69 -2007-12-19,674.21,679.50,669.00,677.37,4421100,677.37 -2007-12-18,674.16,676.71,652.50,673.35,7166700,673.35 -2007-12-17,688.00,695.42,663.67,669.23,5486000,669.23 -2007-12-14,687.51,699.70,687.26,689.96,3673500,689.96 -2007-12-13,696.31,697.62,681.21,694.05,5040800,694.05 -2007-12-12,714.00,714.32,688.50,699.35,6159100,699.35 -2007-12-11,719.94,720.99,698.78,699.20,6139100,699.20 -2007-12-10,715.99,724.80,714.00,718.42,3856200,718.42 -2007-12-07,714.99,718.00,710.50,714.87,3852100,714.87 -2007-12-06,697.80,716.56,697.01,715.26,4909000,715.26 -2007-12-05,692.73,698.93,687.50,698.51,4209600,698.51 -2007-12-04,678.31,692.00,677.12,684.16,4231800,684.16 -2007-12-03,691.01,695.00,681.14,681.53,4325100,681.53 -2007-11-30,711.00,711.06,682.11,693.00,7895500,693.00 -2007-11-29,690.75,702.79,687.77,697.00,6208000,697.00 -2007-11-28,682.11,694.30,672.14,692.26,7916500,692.26 -2007-11-27,674.80,676.43,650.26,673.57,8904500,673.57 -2007-11-26,680.20,693.40,665.00,666.00,6790100,666.00 -2007-11-23,670.00,678.28,668.11,676.70,2738700,676.70 -2007-11-21,643.77,669.97,642.08,660.52,7013500,660.52 -2007-11-20,636.48,659.10,632.87,648.54,9840600,648.54 -2007-11-19,629.59,636.77,618.50,625.85,5527400,625.85 -2007-11-16,633.94,635.49,616.02,633.63,9042800,633.63 -2007-11-15,638.57,647.50,624.00,629.65,6967700,629.65 -2007-11-14,673.28,675.49,636.27,641.68,8094700,641.68 -2007-11-13,644.99,660.92,632.07,660.55,8426100,660.55 -2007-11-12,657.74,669.93,626.21,632.07,10227300,632.07 -2007-11-09,675.78,681.88,661.21,663.97,11388100,663.97 -2007-11-08,734.60,734.89,677.18,693.84,16512200,693.84 -2007-11-07,741.13,747.24,723.14,732.94,8252900,732.94 -2007-11-06,737.56,741.79,725.00,741.79,8436300,741.79 -2007-11-05,706.99,730.23,706.07,725.65,8883700,725.65 -2007-11-02,710.51,713.58,697.34,711.25,5841500,711.25 -2007-11-01,702.79,713.72,701.78,703.21,6527200,703.21 -2007-10-31,700.69,707.00,696.04,707.00,6876800,707.00 -2007-10-30,677.51,699.91,677.51,694.77,6900600,694.77 -2007-10-29,677.77,680.00,672.09,679.23,3066300,679.23 -2007-10-26,674.03,676.54,668.06,674.60,3353900,674.60 -2007-10-25,678.68,678.97,663.55,668.51,5795500,668.51 -2007-10-24,672.71,677.47,659.56,675.82,7404200,675.82 -2007-10-23,661.25,677.60,660.00,675.77,6793700,675.77 -2007-10-22,638.67,655.00,636.28,650.75,6664400,650.75 -2007-10-19,654.56,658.49,643.23,644.71,15789000,644.71 -2007-10-18,635.41,641.37,628.50,639.62,12289200,639.62 -2007-10-17,630.45,634.00,621.59,633.48,6030500,633.48 -2007-10-16,618.49,625.92,611.99,616.00,6025300,616.00 -2007-10-15,638.47,639.86,615.55,620.11,6943800,620.11 -2007-10-12,623.98,638.40,618.24,637.39,6823700,637.39 -2007-10-11,633.64,641.41,609.00,622.00,11799000,622.00 -2007-10-10,621.36,625.68,616.80,625.39,5385600,625.39 -2007-10-09,615.11,623.78,608.39,615.18,8767800,615.18 -2007-10-08,595.00,610.26,593.95,609.62,5028000,609.62 -2007-10-05,587.11,596.00,587.01,594.05,5068700,594.05 -2007-10-04,585.09,585.09,577.06,579.03,2986700,579.03 -2007-10-03,586.25,588.99,580.36,584.02,3879500,584.02 -2007-10-02,583.38,596.81,580.01,584.39,7067500,584.39 -2007-10-01,569.97,584.35,569.61,582.55,4711300,582.55 -2007-09-28,567.00,569.55,564.12,567.27,2639500,567.27 -2007-09-27,571.73,571.74,565.78,567.50,2056300,567.50 -2007-09-26,570.40,571.79,563.81,568.16,3346100,568.16 -2007-09-25,564.00,569.56,562.86,569.00,2730600,569.00 -2007-09-24,561.00,571.46,560.00,568.02,5297000,568.02 -2007-09-21,556.34,560.79,552.83,560.10,8011700,560.10 -2007-09-20,547.00,556.80,546.03,552.83,5525000,552.83 -2007-09-19,539.27,549.45,538.86,546.85,5526900,546.85 -2007-09-18,526.52,537.25,524.27,535.27,4215700,535.27 -2007-09-17,526.53,529.28,524.07,525.30,2197500,525.30 -2007-09-14,523.20,530.27,522.22,528.75,2764900,528.75 -2007-09-13,524.06,527.21,523.22,524.78,1891100,524.78 -2007-09-12,520.53,527.98,519.00,522.65,2986000,522.65 -2007-09-11,516.99,521.65,515.73,521.33,2703600,521.33 -2007-09-10,521.28,522.07,510.88,514.48,3225800,514.48 -2007-09-07,517.86,521.24,516.80,519.35,3663600,519.35 -2007-09-06,529.36,529.83,518.24,523.52,3625900,523.52 -2007-09-05,523.40,529.48,522.25,527.80,3312900,527.80 -2007-09-04,515.02,528.00,514.62,525.15,3693700,525.15 -2007-08-31,513.10,516.50,511.47,515.25,2977600,515.25 -2007-08-30,512.36,515.40,510.58,511.40,2651700,511.40 -2007-08-29,507.84,513.30,507.23,512.88,2549300,512.88 -2007-08-28,511.53,514.98,505.79,506.40,3273900,506.40 -2007-08-27,514.43,517.45,511.40,513.26,2325100,513.26 -2007-08-24,512.61,515.55,508.50,515.00,2472700,515.00 -2007-08-23,516.00,516.13,507.00,512.19,3076700,512.19 -2007-08-22,509.96,516.25,509.25,512.75,3252700,512.75 -2007-08-21,498.94,508.16,497.77,506.61,3610600,506.61 -2007-08-20,502.46,502.56,496.00,497.92,2697300,497.92 -2007-08-17,497.44,501.00,491.65,500.04,5479400,500.04 -2007-08-16,492.02,496.43,480.46,491.52,8645600,491.52 -2007-08-15,509.00,511.69,496.71,497.55,5409500,497.55 -2007-08-14,515.72,517.40,508.00,508.60,3633700,508.60 -2007-08-13,519.54,519.75,513.03,515.50,3179300,515.50 -2007-08-10,510.18,518.72,505.63,515.75,5875200,515.75 -2007-08-09,520.80,526.82,514.63,514.73,4846500,514.73 -2007-08-08,519.34,525.78,517.09,525.78,4068800,525.78 -2007-08-07,509.75,519.88,509.04,516.02,4264300,516.02 -2007-08-06,503.00,510.15,502.50,510.00,3651500,510.00 -2007-08-03,510.05,513.20,503.00,503.00,3176200,503.00 -2007-08-02,513.72,514.99,509.00,511.01,3154900,511.01 -2007-08-01,510.50,516.51,508.14,512.94,4421500,512.94 -2007-07-31,520.23,520.44,510.00,510.00,4270500,510.00 -2007-07-30,512.92,519.34,510.50,516.11,3963300,516.11 -2007-07-27,508.53,516.62,505.50,511.89,5509100,511.89 -2007-07-26,508.74,512.59,498.88,508.00,6883400,508.00 -2007-07-25,516.98,517.02,505.56,509.76,5545000,509.76 -2007-07-24,509.30,518.69,507.11,514.00,5572100,514.00 -2007-07-23,519.01,520.00,512.15,512.51,6356700,512.51 -2007-07-20,511.90,523.18,509.50,520.12,17772300,520.12 -2007-07-19,553.46,553.52,542.24,548.59,11127200,548.59 -2007-07-18,553.89,554.50,543.81,549.50,6080000,549.50 -2007-07-17,555.04,557.73,552.38,555.00,4328600,555.00 -2007-07-16,550.30,558.58,549.31,552.99,6599500,552.99 -2007-07-13,547.91,552.67,547.25,552.16,5237100,552.16 -2007-07-12,545.86,547.32,540.22,545.33,3441600,545.33 -2007-07-11,543.61,546.50,540.01,544.47,3309300,544.47 -2007-07-10,543.79,547.00,541.65,543.34,3856000,543.34 -2007-07-09,543.00,548.74,540.26,542.56,3729800,542.56 -2007-07-06,541.25,543.87,538.73,539.40,2747000,539.40 -2007-07-05,535.56,544.40,532.15,541.63,4942900,541.63 -2007-07-03,531.06,534.40,527.50,534.34,1871800,534.34 -2007-07-02,525.49,531.85,524.20,530.38,3487600,530.38 -2007-06-29,526.02,527.40,519.46,522.70,3880600,522.70 -2007-06-28,524.88,529.50,523.80,525.01,4168400,525.01 -2007-06-27,525.00,527.99,519.56,526.29,6123100,526.29 -2007-06-26,532.73,533.20,526.24,530.26,5689500,530.26 -2007-06-25,528.98,534.99,523.38,527.42,7925000,527.42 -2007-06-22,516.42,524.99,516.10,524.98,7203700,524.98 -2007-06-21,510.98,515.29,506.28,514.11,4409700,514.11 -2007-06-20,516.96,518.75,509.06,509.97,4338200,509.97 -2007-06-19,514.01,517.25,511.54,514.31,4355300,514.31 -2007-06-18,506.18,516.00,504.24,515.20,4835900,515.20 -2007-06-15,508.19,509.00,501.23,505.89,6174100,505.89 -2007-06-14,505.38,505.88,501.70,502.84,4621200,502.84 -2007-06-13,507.09,508.54,498.69,505.24,7034000,505.24 -2007-06-12,508.71,511.67,503.17,504.77,6419500,504.77 -2007-06-11,514.02,518.25,510.00,511.34,4647700,511.34 -2007-06-08,516.20,519.64,509.46,515.49,6358200,515.49 -2007-06-07,519.75,526.50,512.51,515.06,10630500,515.06 -2007-06-06,516.75,520.78,515.26,518.25,7886700,518.25 -2007-06-05,509.75,519.00,506.61,518.84,10447100,518.84 -2007-06-04,497.91,510.51,497.59,507.07,7101000,507.07 -2007-06-01,501.00,505.02,497.93,500.40,4799000,500.40 -2007-05-31,500.56,508.78,497.06,497.91,8924300,497.91 -2007-05-30,484.50,498.84,483.00,498.60,7245800,498.60 -2007-05-29,485.00,491.80,484.00,487.11,5218000,487.11 -2007-05-25,479.70,484.95,477.27,483.52,5348500,483.52 -2007-05-24,475.15,479.20,471.50,474.33,4173600,474.33 -2007-05-23,480.82,483.41,473.75,473.97,5060200,473.97 -2007-05-22,473.00,479.01,473.00,475.86,3839000,475.86 -2007-05-21,469.53,479.20,466.72,470.60,6159300,470.60 -2007-05-18,472.03,472.70,469.75,470.32,3695900,470.32 -2007-05-17,472.46,475.22,470.81,470.96,4660600,470.96 -2007-05-16,462.00,473.14,459.02,472.61,6554200,472.61 -2007-05-15,461.96,462.54,457.41,458.00,4119000,458.00 -2007-05-14,465.48,467.51,460.00,461.78,3872700,461.78 -2007-05-11,461.83,467.00,461.00,466.74,2944100,466.74 -2007-05-10,467.04,469.49,461.02,461.47,3686300,461.47 -2007-05-09,466.15,471.73,463.88,469.25,3889900,469.25 -2007-05-08,466.13,468.17,464.73,466.81,2905100,466.81 -2007-05-07,472.14,472.82,466.47,467.27,3020100,467.27 -2007-05-04,470.12,474.84,465.88,471.12,3950000,471.12 -2007-05-03,466.22,474.07,465.29,473.23,3594200,473.23 -2007-05-02,468.65,471.08,465.73,465.78,3062700,465.78 -2007-05-01,472.19,472.81,464.17,469.00,3658200,469.00 -2007-04-30,479.15,481.35,471.38,471.38,3641200,471.38 -2007-04-27,480.07,482.40,478.33,479.01,2925700,479.01 -2007-04-26,478.10,484.45,477.11,481.18,4124900,481.18 -2007-04-25,480.00,481.37,476.11,477.99,3966800,477.99 -2007-04-24,478.61,479.98,475.55,477.53,3694700,477.53 -2007-04-23,480.10,485.00,478.26,479.08,5674600,479.08 -2007-04-20,490.52,492.50,482.02,482.48,12161500,482.48 -2007-04-19,474.50,481.95,469.59,471.65,11009600,471.65 -2007-04-18,471.26,479.90,469.53,476.01,5670500,476.01 -2007-04-17,473.80,476.39,471.60,472.80,3210100,472.80 -2007-04-16,468.46,476.99,468.15,474.27,5077900,474.27 -2007-04-13,468.45,468.77,463.36,466.29,2794800,466.29 -2007-04-12,464.00,468.00,462.24,467.39,2707900,467.39 -2007-04-11,466.06,469.40,462.61,464.53,3812000,464.53 -2007-04-10,467.09,470.79,465.16,466.50,2979300,466.50 -2007-04-09,472.98,473.00,465.59,468.21,3062100,468.21 -2007-04-05,471.30,472.09,469.62,471.51,2715800,471.51 -2007-04-04,472.14,473.00,469.58,471.02,3778800,471.02 -2007-04-03,464.05,474.25,464.00,472.60,6501800,472.60 -2007-04-02,457.76,458.53,452.12,458.53,3448500,458.53 -2007-03-30,462.10,463.40,456.14,458.16,3380200,458.16 -2007-03-29,464.55,466.00,455.00,460.92,3988500,460.92 -2007-03-28,461.87,465.44,460.15,461.88,4591600,461.88 -2007-03-27,463.55,465.23,460.34,463.62,3741200,463.62 -2007-03-26,460.55,465.00,455.62,465.00,4710300,465.00 -2007-03-23,461.45,463.39,457.08,461.83,4111300,461.83 -2007-03-22,455.61,462.17,452.53,462.04,5680700,462.04 -2007-03-21,445.30,456.57,445.21,456.55,5798300,456.55 -2007-03-20,445.79,447.60,443.60,445.28,3421500,445.28 -2007-03-19,443.25,448.50,440.63,447.23,5197700,447.23 -2007-03-16,445.65,446.70,439.89,440.85,5659100,440.85 -2007-03-15,447.86,449.82,443.94,446.19,3944200,446.19 -2007-03-14,443.23,448.66,439.00,448.00,8016900,448.00 -2007-03-13,450.11,451.93,442.83,443.03,6377300,443.03 -2007-03-12,452.57,455.25,451.11,454.75,3465400,454.75 -2007-03-09,458.00,458.40,450.10,452.96,4977700,452.96 -2007-03-08,459.22,465.50,454.10,454.72,5362800,454.72 -2007-03-07,462.69,463.14,454.29,455.64,6534100,455.64 -2007-03-06,447.47,459.00,447.38,457.55,7533700,457.55 -2007-03-05,437.02,445.50,437.00,440.95,6355100,440.95 -2007-03-02,445.11,448.70,438.68,438.68,6583600,438.68 -2007-03-01,442.67,452.42,440.00,448.23,8685200,448.23 -2007-02-28,450.41,453.67,443.04,449.45,8032300,449.45 -2007-02-27,455.00,459.80,447.17,448.77,9312800,448.77 -2007-02-26,472.83,475.25,463.75,464.93,3969900,464.93 -2007-02-23,475.75,476.95,467.80,470.62,3882600,470.62 -2007-02-22,478.69,484.24,474.39,475.85,5743900,475.85 -2007-02-21,469.84,478.68,467.74,475.86,5640600,475.86 -2007-02-20,468.47,472.75,464.71,472.10,4067600,472.10 -2007-02-16,462.80,470.15,462.06,469.94,6177000,469.94 -2007-02-15,466.00,466.13,460.72,461.47,4042400,461.47 -2007-02-14,460.00,469.13,459.22,465.93,5698800,465.93 -2007-02-13,459.15,462.78,457.26,459.10,4062600,459.10 -2007-02-12,460.68,462.39,455.02,458.29,5754500,458.29 -2007-02-09,471.65,472.68,461.50,461.89,4858600,461.89 -2007-02-08,468.05,473.75,465.15,471.03,4076700,471.03 -2007-02-07,473.82,474.35,468.78,470.01,4119800,470.01 -2007-02-06,468.10,473.30,467.26,471.48,5321900,471.48 -2007-02-05,477.50,478.00,466.19,467.16,7206900,467.16 -2007-02-02,482.61,485.00,477.81,481.50,6286500,481.50 -2007-02-01,506.00,506.01,481.53,481.75,15658700,481.75 -2007-01-31,496.49,505.00,495.51,501.50,12206100,501.50 -2007-01-30,494.00,498.00,491.22,494.32,4180500,494.32 -2007-01-29,498.00,498.75,490.50,492.47,4775700,492.47 -2007-01-26,490.93,497.90,487.03,495.84,5496500,495.84 -2007-01-25,501.00,504.50,485.66,488.09,6368500,488.09 -2007-01-24,484.45,499.54,483.29,499.07,6059300,499.07 -2007-01-23,480.79,484.75,477.29,479.05,4665500,479.05 -2007-01-22,492.50,492.65,478.50,480.84,5404300,480.84 -2007-01-19,487.98,490.76,486.74,489.75,4978300,489.75 -2007-01-18,494.52,496.48,487.43,487.83,5932000,487.83 -2007-01-17,503.39,507.77,494.38,497.28,6699100,497.28 -2007-01-16,507.55,513.00,503.30,504.28,7568900,504.28 -2007-01-12,501.99,505.00,500.00,505.00,4473700,505.00 -2007-01-11,497.20,501.75,496.18,499.72,7208200,499.72 -2007-01-10,484.43,493.55,482.04,489.46,5968500,489.46 -2007-01-09,485.45,488.25,481.20,485.50,5381400,485.50 -2007-01-08,487.69,489.87,482.20,483.58,4754400,483.58 -2007-01-05,482.50,487.50,478.11,487.19,6872100,487.19 -2007-01-04,469.00,483.95,468.35,483.26,7887600,483.26 -2007-01-03,466.00,476.66,461.11,467.59,7706500,467.59 -2006-12-29,462.10,464.47,459.86,460.48,2559200,460.48 -2006-12-28,467.12,468.58,462.25,462.56,3116200,462.56 -2006-12-27,460.00,468.08,459.10,468.03,4231500,468.03 -2006-12-26,456.52,459.47,454.59,457.53,2074300,457.53 -2006-12-22,457.50,458.64,452.73,455.58,3988300,455.58 -2006-12-21,464.18,465.25,452.34,456.20,6953300,456.20 -2006-12-20,470.00,471.50,462.33,462.90,4367800,462.90 -2006-12-19,461.72,469.31,458.50,468.63,6587000,468.63 -2006-12-18,482.51,482.74,460.72,462.80,8016600,462.80 -2006-12-15,482.64,484.11,479.84,480.30,5190800,480.30 -2006-12-14,480.25,483.75,477.26,482.12,4748900,482.12 -2006-12-13,484.69,485.50,477.02,478.99,4662100,478.99 -2006-12-12,483.85,486.36,480.28,481.78,4181000,481.78 -2006-12-11,484.92,488.90,483.80,483.93,3263400,483.93 -2006-12-08,481.94,488.60,480.00,484.11,3974900,484.11 -2006-12-07,490.23,491.80,482.42,482.64,4664300,482.64 -2006-12-06,486.96,492.40,484.52,488.71,4450300,488.71 -2006-12-05,487.40,489.44,484.89,487.00,4103000,487.00 -2006-12-04,483.00,487.43,479.35,484.85,4899900,484.85 -2006-12-01,485.98,488.39,478.50,480.80,5631400,480.80 -2006-11-30,484.19,490.40,481.55,484.81,5577500,484.81 -2006-11-29,494.24,494.74,482.25,484.65,6315300,484.65 -2006-11-28,481.13,489.86,477.03,489.50,7797600,489.50 -2006-11-27,501.37,501.78,484.75,484.75,7324700,484.75 -2006-11-24,504.50,507.50,504.00,505.00,1732700,505.00 -2006-11-22,510.97,513.00,505.78,508.01,4500700,508.01 -2006-11-21,496.54,510.00,495.83,509.65,8427500,509.65 -2006-11-20,498.40,498.40,492.65,495.05,5124500,495.05 -2006-11-17,493.25,499.66,493.00,498.79,5511000,498.79 -2006-11-16,495.00,497.68,492.56,495.90,5092600,495.90 -2006-11-15,493.43,499.85,491.93,491.93,8370700,491.93 -2006-11-14,480.70,489.95,480.50,489.30,7223400,489.30 -2006-11-13,474.90,481.17,474.14,481.03,4341900,481.03 -2006-11-10,473.78,474.72,470.29,473.55,2796700,473.55 -2006-11-09,476.50,479.49,471.86,472.63,4879200,472.63 -2006-11-08,470.35,481.74,468.60,475.00,7965000,475.00 -2006-11-07,476.95,479.02,471.77,472.57,4897100,472.57 -2006-11-06,473.77,479.66,472.33,476.95,4991500,476.95 -2006-11-03,472.23,473.75,465.06,471.80,4907700,471.80 -2006-11-02,467.50,473.73,466.38,469.91,5236700,469.91 -2006-11-01,478.76,479.13,465.26,467.50,5426300,467.50 -2006-10-31,478.06,482.16,473.84,476.39,6285400,476.39 -2006-10-30,474.82,480.46,470.01,476.57,6563100,476.57 -2006-10-27,483.90,485.24,472.49,475.20,6604000,475.20 -2006-10-26,487.68,491.96,484.20,485.10,7031700,485.10 -2006-10-25,477.49,488.50,475.11,486.60,9187500,486.60 -2006-10-24,476.28,477.86,471.41,473.31,8660200,473.31 -2006-10-23,462.28,484.64,460.37,480.78,15104500,480.78 -2006-10-20,458.99,460.10,453.59,459.67,11647900,459.67 -2006-10-19,420.23,429.50,419.57,426.06,11503500,426.06 -2006-10-18,422.99,424.75,417.50,419.31,6017300,419.31 -2006-10-17,420.30,423.75,416.70,420.64,5211000,420.64 -2006-10-16,427.70,429.20,421.34,421.75,4319400,421.75 -2006-10-13,427.76,429.50,425.56,427.30,3622500,427.30 -2006-10-12,428.56,429.68,424.00,427.44,4844000,427.44 -2006-10-11,425.02,429.91,423.76,426.50,5635400,426.50 -2006-10-10,431.56,437.85,422.39,426.65,9788600,426.65 -2006-10-09,424.80,431.95,423.42,429.00,7583300,429.00 -2006-10-06,410.22,421.91,409.75,420.50,7336500,420.50 -2006-10-05,414.70,418.24,410.86,411.81,5789800,411.81 -2006-10-04,404.97,415.77,403.05,415.70,6661800,415.70 -2006-10-03,401.29,406.46,398.19,404.04,5464700,404.04 -2006-10-02,401.90,406.00,400.80,401.44,3651900,401.44 -2006-09-29,405.13,405.62,401.41,401.90,3310900,401.90 -2006-09-28,404.08,406.98,400.54,403.58,5107400,403.58 -2006-09-27,406.30,411.22,402.37,402.92,5876700,402.92 -2006-09-26,405.50,407.68,401.77,406.87,5289400,406.87 -2006-09-25,405.58,409.45,402.50,403.98,5737300,403.98 -2006-09-22,404.98,407.45,401.36,403.78,4649600,403.78 -2006-09-21,400.30,408.45,399.86,406.85,10692100,406.85 -2006-09-20,407.10,407.39,394.62,397.00,9147800,397.00 -2006-09-19,415.46,415.49,392.74,403.81,14292900,403.81 -2006-09-18,410.00,418.69,409.47,414.69,7106700,414.69 -2006-09-15,407.48,410.05,406.74,409.88,7838200,409.88 -2006-09-14,404.30,406.28,401.93,403.98,5366100,403.98 -2006-09-13,395.15,406.76,395.10,406.57,9768200,406.57 -2006-09-12,385.00,392.73,384.88,391.90,5442200,391.90 -2006-09-11,378.26,384.69,377.77,384.09,4529200,384.09 -2006-09-08,376.72,380.79,376.72,377.85,3083400,377.85 -2006-09-07,379.39,381.75,377.40,378.49,3842000,378.49 -2006-09-06,382.10,383.19,379.66,380.14,3724100,380.14 -2006-09-05,379.87,385.40,377.44,384.36,4074300,384.36 -2006-09-01,380.99,381.28,377.19,378.60,2672900,378.60 -2006-08-31,381.49,382.15,378.20,378.53,2959900,378.53 -2006-08-30,379.21,384.65,378.51,380.75,4044400,380.75 -2006-08-29,380.78,382.32,377.20,378.95,4460000,378.95 -2006-08-28,375.61,380.95,375.00,380.95,4164000,380.95 -2006-08-25,373.08,375.32,372.50,373.26,2466700,373.26 -2006-08-24,374.44,376.40,372.26,373.73,3482500,373.73 -2006-08-23,377.64,378.27,372.66,373.43,3642300,373.43 -2006-08-22,377.73,379.26,374.84,378.29,4164100,378.29 -2006-08-21,378.10,379.00,375.22,377.30,4023300,377.30 -2006-08-18,386.31,387.09,380.75,383.36,4952200,383.36 -2006-08-17,386.39,390.00,383.92,385.80,5080200,385.80 -2006-08-16,383.48,388.45,382.12,387.72,5853200,387.72 -2006-08-15,374.11,381.67,372.60,380.97,6698200,380.97 -2006-08-14,371.50,375.13,368.67,369.43,4968300,369.43 -2006-08-11,374.40,375.28,368.00,368.50,3766500,368.50 -2006-08-10,373.88,377.67,372.46,374.20,4261900,374.20 -2006-08-09,382.80,384.68,376.36,376.94,4311000,376.94 -2006-08-08,382.82,384.50,379.09,381.00,5743200,381.00 -2006-08-07,371.50,379.73,371.15,377.95,3946900,377.95 -2006-08-04,379.56,380.68,371.75,373.85,5095200,373.85 -2006-08-03,364.98,377.91,363.36,375.39,6327000,375.39 -2006-08-02,375.60,377.17,365.20,367.23,7097800,367.23 -2006-08-01,385.11,385.77,375.51,375.51,5463200,375.51 -2006-07-31,388.00,389.17,383.31,386.60,4595300,386.60 -2006-07-28,382.00,389.56,381.73,388.12,4083600,388.12 -2006-07-27,387.37,387.49,377.95,382.40,5641100,382.40 -2006-07-26,388.20,391.91,383.00,385.50,5531900,385.50 -2006-07-25,385.02,391.31,383.80,389.36,5761100,389.36 -2006-07-24,392.82,393.89,381.21,390.90,8086100,390.90 -2006-07-21,386.14,391.75,377.69,390.11,11754600,390.11 -2006-07-20,404.28,404.44,385.66,387.12,12538700,387.12 -2006-07-19,395.01,401.14,394.66,399.00,8518500,399.00 -2006-07-18,409.75,410.57,397.74,403.05,8536800,403.05 -2006-07-17,404.63,411.00,403.72,407.89,5811900,407.89 -2006-07-14,410.33,411.49,398.61,403.50,7552100,403.50 -2006-07-13,414.00,418.34,406.83,408.83,6924500,408.83 -2006-07-12,422.09,422.74,416.73,417.25,4906700,417.25 -2006-07-11,418.51,425.05,413.03,424.56,5971300,424.56 -2006-07-10,423.44,425.23,416.38,418.20,4436400,418.20 -2006-07-07,426.05,427.89,415.88,420.45,6041900,420.45 -2006-07-06,423.38,425.38,421.98,423.19,3687100,423.19 -2006-07-05,421.52,422.80,415.64,421.46,4985600,421.46 -2006-07-03,420.04,423.77,419.45,423.20,2156700,423.20 -2006-06-30,415.60,419.33,412.33,419.33,6258000,419.33 -2006-06-29,407.99,418.20,405.82,417.81,6658200,417.81 -2006-06-28,404.01,406.48,401.13,406.11,3710500,406.11 -2006-06-27,405.71,408.00,401.01,402.32,4107100,402.32 -2006-06-26,406.75,408.30,403.25,404.22,3551200,404.22 -2006-06-23,402.76,409.75,400.74,404.86,5314800,404.86 -2006-06-22,401.58,406.00,388.00,399.95,5911900,399.95 -2006-06-21,391.06,404.00,389.75,402.13,8744400,402.13 -2006-06-20,388.03,391.87,386.51,387.17,4039900,387.17 -2006-06-19,390.85,394.80,386.98,388.14,7633100,388.14 -2006-06-16,389.10,390.93,388.00,390.70,5304600,390.70 -2006-06-15,386.62,392.25,383.00,391.00,6785700,391.00 -2006-06-14,389.83,391.10,378.52,384.39,7772000,384.39 -2006-06-13,380.90,387.00,378.12,386.52,7659100,386.52 -2006-06-12,388.34,390.49,381.00,381.54,5019100,381.54 -2006-06-09,392.19,395.43,385.35,386.57,6157500,386.57 -2006-06-08,387.75,394.27,378.59,393.30,10359500,393.30 -2006-06-07,393.24,394.86,386.50,386.51,8911300,386.51 -2006-06-06,376.58,390.00,376.30,389.99,10259800,389.99 -2006-06-05,376.18,381.45,374.15,374.44,5558500,374.44 -2006-06-02,386.84,387.08,377.45,379.44,6386400,379.44 -2006-06-01,373.54,382.99,371.60,382.62,6278000,382.62 -2006-05-31,373.80,378.25,366.78,371.82,7981300,371.82 -2006-05-30,378.28,381.00,371.45,371.94,4316000,371.94 -2006-05-26,384.55,385.88,380.03,381.35,3667000,381.35 -2006-05-25,379.08,383.00,372.31,382.99,8194600,382.99 -2006-05-24,377.35,383.44,371.61,381.25,9553800,381.25 -2006-05-23,374.21,383.88,373.56,375.58,8983000,375.58 -2006-05-22,367.85,373.03,365.25,370.95,8604400,370.95 -2006-05-19,373.28,374.50,360.57,370.02,11398200,370.02 -2006-05-18,378.78,381.81,370.71,370.99,5835000,370.99 -2006-05-17,370.61,379.84,370.22,374.50,10643800,374.50 -2006-05-16,375.99,376.86,369.89,371.30,6491100,371.30 -2006-05-15,375.93,380.15,368.25,376.20,8590100,376.20 -2006-05-12,383.54,384.87,373.55,374.13,10087600,374.13 -2006-05-11,403.42,404.71,384.98,387.00,8892800,387.00 -2006-05-10,408.31,411.71,401.86,402.98,6187200,402.98 -2006-05-09,395.70,409.00,393.75,408.80,9140600,408.80 -2006-05-08,395.11,397.12,390.05,394.78,5118600,394.78 -2006-05-05,397.60,400.68,391.78,394.30,6065000,394.30 -2006-05-04,395.03,398.87,392.21,394.75,4652000,394.75 -2006-05-03,396.35,401.50,390.88,394.17,8072200,394.17 -2006-05-02,401.08,402.49,388.40,394.80,13104300,394.80 -2006-05-01,418.47,419.44,398.55,398.90,10361200,398.90 -2006-04-28,418.63,425.73,416.30,417.94,7421300,417.94 -2006-04-27,422.91,426.91,419.39,420.03,8337900,420.03 -2006-04-26,427.74,430.04,423.53,425.97,7277800,425.97 -2006-04-25,439.63,441.04,426.00,427.16,9569000,427.16 -2006-04-24,439.40,444.70,436.52,440.50,8836400,440.50 -2006-04-21,448.90,450.72,436.17,437.10,22551300,437.10 -2006-04-20,411.01,416.00,408.20,415.00,12271500,415.00 -2006-04-19,412.57,413.64,406.73,410.50,6781700,410.50 -2006-04-18,407.93,409.83,401.50,404.24,8137600,404.24 -2006-04-17,403.45,412.50,400.84,406.82,8259500,406.82 -2006-04-13,408.63,409.76,400.50,402.16,6552900,402.16 -2006-04-12,409.00,411.33,405.19,408.95,6017000,408.95 -2006-04-11,416.42,419.10,406.22,409.66,11107200,409.66 -2006-04-10,407.08,417.17,405.25,416.38,9320100,416.38 -2006-04-07,412.41,412.85,404.02,406.16,7025900,406.16 -2006-04-06,406.49,413.89,405.43,411.18,8598500,411.18 -2006-04-05,408.20,414.57,402.82,407.99,13410500,407.99 -2006-04-04,389.90,404.90,388.14,404.34,15715700,404.34 -2006-04-03,389.53,392.47,387.93,389.70,8122700,389.70 -2006-03-31,388.74,391.87,384.03,390.00,36521400,390.00 -2006-03-30,389.19,393.50,383.61,388.44,14711700,388.44 -2006-03-29,379.94,399.00,379.51,394.98,19027500,394.98 -2006-03-28,371.71,377.86,371.17,377.20,8945800,377.20 -2006-03-27,367.09,371.71,365.00,369.69,7023700,369.69 -2006-03-24,368.62,370.09,362.51,365.80,15180600,365.80 -2006-03-23,342.35,345.75,340.20,341.89,7434700,341.89 -2006-03-22,339.75,344.10,337.50,340.22,7596000,340.22 -2006-03-21,350.01,351.66,339.08,339.92,9831100,339.92 -2006-03-20,342.34,350.09,341.54,348.19,10407600,348.19 -2006-03-17,338.80,341.78,334.93,339.79,8551700,339.79 -2006-03-16,348.61,348.75,337.90,338.77,10016700,338.77 -2006-03-15,350.77,352.30,340.53,344.50,12768800,344.50 -2006-03-14,337.14,352.37,332.62,351.16,18450700,351.16 -2006-03-13,340.93,346.10,335.45,337.06,13642400,337.06 -2006-03-10,343.50,344.50,331.55,337.50,19325600,337.50 -2006-03-09,355.39,358.53,341.50,343.00,13910400,343.00 -2006-03-08,353.93,360.03,350.54,353.88,11745600,353.88 -2006-03-07,365.02,368.45,358.15,364.45,10378800,364.45 -2006-03-06,380.91,383.40,367.14,368.10,8939700,368.10 -2006-03-03,384.30,387.24,375.76,378.18,11962000,378.18 -2006-03-02,364.28,381.10,362.20,376.45,18330300,376.45 -2006-03-01,368.56,369.45,361.30,364.80,12061200,364.80 -2006-02-28,393.20,397.54,338.51,362.62,39437600,362.62 -2006-02-27,381.27,391.70,380.28,390.38,10212200,390.38 -2006-02-24,377.30,380.07,373.49,377.40,6484300,377.40 -2006-02-23,365.61,381.24,365.39,378.07,12551600,378.07 -2006-02-22,367.15,368.95,363.86,365.49,6476200,365.49 -2006-02-21,366.44,373.54,365.11,366.59,8686000,366.59 -2006-02-17,369.86,372.14,363.62,368.75,14320200,368.75 -2006-02-16,345.67,367.00,344.49,366.46,21315500,366.46 -2006-02-15,341.27,346.00,337.83,342.38,12947000,342.38 -2006-02-14,345.33,351.69,342.40,343.32,14654000,343.32 -2006-02-13,346.64,350.60,341.89,345.70,19717800,345.70 -2006-02-10,361.95,364.50,353.14,362.61,15223500,362.61 -2006-02-09,371.20,374.40,356.11,358.77,11912400,358.77 -2006-02-08,368.48,370.69,354.67,369.08,20804100,369.08 -2006-02-07,382.99,383.70,363.35,367.92,16630200,367.92 -2006-02-06,385.31,389.90,379.56,385.10,8940400,385.10 -2006-02-03,393.62,393.90,372.57,381.55,18281800,381.55 -2006-02-02,403.82,406.50,395.98,396.04,11807700,396.04 -2006-02-01,389.03,402.00,387.52,401.78,27122500,401.78 -2006-01-31,430.57,439.60,423.97,432.66,22066000,432.66 -2006-01-30,429.23,433.28,425.00,426.82,8588900,426.82 -2006-01-27,435.00,438.22,428.98,433.49,8452200,433.49 -2006-01-26,439.54,439.99,423.56,434.27,12926100,434.27 -2006-01-25,451.26,454.23,429.22,433.00,18739800,433.00 -2006-01-24,436.03,444.95,434.48,443.03,15464600,443.03 -2006-01-23,407.38,428.39,405.73,427.50,22741400,427.50 -2006-01-20,438.70,440.03,394.74,399.46,41116700,399.46 -2006-01-19,451.17,453.49,433.00,436.45,14537300,436.45 -2006-01-18,447.30,457.36,443.25,444.91,20485700,444.91 -2006-01-17,463.06,469.90,462.53,467.11,8270300,467.11 -2006-01-13,464.31,466.89,461.61,466.25,7656600,466.25 -2006-01-12,473.72,474.99,461.50,463.63,10125300,463.63 -2006-01-11,471.27,475.11,469.18,471.63,9007400,471.63 -2006-01-10,464.42,470.25,462.04,469.76,9097100,469.76 -2006-01-09,466.41,473.40,460.94,466.90,12791900,466.90 -2006-01-06,456.87,470.50,453.24,465.66,17756900,465.66 -2006-01-05,446.00,451.55,441.50,451.24,10808300,451.24 -2006-01-04,443.90,448.96,439.75,445.24,15286400,445.24 -2006-01-03,422.52,435.67,418.22,435.23,13121200,435.23 -2005-12-30,417.27,418.21,413.74,414.86,7587100,414.86 -2005-12-29,427.98,428.73,419.17,420.15,6945800,420.15 -2005-12-28,424.34,427.78,421.26,426.69,7117900,426.69 -2005-12-27,431.86,431.86,422.76,424.64,6702800,424.64 -2005-12-23,432.15,432.50,428.78,430.93,4595100,430.93 -2005-12-22,431.77,432.86,425.93,432.04,7546600,432.04 -2005-12-21,433.55,436.86,420.71,426.33,11221900,426.33 -2005-12-20,427.86,432.20,424.67,429.74,10084700,429.74 -2005-12-19,432.20,446.21,420.11,424.60,21936800,424.60 -2005-12-16,425.34,432.50,422.75,430.15,16330500,430.15 -2005-12-15,419.11,423.14,416.50,422.55,6045800,422.55 -2005-12-14,417.04,419.73,415.49,418.96,6630400,418.96 -2005-12-13,412.50,418.00,411.64,417.49,8157000,417.49 -2005-12-12,414.63,415.21,409.95,412.61,6950100,412.61 -2005-12-09,415.00,415.78,408.56,409.20,7643400,409.20 -2005-12-08,405.30,410.65,402.64,410.65,8910100,410.65 -2005-12-07,406.16,406.70,399.01,404.22,11665900,404.22 -2005-12-06,408.70,416.41,401.70,404.54,15114700,404.54 -2005-12-05,417.00,417.50,404.28,405.85,10289400,405.85 -2005-12-02,416.94,419.53,413.86,417.70,7543500,417.70 -2005-12-01,409.20,415.44,408.29,414.09,9744900,414.09 -2005-11-30,404.26,408.45,395.56,404.91,15596600,404.91 -2005-11-29,424.46,426.40,402.14,403.54,21495800,403.54 -2005-11-28,429.82,431.24,422.44,423.48,11008400,423.48 -2005-11-25,425.78,428.75,425.30,428.62,4840100,428.62 -2005-11-23,417.04,424.72,415.78,422.86,10085000,422.86 -2005-11-22,408.65,417.31,406.23,416.47,9596000,416.47 -2005-11-21,399.17,409.98,393.49,409.36,10335100,409.36 -2005-11-18,403.49,404.50,399.85,400.21,7025700,400.21 -2005-11-17,401.80,403.81,399.53,403.45,9212200,403.45 -2005-11-16,396.20,398.85,394.11,398.15,8695200,398.15 -2005-11-15,394.38,397.00,390.95,392.80,8624900,392.80 -2005-11-14,392.12,398.22,391.53,396.97,7807900,396.97 -2005-11-11,395.12,396.90,388.85,390.40,7063900,390.40 -2005-11-10,378.36,391.35,377.43,391.10,9128700,391.10 -2005-11-09,386.67,388.29,378.03,379.15,10466900,379.15 -2005-11-08,394.25,395.59,388.58,389.90,7897500,389.90 -2005-11-07,395.10,397.47,392.15,395.03,9591500,395.03 -2005-11-04,389.98,391.79,385.45,390.43,8824900,390.43 -2005-11-03,382.41,386.58,381.38,385.95,7448400,385.95 -2005-11-02,381.70,385.00,377.17,379.68,10565400,379.68 -2005-11-01,371.86,383.90,369.01,379.38,16356100,379.38 -2005-10-31,360.24,374.75,359.51,372.14,14342900,372.14 -2005-10-28,355.27,358.95,355.02,358.17,5903500,358.17 -2005-10-27,356.60,357.09,351.68,353.06,5134400,353.06 -2005-10-26,346.28,356.00,346.19,355.44,8907500,355.44 -2005-10-25,345.78,347.40,342.86,346.91,6878300,346.91 -2005-10-24,343.37,349.30,342.19,348.65,9431700,348.65 -2005-10-21,345.80,346.43,333.00,339.90,22892400,339.90 -2005-10-20,309.99,311.13,301.21,303.20,13911700,303.20 -2005-10-19,304.00,309.87,303.96,308.70,7010700,308.70 -2005-10-18,304.96,307.96,302.74,303.28,7077800,303.28 -2005-10-17,297.50,305.20,294.56,305.00,7566700,305.00 -2005-10-14,299.90,300.23,292.54,296.14,8519100,296.14 -2005-10-13,302.00,302.00,290.68,297.44,10567700,297.44 -2005-10-12,305.20,307.19,299.00,300.97,9306200,300.97 -2005-10-11,310.61,312.65,304.86,306.10,8542600,306.10 -2005-10-10,313.31,314.82,309.15,310.65,5572200,310.65 -2005-10-07,314.79,316.67,310.54,312.99,6770300,312.99 -2005-10-06,314.14,314.48,310.09,312.75,7993800,312.75 -2005-10-05,312.69,314.90,308.00,310.71,8328400,310.71 -2005-10-04,319.95,321.28,310.74,311.00,9144300,311.00 -2005-10-03,313.63,320.11,312.79,318.68,9160300,318.68 -2005-09-30,314.22,317.50,312.29,316.46,9151300,316.46 -2005-09-29,306.68,310.72,306.08,309.62,5613800,309.62 -2005-09-28,314.22,315.10,305.60,306.00,7997400,306.00 -2005-09-27,314.95,318.41,313.38,313.94,6873100,313.94 -2005-09-26,319.50,320.95,312.56,314.28,9894400,314.28 -2005-09-23,313.00,317.21,312.59,315.36,8483800,315.36 -2005-09-22,311.50,319.22,310.17,311.37,13006400,311.37 -2005-09-21,308.41,313.76,305.96,311.90,10119700,311.90 -2005-09-20,306.15,311.30,305.23,307.91,9351000,307.91 -2005-09-19,301.00,306.00,300.71,303.79,5761900,303.79 -2005-09-16,304.02,304.50,299.87,300.20,7579800,300.20 -2005-09-15,299.52,306.75,297.91,302.62,15466200,302.62 -2005-09-14,308.73,313.28,300.30,303.00,11275800,303.00 -2005-09-13,309.00,315.53,306.17,311.68,10299900,311.68 -2005-09-12,301.75,311.42,301.00,309.74,10386500,309.74 -2005-09-09,297.28,299.10,296.56,299.09,4390500,299.09 -2005-09-08,294.83,299.28,293.36,295.39,6613300,295.39 -2005-09-07,285.89,295.50,285.28,294.87,7499500,294.87 -2005-09-06,289.00,289.39,286.80,287.11,4212300,287.11 -2005-09-02,286.51,289.99,286.44,288.45,3434500,288.45 -2005-09-01,285.91,287.50,285.00,286.25,2742100,286.25 -2005-08-31,288.23,288.50,284.36,286.00,5034000,286.00 -2005-08-30,287.39,289.51,285.88,287.27,4792000,287.27 -2005-08-29,282.24,289.12,282.24,288.45,5903000,288.45 -2005-08-26,283.48,285.02,282.66,283.58,3755300,283.58 -2005-08-25,282.55,284.00,279.97,282.59,4376600,282.59 -2005-08-24,277.57,284.75,276.45,282.57,8593100,282.57 -2005-08-23,276.16,279.74,274.12,279.58,5821700,279.58 -2005-08-22,281.24,281.47,273.35,274.01,6813000,274.01 -2005-08-19,280.99,281.45,279.62,280.00,5542900,280.00 -2005-08-18,275.91,280.50,275.00,279.99,11872800,279.99 -2005-08-17,285.51,286.57,284.00,285.10,3883300,285.10 -2005-08-16,284.88,287.79,283.34,285.65,7109200,285.65 -2005-08-15,289.80,292.77,283.77,284.00,8174700,284.00 -2005-08-12,283.36,290.20,281.64,289.72,6585900,289.72 -2005-08-11,285.89,286.58,280.62,284.05,7514900,284.05 -2005-08-10,291.30,292.33,284.88,285.68,6879000,285.68 -2005-08-09,291.96,292.68,288.51,291.57,5779300,291.57 -2005-08-08,293.60,295.65,290.49,291.25,4481800,291.25 -2005-08-05,297.50,298.51,291.31,292.35,5939700,292.35 -2005-08-04,295.55,299.00,295.25,297.73,5236500,297.73 -2005-08-03,298.00,299.72,295.60,297.30,5930600,297.30 -2005-08-02,291.60,299.52,291.12,299.19,7290200,299.19 -2005-08-01,288.12,292.50,288.10,291.61,5662400,291.61 -2005-07-29,292.14,292.84,286.99,287.76,8363300,287.76 -2005-07-28,297.41,297.41,293.28,293.50,5925600,293.50 -2005-07-27,297.74,298.23,292.40,296.93,7217900,296.93 -2005-07-26,295.01,298.00,292.09,296.09,9816900,296.09 -2005-07-25,302.39,303.29,294.96,295.85,9658800,295.85 -2005-07-22,306.37,309.25,296.33,302.40,23386800,302.40 -2005-07-21,314.05,317.80,311.21,313.94,19789400,313.94 -2005-07-20,305.57,312.61,301.80,312.00,14310400,312.00 -2005-07-19,302.10,310.35,301.80,309.90,12621400,309.90 -2005-07-18,300.00,301.90,297.75,299.54,6207800,299.54 -2005-07-15,301.24,303.40,299.78,301.19,8438400,301.19 -2005-07-14,305.34,306.75,300.07,300.89,10667700,300.89 -2005-07-13,292.51,299.24,292.10,298.86,11437900,298.86 -2005-07-12,293.39,294.40,290.93,291.78,5864900,291.78 -2005-07-11,296.40,296.60,291.02,293.35,8390300,293.35 -2005-07-08,296.25,297.50,294.05,296.23,7457600,296.23 -2005-07-07,289.39,295.80,288.51,295.54,10672100,295.54 -2005-07-06,297.30,297.60,291.38,291.52,8000300,291.52 -2005-07-05,292.10,295.98,290.23,295.71,7494000,295.71 -2005-07-01,295.04,296.24,289.22,291.25,9227600,291.25 -2005-06-30,294.34,298.93,291.04,294.15,15094400,294.15 -2005-06-29,302.50,304.38,292.15,292.72,18298700,292.72 -2005-06-28,306.28,309.25,302.00,302.00,19036500,302.00 -2005-06-27,298.90,304.47,293.86,304.10,17802900,304.10 -2005-06-24,290.90,298.00,289.58,297.25,17771200,297.25 -2005-06-23,288.00,294.81,286.50,289.71,14056400,289.71 -2005-06-22,289.67,292.32,288.67,289.30,10474000,289.30 -2005-06-21,288.07,290.30,284.97,287.84,15132300,287.84 -2005-06-20,276.09,287.67,271.73,286.70,21024700,286.70 -2005-06-17,279.00,280.30,275.90,280.30,10434400,280.30 -2005-06-16,274.26,278.30,273.07,277.44,12462400,277.44 -2005-06-15,275.00,277.30,267.43,274.80,20883100,274.80 -2005-06-14,278.59,281.24,277.75,278.35,10091900,278.35 -2005-06-13,279.82,284.19,276.52,282.75,12803200,282.75 -2005-06-10,286.99,287.28,280.02,282.50,12696600,282.50 -2005-06-09,284.72,288.50,280.56,286.31,16441100,286.31 -2005-06-08,292.85,293.19,278.00,279.56,25700900,279.56 -2005-06-07,297.10,299.59,290.30,293.12,24323000,293.12 -2005-06-06,282.39,293.75,281.83,290.94,22525900,290.94 -2005-06-03,286.79,289.30,277.41,280.26,18782300,280.26 -2005-06-02,288.73,289.78,284.60,287.90,17974100,287.90 -2005-06-01,283.20,292.89,282.02,288.00,35191700,288.00 -2005-05-31,269.43,278.40,269.37,277.27,22236800,277.27 -2005-05-27,260.46,266.05,259.25,266.00,12184100,266.00 -2005-05-26,260.96,263.76,258.30,259.20,13546600,259.20 -2005-05-25,252.73,260.98,250.63,260.81,18057900,260.81 -2005-05-24,256.96,265.44,253.50,256.00,29043100,256.00 -2005-05-23,243.16,258.10,242.71,255.45,21388300,255.45 -2005-05-20,241.21,241.67,239.65,241.61,8163500,241.61 -2005-05-19,240.34,241.17,238.27,239.18,9716500,239.18 -2005-05-18,233.61,239.97,233.52,239.16,12312000,239.16 -2005-05-17,230.56,233.45,230.20,233.13,7808900,233.13 -2005-05-16,229.68,231.62,228.57,231.05,5681400,231.05 -2005-05-13,229.18,231.09,227.32,229.24,7415500,229.24 -2005-05-12,230.81,232.23,228.20,228.72,8948200,228.72 -2005-05-11,228.97,231.98,227.93,231.29,11478800,231.29 -2005-05-10,225.47,227.80,224.72,227.80,6345800,227.80 -2005-05-09,228.00,228.50,225.43,226.02,5536800,226.02 -2005-05-06,228.40,229.25,226.47,228.02,6763900,228.02 -2005-05-05,228.62,228.62,225.88,226.98,7509600,226.98 -2005-05-04,227.23,229.88,227.00,228.50,12083500,228.50 -2005-05-03,221.85,228.15,221.32,226.19,17780200,226.19 -2005-05-02,222.05,223.70,220.21,222.29,9767400,222.29 -2005-04-29,221.91,222.25,217.82,220.00,9170200,220.00 -2005-04-28,219.50,222.08,217.71,219.45,8682800,219.45 -2005-04-27,217.99,220.85,216.74,219.78,10264800,219.78 -2005-04-26,220.22,222.00,218.29,218.75,17272000,218.75 -2005-04-25,217.82,224.74,217.52,223.53,19840000,223.53 -2005-04-22,222.90,224.00,214.26,215.81,33205100,215.81 -2005-04-21,200.42,205.00,199.32,204.22,17751900,204.22 -2005-04-20,198.58,200.50,195.91,198.10,15451500,198.10 -2005-04-19,189.33,192.00,188.03,191.40,8430000,191.40 -2005-04-18,184.58,187.88,183.49,186.97,6550300,186.97 -2005-04-15,190.10,190.34,184.66,185.00,11577400,185.00 -2005-04-14,193.27,194.36,190.10,191.45,6152700,191.45 -2005-04-13,193.47,194.32,189.73,192.93,6555800,192.93 -2005-04-12,193.00,194.42,189.41,193.96,7319600,193.96 -2005-04-11,193.09,194.80,192.32,193.23,5410500,193.23 -2005-04-08,193.69,195.10,191.45,192.05,5116600,192.05 -2005-04-07,188.78,194.62,188.64,193.76,9692200,193.76 -2005-04-06,189.24,189.65,187.58,189.22,5252600,189.22 -2005-04-05,187.73,190.26,187.57,188.57,8736700,188.57 -2005-04-04,179.95,185.32,179.84,185.29,8076400,185.29 -2005-04-01,181.76,182.95,179.99,180.04,6182000,180.04 -2005-03-31,177.95,181.39,177.64,180.51,6768600,180.51 -2005-03-30,180.64,181.45,179.60,180.45,6236100,180.45 -2005-03-29,181.05,183.28,178.07,179.57,6473000,179.57 -2005-03-28,181.68,184.80,180.95,181.42,8738000,181.42 -2005-03-24,180.70,180.86,179.20,179.25,3705200,179.25 -2005-03-23,177.97,180.24,177.97,178.98,4845000,178.98 -2005-03-22,181.18,181.94,177.85,178.60,5631700,178.60 -2005-03-21,179.27,182.17,177.25,180.88,7483700,180.88 -2005-03-18,178.81,180.40,178.31,180.04,7090000,180.04 -2005-03-17,177.13,179.64,175.80,179.29,8260600,179.29 -2005-03-16,176.70,178.61,175.01,175.60,7106300,175.60 -2005-03-15,175.30,180.00,174.21,178.61,10422100,178.61 -2005-03-14,178.33,178.40,172.57,174.99,11146600,174.99 -2005-03-11,180.44,180.95,177.15,177.80,8028300,177.80 -2005-03-10,181.01,181.20,177.40,179.98,10960500,179.98 -2005-03-09,184.21,184.65,180.16,181.35,11360400,181.35 -2005-03-08,189.10,189.85,184.97,185.20,8046100,185.20 -2005-03-07,187.78,189.60,187.03,188.81,8667400,188.81 -2005-03-04,186.70,187.25,185.07,185.90,6774100,185.90 -2005-03-03,186.13,187.75,184.31,187.01,7608600,187.01 -2005-03-02,185.95,187.67,184.36,185.18,7285500,185.18 -2005-03-01,189.29,189.75,182.00,186.06,9311200,186.06 -2005-02-28,186.00,189.87,185.85,187.99,7818400,187.99 -2005-02-25,189.15,189.92,185.51,185.87,9973500,185.87 -2005-02-24,183.37,189.85,182.23,188.89,25814300,188.89 -2005-02-23,193.30,194.48,188.66,193.95,15586000,193.95 -2005-02-22,196.50,198.90,190.39,191.37,13483700,191.37 -2005-02-18,198.51,198.84,196.66,197.95,8485900,197.95 -2005-02-17,197.83,199.75,196.81,197.90,10414400,197.90 -2005-02-16,194.70,199.33,194.30,198.41,16532300,198.41 -2005-02-15,193.60,199.84,193.08,195.23,25782800,195.23 -2005-02-14,182.85,193.08,181.00,192.99,38562200,192.99 -2005-02-11,186.66,192.32,186.07,187.40,13116000,187.40 -2005-02-10,191.97,192.21,185.25,187.98,18982700,187.98 -2005-02-09,200.76,201.60,189.46,191.58,17171500,191.58 -2005-02-08,196.96,200.02,194.53,198.64,11480000,198.64 -2005-02-07,205.26,206.40,195.51,196.03,12960400,196.03 -2005-02-04,206.47,207.75,202.60,204.36,14819300,204.36 -2005-02-03,205.99,213.37,205.81,210.86,12988100,210.86 -2005-02-02,215.55,216.80,203.66,205.96,32799300,205.96 -2005-02-01,194.38,196.66,190.63,191.90,18839000,191.90 -2005-01-31,193.69,196.36,191.72,195.62,9596700,195.62 -2005-01-28,190.02,194.70,186.34,190.34,12208200,190.34 -2005-01-27,188.76,188.86,185.20,188.08,6627400,188.08 -2005-01-26,179.27,189.41,179.15,189.24,12307900,189.24 -2005-01-25,181.94,182.24,176.29,177.12,10659200,177.12 -2005-01-24,188.69,189.33,180.32,180.72,14022700,180.72 -2005-01-21,194.54,195.36,188.12,188.28,9258400,188.28 -2005-01-20,192.50,196.25,192.00,193.92,9001600,193.92 -2005-01-19,204.65,205.30,196.71,197.30,11257700,197.30 -2005-01-18,200.97,205.02,198.66,203.90,13172600,203.90 -2005-01-14,196.00,200.01,194.13,199.97,9640300,199.97 -2005-01-13,195.38,197.39,194.05,195.33,6849400,195.33 -2005-01-12,194.33,195.93,190.50,195.38,8177800,195.38 -2005-01-11,195.62,197.71,193.18,193.54,6958700,193.54 -2005-01-10,194.50,198.10,191.83,195.06,7539600,195.06 -2005-01-07,190.64,194.25,188.78,193.85,9662900,193.85 -2005-01-06,195.08,195.90,187.72,188.55,10387100,188.55 -2005-01-05,193.45,196.90,192.23,193.51,8236600,193.51 -2005-01-04,201.40,202.93,193.48,194.50,13755900,194.50 -2005-01-03,197.40,203.64,195.46,202.71,15844200,202.71 -2004-12-31,199.23,199.88,192.56,192.79,7668500,192.79 -2004-12-30,192.97,198.23,191.85,197.60,5904300,197.60 -2004-12-29,191.78,193.52,191.78,192.90,2678100,192.90 -2004-12-28,192.11,193.55,191.01,192.76,4145800,192.76 -2004-12-27,189.15,193.30,189.10,191.91,6104100,191.91 -2004-12-23,187.45,188.60,186.00,187.90,3614600,187.90 -2004-12-22,183.90,186.85,183.01,186.30,3907000,186.30 -2004-12-21,186.31,187.88,183.40,183.75,5516300,183.75 -2004-12-20,182.00,188.46,181.87,185.02,9834500,185.02 -2004-12-17,176.76,180.50,176.55,180.08,7386200,180.08 -2004-12-16,176.95,180.49,175.95,176.47,8572800,176.47 -2004-12-15,177.99,180.69,176.66,179.78,11471000,179.78 -2004-12-14,171.00,178.82,169.60,178.69,11088400,178.69 -2004-12-13,172.17,173.18,169.45,170.45,4818600,170.45 -2004-12-10,173.43,174.88,171.29,171.65,4317200,171.65 -2004-12-09,170.25,173.50,168.47,173.43,7654000,173.43 -2004-12-08,170.35,173.68,168.73,169.98,7541800,169.98 -2004-12-07,176.00,176.20,170.55,171.43,6870900,171.43 -2004-12-06,179.13,180.70,176.02,176.29,6254000,176.29 -2004-12-03,179.95,181.06,177.60,180.40,5869200,180.40 -2004-12-02,179.90,181.51,178.55,179.40,6260900,179.40 -2004-12-01,181.95,182.50,179.55,179.96,7864100,179.96 -2004-11-30,180.71,183.00,180.25,181.98,7700000,181.98 -2004-11-29,180.36,182.95,177.51,181.05,10666600,181.05 -2004-11-26,175.80,180.03,175.32,179.39,6480100,179.39 -2004-11-24,174.82,177.21,172.51,174.76,15281000,174.76 -2004-11-23,167.97,170.83,166.50,167.52,12413300,167.52 -2004-11-22,164.47,169.50,161.31,165.10,12368200,165.10 -2004-11-19,169.10,169.98,166.52,169.40,8769300,169.40 -2004-11-18,170.29,174.42,165.73,167.54,16629600,167.54 -2004-11-17,169.02,177.50,169.00,172.50,18132900,172.50 -2004-11-16,177.50,179.47,170.83,172.54,20917400,172.54 -2004-11-15,180.45,188.32,178.75,184.87,11901500,184.87 -2004-11-12,185.23,189.80,177.40,182.00,16746100,182.00 -2004-11-11,169.13,183.75,167.57,183.02,14985500,183.02 -2004-11-10,170.67,172.52,166.33,167.86,10644000,167.86 -2004-11-09,174.10,175.20,165.27,168.70,11064200,168.70 -2004-11-08,170.93,175.44,169.40,172.55,11191800,172.55 -2004-11-05,181.98,182.30,168.55,169.35,19833100,169.35 -2004-11-04,188.44,190.40,183.35,184.70,14409600,184.70 -2004-11-03,198.18,201.60,190.75,191.67,13888700,191.67 -2004-11-02,198.78,199.25,193.34,194.87,11346300,194.87 -2004-11-01,193.55,197.67,191.27,196.03,12224900,196.03 -2004-10-29,198.89,199.95,190.60,190.64,21162500,190.64 -2004-10-28,186.68,194.39,185.60,193.30,14846800,193.30 -2004-10-27,182.72,189.52,181.77,185.97,13356500,185.97 -2004-10-26,186.34,192.64,180.00,181.80,22307100,181.80 -2004-10-25,176.40,194.43,172.55,187.40,32764200,187.40 -2004-10-22,170.54,180.17,164.08,172.43,36891900,172.43 -2004-10-21,144.40,150.13,141.62,149.38,14589500,149.38 -2004-10-20,148.03,148.99,139.60,140.49,11372700,140.49 -2004-10-19,150.50,152.40,147.35,147.94,9064000,147.94 -2004-10-18,143.20,149.20,141.21,149.16,7025200,149.16 -2004-10-15,144.93,145.50,141.95,144.11,6604000,144.11 -2004-10-14,141.01,142.38,138.56,142.00,5226300,142.00 -2004-10-13,143.32,143.55,140.08,140.90,9893000,140.90 -2004-10-12,134.44,137.61,133.40,137.40,5838600,137.40 -2004-10-11,137.00,138.86,133.85,135.26,5241300,135.26 -2004-10-08,138.72,139.68,137.02,137.73,5540300,137.73 -2004-10-07,136.92,139.88,136.55,138.85,7064600,138.85 -2004-10-06,137.55,138.45,136.00,137.08,6697400,137.08 -2004-10-05,134.66,138.53,132.24,138.37,7494100,138.37 -2004-10-04,135.25,136.87,134.03,135.06,6517900,135.06 -2004-10-01,130.80,134.24,128.90,132.58,7570000,132.58 -2004-09-30,129.90,132.30,129.00,129.60,6885900,129.60 -2004-09-29,126.70,135.02,126.23,131.08,15273500,131.08 -2004-09-28,121.30,127.40,120.21,126.86,8473000,126.86 -2004-09-27,119.56,120.88,117.80,118.26,3536600,118.26 -2004-09-24,120.94,124.10,119.76,119.83,4566300,119.83 -2004-09-23,118.84,122.63,117.02,120.82,4272100,120.82 -2004-09-22,117.40,119.67,116.81,118.38,3794400,118.38 -2004-09-21,119.81,120.42,117.51,117.84,3618000,117.84 -2004-09-20,116.95,121.60,116.77,119.36,5319700,119.36 -2004-09-17,114.42,117.49,113.55,117.49,4741000,117.49 -2004-09-16,112.34,115.80,111.65,113.97,4637800,113.97 -2004-09-15,110.56,114.23,110.20,112.00,5361900,112.00 -2004-09-14,107.45,112.00,106.79,111.49,5419900,111.49 -2004-09-13,106.63,108.41,106.46,107.50,3926000,107.50 -2004-09-10,101.60,106.56,101.30,105.33,4353800,105.33 -2004-09-09,102.53,102.71,101.00,102.31,2032900,102.31 -2004-09-08,100.74,103.03,100.50,102.30,2495300,102.30 -2004-09-07,101.01,102.00,99.61,101.58,2926700,101.58 -2004-09-03,100.95,101.74,99.32,100.01,2578800,100.01 -2004-09-02,99.19,102.37,98.94,101.51,7566900,101.51 -2004-09-01,102.70,102.97,99.67,100.25,4573700,100.25 -2004-08-31,102.30,103.71,102.16,102.37,2461400,102.37 -2004-08-30,105.28,105.49,102.01,102.01,2601000,102.01 -2004-08-27,108.10,108.62,105.69,106.15,3109000,106.15 -2004-08-26,104.95,107.95,104.66,107.91,3551000,107.91 -2004-08-25,104.96,108.00,103.88,106.00,4598900,106.00 -2004-08-24,111.24,111.60,103.57,104.87,7631300,104.87 -2004-08-23,110.75,113.48,109.05,109.40,9137200,109.40 -2004-08-20,101.01,109.08,100.50,108.31,11428600,108.31 -2004-08-19,100.00,104.06,95.96,100.34,22351900,100.34 diff --git a/examples/data/intc.csv b/examples/data/intc.csv deleted file mode 100644 index 0073c1ba41eb..000000000000 --- a/examples/data/intc.csv +++ /dev/null @@ -1,66 +0,0 @@ -Date,Open,High,Low,Close,Volume,Adj. Close* -19-Sep-03,29.30,29.36,28.83,29.17,53550300,29.15 -18-Sep-03,28.69,29.28,28.46,29.16,46619000,29.14 -17-Sep-03,28.94,29.38,28.77,28.88,52827300,28.86 -16-Sep-03,28.08,28.99,28.02,28.91,48748000,28.89 -15-Sep-03,28.33,28.45,27.91,27.99,36350400,27.97 -12-Sep-03,27.81,28.39,27.55,28.34,51931600,28.32 -11-Sep-03,27.62,28.35,27.29,28.03,56654900,28.01 -10-Sep-03,28.44,28.49,27.63,27.66,57999300,27.64 -9-Sep-03,29.00,29.13,28.66,28.79,49792900,28.77 -8-Sep-03,28.88,29.20,28.80,29.18,52154000,29.16 -5-Sep-03,28.83,29.10,28.37,28.71,68429904,28.69 -4-Sep-03,28.32,28.74,28.04,28.60,63744700,28.58 -3-Sep-03,28.94,28.97,28.04,28.22,60714800,28.20 -2-Sep-03,28.77,28.84,28.17,28.74,58841200,28.72 -29-Aug-03,28.18,28.65,28.04,28.59,41986600,28.57 -28-Aug-03,28.10,28.35,27.85,28.30,48631600,28.28 -27-Aug-03,27.61,28.08,27.42,28.02,58217200,28.00 -26-Aug-03,26.96,27.74,26.68,27.71,65213400,27.69 -25-Aug-03,27.56,27.76,27.07,27.24,52037500,27.22 -22-Aug-03,28.16,29.04,27.32,27.39,120604096,27.37 -21-Aug-03,26.69,26.78,26.01,26.39,66434900,26.37 -20-Aug-03,26.14,26.74,26.13,26.36,47210300,26.34 -19-Aug-03,26.37,26.54,25.92,26.47,55966300,26.45 -18-Aug-03,25.10,26.23,25.05,26.19,59081000,26.17 -15-Aug-03,25.09,25.25,24.81,25.05,21622800,25.04 -14-Aug-03,24.80,25.17,24.55,25.14,51830000,25.13 -13-Aug-03,24.50,25.00,24.30,24.71,51882500,24.70 -12-Aug-03,24.09,24.40,23.82,24.37,48475100,24.36 -11-Aug-03,23.62,24.13,23.58,23.90,41624600,23.89 -8-Aug-03,24.15,24.22,23.33,23.58,57453600,23.57 -7-Aug-03,23.94,24.30,23.86,23.99,48517800,23.98 -6-Aug-03,24.10,24.55,23.81,24.14,57799000,24.13 -5-Aug-03,25.12,25.12,24.23,24.27,51979800,24.26 -4-Aug-03,24.91,25.23,24.39,25.13,53570000,25.10 -1-Aug-03,24.78,25.07,24.73,25.02,48494900,24.99 -31-Jul-03,24.80,25.35,24.68,24.89,68692096,24.86 -30-Jul-03,24.86,24.87,24.28,24.49,40786200,24.46 -29-Jul-03,24.81,25.23,24.70,24.90,68217600,24.87 -28-Jul-03,24.92,25.13,24.61,24.76,45462200,24.73 -25-Jul-03,24.17,24.94,23.73,24.91,52627700,24.88 -24-Jul-03,25.15,25.17,23.95,23.97,58119100,23.94 -23-Jul-03,24.37,24.90,24.26,24.81,49058200,24.78 -22-Jul-03,24.39,24.53,24.05,24.42,61074300,24.39 -21-Jul-03,24.60,24.63,23.95,24.06,52851200,24.03 -18-Jul-03,25.10,25.15,24.15,24.66,65296900,24.63 -17-Jul-03,24.69,25.10,24.60,24.93,71736800,24.90 -16-Jul-03,25.24,25.50,24.82,25.31,128925696,25.27 -15-Jul-03,24.44,24.77,23.67,24.10,102323696,24.07 -14-Jul-03,24.27,24.58,23.85,24.02,76909400,23.99 -11-Jul-03,23.29,23.50,23.07,23.34,46535400,23.31 -10-Jul-03,23.07,23.30,22.61,22.91,63261600,22.88 -9-Jul-03,23.30,23.99,23.25,23.48,78521904,23.45 -8-Jul-03,22.83,23.40,22.67,23.15,64980800,23.12 -7-Jul-03,22.24,22.98,22.17,22.91,56553100,22.88 -3-Jul-03,21.97,22.31,21.71,21.72,40502400,21.69 -2-Jul-03,21.66,22.32,21.47,22.21,74291504,22.18 -1-Jul-03,20.87,21.50,20.51,21.41,64496600,21.38 -30-Jun-03,21.14,21.30,20.59,20.81,51457500,20.78 -27-Jun-03,20.70,21.13,20.53,20.57,63348200,20.54 -26-Jun-03,20.30,20.76,20.15,20.63,52904900,20.60 -25-Jun-03,20.53,20.83,19.99,20.04,61250600,20.01 -24-Jun-03,20.11,20.74,20.04,20.45,63799700,20.42 -23-Jun-03,20.70,20.97,20.05,20.36,59628100,20.33 -20-Jun-03,21.34,21.42,20.64,20.67,78909400,20.64 -19-Jun-03,21.66,21.92,21.12,21.12,69563696,21.09 diff --git a/examples/data/lena.jpg b/examples/data/lena.jpg deleted file mode 100644 index dc0704495576e64ae908d225e129782a1d2d4287..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27428 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

wgq^!e(^YVP2qH$ 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

Nq~N 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

    Need help?

    and join the matplotlib mailing lists. The search tool searches all of -the documentation, including full text search of almost 300 complete +the documentation, including full text search of over 350 complete examples which exercise almost every corner of matplotlib.

    You can file bugs, patches and feature requests on the diff --git a/doc/users/annotations.rst b/doc/users/annotations.rst index 6d4c2cb73b17..976732f8fa46 100644 --- a/doc/users/annotations.rst +++ b/doc/users/annotations.rst @@ -78,6 +78,4 @@ keyword args like ``horizontalalignment``, ``verticalalignment`` and .. plot:: pyplots/annotation_polar.py :include-source: -See the `annotations demo -`_ for more -examples. +For more on all the wild and wonderful things you can do with annotations, including fancy arrows, see :ref:`plotting-guide-annotation` and :ref:`pylab_examples-annotation_demo`. diff --git a/doc/users/artists.rst b/doc/users/artists.rst index b49c79a3f384..e194667ad837 100644 --- a/doc/users/artists.rst +++ b/doc/users/artists.rst @@ -19,27 +19,7 @@ the ``Artist`` handles all the high level constructs like representing and laying out the figure, text, and lines. The typical user will spend 95% of his time working with the ``Artists``. -There are two types of ``Artists``: primitives and containers. The -primitives represent the standard graphical objects we want to paint -onto our canvas: :class:`~matplotlib.lines.Line2D`, -:class:`~matplotlib.patches.Rectangle`, -:class:`~matplotlib.text.Text`, :class:`~matplotlib.image.AxesImage`, -etc., and the containers are places to put them -(:class:`~matplotlib.axis.Axis`, :class:`~matplotlib.axes.Axes` and -:class:`~matplotlib.figure.Figure`). The standard use is to create a -:class:`~matplotlib.figure.Figure` instance, use the ``Figure`` to -create one or more :class:`~matplotlib.axes.Axes` or -:class:`~matplotlib.axes.Subplot` instances, and use the ``Axes`` -instance helper methods to create the primitives. In the example -below, we create a ``Figure`` instance using -:func:`matplotlib.pyplot.figure`, which is a convenience method for -instantiating ``Figure`` instances and connecting them with your user -interface or drawing toolkit ``FigureCanvas``. As we will discuss -below, this is not necessary, and you can work directly with -PostScript, PDF Gtk+, or wxPython ``FigureCanvas`` instances. For -example, instantiate your ``Figures`` directly and connect them -yourselves, but since we are focusing here on the ``Artist`` API we'll let -:mod:`~matplotlib.pyplot` handle some of those details for us:: +There are two types of ``Artists``: primitives and containers. The primitives represent the standard graphical objects we want to paint onto our canvas: :class:`~matplotlib.lines.Line2D`, :class:`~matplotlib.patches.Rectangle`, :class:`~matplotlib.text.Text`, :class:`~matplotlib.image.AxesImage`, etc., and the containers are places to put them (:class:`~matplotlib.axis.Axis`, :class:`~matplotlib.axes.Axes` and :class:`~matplotlib.figure.Figure`). The standard use is to create a :class:`~matplotlib.figure.Figure` instance, use the ``Figure`` to create one or more :class:`~matplotlib.axes.Axes` or :class:`~matplotlib.axes.Subplot` instances, and use the ``Axes`` instance helper methods to create the primitives. In the example below, we create a ``Figure`` instance using :func:`matplotlib.pyplot.figure`, which is a convenience method for instantiating ``Figure`` instances and connecting them with your user interface or drawing toolkit ``FigureCanvas``. As we will discuss below, this is not necessary -- you can work directly with PostScript, PDF Gtk+, or wxPython ``FigureCanvas`` instances, instantiate your ``Figures`` directly and connect them yourselves -- but since we are focusing here on the ``Artist`` API we'll let :mod:`~matplotlib.pyplot` handle some of those details for us:: import matplotlib.pyplot as plt fig = plt.figure() @@ -85,7 +65,7 @@ subclass of ``Axes``) and when you call ``ax.plot``, it creates a ` list. In the interactive `ipython `_ session below, you can see that the ``Axes.lines`` list is length one and contains the same line that was -returned by the ``line, = ax.plot(x, y, 'o')`` call: +returned by the ``line, = ax.plot...`` call: .. sourcecode:: ipython @@ -536,20 +516,7 @@ and zooming, as well as the :class:`~matplotlib.ticker.Locator` and :class:`~matplotlib.ticker.Formatter` instances which control where the ticks are placed and how they are represented as strings. -Each ``Axis`` object contains a :attr:`~matplotlib.axis.Axis.label` -attribute (this is what the :mod:`~matplotlib.pylab` calls to -:func:`~matplotlib.pylab.xlabel` and :func:`~matplotlib.pylab.ylabel` -set) as well as a list of major and minor ticks. The ticks are -:class:`~matplotlib.axis.XTick` and :class:`~matplotlib.axis.YTick` -instances, which contain the actual line and text primitives that -render the ticks and ticklabels. Because the ticks are dynamically -created as needed (eg. when panning and zooming), you should access -the lists of major and minor ticks through their accessor methods -:meth:`~matplotlib.axis.Axis.get_major_ticks` and -:meth:`~matplotlib.axis.Axis.get_minor_ticks`. Although the ticks -contain all the primitives and will be covered below, the ``Axis`` methods -contain accessor methods to return the tick lines, tick labels, tick -locations etc.: +Each ``Axis`` object contains a :attr:`~matplotlib.axis.Axis.label` attribute (this is what :mod:`~matplotlib.pylab` modifies in calls to :func:`~matplotlib.pylab.xlabel` and :func:`~matplotlib.pylab.ylabel`) as well as a list of major and minor ticks. The ticks are :class:`~matplotlib.axis.XTick` and :class:`~matplotlib.axis.YTick` instances, which contain the actual line and text primitives that render the ticks and ticklabels. Because the ticks are dynamically created as needed (eg. when panning and zooming), you should access the lists of major and minor ticks through their accessor methods :meth:`~matplotlib.axis.Axis.get_major_ticks` and :meth:`~matplotlib.axis.Axis.get_minor_ticks`. Although the ticks contain all the primitives and will be covered below, the ``Axis`` methods contain accessor methods to return the tick lines, tick labels, tick locations etc.: .. sourcecode:: ipython @@ -636,7 +603,7 @@ label1On boolean which determines whether to draw tick label label2On boolean which determines whether to draw tick label ============== ========================================================== -Here is an example which sets the formatter for the upper ticks with +Here is an example which sets the formatter for the right side ticks with dollar signs and colors them green on the right side of the yaxis .. plot:: pyplots/dollar_ticks.py diff --git a/doc/users/credits.rst b/doc/users/credits.rst index f2eb75896235..107192201ec0 100644 --- a/doc/users/credits.rst +++ b/doc/users/credits.rst @@ -16,9 +16,9 @@ Special thanks to those who have made valuable contributions Jeremy O'Donoghue wrote the wx backend -Andrew Straw - provided much of the log scaling architecture, the fill command, PIL - support for imshow, and provided many examples +Andrew Straw provided much of the log scaling architecture, the fill + command, PIL support for imshow, and provided many examples. He + also wrote the support for dropped axis spines. Charles Twardy provided the impetus code for the legend class and has made @@ -28,7 +28,6 @@ Gary Ruben made many enhancements to errorbar to support x and y errorbar plots, and added a number of new marker types to plot. - John Gill wrote the table class and examples, helped with support for auto-legend placement, and added support for legending scatter @@ -133,7 +132,7 @@ Eric Firing most aspects of matplotlib. Daishi Harada - added support for "Dashed Text". See ` dashpointlabel.py + added support for "Dashed Text". See `dashpointlabel.py `_ and :class:`~matplotlib.text.TextWithDash`. @@ -147,11 +146,10 @@ The `brainvisa `_ Orsay team and Fernando Perez Charlie Moad - contributed work to matplotlib's Cocoa support and does the binary - builds and releases. + contributed work to matplotlib's Cocoa support and has done a lot of work on the OSX and win32 binary releases. -Jouni K. Seppaenen - wrote the PDF backend. +Jouni K. Seppaenen wrote the PDF backend and contributed numerous + fixes to the code, to tex support and to the get_sample_data handler Paul Kienzle improved the picking infrastruture for interactive plots, and with @@ -171,4 +169,7 @@ John Porter, Jonathon Taylor and Reinier Heeres matplotlib, and Jonathon Taylor and Reinier Heeres ported it to the refactored transform trunk. - +Jae-Joon Lee implemented fancy arrows and boxes, rewrote the legend + support to handle multiple columns and fancy text boxes, wrote the + axes grid toolkit, and has made numerous contributions to the code + and documentation \ No newline at end of file diff --git a/doc/users/event_handling.rst b/doc/users/event_handling.rst index 1ef07ae5485f..136d261a1e33 100644 --- a/doc/users/event_handling.rst +++ b/doc/users/event_handling.rst @@ -1,555 +1,555 @@ -.. _event-handling-tutorial: - -************************** -Event handling and picking -************************** - -matplotlib works with 5 user interface toolkits (wxpython, tkinter, -qt, gtk and fltk) and in order to support features like interactive -panning and zooming of figures, it is helpful to the developers to -have an API for interacting with the figure via key presses and mouse -movements that is "GUI neutral" so we don't have to repeat a lot of -code across the different user interfaces. Although the event -handling API is GUI neutral, it is based on the GTK model, which was -the first user interface matplotlib supported. The events that are -triggered are also a bit richer vis-a-vis matplotlib than standard GUI -events, including information like which :class:`matplotlib.axes.Axes` -the event occurred in. The events also understand the matplotlib -coordinate system, and report event locations in both pixel and data -coordinates. - -.. _event-connections: - -Event connections -================= - -To receive events, you need to write a callback function and then -connect your function to the event manager, which is part of the -:class:`~matplotlib.backend_bases.FigureCanvasBase`. Here is a simple -example that prints the location of the mouse click and which button -was pressed:: - - fig = plt.figure() - ax = fig.add_subplot(111) - ax.plot(np.random.rand(10)) - - def onclick(event): - print 'button=%d, x=%d, y=%d, xdata=%f, ydata=%f'%( - event.button, event.x, event.y, event.xdata, event.ydata) - - cid = fig.canvas.mpl_connect('button_press_event', onclick) - -The ``FigureCanvas`` method -:meth:`~matplotlib.backend_bases.FigureCanvasBase.mpl_connect` returns -a connection id which is simply an integer. When you want to -disconnect the callback, just call:: - - fig.canvas.mpl_disconnect(cid) - -Here are the events that you can connect to, the class instances that -are sent back to you when the event occurs, and the event descriptions - - -======================= ====================================================================================== -Event name Class and description -======================= ====================================================================================== -'button_press_event' :class:`~matplotlib.backend_bases.MouseEvent` - mouse button is pressed -'button_release_event' :class:`~matplotlib.backend_bases.MouseEvent` - mouse button is released -'draw_event' :class:`~matplotlib.backend_bases.DrawEvent` - canvas draw -'key_press_event' :class:`~matplotlib.backend_bases.KeyEvent` - key is pressed -'key_release_event' :class:`~matplotlib.backend_bases.KeyEvent` - key is released -'motion_notify_event' :class:`~matplotlib.backend_bases.MouseEvent` - mouse motion -'pick_event' :class:`~matplotlib.backend_bases.PickEvent` - an object in the canvas is selected -'resize_event' :class:`~matplotlib.backend_bases.ResizeEvent` - figure canvas is resized -'scroll_event' :class:`~matplotlib.backend_bases.MouseEvent` - mouse scroll wheel is rolled -'figure_enter_event' :class:`~matplotlib.backend_bases.LocationEvent` - mouse enters a new figure -'figure_leave_event' :class:`~matplotlib.backend_bases.LocationEvent` - mouse leaves a figure -'axes_enter_event' :class:`~matplotlib.backend_bases.LocationEvent` - mouse enters a new axes -'axes_leave_event' :class:`~matplotlib.backend_bases.LocationEvent` - mouse leaves an axes -======================= ====================================================================================== - -.. _event-attributes: - -Event attributes -================ - -All matplotlib events inherit from the base class -:class:`matplotlib.backend_bases.Event`, which store the attributes: - - ``name`` - the event name - - ``canvas`` - the FigureCanvas instance generating the event - - ``guiEvent`` - the GUI event that triggered the matplotlib event - - -The most common events that are the bread and butter of event handling -are key press/release events and mouse press/release and movement -events. The :class:`~matplotlib.backend_bases.KeyEvent` and -:class:`~matplotlib.backend_bases.MouseEvent` classes that handle -these events are both derived from the LocationEvent, which has the -following attributes - - ``x`` - x position - pixels from left of canvas - - ``y`` - y position - pixels from bottom of canvas - - ``inaxes`` - the :class:`~matplotlib.axes.Axes` instance if mouse is over axes - - ``xdata`` - x coord of mouse in data coords - - ``ydata`` - y coord of mouse in data coords - -Let's look a simple example of a canvas, where a simple line segment -is created every time a mouse is pressed:: - - class LineBuilder: - def __init__(self, line): - self.line = line - self.xs = list(line.get_xdata()) - self.ys = list(line.get_ydata()) - self.cid = line.figure.canvas.mpl_connect('button_press_event', self) - - def __call__(self, event): - print 'click', event - if event.inaxes!=self.line.axes: return - self.xs.append(event.xdata) - self.ys.append(event.ydata) - self.line.set_data(self.xs, self.ys) - self.line.figure.canvas.draw() - - fig = plt.figure() - ax = fig.add_subplot(111) - ax.set_title('click to build line segments') - line, = ax.plot([0], [0]) # empty line - linebuilder = LineBuilder(line) - - - -The :class:`~matplotlib.backend_bases.MouseEvent` that we just used is a -:class:`~matplotlib.backend_bases.LocationEvent`, so we have access to -the data and pixel coordinates in event.x and event.xdata. In -addition to the ``LocationEvent`` attributes, it has - - ``button`` - button pressed None, 1, 2, 3, 'up', 'down' (up and down are used for scroll events) - - ``key`` - the key pressed: None, chr(range(255), 'shift', 'win', or 'control' - -Draggable rectangle exercise ----------------------------- - -Write draggable rectangle class that is initialized with a -:class:`~matplotlib.patches.Rectangle` instance but will move its x,y -location when dragged. Hint: you will need to store the orginal -``xy`` location of the rectangle which is stored as rect.xy and -connect to the press, motion and release mouse events. When the mouse -is pressed, check to see if the click occurs over your rectangle (see -:meth:`matplotlib.patches.Rectangle.contains`) and if it does, store -the rectangle xy and the location of the mouse click in data coords. -In the motion event callback, compute the deltax and deltay of the -mouse movement, and add those deltas to the origin of the rectangle -you stored. The redraw the figure. On the button release event, just -reset all the button press data you stored as None. - -Here is the solution:: - - import numpy as np - import matplotlib.pyplot as plt - - class DraggableRectangle: - def __init__(self, rect): - self.rect = rect - self.press = None - - def connect(self): - 'connect to all the events we need' - self.cidpress = self.rect.figure.canvas.mpl_connect( - 'button_press_event', self.on_press) - self.cidrelease = self.rect.figure.canvas.mpl_connect( - 'button_release_event', self.on_release) - self.cidmotion = self.rect.figure.canvas.mpl_connect( - 'motion_notify_event', self.on_motion) - - def on_press(self, event): - 'on button press we will see if the mouse is over us and store some data' - if event.inaxes != self.rect.axes: return - - contains, attrd = self.rect.contains(event) - if not contains: return - print 'event contains', self.rect.xy - x0, y0 = self.rect.xy - self.press = x0, y0, event.xdata, event.ydata - - def on_motion(self, event): - 'on motion we will move the rect if the mouse is over us' - if self.press is None: return - if event.inaxes != self.rect.axes: return - x0, y0, xpress, ypress = self.press - dx = event.xdata - xpress - dy = event.ydata - ypress - #print 'x0=%f, xpress=%f, event.xdata=%f, dx=%f, x0+dx=%f'%(x0, xpress, event.xdata, dx, x0+dx) - self.rect.set_x(x0+dx) - self.rect.set_y(y0+dy) - - self.rect.figure.canvas.draw() - - - def on_release(self, event): - 'on release we reset the press data' - self.press = None - self.rect.figure.canvas.draw() - - def disconnect(self): - 'disconnect all the stored connection ids' - self.rect.figure.canvas.mpl_disconnect(self.cidpress) - self.rect.figure.canvas.mpl_disconnect(self.cidrelease) - self.rect.figure.canvas.mpl_disconnect(self.cidmotion) - - fig = plt.figure() - ax = fig.add_subplot(111) - rects = ax.bar(range(10), 20*np.random.rand(10)) - drs = [] - for rect in rects: - dr = DraggableRectangle(rect) - dr.connect() - drs.append(dr) - - plt.show() - - -**Extra credit**: use the animation blit techniques discussed in the -`animations recipe -`_ to make the -animated drawing faster and smoother. - -Extra credit solution:: - - # draggable rectangle with the animation blit techniques; see - # http://www.scipy.org/Cookbook/Matplotlib/Animations - import numpy as np - import matplotlib.pyplot as plt - - class DraggableRectangle: - lock = None # only one can be animated at a time - def __init__(self, rect): - self.rect = rect - self.press = None - self.background = None - - def connect(self): - 'connect to all the events we need' - self.cidpress = self.rect.figure.canvas.mpl_connect( - 'button_press_event', self.on_press) - self.cidrelease = self.rect.figure.canvas.mpl_connect( - 'button_release_event', self.on_release) - self.cidmotion = self.rect.figure.canvas.mpl_connect( - 'motion_notify_event', self.on_motion) - - def on_press(self, event): - 'on button press we will see if the mouse is over us and store some data' - if event.inaxes != self.rect.axes: return - if DraggableRectangle.lock is not None: return - contains, attrd = self.rect.contains(event) - if not contains: return - print 'event contains', self.rect.xy - x0, y0 = self.rect.xy - self.press = x0, y0, event.xdata, event.ydata - DraggableRectangle.lock = self - - # draw everything but the selected rectangle and store the pixel buffer - canvas = self.rect.figure.canvas - axes = self.rect.axes - self.rect.set_animated(True) - canvas.draw() - self.background = canvas.copy_from_bbox(self.rect.axes.bbox) - - # now redraw just the rectangle - axes.draw_artist(self.rect) - - # and blit just the redrawn area - canvas.blit(axes.bbox) - - def on_motion(self, event): - 'on motion we will move the rect if the mouse is over us' - if DraggableRectangle.lock is not self: - return - if event.inaxes != self.rect.axes: return - x0, y0, xpress, ypress = self.press - dx = event.xdata - xpress - dy = event.ydata - ypress - self.rect.set_x(x0+dx) - self.rect.set_y(y0+dy) - - canvas = self.rect.figure.canvas - axes = self.rect.axes - # restore the background region - canvas.restore_region(self.background) - - # redraw just the current rectangle - axes.draw_artist(self.rect) - - # blit just the redrawn area - canvas.blit(axes.bbox) - - def on_release(self, event): - 'on release we reset the press data' - if DraggableRectangle.lock is not self: - return - - self.press = None - DraggableRectangle.lock = None - - # turn off the rect animation property and reset the background - self.rect.set_animated(False) - self.background = None - - # redraw the full figure - self.rect.figure.canvas.draw() - - def disconnect(self): - 'disconnect all the stored connection ids' - self.rect.figure.canvas.mpl_disconnect(self.cidpress) - self.rect.figure.canvas.mpl_disconnect(self.cidrelease) - self.rect.figure.canvas.mpl_disconnect(self.cidmotion) - - fig = plt.figure() - ax = fig.add_subplot(111) - rects = ax.bar(range(10), 20*np.random.rand(10)) - drs = [] - for rect in rects: - dr = DraggableRectangle(rect) - dr.connect() - drs.append(dr) - - plt.show() - - -.. _enter-leave-events: - -Mouse enter and leave -====================== - -If you want to be notified when the mouse enters or leaves a figure or -axes, you can connect to the figure/axes enter/leave events. Here is -a simple example that changes the colors of the axes and figure -background that the mouse is over:: - - """ - Illustrate the figure and axes enter and leave events by changing the - frame colors on enter and leave - """ - import matplotlib.pyplot as plt - - def enter_axes(event): - print 'enter_axes', event.inaxes - event.inaxes.patch.set_facecolor('yellow') - event.canvas.draw() - - def leave_axes(event): - print 'leave_axes', event.inaxes - event.inaxes.patch.set_facecolor('white') - event.canvas.draw() - - def enter_figure(event): - print 'enter_figure', event.canvas.figure - event.canvas.figure.patch.set_facecolor('red') - event.canvas.draw() - - def leave_figure(event): - print 'leave_figure', event.canvas.figure - event.canvas.figure.patch.set_facecolor('grey') - event.canvas.draw() - - fig1 = plt.figure() - fig1.suptitle('mouse hover over figure or axes to trigger events') - ax1 = fig1.add_subplot(211) - ax2 = fig1.add_subplot(212) - - fig1.canvas.mpl_connect('figure_enter_event', enter_figure) - fig1.canvas.mpl_connect('figure_leave_event', leave_figure) - fig1.canvas.mpl_connect('axes_enter_event', enter_axes) - fig1.canvas.mpl_connect('axes_leave_event', leave_axes) - - fig2 = plt.figure() - fig2.suptitle('mouse hover over figure or axes to trigger events') - ax1 = fig2.add_subplot(211) - ax2 = fig2.add_subplot(212) - - fig2.canvas.mpl_connect('figure_enter_event', enter_figure) - fig2.canvas.mpl_connect('figure_leave_event', leave_figure) - fig2.canvas.mpl_connect('axes_enter_event', enter_axes) - fig2.canvas.mpl_connect('axes_leave_event', leave_axes) - - plt.show() - - - -.. _object-picking: - -Object picking -============== - -You can enable picking by setting the ``picker`` property of an -:class:`~matplotlib.artist.Artist` (eg a matplotlib -:class:`~matplotlib.lines.Line2D`, :class:`~matplotlib.text.Text`, -:class:`~matplotlib.patches.Patch`, :class:`~matplotlib.patches.Polygon`, -:class:`~matplotlib.patches.AxesImage`, etc...) - -There are a variety of meanings of the ``picker`` property: - - ``None`` - picking is disabled for this artist (default) - - ``boolean`` - if True then picking will be enabled and the artist will fire a - pick event if the mouse event is over the artist - - ``float`` - if picker is a number it is interpreted as an epsilon tolerance in - points and the the artist will fire off an event if its data is - within epsilon of the mouse event. For some artists like lines - and patch collections, the artist may provide additional data to - the pick event that is generated, eg the indices of the data - within epsilon of the pick event. - - ``function`` - if picker is callable, it is a user supplied function which - determines whether the artist is hit by the mouse event. The - signature is ``hit, props = picker(artist, mouseevent)`` to - determine the hit test. If the mouse event is over the artist, - return ``hit=True`` and props is a dictionary of properties you - want added to the :class:`~matplotlib.backend_bases.PickEvent` - attributes - - -After you have enabled an artist for picking by setting the ``picker`` -property, you need to connect to the figure canvas pick_event to get -pick callbacks on mouse press events. Eg:: - - def pick_handler(event): - mouseevent = event.mouseevent - artist = event.artist - # now do something with this... - - -The :class:`~matplotlib.backend_bases.PickEvent` which is passed to -your callback is always fired with two attributes: - - ``mouseevent`` the mouse event that generate the pick event. The - mouse event in turn has attributes like ``x`` and ``y`` (the - coords in display space, eg pixels from left, bottom) and xdata, - ydata (the coords in data space). Additionally, you can get - information about which buttons were pressed, which keys were - pressed, which :class:`~matplotlib.axes.Axes` the mouse is over, - etc. See :class:`matplotlib.backend_bases.MouseEvent` for - details. - - ``artist`` - the :class:`~matplotlib.artist.Artist` that generated the pick - event. - -Additionally, certain artists like :class:`~matplotlib.lines.Line2D` -and :class:`~matplotlib.collections.PatchCollection` may attach -additional meta data like the indices into the data that meet the -picker criteria (eg all the points in the line that are within the -specified epsilon tolerance) - -Simple picking example ----------------------- - -In the example below, we set the line picker property to a scalar, so -it represents a tolerance in points (72 points per inch). The onpick -callback function will be called when the pick event it within the -tolerance distance from the line, and has the indices of the data -vertices that are within the pick distance tolerance. Our onpick -callback function simply prints the data that are under the pick -location. Different matplotlib Artists can attach different data to -the PickEvent. For example, ``Line2D`` attaches the ind property, -which are the indices into the line data under the pick point. See -:meth:`~matplotlib.lines.Line2D.pick` for details on the ``PickEvent`` -properties of the line. Here is the code:: - - import numpy as np - import matplotlib.pyplot as plt - - fig = plt.figure() - ax = fig.add_subplot(111) - ax.set_title('click on points') - - line, = ax.plot(np.random.rand(100), 'o', picker=5) # 5 points tolerance - - def onpick(event): - thisline = event.artist - xdata = thisline.get_xdata() - ydata = thisline.get_ydata() - ind = event.ind - print 'onpick points:', zip(xdata[ind], ydata[ind]) - - fig.canvas.mpl_connect('pick_event', onpick) - - plt.show() - - -Picking exercise ----------------- - -Create a data set of 100 arrays of 1000 Gaussian random numbers and -compute the sample mean and standard deviation of each of them (hint: -numpy arrays have a mean and std method) and make a xy marker plot of -the 100 means vs the 100 standard deviations. Connect the line -created by the plot command to the pick event, and plot the original -time series of the data that generated the clicked on points. If more -than one point is within the tolerance of the clicked on point, you -can use multiple subplots to plot the multiple time series. - -Exercise solution:: - - """ - compute the mean and stddev of 100 data sets and plot mean vs stddev. - When you click on one of the mu, sigma points, plot the raw data from - the dataset that generated the mean and stddev - """ - import numpy as np - import matplotlib.pyplot as plt - - X = np.random.rand(100, 1000) - xs = np.mean(X, axis=1) - ys = np.std(X, axis=1) - - fig = plt.figure() - ax = fig.add_subplot(111) - ax.set_title('click on point to plot time series') - line, = ax.plot(xs, ys, 'o', picker=5) # 5 points tolerance - - - def onpick(event): - - if event.artist!=line: return True - - N = len(event.ind) - if not N: return True - - - figi = plt.figure() - for subplotnum, dataind in enumerate(event.ind): - ax = figi.add_subplot(N,1,subplotnum+1) - ax.plot(X[dataind]) - ax.text(0.05, 0.9, 'mu=%1.3f\nsigma=%1.3f'%(xs[dataind], ys[dataind]), - transform=ax.transAxes, va='top') - ax.set_ylim(-0.5, 1.5) - figi.show() - return True - - fig.canvas.mpl_connect('pick_event', onpick) - +.. _event-handling-tutorial: + +************************** +Event handling and picking +************************** + +matplotlib works with 6 user interface toolkits (wxpython, tkinter, +qt, gtk, fltk abd macosx) and in order to support features like interactive +panning and zooming of figures, it is helpful to the developers to +have an API for interacting with the figure via key presses and mouse +movements that is "GUI neutral" so we don't have to repeat a lot of +code across the different user interfaces. Although the event +handling API is GUI neutral, it is based on the GTK model, which was +the first user interface matplotlib supported. The events that are +triggered are also a bit richer vis-a-vis matplotlib than standard GUI +events, including information like which :class:`matplotlib.axes.Axes` +the event occurred in. The events also understand the matplotlib +coordinate system, and report event locations in both pixel and data +coordinates. + +.. _event-connections: + +Event connections +================= + +To receive events, you need to write a callback function and then +connect your function to the event manager, which is part of the +:class:`~matplotlib.backend_bases.FigureCanvasBase`. Here is a simple +example that prints the location of the mouse click and which button +was pressed:: + + fig = plt.figure() + ax = fig.add_subplot(111) + ax.plot(np.random.rand(10)) + + def onclick(event): + print 'button=%d, x=%d, y=%d, xdata=%f, ydata=%f'%( + event.button, event.x, event.y, event.xdata, event.ydata) + + cid = fig.canvas.mpl_connect('button_press_event', onclick) + +The ``FigureCanvas`` method +:meth:`~matplotlib.backend_bases.FigureCanvasBase.mpl_connect` returns +a connection id which is simply an integer. When you want to +disconnect the callback, just call:: + + fig.canvas.mpl_disconnect(cid) + +Here are the events that you can connect to, the class instances that +are sent back to you when the event occurs, and the event descriptions + + +======================= ====================================================================================== +Event name Class and description +======================= ====================================================================================== +'button_press_event' :class:`~matplotlib.backend_bases.MouseEvent` - mouse button is pressed +'button_release_event' :class:`~matplotlib.backend_bases.MouseEvent` - mouse button is released +'draw_event' :class:`~matplotlib.backend_bases.DrawEvent` - canvas draw +'key_press_event' :class:`~matplotlib.backend_bases.KeyEvent` - key is pressed +'key_release_event' :class:`~matplotlib.backend_bases.KeyEvent` - key is released +'motion_notify_event' :class:`~matplotlib.backend_bases.MouseEvent` - mouse motion +'pick_event' :class:`~matplotlib.backend_bases.PickEvent` - an object in the canvas is selected +'resize_event' :class:`~matplotlib.backend_bases.ResizeEvent` - figure canvas is resized +'scroll_event' :class:`~matplotlib.backend_bases.MouseEvent` - mouse scroll wheel is rolled +'figure_enter_event' :class:`~matplotlib.backend_bases.LocationEvent` - mouse enters a new figure +'figure_leave_event' :class:`~matplotlib.backend_bases.LocationEvent` - mouse leaves a figure +'axes_enter_event' :class:`~matplotlib.backend_bases.LocationEvent` - mouse enters a new axes +'axes_leave_event' :class:`~matplotlib.backend_bases.LocationEvent` - mouse leaves an axes +======================= ====================================================================================== + +.. _event-attributes: + +Event attributes +================ + +All matplotlib events inherit from the base class +:class:`matplotlib.backend_bases.Event`, which store the attributes: + + ``name`` + the event name + + ``canvas`` + the FigureCanvas instance generating the event + + ``guiEvent`` + the GUI event that triggered the matplotlib event + + +The most common events that are the bread and butter of event handling +are key press/release events and mouse press/release and movement +events. The :class:`~matplotlib.backend_bases.KeyEvent` and +:class:`~matplotlib.backend_bases.MouseEvent` classes that handle +these events are both derived from the LocationEvent, which has the +following attributes + + ``x`` + x position - pixels from left of canvas + + ``y`` + y position - pixels from bottom of canvas + + ``inaxes`` + the :class:`~matplotlib.axes.Axes` instance if mouse is over axes + + ``xdata`` + x coord of mouse in data coords + + ``ydata`` + y coord of mouse in data coords + +Let's look a simple example of a canvas, where a simple line segment +is created every time a mouse is pressed:: + + class LineBuilder: + def __init__(self, line): + self.line = line + self.xs = list(line.get_xdata()) + self.ys = list(line.get_ydata()) + self.cid = line.figure.canvas.mpl_connect('button_press_event', self) + + def __call__(self, event): + print 'click', event + if event.inaxes!=self.line.axes: return + self.xs.append(event.xdata) + self.ys.append(event.ydata) + self.line.set_data(self.xs, self.ys) + self.line.figure.canvas.draw() + + fig = plt.figure() + ax = fig.add_subplot(111) + ax.set_title('click to build line segments') + line, = ax.plot([0], [0]) # empty line + linebuilder = LineBuilder(line) + + + +The :class:`~matplotlib.backend_bases.MouseEvent` that we just used is a +:class:`~matplotlib.backend_bases.LocationEvent`, so we have access to +the data and pixel coordinates in event.x and event.xdata. In +addition to the ``LocationEvent`` attributes, it has + + ``button`` + button pressed None, 1, 2, 3, 'up', 'down' (up and down are used for scroll events) + + ``key`` + the key pressed: None, any character, 'shift', 'win', or 'control' + +Draggable rectangle exercise +---------------------------- + +Write draggable rectangle class that is initialized with a +:class:`~matplotlib.patches.Rectangle` instance but will move its x,y +location when dragged. Hint: you will need to store the orginal +``xy`` location of the rectangle which is stored as rect.xy and +connect to the press, motion and release mouse events. When the mouse +is pressed, check to see if the click occurs over your rectangle (see +:meth:`matplotlib.patches.Rectangle.contains`) and if it does, store +the rectangle xy and the location of the mouse click in data coords. +In the motion event callback, compute the deltax and deltay of the +mouse movement, and add those deltas to the origin of the rectangle +you stored. The redraw the figure. On the button release event, just +reset all the button press data you stored as None. + +Here is the solution:: + + import numpy as np + import matplotlib.pyplot as plt + + class DraggableRectangle: + def __init__(self, rect): + self.rect = rect + self.press = None + + def connect(self): + 'connect to all the events we need' + self.cidpress = self.rect.figure.canvas.mpl_connect( + 'button_press_event', self.on_press) + self.cidrelease = self.rect.figure.canvas.mpl_connect( + 'button_release_event', self.on_release) + self.cidmotion = self.rect.figure.canvas.mpl_connect( + 'motion_notify_event', self.on_motion) + + def on_press(self, event): + 'on button press we will see if the mouse is over us and store some data' + if event.inaxes != self.rect.axes: return + + contains, attrd = self.rect.contains(event) + if not contains: return + print 'event contains', self.rect.xy + x0, y0 = self.rect.xy + self.press = x0, y0, event.xdata, event.ydata + + def on_motion(self, event): + 'on motion we will move the rect if the mouse is over us' + if self.press is None: return + if event.inaxes != self.rect.axes: return + x0, y0, xpress, ypress = self.press + dx = event.xdata - xpress + dy = event.ydata - ypress + #print 'x0=%f, xpress=%f, event.xdata=%f, dx=%f, x0+dx=%f'%(x0, xpress, event.xdata, dx, x0+dx) + self.rect.set_x(x0+dx) + self.rect.set_y(y0+dy) + + self.rect.figure.canvas.draw() + + + def on_release(self, event): + 'on release we reset the press data' + self.press = None + self.rect.figure.canvas.draw() + + def disconnect(self): + 'disconnect all the stored connection ids' + self.rect.figure.canvas.mpl_disconnect(self.cidpress) + self.rect.figure.canvas.mpl_disconnect(self.cidrelease) + self.rect.figure.canvas.mpl_disconnect(self.cidmotion) + + fig = plt.figure() + ax = fig.add_subplot(111) + rects = ax.bar(range(10), 20*np.random.rand(10)) + drs = [] + for rect in rects: + dr = DraggableRectangle(rect) + dr.connect() + drs.append(dr) + + plt.show() + + +**Extra credit**: use the animation blit techniques discussed in the +`animations recipe +`_ to make the +animated drawing faster and smoother. + +Extra credit solution:: + + # draggable rectangle with the animation blit techniques; see + # http://www.scipy.org/Cookbook/Matplotlib/Animations + import numpy as np + import matplotlib.pyplot as plt + + class DraggableRectangle: + lock = None # only one can be animated at a time + def __init__(self, rect): + self.rect = rect + self.press = None + self.background = None + + def connect(self): + 'connect to all the events we need' + self.cidpress = self.rect.figure.canvas.mpl_connect( + 'button_press_event', self.on_press) + self.cidrelease = self.rect.figure.canvas.mpl_connect( + 'button_release_event', self.on_release) + self.cidmotion = self.rect.figure.canvas.mpl_connect( + 'motion_notify_event', self.on_motion) + + def on_press(self, event): + 'on button press we will see if the mouse is over us and store some data' + if event.inaxes != self.rect.axes: return + if DraggableRectangle.lock is not None: return + contains, attrd = self.rect.contains(event) + if not contains: return + print 'event contains', self.rect.xy + x0, y0 = self.rect.xy + self.press = x0, y0, event.xdata, event.ydata + DraggableRectangle.lock = self + + # draw everything but the selected rectangle and store the pixel buffer + canvas = self.rect.figure.canvas + axes = self.rect.axes + self.rect.set_animated(True) + canvas.draw() + self.background = canvas.copy_from_bbox(self.rect.axes.bbox) + + # now redraw just the rectangle + axes.draw_artist(self.rect) + + # and blit just the redrawn area + canvas.blit(axes.bbox) + + def on_motion(self, event): + 'on motion we will move the rect if the mouse is over us' + if DraggableRectangle.lock is not self: + return + if event.inaxes != self.rect.axes: return + x0, y0, xpress, ypress = self.press + dx = event.xdata - xpress + dy = event.ydata - ypress + self.rect.set_x(x0+dx) + self.rect.set_y(y0+dy) + + canvas = self.rect.figure.canvas + axes = self.rect.axes + # restore the background region + canvas.restore_region(self.background) + + # redraw just the current rectangle + axes.draw_artist(self.rect) + + # blit just the redrawn area + canvas.blit(axes.bbox) + + def on_release(self, event): + 'on release we reset the press data' + if DraggableRectangle.lock is not self: + return + + self.press = None + DraggableRectangle.lock = None + + # turn off the rect animation property and reset the background + self.rect.set_animated(False) + self.background = None + + # redraw the full figure + self.rect.figure.canvas.draw() + + def disconnect(self): + 'disconnect all the stored connection ids' + self.rect.figure.canvas.mpl_disconnect(self.cidpress) + self.rect.figure.canvas.mpl_disconnect(self.cidrelease) + self.rect.figure.canvas.mpl_disconnect(self.cidmotion) + + fig = plt.figure() + ax = fig.add_subplot(111) + rects = ax.bar(range(10), 20*np.random.rand(10)) + drs = [] + for rect in rects: + dr = DraggableRectangle(rect) + dr.connect() + drs.append(dr) + + plt.show() + + +.. _enter-leave-events: + +Mouse enter and leave +====================== + +If you want to be notified when the mouse enters or leaves a figure or +axes, you can connect to the figure/axes enter/leave events. Here is +a simple example that changes the colors of the axes and figure +background that the mouse is over:: + + """ + Illustrate the figure and axes enter and leave events by changing the + frame colors on enter and leave + """ + import matplotlib.pyplot as plt + + def enter_axes(event): + print 'enter_axes', event.inaxes + event.inaxes.patch.set_facecolor('yellow') + event.canvas.draw() + + def leave_axes(event): + print 'leave_axes', event.inaxes + event.inaxes.patch.set_facecolor('white') + event.canvas.draw() + + def enter_figure(event): + print 'enter_figure', event.canvas.figure + event.canvas.figure.patch.set_facecolor('red') + event.canvas.draw() + + def leave_figure(event): + print 'leave_figure', event.canvas.figure + event.canvas.figure.patch.set_facecolor('grey') + event.canvas.draw() + + fig1 = plt.figure() + fig1.suptitle('mouse hover over figure or axes to trigger events') + ax1 = fig1.add_subplot(211) + ax2 = fig1.add_subplot(212) + + fig1.canvas.mpl_connect('figure_enter_event', enter_figure) + fig1.canvas.mpl_connect('figure_leave_event', leave_figure) + fig1.canvas.mpl_connect('axes_enter_event', enter_axes) + fig1.canvas.mpl_connect('axes_leave_event', leave_axes) + + fig2 = plt.figure() + fig2.suptitle('mouse hover over figure or axes to trigger events') + ax1 = fig2.add_subplot(211) + ax2 = fig2.add_subplot(212) + + fig2.canvas.mpl_connect('figure_enter_event', enter_figure) + fig2.canvas.mpl_connect('figure_leave_event', leave_figure) + fig2.canvas.mpl_connect('axes_enter_event', enter_axes) + fig2.canvas.mpl_connect('axes_leave_event', leave_axes) + + plt.show() + + + +.. _object-picking: + +Object picking +============== + +You can enable picking by setting the ``picker`` property of an +:class:`~matplotlib.artist.Artist` (eg a matplotlib +:class:`~matplotlib.lines.Line2D`, :class:`~matplotlib.text.Text`, +:class:`~matplotlib.patches.Patch`, :class:`~matplotlib.patches.Polygon`, +:class:`~matplotlib.patches.AxesImage`, etc...) + +There are a variety of meanings of the ``picker`` property: + + ``None`` + picking is disabled for this artist (default) + + ``boolean`` + if True then picking will be enabled and the artist will fire a + pick event if the mouse event is over the artist + + ``float`` + if picker is a number it is interpreted as an epsilon tolerance in + points and the the artist will fire off an event if its data is + within epsilon of the mouse event. For some artists like lines + and patch collections, the artist may provide additional data to + the pick event that is generated, eg the indices of the data + within epsilon of the pick event. + + ``function`` + if picker is callable, it is a user supplied function which + determines whether the artist is hit by the mouse event. The + signature is ``hit, props = picker(artist, mouseevent)`` to + determine the hit test. If the mouse event is over the artist, + return ``hit=True`` and props is a dictionary of properties you + want added to the :class:`~matplotlib.backend_bases.PickEvent` + attributes + + +After you have enabled an artist for picking by setting the ``picker`` +property, you need to connect to the figure canvas pick_event to get +pick callbacks on mouse press events. Eg:: + + def pick_handler(event): + mouseevent = event.mouseevent + artist = event.artist + # now do something with this... + + +The :class:`~matplotlib.backend_bases.PickEvent` which is passed to +your callback is always fired with two attributes: + + ``mouseevent`` the mouse event that generate the pick event. The + mouse event in turn has attributes like ``x`` and ``y`` (the + coords in display space, eg pixels from left, bottom) and xdata, + ydata (the coords in data space). Additionally, you can get + information about which buttons were pressed, which keys were + pressed, which :class:`~matplotlib.axes.Axes` the mouse is over, + etc. See :class:`matplotlib.backend_bases.MouseEvent` for + details. + + ``artist`` + the :class:`~matplotlib.artist.Artist` that generated the pick + event. + +Additionally, certain artists like :class:`~matplotlib.lines.Line2D` +and :class:`~matplotlib.collections.PatchCollection` may attach +additional meta data like the indices into the data that meet the +picker criteria (eg all the points in the line that are within the +specified epsilon tolerance) + +Simple picking example +---------------------- + +In the example below, we set the line picker property to a scalar, so +it represents a tolerance in points (72 points per inch). The onpick +callback function will be called when the pick event it within the +tolerance distance from the line, and has the indices of the data +vertices that are within the pick distance tolerance. Our onpick +callback function simply prints the data that are under the pick +location. Different matplotlib Artists can attach different data to +the PickEvent. For example, ``Line2D`` attaches the ind property, +which are the indices into the line data under the pick point. See +:meth:`~matplotlib.lines.Line2D.pick` for details on the ``PickEvent`` +properties of the line. Here is the code:: + + import numpy as np + import matplotlib.pyplot as plt + + fig = plt.figure() + ax = fig.add_subplot(111) + ax.set_title('click on points') + + line, = ax.plot(np.random.rand(100), 'o', picker=5) # 5 points tolerance + + def onpick(event): + thisline = event.artist + xdata = thisline.get_xdata() + ydata = thisline.get_ydata() + ind = event.ind + print 'onpick points:', zip(xdata[ind], ydata[ind]) + + fig.canvas.mpl_connect('pick_event', onpick) + + plt.show() + + +Picking exercise +---------------- + +Create a data set of 100 arrays of 1000 Gaussian random numbers and +compute the sample mean and standard deviation of each of them (hint: +numpy arrays have a mean and std method) and make a xy marker plot of +the 100 means vs the 100 standard deviations. Connect the line +created by the plot command to the pick event, and plot the original +time series of the data that generated the clicked on points. If more +than one point is within the tolerance of the clicked on point, you +can use multiple subplots to plot the multiple time series. + +Exercise solution:: + + """ + compute the mean and stddev of 100 data sets and plot mean vs stddev. + When you click on one of the mu, sigma points, plot the raw data from + the dataset that generated the mean and stddev + """ + import numpy as np + import matplotlib.pyplot as plt + + X = np.random.rand(100, 1000) + xs = np.mean(X, axis=1) + ys = np.std(X, axis=1) + + fig = plt.figure() + ax = fig.add_subplot(111) + ax.set_title('click on point to plot time series') + line, = ax.plot(xs, ys, 'o', picker=5) # 5 points tolerance + + + def onpick(event): + + if event.artist!=line: return True + + N = len(event.ind) + if not N: return True + + + figi = plt.figure() + for subplotnum, dataind in enumerate(event.ind): + ax = figi.add_subplot(N,1,subplotnum+1) + ax.plot(X[dataind]) + ax.text(0.05, 0.9, 'mu=%1.3f\nsigma=%1.3f'%(xs[dataind], ys[dataind]), + transform=ax.transAxes, va='top') + ax.set_ylim(-0.5, 1.5) + figi.show() + return True + + fig.canvas.mpl_connect('pick_event', onpick) + plt.show() diff --git a/doc/users/pyplot_tutorial.rst b/doc/users/pyplot_tutorial.rst index 8231fee46ee9..defadc8671f5 100644 --- a/doc/users/pyplot_tutorial.rst +++ b/doc/users/pyplot_tutorial.rst @@ -74,7 +74,7 @@ several ways to set line properties one line so it is a list of length 1. I use tuple unpacking in the ``line, = plot(x, y, 'o')`` to get the first element of the list:: - line, = plt.plot(x, y, 'o') + line, = plt.plot(x, y, '-') line.set_antialiased(False) # turn off antialising * Use the :func:`~matplotlib.pyplot.setp` command. The example below @@ -156,7 +156,7 @@ current axes (a :class:`matplotlib.axes.Axes` instance), and :func:`~matplotlib.pyplot.gcf` returns the current figure (:class:`matplotlib.figure.Figure` instance). Normally, you don't have to worry about this, because it is all taken care of behind the -scenes. Below is an script to create two subplots. +scenes. Below is a script to create two subplots. .. plot:: pyplots/pyplot_two_subplots.py :include-source: @@ -165,18 +165,16 @@ The :func:`~matplotlib.pyplot.figure` command here is optional because ``figure(1)`` will be created by default, just as a ``subplot(111)`` will be created by default if you don't manually specify an axes. The :func:`~matplotlib.pyplot.subplot` command specifies ``numrows, -numcols, fignum`` where ``fignum`` ranges from 1 to -``numrows*numcols``. The commas in the ``subplot command are optional + numcols, fignum`` where ``fignum`` ranges from 1 to +``numrows*numcols``. The commas in the ``subplot`` command are optional if ``numrows*numcols<10``. So ``subplot(211)`` is identical to ``subplot(2,1,1)``. You can create an arbitrary number of subplots and axes. If you want to place an axes manually, ie, not on a rectangular grid, use the :func:`~matplotlib.pyplot.axes` command, which allows you to specify the location as ``axes([left, bottom, width, height])`` where all values are in fractional (0 to 1) -coordinates. See `axes_demo.py -`_ for an example of -placing axes manually and `line_styles.py -`_ for an example +coordinates. See :ref:`pylab_examples-axes_demo` for an example of +placing axes manually and :ref:`pylab_examples-line_styles` for an example with lots-o-subplots. @@ -269,6 +267,6 @@ these arguments are ``(x,y)`` tuples. In this basic example, both the ``xy`` (arrow tip) and ``xytext`` locations (text location) are in data coordinates. There are a variety of other coordinate systems one can choose -- see -:ref:`annotations-tutorial` for details. More examples can be found -in the `annotations demo -`_ +:ref:`annotations-tutorial` and :ref:`plotting-guide-annotation` +for details. More examples can be found +in :ref:`pylab_examples-annotation_demo`. diff --git a/doc/users/screenshots.rst b/doc/users/screenshots.rst index c17c38ecc366..811b40a5d265 100644 --- a/doc/users/screenshots.rst +++ b/doc/users/screenshots.rst @@ -45,8 +45,23 @@ the :mod:`matplotlib.path`. .. plot:: mpl_examples/api/path_patch_demo.py +.. _screenshots_mplot3d_surface: + +mplot3d +========= + +The mplot3d toolkit (see :ref:`toolkit_mplot3d-tutorial` and +:ref:`mplot3d-examples-index`) has support for simple 3d graphs +including surface, wireframe, scatter, and bar charts (added in +matlpotlib-0.99). Thanks to John Porter, Jonathon Taylor and Reinier +Heeres for the mplot3d toolkit. The toolkit is included with all +standard matplotlib installs. + +.. plot:: mpl_examples/mplot3d/surface3d_demo.py + .. _screenshots_ellipse_demo: + Ellipses ======== diff --git a/doc/users/whats_new.rst b/doc/users/whats_new.rst index 286eec4deb03..e4d504970490 100644 --- a/doc/users/whats_new.rst +++ b/doc/users/whats_new.rst @@ -18,8 +18,8 @@ mplot3d Reinier Heeres has ported John Porter's mplot3d over to the new matplotlib transformations framework, and it is now available as a -toolkit mpl_toolkits.mplot3d. See the `examples -`_ and +toolkit mpl_toolkits.mplot3d (which now comes standard with all mpl +installs). See :ref:`mplot3d-examples-index` and :ref:`toolkit_mplot3d-tutorial` .. plot:: pyplots/whats_new_99_mplot3d.py @@ -29,10 +29,11 @@ toolkit mpl_toolkits.mplot3d. See the `examples axes grid toolkit ----------------- -Jae Joon has added a new toolkit to ease displaying multiple images in +Jae-Joon Lee has added a new toolkit to ease displaying multiple images in matplotlib, as well as some support for curvilinear grids to support -the world coordinate system. See :ref:`axes_grid_users-guide-index` -and `examples `_ +the world coordinate system. The toolkit is included standard with all +new mpl installs. See :ref:`axes_grid-examples-index` and +:ref:`axes_grid_users-guide-index`. .. plot:: pyplots/whats_new_99_axes_grid.py diff --git a/lib/matplotlib/backends/backend_gtk.py b/lib/matplotlib/backends/backend_gtk.py index 3beb86591321..067aea1cd819 100644 --- a/lib/matplotlib/backends/backend_gtk.py +++ b/lib/matplotlib/backends/backend_gtk.py @@ -440,8 +440,15 @@ def __init__(self, canvas, num): self.window = gtk.Window() self.window.set_title("Figure %d" % num) if (window_icon): - self.window.set_icon_from_file(window_icon) - + try: + self.window.set_icon_from_file(window_icon) + except: + # some versions of gtk throw a glib.GError but not + # all, so I am not sure how to catch it. I am unhappy + # diong a blanket catch here, but an not sure what a + # better way is - JDH + verbose.report('Could not load matplotlib icon: %s' % sys.exc_info()[1]) + self.vbox = gtk.VBox() self.window.add(self.vbox) self.vbox.show() @@ -666,7 +673,11 @@ def configure_subplots(self, button): window = gtk.Window() if (window_icon): - window.set_icon_from_file(window_icon) + try: window.set_icon_from_file(window_icon) + except: + # we presumably already logged a message on the + # failure of the main plot, don't keep reporting + pass window.set_title("Subplot Configuration Tool") window.set_default_size(w, h) vbox = gtk.VBox() diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index 739d490a9c20..be4eefe81725 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -488,7 +488,10 @@ def __call__(self, X, alpha=1.0, bytes=False): if not self._isinit: self._init() alpha = min(alpha, 1.0) # alpha must be between 0 and 1 alpha = max(alpha, 0.0) - self._lut[:,-1] = alpha + self._lut[:-1,-1] = alpha # Don't assign global alpha to i_bad; + # it would defeat the purpose of the + # default behavior, which is to not + # show anything where data are missing. mask_bad = None if not cbook.iterable(X): vtype = 'scalar' From aa82808eaa35e487c49a62f5d089a0738814c1e0 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Sat, 8 Aug 2009 11:25:32 +0000 Subject: [PATCH 0050/1000] Merged revisions 7426 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7426 | jdh2358 | 2009-08-08 06:00:41 -0500 (Sat, 08 Aug 2009) | 1 line replace list comps w/ numpy in mplot3d ........ svn path=/trunk/matplotlib/; revision=7427 --- lib/mpl_toolkits/mplot3d/art3d.py | 8 +++--- lib/mpl_toolkits/mplot3d/axes3d.py | 25 +++++++++--------- lib/mpl_toolkits/mplot3d/axis3d.py | 42 +++++++++++++++--------------- lib/mpl_toolkits/mplot3d/proj3d.py | 13 +++------ 4 files changed, 42 insertions(+), 46 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/art3d.py b/lib/mpl_toolkits/mplot3d/art3d.py index df5cb83e2d41..8c28ca2d7b9c 100644 --- a/lib/mpl_toolkits/mplot3d/art3d.py +++ b/lib/mpl_toolkits/mplot3d/art3d.py @@ -92,6 +92,7 @@ def __init__(self, xs, ys, zs, *args, **kwargs): def set_3d_properties(self, zs=0, zdir='z'): xs = self.get_xdata() ys = self.get_ydata() + try: zs = float(zs) zs = [zs for x in xs] @@ -116,7 +117,7 @@ def path_to_3d_segment(path, zs=0, zdir='z'): '''Convert a path to a 3D segment.''' if not iterable(zs): - zs = [zs] * len(path) + zs = np.ones(len(path)) * zs seg = [] pathsegs = path.iter_segments(simplify=False, curves=False) @@ -131,7 +132,7 @@ def paths_to_3d_segments(paths, zs=0, zdir='z'): ''' if not iterable(zs): - zs = [zs] * len(paths) + zs = np.ones(len(paths)) * zs segments = [] for path, pathz in zip(paths, zs): @@ -192,7 +193,8 @@ def __init__(self, *args, **kwargs): def set_3d_properties(self, verts, zs=0, zdir='z'): if not iterable(zs): - zs = [zs] * len(verts) + zs = np.ones(len(verts)) * zs + self._segment3d = [juggle_axes(x, y, z, zdir) \ for ((x, y), z) in zip(verts, zs)] self._facecolor3d = Patch.get_facecolor(self) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 158c07e7b187..1b8632ae0be0 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -58,7 +58,7 @@ def __init__(self, fig, rect=None, *args, **kwargs): xticks=[], yticks=[], *args, **kwargs) self.M = None - + self._ready = 1 self.mouse_init() self.create_axes() @@ -184,7 +184,7 @@ def auto_scale_xyz(self, X, Y, Z=None, had_data=None): def autoscale_view(self, scalex=True, scaley=True, scalez=True): # This method looks at the rectanglular volume (see above) # of data and decides how to scale the view portal to fit it. - + self.set_top_view() if not self._ready: return @@ -534,7 +534,7 @@ def plot(self, xs, ys, *args, **kwargs): # Match length if not cbook.iterable(zs): - zs = [zs] * len(xs) + zs = np.ones(len(xs)) * zs lines = Axes.plot(self, xs, ys, *args[argsi:], **kwargs) for line in lines: @@ -552,7 +552,7 @@ def plot_surface(self, X, Y, Z, *args, **kwargs): By default it will be colored in shades of a solid color, but it also supports color mapping by supplying the *cmap* argument. - + ========== ================================================ Argument Description ========== ================================================ @@ -648,7 +648,7 @@ def _shade_colors(self, color, normals): shade = np.array(shade) mask = ~np.isnan(shade) - if len(shade[mask]) > 0: + if len(shade[mask]) > 0: norm = Normalize(min(shade[mask]), max(shade[mask])) color = color.copy() color[3] = 1 @@ -679,7 +679,7 @@ def plot_wireframe(self, X, Y, Z, *args, **kwargs): rstride = kwargs.pop("rstride", 1) cstride = kwargs.pop("cstride", 1) - + had_data = self.has_data() rows, cols = Z.shape @@ -708,7 +708,7 @@ def plot_wireframe(self, X, Y, Z, *args, **kwargs): def _3d_extend_contour(self, cset, stride=5): ''' - Extend a contour in 3D by creating + Extend a contour in 3D by creating ''' levels = cset.levels @@ -742,7 +742,7 @@ def _3d_extend_contour(self, cset, stride=5): v1 = np.array(topverts[0][i1]) - np.array(topverts[0][i2]) v2 = np.array(topverts[0][i1]) - np.array(botverts[0][i1]) normals.append(np.cross(v1, v2)) - + colors = self._shade_colors(color, normals) colors2 = self._shade_colors(color, normals) polycol = art3d.Poly3DCollection(polyverts, facecolors=colors, @@ -811,13 +811,13 @@ def contourf(self, X, Y, Z, *args, **kwargs): self.auto_scale_xyz(X, Y, Z, had_data) return cset - + contourf3D = contourf def add_collection3d(self, col, zs=0, zdir='z'): ''' Add a 3d collection object to the plot. - + 2D collection types are converted to a 3D version by modifying the object and adding z coordinate information. @@ -865,7 +865,7 @@ def scatter(self, xs, ys, zs=0, zdir='z', *args, **kwargs): patches = Axes.scatter(self, xs, ys, *args, **kwargs) if not cbook.iterable(zs): is_2d = True - zs = [zs] * len(xs) + zs = np.ones(len(xs)) * zs else: is_2d = False art3d.patch_collection_2d_to_3d(patches, zs=zs, zdir=zdir) @@ -903,7 +903,8 @@ def bar(self, left, height, zs=0, zdir='z', *args, **kwargs): patches = Axes.bar(self, left, height, *args, **kwargs) if not cbook.iterable(zs): - zs = [zs] * len(left) + zs = np.ones(len(left))*zs + verts = [] verts_zs = [] diff --git a/lib/mpl_toolkits/mplot3d/axis3d.py b/lib/mpl_toolkits/mplot3d/axis3d.py index 38bf82b4055b..0386eff24e84 100644 --- a/lib/mpl_toolkits/mplot3d/axis3d.py +++ b/lib/mpl_toolkits/mplot3d/axis3d.py @@ -22,6 +22,7 @@ def get_flip_min_max(coord, index, mins, maxs): def move_from_center(coord, centers, deltas, axmask=(True, True, True)): '''Return a coordinate that is moved by "deltas" away from the center.''' coord = copy.copy(coord) + #print coord, centers, deltas, axmask for i in range(3): if not axmask[i]: continue @@ -84,7 +85,7 @@ def __init__(self, adir, v_intervalx, d_intervalx, axes, *args, **kwargs): alpha=0.8, facecolor=(1,1,1,0), edgecolor=(1,1,1,0)) - + self.axes._set_artist_props(self.line) self.axes._set_artist_props(self.pane) self.gridlines = art3d.Line3DCollection([], ) @@ -141,7 +142,7 @@ def draw(self, renderer): # code from XAxis majorTicks = self.get_major_ticks() majorLocs = self.major.locator() - + # filter locations here so that no extra grid lines are drawn interval = self.get_view_interval() majorLocs = [loc for loc in majorLocs if \ @@ -152,19 +153,20 @@ def draw(self, renderer): # Determine bounds minx, maxx, miny, maxy, minz, maxz = self.axes.get_w_lims() - mins = (minx, miny, minz) - maxs = (maxx, maxy, maxz) - centers = [(maxv + minv) / 2 for minv, maxv in zip(mins, maxs)] - deltas = [(maxv - minv) / 12 for minv, maxv in zip(mins, maxs)] - mins = [minv - delta / 4 for minv, delta in zip(mins, deltas)] - maxs = [maxv + delta / 4 for maxv, delta in zip(maxs, deltas)] + mins = np.array((minx, miny, minz)) + maxs = np.array((maxx, maxy, maxz)) + centers = (maxs + mins) / 2. + deltas = (maxs - mins) / 12. + mins = mins - deltas / 4. + maxs = maxs + deltas / 4. # Determine which planes should be visible by the avg z value vals = mins[0], maxs[0], mins[1], maxs[1], mins[2], maxs[2] tc = self.axes.tunit_cube(vals, renderer.M) + #raise RuntimeError('WTF: p1=%s'%p1) avgz = [tc[p1][2] + tc[p2][2] + tc[p3][2] + tc[p4][2] for \ p1, p2, p3, p4 in self._PLANES] - highs = [avgz[2*i] < avgz[2*i+1] for i in range(3)] + highs = np.array([avgz[2*i] < avgz[2*i+1] for i in range(3)]) # Draw plane info = self._AXINFO[self.adir] @@ -178,18 +180,14 @@ def draw(self, renderer): self.pane.draw(renderer) # Determine grid lines - minmax = [] - for i, val in enumerate(highs): - if val: - minmax.append(maxs[i]) - else: - minmax.append(mins[i]) + minmax = np.where(highs, maxs, mins) # Draw main axis line juggled = art3d.juggle_axes(0, 2, 1, self.adir) - edgep1 = copy.copy(minmax) + edgep1 = minmax.copy() edgep1[juggled[0]] = get_flip_min_max(edgep1, juggled[0], mins, maxs) - edgep2 = copy.copy(edgep1) + + edgep2 = edgep1.copy() edgep2[juggled[1]] = get_flip_min_max(edgep2, juggled[1], mins, maxs) pep = proj3d.proj_trans_points([edgep1, edgep2], renderer.M) self.line.set_data((pep[0][0], pep[0][1]), (pep[1][0], pep[1][1])) @@ -198,15 +196,17 @@ def draw(self, renderer): # Grid points where the planes meet xyz0 = [] for val in majorLocs: - coord = copy.copy(minmax) + coord = minmax.copy() coord[index] = val xyz0.append(coord) # Draw labels dy = pep[1][1] - pep[1][0] dx = pep[0][1] - pep[0][0] - lxyz = [(v1 + v2) / 2 for v1, v2 in zip(edgep1, edgep2)] - labeldeltas = [1.3 * x for x in deltas] + + lxyz = 0.5*(edgep1 + edgep2) + + labeldeltas = 1.3 * deltas lxyz = move_from_center(lxyz, centers, labeldeltas) tlx, tly, tlz = proj3d.proj_transform(lxyz[0], lxyz[1], lxyz[2], \ renderer.M) @@ -293,7 +293,7 @@ class YAxis(Axis): def get_data_interval(self): 'return the Interval instance for this axis data limits' return self.axes.xy_dataLim.intervaly - + class ZAxis(Axis): def get_data_interval(self): 'return the Interval instance for this axis data limits' diff --git a/lib/mpl_toolkits/mplot3d/proj3d.py b/lib/mpl_toolkits/mplot3d/proj3d.py index 3a2a3c9e34d6..ce4341f769b7 100644 --- a/lib/mpl_toolkits/mplot3d/proj3d.py +++ b/lib/mpl_toolkits/mplot3d/proj3d.py @@ -10,14 +10,7 @@ import numpy as np import numpy.linalg as linalg -def cross(a, b): - """ - Cross product of two vectors - A x B = - a x b = [a2b3 - a3b2, a3b1 - a1b3, a1b2 - a2b1] - """ - return np.array([a[1]*b[2] - a[2]*b[1], a[2]*b[0] - a[0]*b[2], \ - a[0]*b[1] - a[1]*b[0]]) + def line2d(p0, p1): """ @@ -130,9 +123,9 @@ def view_transformation(E, R, V): ## old n = n / mod(n) - u = cross(V, n) + u = np.cross(V, n) u = u / mod(u) - v = cross(n, u) + v = np.cross(n, u) Mr = [[u[0],u[1],u[2],0], [v[0],v[1],v[2],0], [n[0],n[1],n[2],0], From e7fccf796c5c8da26af86a7a6385b979d89330cc Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Sat, 8 Aug 2009 21:11:18 +0000 Subject: [PATCH 0051/1000] fix example demo_ribbon_box.py svn path=/trunk/matplotlib/; revision=7435 --- examples/pylab_examples/demo_ribbon_box.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/examples/pylab_examples/demo_ribbon_box.py b/examples/pylab_examples/demo_ribbon_box.py index 2503ddbc698a..6d5d77567d89 100644 --- a/examples/pylab_examples/demo_ribbon_box.py +++ b/examples/pylab_examples/demo_ribbon_box.py @@ -64,13 +64,13 @@ def __init__(self, bbox, color, ): BboxImage.__init__(self, bbox, - cmap = None, - norm = None, - interpolation=None, - origin=None, - filternorm=1, - filterrad=4.0, - resample = False, + cmap = cmap, + norm = norm, + interpolation=interpolation, + origin=origin, + filternorm=filternorm, + filterrad=filterrad, + resample = resample, **kwargs ) @@ -115,7 +115,7 @@ def draw(self, renderer, *args, **kwargs): for year, h, bc in zip(years, heights, box_colors): bbox0 = Bbox.from_extents(year-0.4, 0., year+0.4, h) bbox = TransformedBbox(bbox0, ax.transData) - rb_patch = RibbonBoxImage(bbox, bc) + rb_patch = RibbonBoxImage(bbox, bc, interpolation="bicubic") ax.add_artist(rb_patch) From a8d6f0610d3e0f53d593c8bf0d0c88e27f14ad9d Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Sun, 9 Aug 2009 04:50:12 +0000 Subject: [PATCH 0052/1000] retrieve a sample image using cbook.get_sample_data function svn path=/trunk/matplotlib/; revision=7437 --- examples/axes_grid/demo_axes_divider.py | 11 +++++++++-- examples/axes_grid/demo_axes_grid.py | 8 +++++++- examples/axes_grid/inset_locator_demo2.py | 8 +++++++- examples/axes_grid/simple_axesgrid2.py | 9 ++++++++- examples/axes_grid/simple_rgb.py | 9 ++++++++- lib/mpl_toolkits/axes_grid/demo_image.py | 17 ----------------- 6 files changed, 39 insertions(+), 23 deletions(-) delete mode 100644 lib/mpl_toolkits/axes_grid/demo_image.py diff --git a/examples/axes_grid/demo_axes_divider.py b/examples/axes_grid/demo_axes_divider.py index 64a2f0c75fcd..5c8a5c5cd05b 100644 --- a/examples/axes_grid/demo_axes_divider.py +++ b/examples/axes_grid/demo_axes_divider.py @@ -1,6 +1,13 @@ import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid.demo_image import get_demo_image -#import mpl_toolkits.imaging.axes_grid as imaging + +def get_demo_image(): + import numpy as np + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) + def demo_simple_image(ax): Z, extent = get_demo_image() diff --git a/examples/axes_grid/demo_axes_grid.py b/examples/axes_grid/demo_axes_grid.py index 8eebae755b27..f5c1187b0a7d 100644 --- a/examples/axes_grid/demo_axes_grid.py +++ b/examples/axes_grid/demo_axes_grid.py @@ -1,7 +1,13 @@ import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid.demo_image import get_demo_image from mpl_toolkits.axes_grid import AxesGrid +def get_demo_image(): + import numpy as np + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) def demo_simple_grid(fig): """ diff --git a/examples/axes_grid/inset_locator_demo2.py b/examples/axes_grid/inset_locator_demo2.py index 391cf561b5d6..7ba980596a63 100644 --- a/examples/axes_grid/inset_locator_demo2.py +++ b/examples/axes_grid/inset_locator_demo2.py @@ -5,7 +5,13 @@ import numpy as np -from mpl_toolkits.axes_grid.demo_image import get_demo_image +def get_demo_image(): + from matplotlib.cbook import get_sample_data + import numpy as np + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) fig = plt.figure(1, [5,4]) diff --git a/examples/axes_grid/simple_axesgrid2.py b/examples/axes_grid/simple_axesgrid2.py index 0f7a547165a4..4b42e9badbdc 100644 --- a/examples/axes_grid/simple_axesgrid2.py +++ b/examples/axes_grid/simple_axesgrid2.py @@ -1,6 +1,13 @@ import matplotlib.pyplot as plt from mpl_toolkits.axes_grid import AxesGrid -from mpl_toolkits.axes_grid.demo_image import get_demo_image + +def get_demo_image(): + import numpy as np + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) F = plt.figure(1, (5.5, 3.5)) grid = AxesGrid(F, 111, # similar to subplot(111) diff --git a/examples/axes_grid/simple_rgb.py b/examples/axes_grid/simple_rgb.py index 3c660c96f142..149764935473 100644 --- a/examples/axes_grid/simple_rgb.py +++ b/examples/axes_grid/simple_rgb.py @@ -1,8 +1,15 @@ import matplotlib.pyplot as plt -from mpl_toolkits.axes_grid.demo_image import get_demo_image from mpl_toolkits.axes_grid.axes_rgb import RGBAxes +def get_demo_image(): + import numpy as np + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) + def get_rgb(): Z, extent = get_demo_image() diff --git a/lib/mpl_toolkits/axes_grid/demo_image.py b/lib/mpl_toolkits/axes_grid/demo_image.py deleted file mode 100644 index e5cd7f157f0a..000000000000 --- a/lib/mpl_toolkits/axes_grid/demo_image.py +++ /dev/null @@ -1,17 +0,0 @@ -import numpy as np - -def get_demo_image(): - # prepare image - delta = 0.5 - - extent = (-3,4,-4,3) - x = np.arange(-3.0, 4.001, delta) - y = np.arange(-4.0, 3.001, delta) - X, Y = np.meshgrid(x, y) - import matplotlib.mlab as mlab - Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) - Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1) - Z = (Z1 - Z2) * 10 - - return Z, extent - From 65dd135929803b6c227f899ff4eb0bd315b53e15 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Sun, 9 Aug 2009 18:50:15 +0000 Subject: [PATCH 0053/1000] Fix the spelling of my name (the rst files are processed as UTF-8 anyway) svn path=/trunk/matplotlib/; revision=7438 --- doc/users/credits.rst | 5 +++-- doc/users/whats_new.rst | 2 +- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/doc/users/credits.rst b/doc/users/credits.rst index 107192201ec0..1edbc93401d4 100644 --- a/doc/users/credits.rst +++ b/doc/users/credits.rst @@ -148,7 +148,8 @@ The `brainvisa `_ Orsay team and Fernando Perez Charlie Moad contributed work to matplotlib's Cocoa support and has done a lot of work on the OSX and win32 binary releases. -Jouni K. Seppaenen wrote the PDF backend and contributed numerous +Jouni K. Seppänen + wrote the PDF backend and contributed numerous fixes to the code, to tex support and to the get_sample_data handler Paul Kienzle @@ -172,4 +173,4 @@ John Porter, Jonathon Taylor and Reinier Heeres Jae-Joon Lee implemented fancy arrows and boxes, rewrote the legend support to handle multiple columns and fancy text boxes, wrote the axes grid toolkit, and has made numerous contributions to the code - and documentation \ No newline at end of file + and documentation diff --git a/doc/users/whats_new.rst b/doc/users/whats_new.rst index e4d504970490..37d351adcdbe 100644 --- a/doc/users/whats_new.rst +++ b/doc/users/whats_new.rst @@ -72,7 +72,7 @@ including binaries for OS X and Windows for python 2.4 and 2.5 (2.6 and 3.0 will not be available until numpy is available on those releases). Thanks to the many developers who contributed to this release, with contributions from Jae-Joon Lee, Michael Droettboom, -Ryan May, Eric Firing, Manuel Metz, Jouni K. Seppaenen, Jeff Whitaker, +Ryan May, Eric Firing, Manuel Metz, Jouni K. Seppänen, Jeff Whitaker, Darren Dale, David Kaplan, Michiel de Hoon and many others who submitted patches From d8c38390660f5972e6ee88428e89eb8ef6b8a9fb Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Sun, 9 Aug 2009 19:25:49 +0000 Subject: [PATCH 0054/1000] reorganization of AxesImage and BboxImage svn path=/trunk/matplotlib/; revision=7439 --- lib/matplotlib/image.py | 336 ++++++++++++++++++++++------------------ 1 file changed, 189 insertions(+), 147 deletions(-) diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index 18cb88181dbf..19cc69ac48f2 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -26,7 +26,7 @@ from matplotlib.transforms import BboxBase -class AxesImage(martist.Artist, cm.ScalarMappable): +class _AxesImageBase(martist.Artist, cm.ScalarMappable): zorder = 1 # map interpolation strings to module constants _interpd = { @@ -62,7 +62,6 @@ def __init__(self, ax, norm = None, interpolation=None, origin=None, - extent=None, filternorm=1, filterrad=4.0, resample = False, @@ -87,7 +86,6 @@ def __init__(self, ax, if origin is None: origin = rcParams['image.origin'] self.origin = origin - self._extent = extent self.set_filternorm(filternorm) self.set_filterrad(filterrad) self._filterrad = filterrad @@ -126,107 +124,8 @@ def changed(self): self._rgbacache = None cm.ScalarMappable.changed(self) - def make_image(self, magnification=1.0): - if self._A is None: - raise RuntimeError('You must first set the image array or the image attribute') - - xmin, xmax, ymin, ymax = self.get_extent() - dxintv = xmax-xmin - dyintv = ymax-ymin - - # the viewport scale factor - sx = dxintv/self.axes.viewLim.width - sy = dyintv/self.axes.viewLim.height - numrows, numcols = self._A.shape[:2] - if sx > 2: - x0 = (self.axes.viewLim.x0-xmin)/dxintv * numcols - ix0 = max(0, int(x0 - self._filterrad)) - x1 = (self.axes.viewLim.x1-xmin)/dxintv * numcols - ix1 = min(numcols, int(x1 + self._filterrad)) - xslice = slice(ix0, ix1) - xmin_old = xmin - xmin = xmin_old + ix0*dxintv/numcols - xmax = xmin_old + ix1*dxintv/numcols - dxintv = xmax - xmin - sx = dxintv/self.axes.viewLim.width - else: - xslice = slice(0, numcols) - - if sy > 2: - y0 = (self.axes.viewLim.y0-ymin)/dyintv * numrows - iy0 = max(0, int(y0 - self._filterrad)) - y1 = (self.axes.viewLim.y1-ymin)/dyintv * numrows - iy1 = min(numrows, int(y1 + self._filterrad)) - if self.origin == 'upper': - yslice = slice(numrows-iy1, numrows-iy0) - else: - yslice = slice(iy0, iy1) - ymin_old = ymin - ymin = ymin_old + iy0*dyintv/numrows - ymax = ymin_old + iy1*dyintv/numrows - dyintv = ymax - ymin - sy = dyintv/self.axes.viewLim.height - else: - yslice = slice(0, numrows) - - if xslice != self._oldxslice or yslice != self._oldyslice: - self._imcache = None - self._oldxslice = xslice - self._oldyslice = yslice - - if self._imcache is None: - if self._A.dtype == np.uint8 and len(self._A.shape) == 3: - im = _image.frombyte(self._A[yslice,xslice,:], 0) - im.is_grayscale = False - else: - if self._rgbacache is None: - x = self.to_rgba(self._A, self._alpha) - self._rgbacache = x - else: - x = self._rgbacache - im = _image.fromarray(x[yslice,xslice], 0) - if len(self._A.shape) == 2: - im.is_grayscale = self.cmap.is_gray() - else: - im.is_grayscale = False - self._imcache = im - - if self.origin=='upper': - im.flipud_in() - else: - im = self._imcache - - fc = self.axes.patch.get_facecolor() - bg = mcolors.colorConverter.to_rgba(fc, 0) - im.set_bg( *bg) - - # image input dimensions - im.reset_matrix() - numrows, numcols = im.get_size() - - im.set_interpolation(self._interpd[self._interpolation]) - - im.set_resample(self._resample) - - # the viewport translation - tx = (xmin-self.axes.viewLim.x0)/dxintv * numcols - ty = (ymin-self.axes.viewLim.y0)/dyintv * numrows - - l, b, r, t = self.axes.bbox.extents - widthDisplay = (round(r) + 0.5) - (round(l) - 0.5) - heightDisplay = (round(t) + 0.5) - (round(b) - 0.5) - widthDisplay *= magnification - heightDisplay *= magnification - im.apply_translation(tx, ty) - - # resize viewport to display - rx = widthDisplay / numcols - ry = heightDisplay / numrows - im.apply_scaling(rx*sx, ry*sy) - im.resize(int(widthDisplay+0.5), int(heightDisplay+0.5), - norm=self._filternorm, radius=self._filterrad) - return im + raise RuntimeError('The make_image method must be overridden.') @allow_rasterization def draw(self, renderer, *args, **kwargs): @@ -314,20 +213,6 @@ def set_array(self, A): - def set_extent(self, extent): - """ - extent is data axes (left, right, bottom, top) for making image plots - """ - self._extent = extent - - xmin, xmax, ymin, ymax = extent - corners = (xmin, ymin), (xmax, ymax) - self.axes.update_datalim(corners) - if self.axes._autoscaleXon: - self.axes.set_xlim((xmin, xmax)) - if self.axes._autoscaleYon: - self.axes.set_ylim((ymin, ymax)) - def get_interpolation(self): """ Return the interpolation method the image uses when resizing. @@ -367,19 +252,6 @@ def get_resample(self): 'return the image resample boolean' return self._resample - def get_extent(self): - 'get the image extent: left, right, bottom, top' - if self._extent is not None: - return self._extent - else: - sz = self.get_size() - #print 'sz', sz - numrows, numcols = sz - if self.origin == 'upper': - return (-0.5, numcols-0.5, numrows-0.5, -0.5) - else: - return (-0.5, numcols-0.5, -0.5, numrows-0.5) - def set_filternorm(self, filternorm): """ Set whether the resize filter norms the weights -- see @@ -412,6 +284,182 @@ def get_filterrad(self): return self._filterrad + +class AxesImage(_AxesImageBase): + def __str__(self): + return "AxesImage(%g,%g;%gx%g)" % tuple(self.axes.bbox.bounds) + + def __init__(self, ax, + cmap = None, + norm = None, + interpolation=None, + origin=None, + extent=None, + filternorm=1, + filterrad=4.0, + resample = False, + **kwargs + ): + + """ + interpolation and cmap default to their rc settings + + cmap is a colors.Colormap instance + norm is a colors.Normalize instance to map luminance to 0-1 + + extent is data axes (left, right, bottom, top) for making image plots + registered with data plots. Default is to label the pixel + centers with the zero-based row and column indices. + + Additional kwargs are matplotlib.artist properties + + """ + + self._extent = extent + + _AxesImageBase.__init__(self, ax, + cmap = cmap, + norm = norm, + interpolation=interpolation, + origin=origin, + filternorm=filternorm, + filterrad=filterrad, + resample = resample, + **kwargs + ) + + + def make_image(self, magnification=1.0): + if self._A is None: + raise RuntimeError('You must first set the image array or the image attribute') + + xmin, xmax, ymin, ymax = self.get_extent() + dxintv = xmax-xmin + dyintv = ymax-ymin + + # the viewport scale factor + sx = dxintv/self.axes.viewLim.width + sy = dyintv/self.axes.viewLim.height + numrows, numcols = self._A.shape[:2] + if sx > 2: + x0 = (self.axes.viewLim.x0-xmin)/dxintv * numcols + ix0 = max(0, int(x0 - self._filterrad)) + x1 = (self.axes.viewLim.x1-xmin)/dxintv * numcols + ix1 = min(numcols, int(x1 + self._filterrad)) + xslice = slice(ix0, ix1) + xmin_old = xmin + xmin = xmin_old + ix0*dxintv/numcols + xmax = xmin_old + ix1*dxintv/numcols + dxintv = xmax - xmin + sx = dxintv/self.axes.viewLim.width + else: + xslice = slice(0, numcols) + + if sy > 2: + y0 = (self.axes.viewLim.y0-ymin)/dyintv * numrows + iy0 = max(0, int(y0 - self._filterrad)) + y1 = (self.axes.viewLim.y1-ymin)/dyintv * numrows + iy1 = min(numrows, int(y1 + self._filterrad)) + if self.origin == 'upper': + yslice = slice(numrows-iy1, numrows-iy0) + else: + yslice = slice(iy0, iy1) + ymin_old = ymin + ymin = ymin_old + iy0*dyintv/numrows + ymax = ymin_old + iy1*dyintv/numrows + dyintv = ymax - ymin + sy = dyintv/self.axes.viewLim.height + else: + yslice = slice(0, numrows) + + if xslice != self._oldxslice or yslice != self._oldyslice: + self._imcache = None + self._oldxslice = xslice + self._oldyslice = yslice + + if self._imcache is None: + if self._A.dtype == np.uint8 and len(self._A.shape) == 3: + im = _image.frombyte(self._A[yslice,xslice,:], 0) + im.is_grayscale = False + else: + if self._rgbacache is None: + x = self.to_rgba(self._A, self._alpha) + self._rgbacache = x + else: + x = self._rgbacache + im = _image.fromarray(x[yslice,xslice], 0) + if len(self._A.shape) == 2: + im.is_grayscale = self.cmap.is_gray() + else: + im.is_grayscale = False + self._imcache = im + + if self.origin=='upper': + im.flipud_in() + else: + im = self._imcache + + fc = self.axes.patch.get_facecolor() + bg = mcolors.colorConverter.to_rgba(fc, 0) + im.set_bg( *bg) + + # image input dimensions + im.reset_matrix() + numrows, numcols = im.get_size() + + im.set_interpolation(self._interpd[self._interpolation]) + + im.set_resample(self._resample) + + # the viewport translation + tx = (xmin-self.axes.viewLim.x0)/dxintv * numcols + ty = (ymin-self.axes.viewLim.y0)/dyintv * numrows + + l, b, r, t = self.axes.bbox.extents + widthDisplay = (round(r) + 0.5) - (round(l) - 0.5) + heightDisplay = (round(t) + 0.5) - (round(b) - 0.5) + widthDisplay *= magnification + heightDisplay *= magnification + im.apply_translation(tx, ty) + + # resize viewport to display + rx = widthDisplay / numcols + ry = heightDisplay / numrows + im.apply_scaling(rx*sx, ry*sy) + im.resize(int(widthDisplay+0.5), int(heightDisplay+0.5), + norm=self._filternorm, radius=self._filterrad) + return im + + + def set_extent(self, extent): + """ + extent is data axes (left, right, bottom, top) for making image plots + """ + self._extent = extent + + xmin, xmax, ymin, ymax = extent + corners = (xmin, ymin), (xmax, ymax) + self.axes.update_datalim(corners) + if self.axes._autoscaleXon: + self.axes.set_xlim((xmin, xmax)) + if self.axes._autoscaleYon: + self.axes.set_ylim((ymin, ymax)) + + def get_extent(self): + 'get the image extent: left, right, bottom, top' + if self._extent is not None: + return self._extent + else: + sz = self.get_size() + #print 'sz', sz + numrows, numcols = sz + if self.origin == 'upper': + return (-0.5, numcols-0.5, numrows-0.5, -0.5) + else: + return (-0.5, numcols-0.5, -0.5, numrows-0.5) + + + class NonUniformImage(AxesImage): def __init__(self, ax, **kwargs): """ @@ -747,7 +795,7 @@ def write_png(self, fname): _png.write_png(buffer, cols, rows, fname) -class BboxImage(AxesImage): +class BboxImage(_AxesImageBase): """ The Image class whose size is determined by the given bbox. """ @@ -770,16 +818,16 @@ def __init__(self, bbox, kwargs are an optional list of Artist keyword args """ - AxesImage.__init__(self, ax=None, - cmap = cmap, - norm = norm, - interpolation=interpolation, - origin=origin, - filternorm=filternorm, - filterrad=filterrad, - resample = resample, - **kwargs - ) + _AxesImageBase.__init__(self, ax=None, + cmap = cmap, + norm = norm, + interpolation=interpolation, + origin=origin, + filternorm=filternorm, + filterrad=filterrad, + resample = resample, + **kwargs + ) self.bbox = bbox @@ -842,11 +890,6 @@ def make_image(self, renderer, magnification=1.0): else: im = self._imcache - if 0: - fc = self.axes.patch.get_facecolor() - bg = mcolors.colorConverter.to_rgba(fc, 0) - im.set_bg( *bg) - # image input dimensions im.reset_matrix() @@ -859,7 +902,6 @@ def make_image(self, renderer, magnification=1.0): heightDisplay = (round(t) + 0.5) - (round(b) - 0.5) widthDisplay *= magnification heightDisplay *= magnification - #im.apply_translation(tx, ty) numrows, numcols = self._A.shape[:2] From 80fb71a76d9fc03795d182bf1c58e9ca70b1501e Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Sun, 9 Aug 2009 19:38:48 +0000 Subject: [PATCH 0055/1000] AnnotationBbox implemented. svn path=/trunk/matplotlib/; revision=7440 --- CHANGELOG | 4 + .../pylab_examples/demo_annotation_box.py | 94 ++++ lib/matplotlib/offsetbox.py | 431 +++++++++++++++++- lib/matplotlib/text.py | 306 +++++++------ .../axes_grid/anchored_artists.py | 103 ++++- 5 files changed, 762 insertions(+), 176 deletions(-) create mode 100644 examples/pylab_examples/demo_annotation_box.py diff --git a/CHANGELOG b/CHANGELOG index 98dc74e8c7af..ac689e35fed3 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +2009-08-09 AnnotationBbox added. Similar to Annotation, but works with + OffsetBox instead of Text. See the example + demo_annotation_box.py. -JJL + 2009-08-07 BboxImage implemented. Two examples, demo_bboximage.py and demo_ribbon_box.py added. - JJL diff --git a/examples/pylab_examples/demo_annotation_box.py b/examples/pylab_examples/demo_annotation_box.py new file mode 100644 index 000000000000..ea82bb53b138 --- /dev/null +++ b/examples/pylab_examples/demo_annotation_box.py @@ -0,0 +1,94 @@ +import matplotlib.pyplot as plt +from matplotlib.offsetbox import TextArea, DrawingArea, OffsetImage, \ + AnnotationBbox +from matplotlib.cbook import get_sample_data + +import numpy as np + +if 1: + fig = plt.gcf() + fig.clf() + ax = plt.subplot(111) + + offsetbox = TextArea("Test 1", minimumdescent=False) + + xy = (0.5, 0.7) + + ax.plot(xy[0], xy[1], ".r") + + ab = AnnotationBbox(offsetbox, xy, + xybox=(-20, 40), + xycoords='data', + boxcoords="offset points", + arrowprops=dict(arrowstyle="->")) + ax.add_artist(ab) + + offsetbox = TextArea("Test", minimumdescent=False) + + ab = AnnotationBbox(offsetbox, xy, + xybox=(1.02, xy[1]), + xycoords='data', + boxcoords=("axes fraction", "data"), + box_alignment=(0.,0.5), + arrowprops=dict(arrowstyle="->")) + ax.add_artist(ab) + + + from matplotlib.patches import Circle + da = DrawingArea(20, 20, 0, 0) + p = Circle((10, 10), 10) + da.add_artist(p) + + xy = [0.3, 0.55] + ab = AnnotationBbox(da, xy, + xybox=(1.02, xy[1]), + xycoords='data', + boxcoords=("axes fraction", "data"), + box_alignment=(0.,0.5), + arrowprops=dict(arrowstyle="->")) + #arrowprops=None) + + ax.add_artist(ab) + + + arr = np.arange(100).reshape((10,10)) + im = OffsetImage(arr, zoom=2) + + ab = AnnotationBbox(im, xy, + xybox=(-50., 50.), + xycoords='data', + boxcoords="offset points", + pad=0.3, + arrowprops=dict(arrowstyle="->")) + #arrowprops=None) + + ax.add_artist(ab) + + + # another image + + + from matplotlib._png import read_png + fn = get_sample_data("lena.png", asfileobj=False) + arr_lena = read_png(fn) + + imagebox = OffsetImage(arr_lena, zoom=0.2) + + ab = AnnotationBbox(imagebox, xy, + xybox=(120., -80.), + xycoords='data', + boxcoords="offset points", + pad=0.5, + arrowprops=dict(arrowstyle="->", + connectionstyle="angle,angleA=0,angleB=90,rad=3") + ) + + + ax.add_artist(ab) + + ax.set_xlim(0, 1) + ax.set_ylim(0, 1) + + + plt.draw() + plt.show() diff --git a/lib/matplotlib/offsetbox.py b/lib/matplotlib/offsetbox.py index 1a85cf86c74b..4bc6be3f7366 100644 --- a/lib/matplotlib/offsetbox.py +++ b/lib/matplotlib/offsetbox.py @@ -19,13 +19,21 @@ import matplotlib.artist as martist import matplotlib.text as mtext import numpy as np -from matplotlib.transforms import Bbox, BboxBase, TransformedBbox, BboxTransformTo +from matplotlib.transforms import Bbox, BboxBase, TransformedBbox, \ + IdentityTransform from matplotlib.font_manager import FontProperties -from matplotlib.patches import FancyBboxPatch +from matplotlib.patches import FancyBboxPatch, FancyArrowPatch from matplotlib import rcParams +import matplotlib.cbook as cbook + +#from bboximage import BboxImage +from matplotlib.image import BboxImage + from matplotlib.patches import bbox_artist as mbbox_artist + + DEBUG=False # for debuging use def bbox_artist(*args, **kwargs): @@ -744,7 +752,7 @@ def get_window_extent(self, renderer): def get_extent(self, renderer): # clear the offset transforms - _off = self.ref_offset_transform.to_values() # to be restored later + _off = self.offset_transform.to_values() # to be restored later self.ref_offset_transform.clear() self.offset_transform.clear() @@ -755,8 +763,10 @@ def get_extent(self, renderer): # adjust ref_offset_tansform self.ref_offset_transform.translate(-ub.x0, -ub.y0) + # restor offset transform - self.offset_transform.matrix_from_values(*_off) + mtx = self.offset_transform.matrix_from_values(*_off) + self.offset_transform.set_matrix(mtx) return ub.width, ub.height, 0., 0. @@ -890,7 +900,7 @@ def get_bbox_to_anchor(self): else: return TransformedBbox(self._bbox_to_anchor, transform) - + @@ -901,7 +911,7 @@ def set_bbox_to_anchor(self, bbox, transform=None): *bbox* can be a Bbox instance, a list of [left, bottom, width, height], or a list of [left, bottom] where the width and height will be assumed to be zero. The bbox will be - transformed to display coordinate by the given transform. + transformed to display coordinate by the given transform. """ if bbox is None or isinstance(bbox, BboxBase): self._bbox_to_anchor = bbox @@ -951,6 +961,13 @@ def _offset(w, h, xd, yd, fontsize=fontsize, self=self): self.set_offset(_offset) + def update_frame(self, bbox, fontsize=None): + self.patch.set_bounds(bbox.x0, bbox.y0, + bbox.width, bbox.height) + + if fontsize: + self.patch.set_mutation_scale(fontsize) + def draw(self, renderer): "draw the artist" @@ -962,11 +979,7 @@ def draw(self, renderer): if self._drawFrame: # update the location and size of the legend bbox = self.get_window_extent(renderer) - self.patch.set_bounds(bbox.x0, bbox.y0, - bbox.width, bbox.height) - - self.patch.set_mutation_scale(fontsize) - + self.update_frame(bbox, fontsize) self.patch.draw(renderer) @@ -1004,3 +1017,399 @@ def _get_anchored_bbox(self, loc, bbox, parentbbox, borderpad): container = parentbbox.padded(-borderpad) anchored_box = bbox.anchored(c, container=container) return anchored_box.x0, anchored_box.y0 + + +class AnchoredText(AnchoredOffsetbox): + """ + AnchoredOffsetbox with Text + """ + + def __init__(self, s, loc, pad=0.4, borderpad=0.5, prop=None, **kwargs): + """ + *s* : string + *loc* : location code + *prop* : font property + *pad* : pad between the text and the frame as fraction of the font size. + *borderpad* : pad between the frame and the axes (or bbox_to_anchor). + + other keyword parameters of AnchoredOffsetbox are also allowed. + """ + + self.txt = TextArea(s, textprops=prop, + minimumdescent=False) + fp = self.txt._text.get_fontproperties() + + super(AnchoredText, self).__init__(loc, pad=pad, borderpad=borderpad, + child=self.txt, + prop=fp, + **kwargs) + + + +class OffsetImage(OffsetBox): + def __init__(self, arr, + zoom=1, + cmap = None, + norm = None, + interpolation=None, + origin=None, + filternorm=1, + filterrad=4.0, + resample = False, + dpi_cor=True, + **kwargs + ): + + self._dpi_cor = dpi_cor + + self.image = BboxImage(bbox=self.get_window_extent, + cmap = cmap, + norm = norm, + interpolation=interpolation, + origin=origin, + filternorm=filternorm, + filterrad=filterrad, + resample = resample, + **kwargs + ) + + self._children = [self.image] + + self.set_zoom(zoom) + self.set_data(arr) + + OffsetBox.__init__(self) + + + def set_data(self, arr): + self._data = np.asarray(arr) + self.image.set_data(self._data) + + def get_data(self): + return self._data + + def set_zoom(self, zoom): + self._zoom = zoom + + def get_zoom(self): + return self._zoom + +# def set_axes(self, axes): +# self.image.set_axes(axes) +# martist.Artist.set_axes(self, axes) + +# def set_offset(self, xy): +# """ +# set offset of the container. + +# Accept : tuple of x,y cooridnate in disokay units. +# """ +# self._offset = xy + +# self.offset_transform.clear() +# self.offset_transform.translate(xy[0], xy[1]) + + + def get_offset(self): + """ + return offset of the container. + """ + return self._offset + + + def get_window_extent(self, renderer): + ''' + get the bounding box in display space. + ''' + w, h, xd, yd = self.get_extent(renderer) + ox, oy = self.get_offset() + return mtransforms.Bbox.from_bounds(ox-xd, oy-yd, w, h) + + + def get_extent(self, renderer): + + if self._dpi_cor: # True, do correction + dpi_cor = renderer.points_to_pixels(1.) + else: + dpi_cor = 1. + + zoom = self.get_zoom() + data = self.get_data() + ny, nx = data.shape[:2] + w, h = nx*zoom, ny*zoom + + return w, h, 0, 0 + + + + def draw(self, renderer): + """ + Draw the children + """ + + self.image.draw(renderer) + + #bbox_artist(self, renderer, fill=False, props=dict(pad=0.)) + + + +from matplotlib.text import _AnnotationBase + +class AnnotationBbox(martist.Artist, _AnnotationBase): + """ + Annotation-like class, but with offsetbox instead of Text. + """ + + zorder = 3 + + def __str__(self): + return "AnnotationBbox(%g,%g)"%(self.xy[0],self.xy[1]) + def __init__(self, offsetbox, xy, + xybox=None, + xycoords='data', + boxcoords=None, + frameon=True, pad=0.4, # BboxPatch + annotation_clip=None, + box_alignment=(0.5, 0.5), + bboxprops=None, + arrowprops=None, + fontsize=None, + **kwargs): + """ + *offsetbox* : OffsetBox instance + + *xycoords* : same as Annotation but can be a tuple of two + strings which are interpreted as x and y coordinates. + + *boxcoords* : similar to textcoords as Annotation but can be a + tuple of two strings which are interpreted as x and y + coordinates. + + *box_alignment* : a tuple of two floats for a vertical and + horizontal alignment of the offset box w.r.t. the *boxcoords*. + The lower-left corner is (0.0) and upper-right corner is (1.1). + + other parameters are identical to that of Annotation. + """ + self.offsetbox = offsetbox + + self.arrowprops = arrowprops + + self.set_fontsize(fontsize) + + + if arrowprops is not None: + self._arrow_relpos = self.arrowprops.pop("relpos", (0.5, 0.5)) + self.arrow_patch = FancyArrowPatch((0, 0), (1,1), + **self.arrowprops) + else: + self._arrow_relpos = None + self.arrow_patch = None + + _AnnotationBase.__init__(self, + xy, xytext=xybox, + xycoords=xycoords, textcoords=boxcoords, + annotation_clip=annotation_clip) + + martist.Artist.__init__(self, **kwargs) + + #self._fw, self._fh = 0., 0. # for alignment + self._box_alignment = box_alignment + + # frame + self.patch = FancyBboxPatch( + xy=(0.0, 0.0), width=1., height=1., + facecolor='w', edgecolor='k', + mutation_scale=self.prop.get_size_in_points(), + snap=True + ) + self.patch.set_boxstyle("square",pad=pad) + if bboxprops: + self.patch.set(**bboxprops) + self._drawFrame = frameon + + + __init__.__doc__ = cbook.dedent(__init__.__doc__) % martist.kwdocd + + def contains(self,event): + t,tinfo = self.offsetbox.contains(event) + if self.arrow is not None: + a,ainfo=self.arrow.contains(event) + t = t or a + + # self.arrow_patch is currently not checked as this can be a line - JJ + + return t,tinfo + + + def get_children(self): + children = [self.offsetbox, self.patch] + if self.arrow_patch: + children.append(self.arrow_patch) + return children + + def set_figure(self, fig): + + if self.arrow_patch is not None: + self.arrow_patch.set_figure(fig) + self.offsetbox.set_figure(fig) + martist.Artist.set_figure(self, fig) + + def set_fontsize(self, s=None): + """ + set fontsize in points + """ + if s is None: + s = rcParams["legend.fontsize"] + + self.prop=FontProperties(size=s) + + def get_fontsize(self, s=None): + """ + return fontsize in points + """ + return self.prop.get_size_in_points() + + def update_positions(self, renderer): + "Update the pixel positions of the annotated point and the text." + xy_pixel = self._get_position_xy(renderer) + self._update_position_xybox(renderer, xy_pixel) + + mutation_scale = renderer.points_to_pixels(self.get_fontsize()) + self.patch.set_mutation_scale(mutation_scale) + + if self.arrow_patch: + self.arrow_patch.set_mutation_scale(mutation_scale) + + + def _update_position_xybox(self, renderer, xy_pixel): + "Update the pixel positions of the annotation text and the arrow patch." + + x, y = self.xytext + if isinstance(self.textcoords, tuple): + xcoord, ycoord = self.textcoords + x1, y1 = self._get_xy(x, y, xcoord) + x2, y2 = self._get_xy(x, y, ycoord) + ox0, oy0 = x1, y2 + else: + ox0, oy0 = self._get_xy(x, y, self.textcoords) + + #self.offsetbox.set_bbox_to_anchor((ox0, oy0)) + w, h, xd, yd = self.offsetbox.get_extent(renderer) + + _fw, _fh = self._box_alignment + self.offsetbox.set_offset((ox0-_fw*w, oy0-_fh*h)) + + # update patch position + bbox = self.offsetbox.get_window_extent(renderer) + #self.offsetbox.set_offset((ox0-_fw*w, oy0-_fh*h)) + self.patch.set_bounds(bbox.x0, bbox.y0, + bbox.width, bbox.height) + + x, y = xy_pixel + + ox1, oy1 = x, y + + if self.arrowprops: + x0, y0 = x, y + + d = self.arrowprops.copy() + + # Use FancyArrowPatch if self.arrowprops has "arrowstyle" key. + + # adjust the starting point of the arrow relative to + # the textbox. + # TODO : Rotation needs to be accounted. + relpos = self._arrow_relpos + + ox0 = bbox.x0 + bbox.width * relpos[0] + oy0 = bbox.y0 + bbox.height * relpos[1] + + # The arrow will be drawn from (ox0, oy0) to (ox1, + # oy1). It will be first clipped by patchA and patchB. + # Then it will be shrinked by shirnkA and shrinkB + # (in points). If patch A is not set, self.bbox_patch + # is used. + + self.arrow_patch.set_positions((ox0, oy0), (ox1,oy1)) + fs = self.prop.get_size_in_points() + mutation_scale = d.pop("mutation_scale", fs) + mutation_scale = renderer.points_to_pixels(mutation_scale) + self.arrow_patch.set_mutation_scale(mutation_scale) + + patchA = d.pop("patchA", self.patch) + self.arrow_patch.set_patchA(patchA) + + + + def draw(self, renderer): + """ + Draw the :class:`Annotation` object to the given *renderer*. + """ + + if renderer is not None: + self._renderer = renderer + if not self.get_visible(): return + + xy_pixel = self._get_position_xy(renderer) + + if not self._check_xy(renderer, xy_pixel): + return + + self.update_positions(renderer) + + if self.arrow_patch is not None: + if self.arrow_patch.figure is None and self.figure is not None: + self.arrow_patch.figure = self.figure + self.arrow_patch.draw(renderer) + + if self._drawFrame: + self.patch.draw(renderer) + + self.offsetbox.draw(renderer) + + + + +if __name__ == "__main__": + + fig = plt.figure(1) + fig.clf() + ax = plt.subplot(121) + + #txt = ax.text(0.5, 0.5, "Test", size=30, ha="center", color="w") + kwargs = dict() + + a = np.arange(256).reshape(16,16)/256. + myimage = OffsetImage(a, + zoom=2, + norm = None, + origin=None, + **kwargs + ) + ax.add_artist(myimage) + + myimage.set_offset((100, 100)) + + + myimage2 = OffsetImage(a, + zoom=2, + norm = None, + origin=None, + **kwargs + ) + ann = AnnotationBbox(myimage2, (0.5, 0.5), + xybox=(30, 30), + xycoords='data', + boxcoords="offset points", + frameon=True, pad=0.4, # BboxPatch + bboxprops=dict(boxstyle="round", fc="y"), + fontsize=None, + arrowprops=dict(arrowstyle="->"), + ) + + ax.add_artist(ann) + + plt.draw() + plt.show() + diff --git a/lib/matplotlib/text.py b/lib/matplotlib/text.py index 3d20b963be66..ca0a5e822db4 100644 --- a/lib/matplotlib/text.py +++ b/lib/matplotlib/text.py @@ -1340,7 +1340,158 @@ def set_figure(self, fig): artist.kwdocd['TextWithDash'] = artist.kwdoc(TextWithDash) -class Annotation(Text): +class _AnnotationBase(object): + def __init__(self, + xy, xytext=None, + xycoords='data', textcoords=None, + annotation_clip=None): + if xytext is None: + xytext = xy + if textcoords is None: + textcoords = xycoords + # we'll draw ourself after the artist we annotate by default + x,y = self.xytext = xytext + + self.xy = xy + self.xycoords = xycoords + self.textcoords = textcoords + self.set_annotation_clip(annotation_clip) + + def _get_xy(self, x, y, s): + if s=='data': + trans = self.axes.transData + x = float(self.convert_xunits(x)) + y = float(self.convert_yunits(y)) + return trans.transform_point((x, y)) + elif s=='offset points': + # convert the data point + dx, dy = self.xy + + # prevent recursion + if self.xycoords == 'offset points': + return self._get_xy(dx, dy, 'data') + + dx, dy = self._get_xy(dx, dy, self.xycoords) + + # convert the offset + dpi = self.figure.get_dpi() + x *= dpi/72. + y *= dpi/72. + + # add the offset to the data point + x += dx + y += dy + + return x, y + elif s=='polar': + theta, r = x, y + x = r*np.cos(theta) + y = r*np.sin(theta) + trans = self.axes.transData + return trans.transform_point((x,y)) + elif s=='figure points': + #points from the lower left corner of the figure + dpi = self.figure.dpi + l,b,w,h = self.figure.bbox.bounds + r = l+w + t = b+h + + x *= dpi/72. + y *= dpi/72. + if x<0: + x = r + x + if y<0: + y = t + y + return x,y + elif s=='figure pixels': + #pixels from the lower left corner of the figure + l,b,w,h = self.figure.bbox.bounds + r = l+w + t = b+h + if x<0: + x = r + x + if y<0: + y = t + y + return x, y + elif s=='figure fraction': + #(0,0) is lower left, (1,1) is upper right of figure + trans = self.figure.transFigure + return trans.transform_point((x,y)) + elif s=='axes points': + #points from the lower left corner of the axes + dpi = self.figure.dpi + l,b,w,h = self.axes.bbox.bounds + r = l+w + t = b+h + if x<0: + x = r + x*dpi/72. + else: + x = l + x*dpi/72. + if y<0: + y = t + y*dpi/72. + else: + y = b + y*dpi/72. + return x, y + elif s=='axes pixels': + #pixels from the lower left corner of the axes + + l,b,w,h = self.axes.bbox.bounds + r = l+w + t = b+h + if x<0: + x = r + x + else: + x = l + x + if y<0: + y = t + y + else: + y = b + y + return x, y + elif s=='axes fraction': + #(0,0) is lower left, (1,1) is upper right of axes + trans = self.axes.transAxes + return trans.transform_point((x, y)) + + def set_annotation_clip(self, b): + """ + set *annotation_clip* attribute. + + * True : the annotation will only be drawn when self.xy is inside the axes. + * False : the annotation will always be drawn regardless of its position. + * None : the self.xy will be checked only if *xycoords* is "data" + """ + self._annotation_clip = b + + def get_annotation_clip(self): + """ + Return *annotation_clip* attribute. + See :meth:`set_annotation_clip` for the meaning of return values. + """ + return self._annotation_clip + + def _get_position_xy(self, renderer): + "Return the pixel position of the the annotated point." + x, y = self.xy + return self._get_xy(x, y, self.xycoords) + + def _check_xy(self, renderer, xy_pixel): + """ + given the xy pixel coordinate, check if the annotation need to + be drawn. + """ + + b = self.get_annotation_clip() + if b or (b is None and self.xycoords == "data"): + # check if self.xy is inside the axes. + if not self.axes.contains_point(xy_pixel): + return False + + return True + + + + +class Annotation(Text, _AnnotationBase): """ A :class:`~matplotlib.text.Text` class to make annotating things in the figure, such as :class:`~matplotlib.figure.Figure`, @@ -1354,6 +1505,7 @@ def __init__(self, s, xy, xycoords='data', textcoords=None, arrowprops=None, + annotation_clip=None, **kwargs): """ Annotate the *x*, *y* point *xy* with text *s* at *x*, *y* @@ -1442,16 +1594,14 @@ def __init__(self, s, xy, %(Text)s """ - if xytext is None: - xytext = xy - if textcoords is None: - textcoords = xycoords - # we'll draw ourself after the artist we annotate by default - x,y = self.xytext = xytext + + _AnnotationBase.__init__(self, + xy, xytext=xytext, + xycoords=xycoords, textcoords=textcoords, + annotation_clip=annotation_clip) + + x,y = self.xytext Text.__init__(self, x, y, s, **kwargs) - self.xy = xy - self.xycoords = xycoords - self.textcoords = textcoords self.arrowprops = arrowprops @@ -1465,9 +1615,6 @@ def __init__(self, s, xy, else: self.arrow_patch = None - # if True, draw annotation only if self.xy is inside the axes - self._annotation_clip = None - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd def contains(self,event): @@ -1489,118 +1636,6 @@ def set_figure(self, fig): self.arrow_patch.set_figure(fig) Artist.set_figure(self, fig) - def _get_xy(self, x, y, s): - if s=='data': - trans = self.axes.transData - x = float(self.convert_xunits(x)) - y = float(self.convert_yunits(y)) - return trans.transform_point((x, y)) - elif s=='offset points': - # convert the data point - dx, dy = self.xy - - # prevent recursion - if self.xycoords == 'offset points': - return self._get_xy(dx, dy, 'data') - - dx, dy = self._get_xy(dx, dy, self.xycoords) - - # convert the offset - dpi = self.figure.get_dpi() - x *= dpi/72. - y *= dpi/72. - - # add the offset to the data point - x += dx - y += dy - - return x, y - elif s=='polar': - theta, r = x, y - x = r*np.cos(theta) - y = r*np.sin(theta) - trans = self.axes.transData - return trans.transform_point((x,y)) - elif s=='figure points': - #points from the lower left corner of the figure - dpi = self.figure.dpi - l,b,w,h = self.figure.bbox.bounds - r = l+w - t = b+h - - x *= dpi/72. - y *= dpi/72. - if x<0: - x = r + x - if y<0: - y = t + y - return x,y - elif s=='figure pixels': - #pixels from the lower left corner of the figure - l,b,w,h = self.figure.bbox.bounds - r = l+w - t = b+h - if x<0: - x = r + x - if y<0: - y = t + y - return x, y - elif s=='figure fraction': - #(0,0) is lower left, (1,1) is upper right of figure - trans = self.figure.transFigure - return trans.transform_point((x,y)) - elif s=='axes points': - #points from the lower left corner of the axes - dpi = self.figure.dpi - l,b,w,h = self.axes.bbox.bounds - r = l+w - t = b+h - if x<0: - x = r + x*dpi/72. - else: - x = l + x*dpi/72. - if y<0: - y = t + y*dpi/72. - else: - y = b + y*dpi/72. - return x, y - elif s=='axes pixels': - #pixels from the lower left corner of the axes - - l,b,w,h = self.axes.bbox.bounds - r = l+w - t = b+h - if x<0: - x = r + x - else: - x = l + x - if y<0: - y = t + y - else: - y = b + y - return x, y - elif s=='axes fraction': - #(0,0) is lower left, (1,1) is upper right of axes - trans = self.axes.transAxes - return trans.transform_point((x, y)) - - def set_annotation_clip(self, b): - """ - set *annotation_clip* attribute. - - * True : the annotation will only be drawn when self.xy is inside the axes. - * False : the annotation will always be drawn regardless of its position. - * None : the self.xy will be checked only if *xycoords* is "data" - """ - self._annotation_clip = b - - def get_annotation_clip(self): - """ - Return *annotation_clip* attribute. - See :meth:`set_annotation_clip` for the meaning of return values. - """ - return self._annotation_clip - def update_positions(self, renderer): "Update the pixel positions of the annotated point and the text." @@ -1608,12 +1643,6 @@ def update_positions(self, renderer): self._update_position_xytext(renderer, xy_pixel) - def _get_position_xy(self, renderer): - "Return the pixel position of the the annotated point." - x, y = self.xy - return self._get_xy(x, y, self.xycoords) - - def _update_position_xytext(self, renderer, xy_pixel): "Update the pixel positions of the annotation text and the arrow patch." @@ -1698,21 +1727,6 @@ def _update_position_xytext(self, renderer, xy_pixel): self.arrow.set_clip_box(self.get_clip_box()) - def _check_xy(self, renderer, xy_pixel): - """ - given the xy pixel coordinate, check if the annotation need to - be drawn. - """ - - b = self.get_annotation_clip() - if b or (b is None and self.xycoords == "data"): - # check if self.xy is inside the axes. - if not self.axes.contains_point(xy_pixel): - return False - - return True - - def draw(self, renderer): """ Draw the :class:`Annotation` object to the given *renderer*. diff --git a/lib/mpl_toolkits/axes_grid/anchored_artists.py b/lib/mpl_toolkits/axes_grid/anchored_artists.py index 035eb527a0e4..045a4834de8c 100644 --- a/lib/mpl_toolkits/axes_grid/anchored_artists.py +++ b/lib/mpl_toolkits/axes_grid/anchored_artists.py @@ -1,41 +1,35 @@ - -from matplotlib.font_manager import FontProperties -from matplotlib import rcParams from matplotlib.patches import Rectangle, Ellipse -from matplotlib.offsetbox import AnchoredOffsetbox, AuxTransformBox, VPacker,\ - TextArea, DrawingArea - - -class AnchoredText(AnchoredOffsetbox): - def __init__(self, s, loc, pad=0.4, borderpad=0.5, prop=None, **kwargs): - - self.txt = TextArea(s, textprops=prop, - minimumdescent=False) - fp = self.txt._text.get_fontproperties() - - super(AnchoredText, self).__init__(loc, pad=pad, borderpad=borderpad, - child=self.txt, - prop=fp, - **kwargs) +import numpy as np +from matplotlib.offsetbox import AnchoredOffsetbox, AuxTransformBox, VPacker,\ + TextArea, AnchoredText, DrawingArea, AnnotationBbox class AnchoredDrawingArea(AnchoredOffsetbox): + """ + AnchoredOffsetbox with DrawingArea + """ + def __init__(self, width, height, xdescent, ydescent, loc, pad=0.4, borderpad=0.5, prop=None, frameon=True, **kwargs): + """ + *width*, *height*, *xdescent*, *ydescent* : the dimensions of the DrawingArea. + *prop* : font property. this is only used for scaling the paddings. + """ self.da = DrawingArea(width, height, xdescent, ydescent, clip=True) self.drawing_area = self.da - + super(AnchoredDrawingArea, self).__init__(loc, pad=pad, borderpad=borderpad, child=self.da, prop=None, frameon=frameon, **kwargs) + class AnchoredAuxTransformBox(AnchoredOffsetbox): def __init__(self, transform, loc, pad=0.4, borderpad=0.5, prop=None, frameon=True, **kwargs): @@ -49,6 +43,7 @@ def __init__(self, transform, loc, **kwargs) + class AnchoredEllipse(AnchoredOffsetbox): def __init__(self, transform, width, height, angle, loc, pad=0.1, borderpad=0.1, prop=None, frameon=True, **kwargs): @@ -93,3 +88,73 @@ def __init__(self, transform, size, label, loc, prop=prop, frameon=frameon, **kwargs) + +if __name__ == "__main__": + + import matplotlib.pyplot as plt + + fig = plt.gcf() + fig.clf() + ax = plt.subplot(111) + + offsetbox = AnchoredText("Test", loc=6, pad=0.3, + borderpad=0.3, prop=None) + xy = (0.5, 0.5) + ax.plot([0.5], [0.5], "xk") + ab = AnnotationBbox(offsetbox, xy, + xybox=(1., .5), + xycoords='data', + boxcoords=("axes fraction", "data"), + arrowprops=dict(arrowstyle="->")) + #arrowprops=None) + + ax.add_artist(ab) + + + from matplotlib.patches import Circle + ada = AnchoredDrawingArea(20, 20, 0, 0, + loc=6, pad=0.1, borderpad=0.3, frameon=True) + p = Circle((10, 10), 10) + ada.da.add_artist(p) + + ab = AnnotationBbox(ada, (0.3, 0.4), + xybox=(1., 0.4), + xycoords='data', + boxcoords=("axes fraction", "data"), + arrowprops=dict(arrowstyle="->")) + #arrowprops=None) + + ax.add_artist(ab) + + + arr = np.arange(100).reshape((10,10)) + im = AnchoredImage(arr, + loc=4, + pad=0.5, borderpad=0.2, prop=None, frameon=True, + zoom=1, + cmap = None, + norm = None, + interpolation=None, + origin=None, + extent=None, + filternorm=1, + filterrad=4.0, + resample = False, + ) + + ab = AnnotationBbox(im, (0.5, 0.5), + xybox=(-10., 10.), + xycoords='data', + boxcoords="offset points", + arrowprops=dict(arrowstyle="->")) + #arrowprops=None) + + ax.add_artist(ab) + + ax.set_xlim(0, 1) + ax.set_ylim(0, 1) + + + plt.draw() + plt.show() + From 88b0b3a17cb0b9b755bcddf6bb6f47b3101dbf11 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Sun, 9 Aug 2009 20:58:24 +0000 Subject: [PATCH 0056/1000] added demo_text_path.py svn path=/trunk/matplotlib/; revision=7441 --- examples/pylab_examples/demo_text_path.py | 213 ++++++++++++++++++++++ 1 file changed, 213 insertions(+) create mode 100644 examples/pylab_examples/demo_text_path.py diff --git a/examples/pylab_examples/demo_text_path.py b/examples/pylab_examples/demo_text_path.py new file mode 100644 index 000000000000..e0ec0dbe2a05 --- /dev/null +++ b/examples/pylab_examples/demo_text_path.py @@ -0,0 +1,213 @@ + +# -*- coding: utf-8 -*- + +import matplotlib.pyplot as plt +from matplotlib.image import BboxImage +import numpy as np +from matplotlib.transforms import Affine2D, IdentityTransform + +import matplotlib.font_manager as font_manager +from matplotlib.ft2font import FT2Font, KERNING_DEFAULT, LOAD_NO_HINTING +from matplotlib.font_manager import FontProperties +from matplotlib.path import Path +import matplotlib.patches as mpatches + +from matplotlib.offsetbox import AnnotationBbox,\ + AnchoredOffsetbox, AuxTransformBox + +#from matplotlib.offsetbox import + +from matplotlib.cbook import get_sample_data + + +class TextPatch(mpatches.PathPatch): + + FONT_SCALE = 100. + + def __init__(self, xy, s, size=None, prop=None, bbox_image=None, + *kl, **kwargs): + if prop is None: + prop = FontProperties() + + if size is None: + size = prop.get_size_in_points() + + self._xy = xy + self.set_size(size) + + self.text_path = self.text_get_path(prop, s) + + mpatches.PathPatch.__init__(self, self.text_path, *kl, **kwargs) + + self._init_bbox_image(bbox_image) + + + def _init_bbox_image(self, im): + + if im is None: + self.bbox_image = None + else: + bbox_image = BboxImage(self.get_window_extent, + norm = None, + origin=None, + ) + bbox_image.set_transform(IdentityTransform()) + + bbox_image.set_data(im) + self.bbox_image = bbox_image + + def draw(self, renderer=None): + + + if self.bbox_image is not None: + # the clip path must be updated every draw. any solution? -JJ + self.bbox_image.set_clip_path(self.text_path, self.get_transform()) + self.bbox_image.draw(renderer) + + mpatches.PathPatch.draw(self, renderer) + + + def set_size(self, size): + self._size = size + + def get_size(self): + return self._size + + def get_patch_transform(self): + tr = Affine2D().scale(self._size/self.FONT_SCALE, self._size/self.FONT_SCALE) + return tr.translate(*self._xy) + + def glyph_char_path(self, glyph, currx=0.): + + verts, codes = [], [] + for step in glyph.path: + if step[0] == 0: # MOVE_TO + verts.append((step[1], step[2])) + codes.append(Path.MOVETO) + elif step[0] == 1: # LINE_TO + verts.append((step[1], step[2])) + codes.append(Path.LINETO) + elif step[0] == 2: # CURVE3 + verts.extend([(step[1], step[2]), + (step[3], step[4])]) + codes.extend([Path.CURVE3, Path.CURVE3]) + elif step[0] == 3: # CURVE4 + verts.extend([(step[1], step[2]), + (step[3], step[4]), + (step[5], step[6])]) + codes.extend([Path.CURVE4, Path.CURVE4, Path.CURVE4]) + elif step[0] == 4: # ENDPOLY + verts.append((0, 0,)) + codes.append(Path.CLOSEPOLY) + + verts = [(x+currx, y) for (x,y) in verts] + + return verts, codes + + + def text_get_path(self, prop, s): + + fname = font_manager.findfont(prop) + font = FT2Font(str(fname)) + + font.set_size(self.FONT_SCALE, 72) + + cmap = font.get_charmap() + lastgind = None + + currx = 0 + + verts, codes = [], [] + + for c in s: + + ccode = ord(c) + gind = cmap.get(ccode) + if gind is None: + ccode = ord('?') + gind = 0 + glyph = font.load_char(ccode, flags=LOAD_NO_HINTING) + + + if lastgind is not None: + kern = font.get_kerning(lastgind, gind, KERNING_DEFAULT) + else: + kern = 0 + currx += (kern / 64.0) #/ (self.FONT_SCALE) + + verts1, codes1 = self.glyph_char_path(glyph, currx) + verts.extend(verts1) + codes.extend(codes1) + + + currx += (glyph.linearHoriAdvance / 65536.0) #/ (self.FONT_SCALE) + lastgind = gind + + return Path(verts, codes) + +if 1: + + fig = plt.figure(1) + + # EXAMPLE 1 + + ax = plt.subplot(211) + + from matplotlib._png import read_png + fn = get_sample_data("lena.png", asfileobj=False) + arr = read_png(fn) + p = TextPatch((0, 0), "!?", size=150, fc="none", ec="k", + bbox_image=arr, + transform=IdentityTransform()) + p.set_clip_on(False) + + # make offset box + offsetbox = AuxTransformBox(IdentityTransform()) + offsetbox.add_artist(p) + + # make anchored offset box + ao = AnchoredOffsetbox(loc=2, child=offsetbox, frameon=True, borderpad=0.2) + + ax.add_artist(ao) + + + + # EXAMPLE 2 + + ax = plt.subplot(212) + + shadow1 = TextPatch((3, -2), "TextPath", size=70, fc="none", ec="0.6", lw=3, + transform=IdentityTransform()) + shadow2 = TextPatch((3, -2), "TextPath", size=70, fc="0.3", ec="none", + transform=IdentityTransform()) + + arr = np.arange(256).reshape(1,256)/256. + text_path = TextPatch((0, 0), "TextPath", size=70, fc="none", ec="none", lw=1, + bbox_image=arr, + transform=IdentityTransform()) + + # make offset box + offsetbox = AuxTransformBox(IdentityTransform()) + offsetbox.add_artist(shadow1) + offsetbox.add_artist(shadow2) + offsetbox.add_artist(text_path) + + # place the anchored offset box using AnnotationBbox + ab = AnnotationBbox(offsetbox, (0.5, 0.5), + xycoords='data', + boxcoords="offset points", + box_alignment=(0.5,0.5), + ) + + + ax.add_artist(ab) + + ax.set_xlim(0, 1) + ax.set_ylim(0, 1) + + + + + + plt.draw() + plt.show() From 8644c6c698df4b96df290f7c32aebd9885b0144d Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Mon, 10 Aug 2009 00:47:21 +0000 Subject: [PATCH 0057/1000] Merged revisions 7442-7444 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7442 | efiring | 2009-08-09 14:02:56 -1000 (Sun, 09 Aug 2009) | 2 lines patch from sage project: make unicode_safe safer ........ r7443 | efiring | 2009-08-09 14:19:19 -1000 (Sun, 09 Aug 2009) | 3 lines Patch from Jason, sage project: prevent failure with tiny arrows. Also deleting unwanted whitespace in bezier.py. ........ r7444 | efiring | 2009-08-09 14:31:30 -1000 (Sun, 09 Aug 2009) | 3 lines Sage patch, slightly modified, to improve tk/tcl detection. http://trac.sagemath.org/sage_trac/ticket/4176 ........ svn path=/trunk/matplotlib/; revision=7445 --- lib/matplotlib/bezier.py | 62 +++++++++++++++++++-------------------- lib/matplotlib/cbook.py | 12 ++++++-- lib/matplotlib/patches.py | 14 ++++++--- setupext.py | 3 +- 4 files changed, 53 insertions(+), 38 deletions(-) diff --git a/lib/matplotlib/bezier.py b/lib/matplotlib/bezier.py index 56b4a5d07643..6c261f40c311 100644 --- a/lib/matplotlib/bezier.py +++ b/lib/matplotlib/bezier.py @@ -18,7 +18,7 @@ def get_intersection(cx1, cy1, cos_t1, sin_t1, """ return a intersecting point between a line through (cx1, cy1) and having angle t1 and a line through (cx2, cy2) and angle t2. """ - + # line1 => sin_t1 * (x - cx1) - cos_t1 * (y - cy1) = 0. # line1 => sin_t1 * x + cos_t1 * y = sin_t1*cx1 - cos_t1*cy1 @@ -32,7 +32,7 @@ def get_intersection(cx1, cy1, cos_t1, sin_t1, ad_bc = a*d-b*c if ad_bc == 0.: raise ValueError("Given lines do not intersect") - + #rhs_inverse a_, b_ = d, -b c_, d_ = -c, a @@ -53,7 +53,7 @@ def get_normal_points(cx, cy, cos_t, sin_t, length): if length == 0.: return cx, cy, cx, cy - + cos_t1, sin_t1 = sin_t, -cos_t cos_t2, sin_t2 = -sin_t, cos_t @@ -81,7 +81,7 @@ def _de_casteljau1(beta, t): def split_de_casteljau(beta, t): """split a bezier segment defined by its controlpoints *beta* into two separate segment divided at *t* and return their control points. - + """ beta = np.asarray(beta) beta_list = [beta] @@ -101,20 +101,20 @@ def split_de_casteljau(beta, t): -def find_bezier_t_intersecting_with_closedpath(bezier_point_at_t, inside_closedpath, +def find_bezier_t_intersecting_with_closedpath(bezier_point_at_t, inside_closedpath, t0=0., t1=1., tolerence=0.01): """ Find a parameter t0 and t1 of the given bezier path which bounds the intersecting points with a provided closed path(*inside_closedpath*). Search starts from *t0* and *t1* and it uses a simple bisecting algorithm therefore one of the end point must be inside the path while the orther doesn't. The search stop - when |t0-t1| gets smaller than the given tolerence. + when |t0-t1| gets smaller than the given tolerence. value for - bezier_point_at_t : a function which returns x, y coordinates at *t* - inside_closedpath : return True if the point is insed the path - + """ # inside_closedpath : function @@ -146,7 +146,7 @@ def find_bezier_t_intersecting_with_closedpath(bezier_point_at_t, inside_closedp t0 = middle_t start = middle start_inside = middle_inside - + @@ -192,19 +192,19 @@ def point_at_t(self, t): def split_bezier_intersecting_with_closedpath(bezier, - inside_closedpath, + inside_closedpath, tolerence=0.01): """ bezier : control points of the bezier segment inside_closedpath : a function which returns true if the point is inside the path """ - + bz = BezierSegment(bezier) bezier_point_at_t = bz.point_at_t t0, t1 = find_bezier_t_intersecting_with_closedpath(bezier_point_at_t, - inside_closedpath, + inside_closedpath, tolerence=tolerence) _left, _right = split_de_casteljau(bezier, (t0+t1)/2.) @@ -213,23 +213,23 @@ def split_bezier_intersecting_with_closedpath(bezier, def find_r_to_boundary_of_closedpath(inside_closedpath, xy, - cos_t, sin_t, + cos_t, sin_t, rmin=0., rmax=1., tolerence=0.01): """ Find a radius r (centered at *xy*) between *rmin* and *rmax* at which it intersect with the path. - + inside_closedpath : function cx, cy : center cos_t, sin_t : cosine and sine for the angle - rmin, rmax : + rmin, rmax : """ cx, cy = xy def _f(r): return cos_t*r + cx, sin_t*r + cy - find_bezier_t_intersecting_with_closedpath(_f, inside_closedpath, + find_bezier_t_intersecting_with_closedpath(_f, inside_closedpath, t0=rmin, t1=rmax, tolerence=tolerence) @@ -238,7 +238,7 @@ def _f(r): def split_path_inout(path, inside, tolerence=0.01, reorder_inout=False): """ divide a path into two segment at the point where inside(x, y) - becomes False. + becomes False. """ path_iter = path.iter_segments() @@ -262,7 +262,7 @@ def split_path_inout(path, inside, tolerence=0.01, reorder_inout=False): break ctl_points_old = ctl_points - + if bezier_path is None: raise ValueError("The path does not seem to intersect with the patch") @@ -286,7 +286,7 @@ def split_path_inout(path, inside, tolerence=0.01, reorder_inout=False): verts_right = right[:] #i += 1 - + if path.codes is None: path_in = Path(concat([path.vertices[:i], verts_left])) path_out = Path(concat([verts_right, path.vertices[i:]])) @@ -297,14 +297,14 @@ def split_path_inout(path, inside, tolerence=0.01, reorder_inout=False): path_out = Path(concat([verts_right, path.vertices[i:]]), concat([codes_right, path.codes[i:]])) - + if reorder_inout and begin_inside == False: path_in, path_out = path_out, path_in return path_in, path_out - - + + def inside_circle(cx, cy, r): @@ -328,7 +328,7 @@ def get_parallels(bezier2, width): """ Given the quadraitc bezier control points *bezier2*, returns control points of quadrativ bezier lines roughly parralel to given - one separated by *width*. + one separated by *width*. """ # The parallel bezier lines constructed by following ways. @@ -374,7 +374,7 @@ def make_wedged_bezier2(bezier2, length, shrink_factor=0.5): """ Being similar to get_parallels, returns control points of two quadrativ bezier lines having a width roughly parralel to given - one separated by *width*. + one separated by *width*. """ xx1, yy1 = bezier2[2] @@ -389,17 +389,17 @@ def make_wedged_bezier2(bezier2, length, shrink_factor=0.5): x1, y1, x2, y2 = get_normal_points(cx, cy, cos_t, sin_t, length) - xx12, yy12 = (xx1+xx2)/2., (yy1+yy2)/2., - xx23, yy23 = (xx2+xx3)/2., (yy2+yy3)/2., + xx12, yy12 = (xx1+xx2)/2., (yy1+yy2)/2., + xx23, yy23 = (xx2+xx3)/2., (yy2+yy3)/2., dist = sqrt((xx12-xx23)**2 + (yy12-yy23)**2) cos_t, sin_t = (xx12-xx23)/dist, (yy12-yy23)/dist, - + xm1, ym1, xm2, ym2 = get_normal_points(xx2, yy2, cos_t, sin_t, length*shrink_factor) l_plus = [(x1, y1), (xm1, ym1), (xx1, yy1)] l_minus = [(x2, y2), (xm2, ym2), (xx1, yy1)] - + return l_plus, l_minus @@ -418,7 +418,7 @@ def make_wedged_bezier2(bezier2, width, w1=1., wm=0.5, w2=0.): """ Being similar to get_parallels, returns control points of two quadrativ bezier lines having a width roughly parralel to given - one separated by *width*. + one separated by *width*. """ # c1, cm, c2 @@ -446,9 +446,9 @@ def make_wedged_bezier2(bezier2, width, w1=1., wm=0.5, w2=0.): # find c12, c23 and c123 which are middle points of c1-cm, cm-c3 and c12-c23 c12x, c12y = (c1x+cmx)*.5, (c1y+cmy)*.5 - c23x, c23y = (cmx+c3x)*.5, (cmy+c3y)*.5 + c23x, c23y = (cmx+c3x)*.5, (cmy+c3y)*.5 c123x, c123y = (c12x+c23x)*.5, (c12y+c23y)*.5 - + # tangential angle of c123 (angle between c12 and c23) cos_t123, sin_t123 = get_cos_sin(c12x, c12y, c23x, c23y) @@ -481,7 +481,7 @@ def make_path_regular(p): return Path(p.vertices, c) else: return p - + def concatenate_paths(paths): """ concatenate list of paths into a single path. diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index 325de12ddf57..9e065abeb3a5 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -19,13 +19,21 @@ major, minor1, minor2, s, tmp = sys.version_info -# on some systems, locale.getpreferredencoding returns None, which can break unicode -preferredencoding = locale.getpreferredencoding() +# On some systems, locale.getpreferredencoding returns None, +# which can break unicode; and the sage project reports that +# some systems have incorrect locale specifications, e.g., +# an encoding instead of a valid locale name. + +try: + preferredencoding = locale.getpreferredencoding() +except ValueError: + preferredencoding = None def unicode_safe(s): if preferredencoding is None: return unicode(s) else: return unicode(s, preferredencoding) + class converter: """ Base class for handling string -> python type with support for diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 723556560048..6b75d478f577 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -2326,15 +2326,21 @@ def _shrink(self, path, shrinkA, shrinkB): x, y = path.vertices[0] insideA = inside_circle(x, y, shrinkA) - left, right = split_path_inout(path, insideA) - path = right + try: + left, right = split_path_inout(path, insideA) + path = right + except ValueError: + pass if shrinkB: x, y = path.vertices[-1] insideB = inside_circle(x, y, shrinkB) - left, right = split_path_inout(path, insideB) - path = left + try: + left, right = split_path_inout(path, insideB) + path = left + except ValueError: + pass return path diff --git a/setupext.py b/setupext.py index 233b8bd62c4f..2bc7cba8b310 100644 --- a/setupext.py +++ b/setupext.py @@ -545,7 +545,7 @@ def add_ft2font_flags(module): else: add_base_flags(module) module.libraries.append('z') - + # put this last for library link order module.libraries.extend(std_libs) @@ -1037,6 +1037,7 @@ def add_tk_flags(module): try: tcl_lib_dir, tk_lib_dir, tk_ver = query_tcltk() except: + tk_ver = '' result = hardcoded_tcl_config() else: result = parse_tcl_config(tcl_lib_dir, tk_lib_dir) From b9530195af8e5d81ca2c9eb8d180ea6d63a1f33f Mon Sep 17 00:00:00 2001 From: Reinier Heeres Date: Tue, 11 Aug 2009 07:16:27 +0000 Subject: [PATCH 0058/1000] Merged revisions 7446 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7446 | heeres | 2009-08-11 09:06:15 +0200 (Tue, 11 Aug 2009) | 2 lines Fix bugs: #2830483 (axis scaling), 2834105 (z order problem) ........ svn path=/trunk/matplotlib/; revision=7447 --- lib/mpl_toolkits/mplot3d/art3d.py | 14 ++++++++++++-- lib/mpl_toolkits/mplot3d/axes3d.py | 19 ++++++++++--------- lib/mpl_toolkits/mplot3d/axis3d.py | 3 --- 3 files changed, 22 insertions(+), 14 deletions(-) diff --git a/lib/mpl_toolkits/mplot3d/art3d.py b/lib/mpl_toolkits/mplot3d/art3d.py index 8c28ca2d7b9c..cec906e42360 100644 --- a/lib/mpl_toolkits/mplot3d/art3d.py +++ b/lib/mpl_toolkits/mplot3d/art3d.py @@ -217,9 +217,19 @@ def do_3d_projection(self, renderer): def draw(self, renderer): Patch.draw(self, renderer) +def get_patch_verts(patch): + """Return a list of vertices for the path of a patch.""" + trans = patch.get_patch_transform() + path = patch.get_path() + polygons = path.to_polygons(trans) + if len(polygons): + return polygons[0] + else: + return [] + def patch_2d_to_3d(patch, z=0, zdir='z'): """Convert a Patch to a Patch3D object.""" - verts = patch.get_verts() + verts = get_patch_verts(patch) patch.__class__ = Patch3D patch.set_3d_properties(verts, z, zdir) @@ -333,7 +343,7 @@ def do_3d_projection(self, renderer): if self._zsort: z_segments_2d = [(np.average(zs), zip(xs, ys), fc, ec) for (xs, ys, zs), fc, ec in zip(xyzlist, cface, cedge)] - z_segments_2d.sort(reverse=True) + z_segments_2d.sort(cmp=lambda x, y: cmp(y[0], x[0])) else: raise ValueError, "whoops" diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 1b8632ae0be0..1f62c7e98598 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -200,14 +200,17 @@ def autoscale_view(self, scalex=True, scaley=True, scalez=True): def get_w_lims(self): '''Get 3d world limits.''' - minpy, maxx = self.get_xlim3d() + minx, maxx = self.get_xlim3d() miny, maxy = self.get_ylim3d() minz, maxz = self.get_zlim3d() - return minpy, maxx, miny, maxy, minz, maxz + return minx, maxx, miny, maxy, minz, maxz def _determine_lims(self, xmin=None, xmax=None, *args, **kwargs): if xmax is None and cbook.iterable(xmin): xmin, xmax = xmin + if xmin == xmax: + xmin -= 0.5 + xmax += 0.5 return (xmin, xmax) def set_xlim3d(self, *args, **kwargs): @@ -442,12 +445,12 @@ def _on_move(self, event): elif self.button_pressed == 3: # zoom view # hmmm..this needs some help from clipping.... - minpy, maxx, miny, maxy, minz, maxz = self.get_w_lims() + minx, maxx, miny, maxy, minz, maxz = self.get_w_lims() df = 1-((h - dy)/h) - dx = (maxx-minpy)*df + dx = (maxx-minx)*df dy = (maxy-miny)*df dz = (maxz-minz)*df - self.set_xlim3d(minpy - dx, maxx + dx) + self.set_xlim3d(minx - dx, maxx + dx) self.set_ylim3d(miny - dy, maxy + dy) self.set_zlim3d(minz - dz, maxz + dz) self.get_proj() @@ -903,13 +906,12 @@ def bar(self, left, height, zs=0, zdir='z', *args, **kwargs): patches = Axes.bar(self, left, height, *args, **kwargs) if not cbook.iterable(zs): - zs = np.ones(len(left))*zs - + zs = np.ones(len(left)) * zs verts = [] verts_zs = [] for p, z in zip(patches, zs): - vs = p.get_verts() + vs = art3d.get_patch_verts(p) verts += vs.tolist() verts_zs += [z] * len(vs) art3d.patch_2d_to_3d(p, zs, zdir) @@ -933,7 +935,6 @@ def bar3d(self, x, y, z, dx, dy, dz, color='b'): had_data = self.has_data() if not cbook.iterable(x): - print 'not interable' x, y, z = [x], [y], [z] if not cbook.iterable(dx): dx, dy, dz = [dx], [dy], [dz] diff --git a/lib/mpl_toolkits/mplot3d/axis3d.py b/lib/mpl_toolkits/mplot3d/axis3d.py index 0386eff24e84..5ad0906b7134 100644 --- a/lib/mpl_toolkits/mplot3d/axis3d.py +++ b/lib/mpl_toolkits/mplot3d/axis3d.py @@ -103,9 +103,6 @@ def get_tick_positions(self): def get_major_ticks(self): ticks = maxis.XAxis.get_major_ticks(self) for t in ticks: - def update_coords(renderer, self=t.label1): - return text_update_coords(self, renderer) - # Text overrides setattr so need this to force new method t.tick1line.set_transform(self.axes.transData) t.tick2line.set_transform(self.axes.transData) t.gridline.set_transform(self.axes.transData) From dcf8645c2496e11339dd8da0b926b2b375ab0a26 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Wed, 12 Aug 2009 00:04:43 +0000 Subject: [PATCH 0059/1000] add OffsetBox.contains method svn path=/trunk/matplotlib/; revision=7474 --- lib/matplotlib/offsetbox.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/matplotlib/offsetbox.py b/lib/matplotlib/offsetbox.py index 4bc6be3f7366..5e7d0f7ac25a 100644 --- a/lib/matplotlib/offsetbox.py +++ b/lib/matplotlib/offsetbox.py @@ -152,6 +152,13 @@ def set_figure(self, fig): for c in self.get_children(): c.set_figure(fig) + def contains(self, mouseevent): + for c in self.get_children(): + a, b = c.contains(mouseevent) + if a: + return a, b + return False, {} + def set_offset(self, xy): """ Set the offset From 87a1ae3eef535ca7265e4c6b610330214f34812e Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 12 Aug 2009 19:17:09 +0000 Subject: [PATCH 0060/1000] New version of Gouraud quadmesh shader with 4 triangles per quad. svn path=/trunk/matplotlib/; revision=7478 --- examples/pylab_examples/quadmesh_demo.py | 2 +- lib/matplotlib/collections.py | 48 +++++++++++++----------- src/_backend_agg.cpp | 4 ++ 3 files changed, 31 insertions(+), 23 deletions(-) diff --git a/examples/pylab_examples/quadmesh_demo.py b/examples/pylab_examples/quadmesh_demo.py index 597eb8ec6e14..6b8e63d2bec1 100644 --- a/examples/pylab_examples/quadmesh_demo.py +++ b/examples/pylab_examples/quadmesh_demo.py @@ -38,7 +38,7 @@ #cmap.set_bad('r', 1.0) #ax.pcolormesh(Qx,Qz,Zm, cmap=cmap) # Or use the default, which is transparent: -col = ax.pcolormesh(Qx,Qz,Zm) +col = ax.pcolormesh(Qx,Qz,Zm,shading='gouraud') ax.set_title('With masked values') diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index c6cd0e6c5d71..fff80d727895 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -1132,40 +1132,44 @@ def convert_mesh_to_paths(meshWidth, meshHeight, coordinates): def convert_mesh_to_triangles(self, meshWidth, meshHeight, coordinates): """ Converts a given mesh into a sequence of triangles, each point - with its own color - :class:`matplotlib.path.Path` objects for easier rendering by - backends that do not directly support quadmeshes. - - This function is primarily of use to backend implementers. + with its own color. This is useful for experiments using + `draw_qouraud_triangle`. """ Path = mpath.Path if ma.isMaskedArray(coordinates): - c = coordinates.data + p = coordinates.data else: - c = coordinates + p = coordinates + + p_a = p[0:-1, 0:-1] + p_b = p[0:-1, 1: ] + p_c = p[1: , 1: ] + p_d = p[1: , 0:-1] + p_center = (p_a + p_b + p_c + p_d) / 4.0 triangles = np.concatenate(( - c[0:-1, 0:-1], - c[0:-1, 1: ], - c[1: , 1: ], - c[1: , 1: ], - c[1: , 0:-1], - c[0:-1, 0:-1] + p_a, p_b, p_center, + p_b, p_c, p_center, + p_c, p_d, p_center, + p_d, p_a, p_center, ), axis=2) - triangles = triangles.reshape((meshWidth * meshHeight * 2, 3, 2)) + triangles = triangles.reshape((meshWidth * meshHeight * 4, 3, 2)) c = self.get_facecolor().reshape((meshHeight + 1, meshWidth + 1, 4)) + c_a = c[0:-1, 0:-1] + c_b = c[0:-1, 1: ] + c_c = c[1: , 1: ] + c_d = c[1: , 0:-1] + c_center = (c_a + c_b + c_c + c_d) / 4.0 + colors = np.concatenate(( - c[0:-1, 0:-1], - c[0:-1, 1: ], - c[1: , 1: ], - c[1: , 1: ], - c[1: , 0:-1], - c[0:-1, 0:-1] + c_a, c_b, c_center, + c_b, c_c, c_center, + c_c, c_d, c_center, + c_d, c_a, c_center, ), axis=2) - - colors = colors.reshape((meshWidth * meshHeight * 2, 3, 4)) + colors = colors.reshape((meshWidth * meshHeight * 4, 3, 4)) return triangles, colors diff --git a/src/_backend_agg.cpp b/src/_backend_agg.cpp index 643d28cd217c..6285a245e11a 100644 --- a/src/_backend_agg.cpp +++ b/src/_backend_agg.cpp @@ -1470,6 +1470,10 @@ RendererAgg::draw_gouraud_triangle(const Py::Tuple& args) { Py::Object colors_obj = args[2]; agg::trans_affine trans = py_to_agg_transformation_matrix(args[3].ptr()); + theRasterizer.reset_clipping(); + rendererBase.reset_clipping(true); + set_clipbox(gc.cliprect, theRasterizer); + trans *= agg::trans_affine_scaling(1.0, -1.0); trans *= agg::trans_affine_translation(0.0, (double)height); From 006a52c6f0166770acc7b217b4130fe6bf389fd8 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Fri, 14 Aug 2009 03:29:14 +0000 Subject: [PATCH 0061/1000] Merged revisions 7484 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7484 | efiring | 2009-08-13 15:58:44 -1000 (Thu, 13 Aug 2009) | 3 lines Prevent exception when image is off screen and out of the axes. Bug reported by G. Jones. ........ svn path=/trunk/matplotlib/; revision=7485 --- lib/matplotlib/image.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index 19cc69ac48f2..35f1b435318c 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -134,6 +134,8 @@ def draw(self, renderer, *args, **kwargs): self.axes.get_yscale() != 'linear'): warnings.warn("Images are not supported on non-linear axes.") im = self.make_image(renderer.get_image_magnification()) + if im is None: + return im._url = self.get_url() l, b, widthDisplay, heightDisplay = self.axes.bbox.bounds gc = renderer.new_gc() @@ -167,6 +169,8 @@ def contains(self, mouseevent): def write_png(self, fname, noscale=False): """Write the image to png file with fname""" im = self.make_image() + if im is None: + return if noscale: numrows, numcols = im.get_size() im.reset_matrix() @@ -406,7 +410,8 @@ def make_image(self, magnification=1.0): # image input dimensions im.reset_matrix() numrows, numcols = im.get_size() - + if numrows < 1 or numcols < 1: # out of range + return None im.set_interpolation(self._interpd[self._interpolation]) im.set_resample(self._resample) From 1e6f21eb062d2c6b4723fb4d15310e45be4ca704 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Fri, 14 Aug 2009 13:56:44 +0000 Subject: [PATCH 0062/1000] Merged revisions 7486 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7486 | mdboom | 2009-08-14 09:30:32 -0400 (Fri, 14 Aug 2009) | 2 lines Fix documentation about Axis.transAxis (thanks Jason Sage) ........ svn path=/trunk/matplotlib/; revision=7487 --- lib/matplotlib/axis.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index 5da33792fb7e..be6dd6d90108 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -501,8 +501,8 @@ class Axis(artist.Artist): """ Public attributes - * :attr:`transData` - transform data coords to display coords - * :attr:`transAxis` - transform axis coords to display coords + * :attr:`axes.transData` - transform data coords to display coords + * :attr:`axes.transAxes` - transform axis coords to display coords * :attr:`labelpad` - number of points between the axis and its label """ OFFSETTEXTPAD = 3 From b5f348da9c3126e618dee700de37066602d378af Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Fri, 14 Aug 2009 18:11:05 +0000 Subject: [PATCH 0063/1000] add support for image filtering in agg backend svn path=/trunk/matplotlib/; revision=7488 --- CHANGELOG | 3 + examples/pylab_examples/demo_agg_filter.py | 312 +++++++++++++++++++++ lib/matplotlib/artist.py | 23 +- lib/matplotlib/backend_bases.py | 24 ++ lib/matplotlib/backends/backend_agg.py | 75 ++++- lib/matplotlib/backends/backend_mixed.py | 1 + lib/matplotlib/colors.py | 22 +- lib/matplotlib/text.py | 4 + 8 files changed, 452 insertions(+), 12 deletions(-) create mode 100644 examples/pylab_examples/demo_agg_filter.py diff --git a/CHANGELOG b/CHANGELOG index ac689e35fed3..f5bd0990dc32 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2009-08-14 Add support for image filtering for agg back end. See the example + demo_agg_filter.py. -JJL + 2009-08-09 AnnotationBbox added. Similar to Annotation, but works with OffsetBox instead of Text. See the example demo_annotation_box.py. -JJL diff --git a/examples/pylab_examples/demo_agg_filter.py b/examples/pylab_examples/demo_agg_filter.py new file mode 100644 index 000000000000..d8ae0ee42ece --- /dev/null +++ b/examples/pylab_examples/demo_agg_filter.py @@ -0,0 +1,312 @@ +import matplotlib.pyplot as plt + +import numpy as np +import scipy.ndimage as NI +import matplotlib.cm as cm +import matplotlib.mlab as mlab + + +class BaseFilter(object): + def prepare_image(self, src_image, dpi, pad): + ny, nx, depth = src_image.shape + #tgt_image = np.zeros([pad*2+ny, pad*2+nx, depth], dtype="d") + padded_src = np.zeros([pad*2+ny, pad*2+nx, depth], dtype="d") + padded_src[pad:-pad, pad:-pad,:] = src_image[:,:,:] + + return padded_src#, tgt_image + + def get_pad(self, dpi): + return 0 + + def __call__(self, im, dpi): + pad = self.get_pad(dpi) + padded_src = self.prepare_image(im, dpi, pad) + tgt_image = self.process_image(padded_src, dpi) + return tgt_image, -pad, -pad + + +class OffsetFilter(BaseFilter): + def __init__(self, offsets=None): + if offsets is None: + self.offsets = (0, 0) + else: + self.offsets = offsets + + def get_pad(self, dpi): + return max(*self.offsets) + + def process_image(self, padded_src, dpi): + ox, oy = self.offsets + a1 = np.roll(padded_src, ox, axis=1) + a2 = np.roll(a1, -oy, axis=0) + return a2 + +class GaussianFilter(BaseFilter): + "simple gauss filter" + def __init__(self, sigma, alpha=0.5, color=None): + self.sigma = sigma + self.alpha = alpha + if color is None: + self.color=(0, 0, 0) + else: + self.color=color + + def get_pad(self, dpi): + return int(self.sigma*3) + + + def process_image(self, padded_src, dpi): + #offsetx, offsety = int(self.offsets[0]), int(self.offsets[1]) + tgt_image = np.zeros_like(padded_src) + tgt_image[:,:,-1] = NI.gaussian_filter(padded_src[:,:,-1]*self.alpha, + self.sigma) + tgt_image[:,:,:-1] = self.color + return tgt_image + +class DropShadowFilter(BaseFilter): + def __init__(self, sigma, alpha=0.3, color=None, offsets=None): + self.gauss_filter = GaussianFilter(sigma, alpha, color) + self.offset_filter = OffsetFilter(offsets) + + def get_pad(self, dpi): + return max(self.gauss_filter.get_pad(dpi), + self.offset_filter.get_pad(dpi)) + + def process_image(self, padded_src, dpi): + t1 = self.gauss_filter.process_image(padded_src, dpi) + t2 = self.offset_filter.process_image(t1, dpi) + return t2 + + +from matplotlib.colors import LightSource + +class LightFilter(BaseFilter): + "simple gauss filter" + def __init__(self, sigma, fraction=0.5): + self.gauss_filter = GaussianFilter(sigma, alpha=1) + self.light_source = LightSource() + self.fraction = fraction + #hsv_min_val=0.5,hsv_max_val=0.9, + # hsv_min_sat=0.1,hsv_max_sat=0.1) + def get_pad(self, dpi): + return self.gauss_filter.get_pad(dpi) + + def process_image(self, padded_src, dpi): + t1 = self.gauss_filter.process_image(padded_src, dpi) + elevation = t1[:,:,3] + rgb = padded_src[:,:,:3] + + rgb2 = self.light_source.shade_rgb(rgb, elevation, + fraction=self.fraction) + + tgt = np.empty_like(padded_src) + tgt[:,:,:3] = rgb2 + tgt[:,:,3] = padded_src[:,:,3] + + return tgt + + + +class GrowFilter(BaseFilter): + "enlarge the area" + def __init__(self, pixels, color=None): + self.pixels = pixels + if color is None: + self.color=(1, 1, 1) + else: + self.color=color + + def __call__(self, im, dpi): + pad = self.pixels + ny, nx, depth = im.shape + new_im = np.empty([pad*2+ny, pad*2+nx, depth], dtype="d") + alpha = new_im[:,:,3] + alpha.fill(0) + alpha[pad:-pad, pad:-pad] = im[:,:,-1] + alpha2 = NI.grey_dilation(alpha, size=(self.pixels, self.pixels)) + new_im[:,:,-1] = alpha2 + new_im[:,:,:-1] = self.color + offsetx, offsety = -pad, -pad + + return new_im, offsetx, offsety + + +from matplotlib.artist import Artist + +class FilteredArtistList(Artist): + """ + A simple container to draw filtered artist. + """ + def __init__(self, artist_list, filter): + self._artist_list = artist_list + self._filter = filter + Artist.__init__(self) + + def draw(self, renderer): + renderer.start_rasterizing() + renderer.start_filter() + for a in self._artist_list: + a.draw(renderer) + renderer.stop_filter(self._filter) + renderer.stop_rasterizing() + + + +import matplotlib.transforms as mtransforms + +def filtered_text(ax): + # mostly copied from contour_demo.py + + # prepare image + delta = 0.025 + x = np.arange(-3.0, 3.0, delta) + y = np.arange(-2.0, 2.0, delta) + X, Y = np.meshgrid(x, y) + Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) + Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1) + # difference of Gaussians + Z = 10.0 * (Z2 - Z1) + + + # draw + im = ax.imshow(Z, interpolation='bilinear', origin='lower', + cmap=cm.gray, extent=(-3,3,-2,2)) + levels = np.arange(-1.2, 1.6, 0.2) + CS = ax.contour(Z, levels, + origin='lower', + linewidths=2, + extent=(-3,3,-2,2)) + + ax.set_aspect("auto") + + # contour label + cl = ax.clabel(CS, levels[1::2], # label every second level + inline=1, + fmt='%1.1f', + fontsize=11) + + # change clable color to black + for t in cl: + t.set_color("k") + + # Add white glows to improve visibility of labels. + white_glows = FilteredArtistList(cl, GrowFilter(3)) + ax.add_artist(white_glows) + white_glows.set_zorder(cl[0].get_zorder()-0.1) + + ax.xaxis.set_visible(False) + ax.yaxis.set_visible(False) + + +def drop_shadow_line(ax): + # copyed from examples/misc/svg_filter_line.py + + # draw lines + l1, = ax.plot([0.1, 0.5, 0.9], [0.1, 0.9, 0.5], "bo-", + mec="b", mfc="w", lw=5, mew=3, ms=10, label="Line 1") + l2, = ax.plot([0.1, 0.5, 0.9], [0.5, 0.2, 0.7], "ro-", + mec="r", mfc="w", lw=5, mew=3, ms=10, label="Line 1") + + + gauss = DropShadowFilter(2) + + for l in [l1, l2]: + + # draw shadows with same lines with slight offset. + + xx = l.get_xdata() + yy = l.get_ydata() + shadow, = ax.plot(xx, yy) + shadow.update_from(l) + + # offset transform + ot = mtransforms.offset_copy(l.get_transform(), ax.figure, + x=4.0, y=-6.0, units='points') + + shadow.set_transform(ot) + + + # adjust zorder of the shadow lines so that it is drawn below the + # original lines + shadow.set_zorder(l.get_zorder()-0.5) + shadow.set_agg_filter(gauss) + shadow.set_rasterized(True) # to support mixed-mode renderers + + + + ax.set_xlim(0., 1.) + ax.set_ylim(0., 1.) + + ax.xaxis.set_visible(False) + ax.yaxis.set_visible(False) + + + + +def drop_shadow_patches(ax): + # copyed from barchart_demo.py + N = 5 + menMeans = (20, 35, 30, 35, 27) + + ind = np.arange(N) # the x locations for the groups + width = 0.35 # the width of the bars + + rects1 = ax.bar(ind, menMeans, width, color='r', ec="w", lw=2) + + womenMeans = (25, 32, 34, 20, 25) + rects2 = ax.bar(ind+width+0.1, womenMeans, width, color='y', ec="w", lw=2) + + #gauss = GaussianFilter(1.5, offsets=(1,1), ) + gauss = DropShadowFilter(1.5, offsets=(1,1), ) + shadow = FilteredArtistList(rects1+rects2, gauss) + ax.add_artist(shadow) + shadow.set_zorder(rects1[0].get_zorder()-0.1) + + ax.set_xlim(ind[0]-0.5, ind[-1]+1.5) + ax.set_ylim(0, 40) + + ax.xaxis.set_visible(False) + ax.yaxis.set_visible(False) + + +def light_filter_pie(ax): + fracs = [15,30,45, 10] + explode=(0, 0.05, 0, 0) + pies = ax.pie(fracs, explode=explode) + ax.patch.set_visible(True) + + light_filter = LightFilter(8) + for p in pies[0]: + p.set_agg_filter(light_filter) + p.set_rasterized(True) # to support mixed-mode renderers + p.set(ec="none", + lw=2) + + gauss = DropShadowFilter(3, offsets=(3,4), alpha=0.7) + shadow = FilteredArtistList(pies[0], gauss) + ax.add_artist(shadow) + shadow.set_zorder(pies[0][0].get_zorder()-0.1) + + +if 1: + + plt.figure(1, figsize=(6, 6)) + plt.subplots_adjust(left=0.05, right=0.95) + + ax = plt.subplot(221) + filtered_text(ax) + + ax = plt.subplot(222) + drop_shadow_line(ax) + + ax = plt.subplot(223) + drop_shadow_patches(ax) + + ax = plt.subplot(224) + ax.set_aspect(1) + light_filter_pie(ax) + ax.set_frame_on(True) + + plt.show() + + diff --git a/lib/matplotlib/artist.py b/lib/matplotlib/artist.py index 97e2dc363c44..13eaa3b35a1f 100644 --- a/lib/matplotlib/artist.py +++ b/lib/matplotlib/artist.py @@ -36,7 +36,15 @@ def before(artist, renderer): if artist.get_rasterized(): renderer.start_rasterizing() + if artist.get_agg_filter() is not None: + renderer.start_filter() + + def after(artist, renderer): + + if artist.get_agg_filter() is not None: + renderer.stop_filter(artist.get_agg_filter()) + if artist.get_rasterized(): renderer.stop_rasterizing() @@ -78,7 +86,8 @@ def __init__(self): self._picker = None self._contains = None self._rasterized = None - + self._agg_filter = None + self.eventson = False # fire events only if eventson self._oid = 0 # an observer id self._propobservers = {} # a dict from oids to funcs @@ -548,6 +557,7 @@ def _set_gc_clip(self, gc): gc.set_clip_path(None) def get_rasterized(self): + "return True if the artist is to be rasterized" return self._rasterized def set_rasterized(self, rasterized): @@ -563,6 +573,17 @@ def set_rasterized(self, rasterized): self._rasterized = rasterized + def get_agg_filter(self): + "return filter function to be used for agg filter" + return self._agg_filter + + def set_agg_filter(self, filter_func): + """ + set agg_filter fuction. + + """ + self._agg_filter = filter_func + def draw(self, renderer, *args, **kwargs): 'Derived classes drawing method' if not self.get_visible(): return diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 75133ff596a9..103131f00618 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -409,9 +409,33 @@ def strip_math(self, s): return cbook.strip_math(s) def start_rasterizing(self): + """ + Used in MixedModeRenderer. Switch to the raster renderer. + """ pass def stop_rasterizing(self): + """ + Used in MixedModeRenderer. Switch back to the vector renderer + and draw the contents of the raster renderer as an image on + the vector renderer. + """ + pass + + def start_filter(self): + """ + Used in AggRenderer. Switch to a temporary renderer for image + filtering effects. + """ + pass + + def stop_filter(self, filter_func): + """ + Used in AggRenderer. Switch back to the original renderer. + The contents of the temporary renderer is processed with the + *filter_func* and is drawn on the original renderer as an + image. + """ pass diff --git a/lib/matplotlib/backends/backend_agg.py b/lib/matplotlib/backends/backend_agg.py index 94662d60a24d..a694b9a7b24b 100644 --- a/lib/matplotlib/backends/backend_agg.py +++ b/lib/matplotlib/backends/backend_agg.py @@ -57,21 +57,32 @@ def __init__(self, width, height, dpi): self.height = height if __debug__: verbose.report('RendererAgg.__init__ width=%s, height=%s'%(width, height), 'debug-annoying') self._renderer = _RendererAgg(int(width), int(height), dpi, debug=False) + self._filter_renderers = [] + if __debug__: verbose.report('RendererAgg.__init__ _RendererAgg done', 'debug-annoying') + + self._update_methods() + self.mathtext_parser = MathTextParser('Agg') + + self.bbox = Bbox.from_bounds(0, 0, self.width, self.height) + if __debug__: verbose.report('RendererAgg.__init__ done', + 'debug-annoying') + + def draw_markers(self, *kl, **kw): + # for filtering to work with rastrization, methods needs to be wrapped. + # maybe there is better way to do it. + return self._renderer.draw_markers(*kl, **kw) + + def _update_methods(self): #self.draw_path = self._renderer.draw_path # see below - self.draw_markers = self._renderer.draw_markers + #self.draw_markers = self._renderer.draw_markers self.draw_path_collection = self._renderer.draw_path_collection self.draw_quad_mesh = self._renderer.draw_quad_mesh self.draw_gouraud_triangle = self._renderer.draw_gouraud_triangle self.draw_image = self._renderer.draw_image self.copy_from_bbox = self._renderer.copy_from_bbox self.tostring_rgba_minimized = self._renderer.tostring_rgba_minimized - self.mathtext_parser = MathTextParser('Agg') - - self.bbox = Bbox.from_bounds(0, 0, self.width, self.height) - if __debug__: verbose.report('RendererAgg.__init__ done', - 'debug-annoying') def draw_path(self, gc, path, transform, rgbFace=None): """ @@ -165,6 +176,7 @@ def get_text_width_height_descent(self, s, prop, ismath): d /= 64.0 return w, h, d + def draw_tex(self, gc, x, y, s, prop, angle): # todo, handle props, angle, origins size = prop.get_size_in_points() @@ -271,6 +283,57 @@ def restore_region(self, region, bbox=None, xy=None): else: self._renderer.restore_region(region) + def start_filter(self): + """ + Start filtering. It simply create a new canvas (the old one is saved). + """ + self._filter_renderers.append(self._renderer) + self._renderer = _RendererAgg(int(self.width), int(self.height), + self.dpi) + self._update_methods() + + def stop_filter(self, post_processing): + """ + Save the plot in the current canvas as a image and apply + the *post_processing* function. + + def post_processing(image, dpi): + # ny, nx, depth = image.shape + # image (numpy array) has RGBA channels and has a depth of 4. + ... + # create a new_image (numpy array of 4 channels, size can be + # different). The resulting image may have offsets from + # lower-left corner of the original image + return new_image, offset_x, offset_y + + The saved renderer is restored and the returned image from + post_processing is plotted (using draw_image) on it. + """ + + from matplotlib._image import fromarray + + width, height = int(self.width), int(self.height) + + buffer, bounds = self._renderer.tostring_rgba_minimized() + + l, b, w, h = bounds + + + self._renderer = self._filter_renderers.pop() + self._update_methods() + + if w > 0 and h > 0: + img = npy.fromstring(buffer, npy.uint8) + img, ox, oy = post_processing(img.reshape((h, w, 4)) / 255., + self.dpi) + image = fromarray(img, 1) + image.flipud_out() + + gc = self.new_gc() + self._renderer.draw_image(gc, + l+ox, height - b - h +oy, + image) + def new_figure_manager(num, *args, **kwargs): """ diff --git a/lib/matplotlib/backends/backend_mixed.py b/lib/matplotlib/backends/backend_mixed.py index fcc816c52f8e..b7f7c8a782b6 100644 --- a/lib/matplotlib/backends/backend_mixed.py +++ b/lib/matplotlib/backends/backend_mixed.py @@ -58,6 +58,7 @@ def __init__(self, figure, width, height, dpi, vector_renderer, finalize flipy get_canvas_width_height get_image_magnification get_texmanager get_text_width_height_descent new_gc open_group option_image_nocomposite points_to_pixels strip_math + start_filter stop_filter """.split() def _set_current_renderer(self, renderer): self._renderer = renderer diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index 6d68edf4e867..24ea21c7ae1d 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -1021,6 +1021,19 @@ def shade(self,data,cmap): RGBA values are returned, which can then be used to plot the shaded image with imshow. """ + + rgb0 = cmap((data-data.min())/(data.max()-data.min())) + rgb1 = self.shade_rgb(rgb0, elevation=data) + rgb0[:,:,0:3] = rgb1 + return rgb0 + + def shade_rgb(self,rgb, elevation, fraction=1.): + """ + Take the input RGB array (ny*nx*3) adjust their color values + to given the impression of a shaded relief map with a + specified light source using the elevation (ny*nx). + A new RGB array ((ny*nx*3)) is returned. + """ # imagine an artificial sun placed at infinity in # some azimuth and elevation position illuminating our surface. The parts of # the surface that slope toward the sun should brighten while those sides @@ -1029,7 +1042,7 @@ def shade(self,data,cmap): az = self.azdeg*np.pi/180.0 alt = self.altdeg*np.pi/180.0 # gradient in x and y directions - dx, dy = np.gradient(data) + dx, dy = np.gradient(elevation) slope = 0.5*np.pi - np.arctan(np.hypot(dx, dy)) aspect = np.arctan2(dx, dy) intensity = np.sin(alt)*np.sin(slope) + np.cos(alt)*np.cos(slope)*np.cos(-az -\ @@ -1037,9 +1050,9 @@ def shade(self,data,cmap): # rescale to interval -1,1 # +1 means maximum sun exposure and -1 means complete shade. intensity = (intensity - intensity.min())/(intensity.max() - intensity.min()) - intensity = 2.*intensity - 1. + intensity = (2.*intensity - 1.)*fraction # convert to rgb, then rgb to hsv - rgb = cmap((data-data.min())/(data.max()-data.min())) + #rgb = cmap((data-data.min())/(data.max()-data.min())) hsv = rgb_to_hsv(rgb[:,:,0:3]) # modify hsv values to simulate illumination. hsv[:,:,1] = np.where(np.logical_and(np.abs(hsv[:,:,1])>1.e-10,intensity>0),\ @@ -1053,5 +1066,4 @@ def shade(self,data,cmap): hsv[:,:,1:] = np.where(hsv[:,:,1:]<0.,0,hsv[:,:,1:]) hsv[:,:,1:] = np.where(hsv[:,:,1:]>1.,1,hsv[:,:,1:]) # convert modified hsv back to rgb. - rgb[:,:,0:3] = hsv_to_rgb(hsv) - return rgb + return hsv_to_rgb(hsv) diff --git a/lib/matplotlib/text.py b/lib/matplotlib/text.py index ca0a5e822db4..40dddc704abf 100644 --- a/lib/matplotlib/text.py +++ b/lib/matplotlib/text.py @@ -18,6 +18,8 @@ from matplotlib.transforms import Affine2D, Bbox from matplotlib.lines import Line2D +from matplotlib.artist import allow_rasterization + import matplotlib.nxutils as nxutils def _process_text_args(override, fontdict=None, **kwargs): @@ -501,6 +503,7 @@ def _draw_bbox(self, renderer, posx, posy): self._bbox_patch.draw(renderer) + @allow_rasterization def draw(self, renderer): """ Draws the :class:`Text` object to the given *renderer*. @@ -1727,6 +1730,7 @@ def _update_position_xytext(self, renderer, xy_pixel): self.arrow.set_clip_box(self.get_clip_box()) + @allow_rasterization def draw(self, renderer): """ Draw the :class:`Annotation` object to the given *renderer*. From 4f70c141a76774ba12b897a04445387cb3ee75aa Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Sat, 15 Aug 2009 18:33:54 +0000 Subject: [PATCH 0064/1000] Use decorators to manipulate docstrings; patch by Jason Coombs Tracker 2835685, file DocstringOptimizedTypeErrorRev5.patch svn path=/trunk/matplotlib/; revision=7491 --- boilerplate.py | 6 +- lib/matplotlib/artist.py | 4 +- lib/matplotlib/axes.py | 114 +++++++-------- lib/matplotlib/collections.py | 28 ++-- lib/matplotlib/colorbar.py | 37 ++--- lib/matplotlib/figure.py | 35 +++-- lib/matplotlib/lines.py | 7 +- lib/matplotlib/mlab.py | 18 +-- lib/matplotlib/offsetbox.py | 4 +- lib/matplotlib/patches.py | 157 ++++++++++----------- lib/matplotlib/projections/geo.py | 1 - lib/matplotlib/projections/polar.py | 7 +- lib/matplotlib/pyplot.py | 208 ++++++++++------------------ lib/matplotlib/quiver.py | 32 +++-- lib/matplotlib/scale.py | 6 + lib/matplotlib/spines.py | 3 +- lib/matplotlib/table.py | 3 +- lib/matplotlib/text.py | 16 +-- 18 files changed, 297 insertions(+), 389 deletions(-) diff --git a/boilerplate.py b/boilerplate.py index 061e3b89bcc8..0769e2659f47 100644 --- a/boilerplate.py +++ b/boilerplate.py @@ -20,6 +20,7 @@ _fmtplot = """\ # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.%(func)s) def %(func)s(%(argspec)s): %(ax)s = gca() # allow callers to override the hold state by passing hold=True|False @@ -34,19 +35,16 @@ def %(func)s(%(argspec)s): %(ax)s.hold(%(washold)s) %(mappable)s return %(ret)s -if Axes.%(func)s.__doc__ is not None: - %(func)s.__doc__ = dedent(Axes.%(func)s.__doc__) + __docstring_addendum """ _fmtmisc = """\ # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@docstring.copy_dedent(Axes.%(func)s) def %(func)s(%(argspec)s): %(ret)s = gca().%(func)s(%(call)s) draw_if_interactive() return %(ret)s -if Axes.%(func)s.__doc__ is not None: - %(func)s.__doc__ = dedent(Axes.%(func)s.__doc__) """ # these methods are all simple wrappers of Axes methods by the same diff --git a/lib/matplotlib/artist.py b/lib/matplotlib/artist.py index 13eaa3b35a1f..c2305e428dd1 100644 --- a/lib/matplotlib/artist.py +++ b/lib/matplotlib/artist.py @@ -2,6 +2,7 @@ import re, warnings import matplotlib import matplotlib.cbook as cbook +from matplotlib import docstring from transforms import Bbox, IdentityTransform, TransformedBbox, TransformedPath from path import Path @@ -1193,5 +1194,4 @@ def kwdoc(a): else: return '\n'.join(ArtistInspector(a).pprint_setters(leadingspace=2)) -kwdocd = dict() -kwdocd['Artist'] = kwdoc(Artist) +docstring.interpd.update(Artist=kwdoc(Artist)) diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index 3d1bdaeac913..929d749f1606 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -15,6 +15,7 @@ import matplotlib.colors as mcolors import matplotlib.contour as mcontour import matplotlib.dates as mdates +from matplotlib import docstring import matplotlib.font_manager as font_manager import matplotlib.image as mimage import matplotlib.legend as mlegend @@ -33,7 +34,6 @@ is_string_like = cbook.is_string_like is_sequence_of_strings = cbook.is_sequence_of_strings - def _process_plot_format(fmt): """ Process a matlab(TM) style color/line style format string. Return a @@ -1787,6 +1787,7 @@ def set_axisbelow(self, b): """ self._axisbelow = b + @docstring.dedent_interpd def grid(self, b=None, **kwargs): """ call signature:: @@ -1810,7 +1811,6 @@ def grid(self, b=None, **kwargs): if len(kwargs): b = True self.xaxis.grid(b, **kwargs) self.yaxis.grid(b, **kwargs) - grid.__doc__ = cbook.dedent(grid.__doc__) % martist.kwdocd def ticklabel_format(self, **kwargs): """ @@ -2018,6 +2018,7 @@ def get_xscale(self): ", ".join(mscale.get_scale_names())) return self.xaxis.get_scale() + @docstring.dedent_interpd def set_xscale(self, value, **kwargs): """ call signature:: @@ -2035,10 +2036,6 @@ def set_xscale(self, value, **kwargs): self.autoscale_view() self._update_transScale() - set_xscale.__doc__ = cbook.dedent(set_xscale.__doc__) % { - 'scale': ' | '.join([repr(x) for x in mscale.get_scale_names()]), - 'scale_docs': mscale.get_scale_docs().strip()} - def get_xticks(self, minor=False): 'Return the x ticks as a list of locations' return self.xaxis.get_ticklocs(minor=minor) @@ -2066,6 +2063,7 @@ def get_xticklabels(self, minor=False): return cbook.silent_list('Text xticklabel', self.xaxis.get_ticklabels(minor=minor)) + @docstring.dedent_interpd def set_xticklabels(self, labels, fontdict=None, minor=False, **kwargs): """ call signature:: @@ -2083,8 +2081,6 @@ def set_xticklabels(self, labels, fontdict=None, minor=False, **kwargs): """ return self.xaxis.set_ticklabels(labels, fontdict, minor=minor, **kwargs) - set_xticklabels.__doc__ = cbook.dedent( - set_xticklabels.__doc__) % martist.kwdocd def invert_yaxis(self): "Invert the y-axis." @@ -2192,6 +2188,7 @@ def get_yscale(self): ", ".join(mscale.get_scale_names())) return self.yaxis.get_scale() + @docstring.dedent_interpd def set_yscale(self, value, **kwargs): """ call signature:: @@ -2209,10 +2206,6 @@ def set_yscale(self, value, **kwargs): self.autoscale_view() self._update_transScale() - set_yscale.__doc__ = cbook.dedent(set_yscale.__doc__) % { - 'scale': ' | '.join([repr(x) for x in mscale.get_scale_names()]), - 'scale_docs': mscale.get_scale_docs().strip()} - def get_yticks(self, minor=False): 'Return the y ticks as a list of locations' return self.yaxis.get_ticklocs(minor=minor) @@ -2245,6 +2238,7 @@ def get_yticklabels(self, minor=False): return cbook.silent_list('Text yticklabel', self.yaxis.get_ticklabels(minor=minor)) + @docstring.dedent_interpd def set_yticklabels(self, labels, fontdict=None, minor=False, **kwargs): """ call signature:: @@ -2262,8 +2256,6 @@ def set_yticklabels(self, labels, fontdict=None, minor=False, **kwargs): """ return self.yaxis.set_ticklabels(labels, fontdict, minor=minor, **kwargs) - set_yticklabels.__doc__ = cbook.dedent( - set_yticklabels.__doc__) % martist.kwdocd def xaxis_date(self, tz=None): """Sets up x-axis ticks and labels that treat the x data as dates. @@ -2693,6 +2685,7 @@ def get_title(self): """ return self.title.get_text() + @docstring.dedent_interpd def set_title(self, label, fontdict=None, **kwargs): """ call signature:: @@ -2722,7 +2715,6 @@ def set_title(self, label, fontdict=None, **kwargs): if fontdict is not None: self.title.update(fontdict) self.title.update(kwargs) return self.title - set_title.__doc__ = cbook.dedent(set_title.__doc__) % martist.kwdocd def get_xlabel(self): """ @@ -2731,6 +2723,7 @@ def get_xlabel(self): label = self.xaxis.get_label() return label.get_text() + @docstring.dedent_interpd def set_xlabel(self, xlabel, fontdict=None, labelpad=None, **kwargs): """ call signature:: @@ -2752,7 +2745,6 @@ def set_xlabel(self, xlabel, fontdict=None, labelpad=None, **kwargs): """ if labelpad is not None: self.xaxis.labelpad = labelpad return self.xaxis.set_label_text(xlabel, fontdict, **kwargs) - set_xlabel.__doc__ = cbook.dedent(set_xlabel.__doc__) % martist.kwdocd def get_ylabel(self): """ @@ -2761,6 +2753,7 @@ def get_ylabel(self): label = self.yaxis.get_label() return label.get_text() + @docstring.dedent_interpd def set_ylabel(self, ylabel, fontdict=None, labelpad=None, **kwargs): """ call signature:: @@ -2782,8 +2775,8 @@ def set_ylabel(self, ylabel, fontdict=None, labelpad=None, **kwargs): """ if labelpad is not None: self.yaxis.labelpad = labelpad return self.yaxis.set_label_text(ylabel, fontdict, **kwargs) - set_ylabel.__doc__ = cbook.dedent(set_ylabel.__doc__) % martist.kwdocd + @docstring.dedent_interpd def text(self, x, y, s, fontdict=None, withdash=False, **kwargs): """ @@ -2864,8 +2857,8 @@ def text(self, x, y, s, fontdict=None, #if t.get_clip_on(): t.set_clip_box(self.bbox) if 'clip_on' in kwargs: t.set_clip_box(self.bbox) return t - text.__doc__ = cbook.dedent(text.__doc__) % martist.kwdocd + @docstring.dedent_interpd def annotate(self, *args, **kwargs): """ call signature:: @@ -2885,10 +2878,10 @@ def annotate(self, *args, **kwargs): if kwargs.has_key('clip_on'): a.set_clip_path(self.patch) self.texts.append(a) return a - annotate.__doc__ = cbook.dedent(annotate.__doc__) % martist.kwdocd #### Lines and spans + @docstring.dedent_interpd def axhline(self, y=0, xmin=0, xmax=1, **kwargs): """ call signature:: @@ -2948,8 +2941,7 @@ def axhline(self, y=0, xmin=0, xmax=1, **kwargs): self.autoscale_view(scalex=False, scaley=scaley) return l - axhline.__doc__ = cbook.dedent(axhline.__doc__) % martist.kwdocd - + @docstring.dedent_interpd def axvline(self, x=0, ymin=0, ymax=1, **kwargs): """ call signature:: @@ -3009,8 +3001,7 @@ def axvline(self, x=0, ymin=0, ymax=1, **kwargs): self.autoscale_view(scalex=scalex, scaley=False) return l - axvline.__doc__ = cbook.dedent(axvline.__doc__) % martist.kwdocd - + @docstring.dedent_interpd def axhspan(self, ymin, ymax, xmin=0, xmax=1, **kwargs): """ call signature:: @@ -3066,8 +3057,8 @@ def axhspan(self, ymin, ymax, xmin=0, xmax=1, **kwargs): self.add_patch(p) self.autoscale_view(scalex=False) return p - axhspan.__doc__ = cbook.dedent(axhspan.__doc__) % martist.kwdocd + @docstring.dedent_interpd def axvspan(self, xmin, xmax, ymin=0, ymax=1, **kwargs): """ call signature:: @@ -3123,9 +3114,9 @@ def axvspan(self, xmin, xmax, ymin=0, ymax=1, **kwargs): self.add_patch(p) self.autoscale_view(scaley=False) return p - axvspan.__doc__ = cbook.dedent(axvspan.__doc__) % martist.kwdocd + @docstring.dedent def hlines(self, y, xmin, xmax, colors='k', linestyles='solid', label='', **kwargs): """ @@ -3210,8 +3201,8 @@ def hlines(self, y, xmin, xmax, colors='k', linestyles='solid', return coll - hlines.__doc__ = cbook.dedent(hlines.__doc__) + @docstring.dedent_interpd def vlines(self, x, ymin, ymax, colors='k', linestyles='solid', label='', **kwargs): """ @@ -3290,9 +3281,9 @@ def vlines(self, x, ymin, ymax, colors='k', linestyles='solid', self.autoscale_view() return coll - vlines.__doc__ = cbook.dedent(vlines.__doc__) % martist.kwdocd #### Basic plotting + @docstring.dedent_interpd def plot(self, *args, **kwargs): """ Plot lines and/or markers to the @@ -3425,8 +3416,7 @@ def plot(self, *args, **kwargs): self.autoscale_view(scalex=scalex, scaley=scaley) return lines - plot.__doc__ = cbook.dedent(plot.__doc__) % martist.kwdocd - + @docstring.dedent_interpd def plot_date(self, x, y, fmt='bo', tz=None, xdate=True, ydate=False, **kwargs): """ @@ -3496,9 +3486,9 @@ def plot_date(self, x, y, fmt='bo', tz=None, xdate=True, ydate=False, self.autoscale_view() return ret - plot_date.__doc__ = cbook.dedent(plot_date.__doc__) % martist.kwdocd + @docstring.dedent_interpd def loglog(self, *args, **kwargs): """ call signature:: @@ -3557,8 +3547,8 @@ def loglog(self, *args, **kwargs): self._hold = b # restore the hold return l - loglog.__doc__ = cbook.dedent(loglog.__doc__) % martist.kwdocd + @docstring.dedent_interpd def semilogx(self, *args, **kwargs): """ call signature:: @@ -3608,8 +3598,8 @@ def semilogx(self, *args, **kwargs): l = self.plot(*args, **kwargs) self._hold = b # restore the hold return l - semilogx.__doc__ = cbook.dedent(semilogx.__doc__) % martist.kwdocd + @docstring.dedent_interpd def semilogy(self, *args, **kwargs): """ call signature:: @@ -3659,8 +3649,8 @@ def semilogy(self, *args, **kwargs): self._hold = b # restore the hold return l - semilogy.__doc__ = cbook.dedent(semilogy.__doc__) % martist.kwdocd + @docstring.dedent_interpd def acorr(self, x, **kwargs): """ call signature:: @@ -3722,8 +3712,8 @@ def acorr(self, x, **kwargs): .. plot:: mpl_examples/pylab_examples/xcorr_demo.py """ return self.xcorr(x, x, **kwargs) - acorr.__doc__ = cbook.dedent(acorr.__doc__) % martist.kwdocd + @docstring.dedent_interpd def xcorr(self, x, y, normed=True, detrend=mlab.detrend_none, usevlines=True, maxlags=10, **kwargs): """ @@ -3810,7 +3800,6 @@ def xcorr(self, x, y, normed=True, detrend=mlab.detrend_none, a, = self.plot(lags, c, **kwargs) b = None return lags, c, a, b - xcorr.__doc__ = cbook.dedent(xcorr.__doc__) % martist.kwdocd def _get_legend_handles(self): @@ -4064,6 +4053,7 @@ def step(self, x, y, *args, **kwargs): return self.plot(x, y, *args, **kwargs) + @docstring.dedent_interpd def bar(self, left, height, width=0.8, bottom=None, color=None, edgecolor=None, linewidth=None, yerr=None, xerr=None, ecolor=None, capsize=3, @@ -4331,8 +4321,8 @@ def make_iterable(x): self.dataLim.intervaly = (ymin, ymax) self.autoscale_view() return patches - bar.__doc__ = cbook.dedent(bar.__doc__) % martist.kwdocd + @docstring.dedent_interpd def barh(self, bottom, width, height=0.8, left=None, **kwargs): """ call signature:: @@ -4403,8 +4393,7 @@ def barh(self, bottom, width, height=0.8, left=None, **kwargs): orientation='horizontal', **kwargs) return patches - barh.__doc__ = cbook.dedent(barh.__doc__) % martist.kwdocd - + @docstring.dedent_interpd def broken_barh(self, xranges, yrange, **kwargs): """ call signature:: @@ -4447,8 +4436,6 @@ def broken_barh(self, xranges, yrange, **kwargs): return col - broken_barh.__doc__ = cbook.dedent(broken_barh.__doc__) % martist.kwdocd - def stem(self, x, y, linefmt='b-', markerfmt='bo', basefmt='r-'): """ call signature:: @@ -4642,6 +4629,7 @@ def pie(self, x, explode=None, labels=None, colors=None, if autopct is None: return slices, texts else: return slices, texts, autotexts + @docstring.dedent_interpd def errorbar(self, x, y, yerr=None, xerr=None, fmt='-', ecolor=None, elinewidth=None, capsize=3, barsabove=False, lolims=False, uplims=False, @@ -4900,7 +4888,6 @@ def xywhere(xs, ys, mask): self.autoscale_view() return (l0, caplines, barcols) - errorbar.__doc__ = cbook.dedent(errorbar.__doc__) % martist.kwdocd def boxplot(self, x, notch=0, sym='b+', vert=1, whis=1.5, positions=None, widths=None): @@ -5092,6 +5079,7 @@ def doplot(*args): return dict(whiskers=whiskers, caps=caps, boxes=boxes, medians=medians, fliers=fliers) + @docstring.dedent_interpd def scatter(self, x, y, s=20, c='b', marker='o', cmap=None, norm=None, vmin=None, vmax=None, alpha=1.0, linewidths=None, faceted=True, verts=None, @@ -5407,8 +5395,7 @@ def scatter(self, x, y, s=20, c='b', marker='o', cmap=None, norm=None, self.add_collection(collection) return collection - scatter.__doc__ = cbook.dedent(scatter.__doc__) % martist.kwdocd - + @docstring.dedent_interpd def hexbin(self, x, y, C = None, gridsize = 100, bins = None, xscale = 'linear', yscale = 'linear', extent = None, cmap=None, norm=None, vmin=None, vmax=None, @@ -5821,9 +5808,8 @@ def on_changed(collection): return collection - hexbin.__doc__ = cbook.dedent(hexbin.__doc__) % martist.kwdocd - + @docstring.dedent_interpd def arrow(self, x, y, dx, dy, **kwargs): """ call signature:: @@ -5843,7 +5829,6 @@ def arrow(self, x, y, dx, dy, **kwargs): a = mpatches.FancyArrow(x, y, dx, dy, **kwargs) self.add_artist(a) return a - arrow.__doc__ = cbook.dedent(arrow.__doc__) % martist.kwdocd def quiverkey(self, *args, **kw): qk = mquiver.QuiverKey(*args, **kw) @@ -5860,6 +5845,7 @@ def quiver(self, *args, **kw): return q quiver.__doc__ = mquiver.Quiver.quiver_doc + @docstring.dedent_interpd def barbs(self, *args, **kw): """ %(barbs_doc)s @@ -5873,9 +5859,8 @@ def barbs(self, *args, **kw): self.update_datalim(b.get_offsets()) self.autoscale_view() return b - barbs.__doc__ = cbook.dedent(barbs.__doc__) % { - 'barbs_doc': mquiver.Barbs.barbs_doc} + @docstring.dedent_interpd def fill(self, *args, **kwargs): """ call signature:: @@ -5922,8 +5907,8 @@ def fill(self, *args, **kwargs): patches.append( poly ) self.autoscale_view() return patches - fill.__doc__ = cbook.dedent(fill.__doc__) % martist.kwdocd + @docstring.dedent_interpd def fill_between(self, x, y1, y2=0, where=None, **kwargs): """ call signature:: @@ -6029,8 +6014,8 @@ def fill_between(self, x, y1, y2=0, where=None, **kwargs): self.add_collection(collection) self.autoscale_view() return collection - fill_between.__doc__ = cbook.dedent(fill_between.__doc__) % martist.kwdocd + @docstring.dedent_interpd def fill_betweenx(self, y, x1, x2=0, where=None, **kwargs): """ call signature:: @@ -6136,10 +6121,10 @@ def fill_betweenx(self, y, x1, x2=0, where=None, **kwargs): self.add_collection(collection) self.autoscale_view() return collection - fill_between.__doc__ = cbook.dedent(fill_between.__doc__) % martist.kwdocd #### plotting z(x,y): imshow, pcolor and relatives, contour + @docstring.dedent_interpd def imshow(self, X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=1.0, vmin=None, vmax=None, origin=None, extent=None, shape=None, filternorm=1, @@ -6276,7 +6261,6 @@ def imshow(self, X, cmap=None, norm=None, aspect=None, self.images.append(im) return im - imshow.__doc__ = cbook.dedent(imshow.__doc__) % martist.kwdocd def _pcolorargs(self, funcname, *args): @@ -6304,6 +6288,7 @@ def _pcolorargs(self, funcname, *args): funcname, funcname)) return X, Y, C + @docstring.dedent_interpd def pcolor(self, *args, **kwargs): """ call signatures:: @@ -6511,8 +6496,8 @@ def pcolor(self, *args, **kwargs): self.autoscale_view() self.add_collection(collection) return collection - pcolor.__doc__ = cbook.dedent(pcolor.__doc__) % martist.kwdocd + @docstring.dedent_interpd def pcolormesh(self, *args, **kwargs): """ call signatures:: @@ -6634,8 +6619,8 @@ def pcolormesh(self, *args, **kwargs): self.autoscale_view() self.add_collection(collection) return collection - pcolormesh.__doc__ = cbook.dedent(pcolormesh.__doc__) % martist.kwdocd + @docstring.dedent_interpd def pcolorfast(self, *args, **kwargs): """ pseudocolor plot of a 2-D array @@ -6829,6 +6814,7 @@ def clabel(self, CS, *args, **kwargs): return CS.clabel(*args, **kwargs) clabel.__doc__ = mcontour.ContourSet.clabel.__doc__ + @docstring.dedent_interpd def table(self, **kwargs): """ call signature:: @@ -6853,7 +6839,6 @@ class and add it to the axes with %(Table)s """ return mtable.table(self, **kwargs) - table.__doc__ = cbook.dedent(table.__doc__) % martist.kwdocd def twinx(self): """ @@ -6905,6 +6890,7 @@ def get_shared_y_axes(self): #### Data analysis + @docstring.dedent_interpd def hist(self, x, bins=10, range=None, normed=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, @@ -7257,8 +7243,8 @@ def hist(self, x, bins=10, range=None, normed=False, weights=None, return n[0], bins, cbook.silent_list('Patch', patches[0]) else: return n, bins, cbook.silent_list('Lists of Patches', patches) - hist.__doc__ = cbook.dedent(hist.__doc__) % martist.kwdocd + @docstring.dedent_interpd def psd(self, x, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.window_hanning, noverlap=0, pad_to=None, sides='default', scale_by_freq=None, **kwargs): @@ -7330,12 +7316,7 @@ def psd(self, x, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, return pxx, freqs - psd_doc_dict = dict() - psd_doc_dict.update(martist.kwdocd) - psd_doc_dict.update(mlab.kwdocd) - psd_doc_dict['PSD'] = cbook.dedent(psd_doc_dict['PSD']) - psd.__doc__ = cbook.dedent(psd.__doc__) % psd_doc_dict - + @docstring.dedent_interpd def csd(self, x, y, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.window_hanning, noverlap=0, pad_to=None, sides='default', scale_by_freq=None, **kwargs): @@ -7403,8 +7384,8 @@ def csd(self, x, y, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, self.set_yticks(ticks) return pxy, freqs - csd.__doc__ = cbook.dedent(csd.__doc__) % psd_doc_dict + @docstring.dedent_interpd def cohere(self, x, y, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.window_hanning, noverlap=0, pad_to=None, sides='default', scale_by_freq=None, **kwargs): @@ -7460,8 +7441,8 @@ def cohere(self, x, y, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, self.grid(True) return cxy, freqs - cohere.__doc__ = cbook.dedent(cohere.__doc__) % psd_doc_dict + @docstring.dedent_interpd def specgram(self, x, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.window_hanning, noverlap=128, cmap=None, xextent=None, pad_to=None, sides='default', @@ -7534,8 +7515,6 @@ def specgram(self, x, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, self.axis('auto') return Pxx, freqs, bins, im - specgram.__doc__ = cbook.dedent(specgram.__doc__) % psd_doc_dict - del psd_doc_dict #So that this does not become an Axes attribute def spy(self, Z, precision=0, marker=None, markersize=None, aspect='equal', **kwargs): @@ -7908,7 +7887,8 @@ def subplot_class_factory(axes_class=None): # This is provided for backward compatibility Subplot = subplot_class_factory() -martist.kwdocd['Axes'] = martist.kwdocd['Subplot'] = martist.kwdoc(Axes) +docstring.interpd.update(Axes=martist.kwdoc(Axes)) +docstring.interpd.update(Subplot=martist.kwdoc(Axes)) """ # this is some discarded code I was using to find the minimum positive diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index fff80d727895..1a6997be469b 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -15,6 +15,7 @@ import matplotlib.cbook as cbook import matplotlib.colors as mcolors import matplotlib.cm as cm +from matplotlib import docstring import matplotlib.transforms as transforms import matplotlib.artist as artist from matplotlib.artist import allow_rasterization @@ -496,7 +497,7 @@ def update_from(self, other): # these are not available for the object inspector until after the # class is built so we define an initial set here for the init # function and they will be overridden after object defn -artist.kwdocd['Collection'] = """\ +docstring.interpd.update(Collection = """\ Valid Collection keyword arguments: * *edgecolors*: None @@ -516,12 +517,13 @@ def update_from(self, other): If any of *edgecolors*, *facecolors*, *linewidths*, *antialiaseds* are None, they default to their :data:`matplotlib.rcParams` patch setting, in sequence form. -""" +""") class PathCollection(Collection): """ This is the most basic :class:`Collection` subclass. """ + @docstring.dedent_interpd def __init__(self, paths, **kwargs): """ *paths* is a sequence of :class:`matplotlib.path.Path` @@ -532,7 +534,6 @@ def __init__(self, paths, **kwargs): Collection.__init__(self, **kwargs) self.set_paths(paths) - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd def set_paths(self, paths): @@ -540,6 +541,7 @@ def set_paths(self, paths): class PolyCollection(Collection): + @docstring.dedent_interpd def __init__(self, verts, sizes = None, closed = True, **kwargs): """ *verts* is a sequence of ( *verts0*, *verts1*, ...) where @@ -562,7 +564,6 @@ def __init__(self, verts, sizes = None, closed = True, **kwargs): Collection.__init__(self,**kwargs) self._sizes = sizes self.set_verts(verts, closed) - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd def set_verts(self, verts, closed=True): '''This allows one to delay initialization of the vertices.''' @@ -599,6 +600,7 @@ class BrokenBarHCollection(PolyCollection): A collection of horizontal bars spanning *yrange* with a sequence of *xranges*. """ + @docstring.dedent_interpd def __init__(self, xranges, yrange, **kwargs): """ *xranges* @@ -613,7 +615,6 @@ def __init__(self, xranges, yrange, **kwargs): ymax = ymin + ywidth verts = [ [(xmin, ymin), (xmin, ymax), (xmin+xwidth, ymax), (xmin+xwidth, ymin), (xmin, ymin)] for xmin, xwidth in xranges] PolyCollection.__init__(self, verts, **kwargs) - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd @staticmethod @@ -640,6 +641,7 @@ class RegularPolyCollection(Collection): """Draw a collection of regular polygons with *numsides*.""" _path_generator = mpath.Path.unit_regular_polygon + @docstring.dedent_interpd def __init__(self, numsides, rotation = 0 , @@ -682,8 +684,6 @@ def __init__(self, self._rotation = rotation self.set_transform(transforms.IdentityTransform()) - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd - @allow_rasterization def draw(self, renderer): self._transforms = [ @@ -875,6 +875,7 @@ class CircleCollection(Collection): """ A collection of circles, drawn using splines. """ + @docstring.dedent_interpd def __init__(self, sizes, **kwargs): """ *sizes* @@ -886,7 +887,6 @@ def __init__(self, sizes, **kwargs): self._sizes = sizes self.set_transform(transforms.IdentityTransform()) self._paths = [mpath.Path.unit_circle()] - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd def get_sizes(self): "return sizes of circles" @@ -906,6 +906,7 @@ class EllipseCollection(Collection): """ A collection of ellipses, drawn using splines. """ + @docstring.dedent_interpd def __init__(self, widths, heights, angles, units='points', **kwargs): """ *widths*: sequence @@ -937,8 +938,6 @@ def __init__(self, widths, heights, angles, units='points', **kwargs): self._initialized = False - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd - def _init(self): def on_dpi_change(fig): self._transforms = [] @@ -1230,9 +1229,10 @@ def draw(self, renderer): -artist.kwdocd['Collection'] = patchstr = artist.kwdoc(Collection) +patchstr = artist.kwdoc(Collection) for k in ('QuadMesh', 'PolyCollection', 'BrokenBarHCollection', 'RegularPolyCollection', 'PathCollection', - 'StarPolygonCollection', 'PatchCollection', 'CircleCollection'): - artist.kwdocd[k] = patchstr -artist.kwdocd['LineCollection'] = artist.kwdoc(LineCollection) + 'StarPolygonCollection', 'PatchCollection', + 'CircleCollection', 'Collection',): + docstring.interpd.update({k:patchstr}) +docstring.interpd.update(LineCollection = artist.kwdoc(LineCollection)) diff --git a/lib/matplotlib/colorbar.py b/lib/matplotlib/colorbar.py index b5b5b103a80a..3f06ea98c2d5 100644 --- a/lib/matplotlib/colorbar.py +++ b/lib/matplotlib/colorbar.py @@ -23,6 +23,7 @@ import matplotlib as mpl import matplotlib.colors as colors import matplotlib.cm as cm +from matplotlib import docstring import matplotlib.ticker as ticker import matplotlib.cbook as cbook import matplotlib.lines as lines @@ -150,6 +151,7 @@ ''' % (make_axes_kw_doc, colormap_kw_doc) +docstring.interpd.update(colorbar_doc=colorbar_doc) class ColorbarBase(cm.ScalarMappable): @@ -693,7 +695,25 @@ def update_bruteforce(self, mappable): # be recalculating everything if there was a simple alpha # change. +@docstring.Substitution(make_axes_kw_doc) def make_axes(parent, **kw): + ''' + Resize and reposition a parent axes, and return a child + axes suitable for a colorbar:: + + cax, kw = make_axes(parent, **kw) + + Keyword arguments may include the following (with defaults): + + *orientation* + 'vertical' or 'horizontal' + + %s + + All but the first of these are stripped from the input kw set. + + Returns (cax, kw), the child axes and the reduced kw dictionary. + ''' orientation = kw.setdefault('orientation', 'vertical') fraction = kw.pop('fraction', 0.15) shrink = kw.pop('shrink', 1.0) @@ -720,22 +740,5 @@ def make_axes(parent, **kw): cax = fig.add_axes(pbcb) cax.set_aspect(aspect, anchor=anchor, adjustable='box') return cax, kw -make_axes.__doc__ =''' - Resize and reposition a parent axes, and return a child - axes suitable for a colorbar:: - - cax, kw = make_axes(parent, **kw) - - Keyword arguments may include the following (with defaults): - - *orientation* - 'vertical' or 'horizontal' - - %s - - All but the first of these are stripped from the input kw set. - - Returns (cax, kw), the child axes and the reduced kw dictionary. - ''' % make_axes_kw_doc diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index 36e20eee2a84..b61660ccbf1d 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -32,7 +32,9 @@ from matplotlib.blocking_input import BlockingMouseInput, BlockingKeyMouseInput import matplotlib.cbook as cbook +from matplotlib import docstring +docstring.interpd.update(projection_names = get_projection_names()) class SubplotParams: """ @@ -555,6 +557,7 @@ def fixlist(args): key = fixlist(args), fixitems(kwargs.items()) return key + @docstring.dedent_interpd def add_axes(self, *args, **kwargs): """ Add an a axes with axes rect [*left*, *bottom*, *width*, @@ -564,7 +567,7 @@ def add_axes(self, *args, **kwargs): sets the projection type of the axes. (For backward compatibility, ``polar=True`` may also be provided, which is equivalent to ``projection='polar'``). Valid values for - *projection* are: %(list)s. Some of these projections support + *projection* are: %(projection_names)s. Some of these projections support additional kwargs, which may be provided to :meth:`add_axes`:: rect = l,b,w,h @@ -624,10 +627,7 @@ def add_axes(self, *args, **kwargs): self._seen[key] = a return a - add_axes.__doc__ = dedent(add_axes.__doc__) % \ - {'list': (", ".join(get_projection_names())), - 'Axes': artist.kwdocd['Axes']} - + @docstring.dedent_interpd def add_subplot(self, *args, **kwargs): """ Add a subplot. Examples: @@ -642,7 +642,7 @@ def add_subplot(self, *args, **kwargs): *projection*, which chooses a projection type for the axes. (For backward compatibility, *polar=True* may also be provided, which is equivalent to *projection='polar'*). Valid - values for *projection* are: %(list)s. Some of these projections + values for *projection* are: %(projection_names)s. Some of these projections support additional *kwargs*, which may be provided to :meth:`add_axes`. @@ -693,9 +693,6 @@ def add_subplot(self, *args, **kwargs): self._axstack.push(a) self.sca(a) return a - add_subplot.__doc__ = dedent(add_subplot.__doc__) % { - 'list': ", ".join(get_projection_names()), - 'Axes': artist.kwdocd['Axes']} def clf(self): """ @@ -891,6 +888,7 @@ def legend(self, handles, labels, *args, **kwargs): self.legends.append(l) return l + @docstring.dedent_interpd def text(self, x, y, s, *args, **kwargs): """ Call signature:: @@ -915,13 +913,13 @@ def text(self, x, y, s, *args, **kwargs): self._set_artist_props(t) self.texts.append(t) return t - text.__doc__ = dedent(text.__doc__) % artist.kwdocd def _set_artist_props(self, a): if a!= self: a.set_figure(self) a.set_transform(self.transFigure) + @docstring.dedent_interpd def gca(self, **kwargs): """ Return the current axes, creating one if necessary @@ -945,7 +943,6 @@ def gca(self, **kwargs): if isinstance(ax, projection_class): return ax return self.add_subplot(111, **kwargs) - gca.__doc__ = dedent(gca.__doc__) % artist.kwdocd def sca(self, a): 'Set the current axes to be a and return a' @@ -1038,7 +1035,14 @@ def savefig(self, *args, **kwargs): for ax, alpha in zip(self.axes, original_axes_alpha): ax.patch.set_alpha(alpha) + @docstring.dedent_interpd def colorbar(self, mappable, cax=None, ax=None, **kw): + """ + Create a colorbar for a ScalarMappable instance. + + Documentation for the pylab thin wrapper: + %(colorbar_doc)s + """ if ax is None: ax = self.gca() if cax is None: @@ -1056,13 +1060,6 @@ def on_changed(m): mappable.set_colorbar(cb, cax) self.sca(ax) return cb - colorbar.__doc__ = ''' - Create a colorbar for a ScalarMappable instance. - - Documentation for the pylab thin wrapper: - %s - - '''% cbar.colorbar_doc def subplots_adjust(self, *args, **kwargs): """ @@ -1220,4 +1217,4 @@ def figaspect(arg): newsize = np.clip(newsize,figsize_min,figsize_max) return newsize -artist.kwdocd['Figure'] = artist.kwdoc(Figure) +docstring.interpd.update(Figure=artist.kwdoc(Figure)) diff --git a/lib/matplotlib/lines.py b/lib/matplotlib/lines.py index 3b9fd8b82a1d..5b433bcd9be3 100644 --- a/lib/matplotlib/lines.py +++ b/lib/matplotlib/lines.py @@ -19,6 +19,7 @@ from matplotlib import rcParams from artist import allow_rasterization +from matplotlib import docstring # special-purpose marker identifiers: (TICKLEFT, TICKRIGHT, TICKUP, TICKDOWN, @@ -172,7 +173,7 @@ def __init__(self, xdata, ydata, markeredgewidth = None, markeredgecolor = None, markerfacecolor = None, - fillstyle = 'full', + fillstyle = 'full', antialiased = None, dash_capstyle = None, solid_capstyle = None, @@ -1546,8 +1547,8 @@ def onpick(self, event): lineMarkers = Line2D._markers drawStyles = Line2D.drawStyles -artist.kwdocd['Line2D'] = artist.kwdoc(Line2D) +docstring.interpd.update(Line2D = artist.kwdoc(Line2D)) # You can not set the docstring of an instancemethod, # but you can on the underlying function. Go figure. -Line2D.__init__.im_func.__doc__ = dedent(Line2D.__init__.__doc__) % artist.kwdocd +docstring.dedent_interpd(Line2D.__init__.im_func) diff --git a/lib/matplotlib/mlab.py b/lib/matplotlib/mlab.py index d23c26fabb5e..ac7b0e76e643 100644 --- a/lib/matplotlib/mlab.py +++ b/lib/matplotlib/mlab.py @@ -147,6 +147,7 @@ import matplotlib.nxutils as nxutils import matplotlib.cbook as cbook +from matplotlib import docstring def logspace(xmin,xmax,N): @@ -288,8 +289,7 @@ def _spectral_helper(x, y, NFFT=256, Fs=2, detrend=detrend_none, return Pxy, freqs, t #Split out these keyword docs so that they can be used elsewhere -kwdocd = dict() -kwdocd['PSD'] =""" +docstring.interpd.update(PSD=cbook.dedent(""" Keyword arguments: *NFFT*: integer @@ -346,8 +346,9 @@ def _spectral_helper(x, y, NFFT=256, Fs=2, detrend=detrend_none, by the scaling frequency, which gives density in units of Hz^-1. This allows for integration over the returned frequency values. The default is True for MatLab compatibility. -""" +""")) +@docstring.dedent_interpd def psd(x, NFFT=256, Fs=2, detrend=detrend_none, window=window_hanning, noverlap=0, pad_to=None, sides='default', scale_by_freq=None): """ @@ -373,8 +374,7 @@ def psd(x, NFFT=256, Fs=2, detrend=detrend_none, window=window_hanning, scale_by_freq) return Pxx.real,freqs -psd.__doc__ = psd.__doc__ % kwdocd - +@docstring.dedent_interpd def csd(x, y, NFFT=256, Fs=2, detrend=detrend_none, window=window_hanning, noverlap=0, pad_to=None, sides='default', scale_by_freq=None): """ @@ -405,8 +405,7 @@ def csd(x, y, NFFT=256, Fs=2, detrend=detrend_none, window=window_hanning, Pxy = Pxy.mean(axis=1) return Pxy, freqs -csd.__doc__ = csd.__doc__ % kwdocd - +@docstring.dedent_interpd def specgram(x, NFFT=256, Fs=2, detrend=detrend_none, window=window_hanning, noverlap=128, pad_to=None, sides='default', scale_by_freq=None): """ @@ -445,11 +444,10 @@ def specgram(x, NFFT=256, Fs=2, detrend=detrend_none, window=window_hanning, return Pxx, freqs, t -specgram.__doc__ = specgram.__doc__ % kwdocd - _coh_error = """Coherence is calculated by averaging over *NFFT* length segments. Your signal is too short for your choice of *NFFT*. """ +@docstring.dedent_interpd def cohere(x, y, NFFT=256, Fs=2, detrend=detrend_none, window=window_hanning, noverlap=0, pad_to=None, sides='default', scale_by_freq=None): """ @@ -488,8 +486,6 @@ def cohere(x, y, NFFT=256, Fs=2, detrend=detrend_none, window=window_hanning, Cxy.shape = (len(f),) return Cxy, f -cohere.__doc__ = cohere.__doc__ % kwdocd - def donothing_callback(*args): pass diff --git a/lib/matplotlib/offsetbox.py b/lib/matplotlib/offsetbox.py index 5e7d0f7ac25a..846016fefac1 100644 --- a/lib/matplotlib/offsetbox.py +++ b/lib/matplotlib/offsetbox.py @@ -26,6 +26,7 @@ from matplotlib.patches import FancyBboxPatch, FancyArrowPatch from matplotlib import rcParams +from matplotlib import docstring import matplotlib.cbook as cbook #from bboximage import BboxImage @@ -1171,6 +1172,7 @@ class AnnotationBbox(martist.Artist, _AnnotationBase): def __str__(self): return "AnnotationBbox(%g,%g)"%(self.xy[0],self.xy[1]) + @docstring.dedent_interpd def __init__(self, offsetbox, xy, xybox=None, xycoords='data', @@ -1236,8 +1238,6 @@ def __init__(self, offsetbox, xy, self._drawFrame = frameon - __init__.__doc__ = cbook.dedent(__init__.__doc__) % martist.kwdocd - def contains(self,event): t,tinfo = self.offsetbox.contains(event) if self.arrow is not None: diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 6b75d478f577..23514396aed3 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -9,13 +9,14 @@ import matplotlib.artist as artist from matplotlib.artist import allow_rasterization import matplotlib.colors as colors +from matplotlib import docstring import matplotlib.transforms as transforms from matplotlib.path import Path # these are not available for the object inspector until after the # class is built so we define an initial set here for the init # function and they will be overridden after object definition -artist.kwdocd['Patch'] = """ +docstring.interpd.update(Patch = """ ================= ============================================== Property Description @@ -38,7 +39,7 @@ zorder any number ================= ============================================== - """ + """) class Patch(artist.Artist): """ @@ -51,6 +52,38 @@ class Patch(artist.Artist): def __str__(self): return str(self.__class__).split('.')[-1] + def __init__(self, + edgecolor=None, + facecolor=None, + linewidth=None, + linestyle=None, + antialiased = None, + hatch = None, + fill=True, + **kwargs + ): + """ + The following kwarg properties are supported + + %(Patch)s + """ + artist.Artist.__init__(self) + + if linewidth is None: linewidth = mpl.rcParams['patch.linewidth'] + if linestyle is None: linestyle = "solid" + if antialiased is None: antialiased = mpl.rcParams['patch.antialiased'] + + self.set_edgecolor(edgecolor) + self.set_facecolor(facecolor) + self.set_linewidth(linewidth) + self.set_linestyle(linestyle) + self.set_antialiased(antialiased) + self.set_hatch(hatch) + self.fill = fill + self._combined_transform = transforms.IdentityTransform() + + if len(kwargs): artist.setp(self, **kwargs) + def get_verts(self): """ Return a copy of the vertices used in this patch @@ -337,53 +370,20 @@ def get_path(self): def get_window_extent(self, renderer=None): return self.get_path().get_extents(self.get_transform()) -artist.kwdocd['Patch'] = patchdoc = artist.kwdoc(Patch) +patchdoc = artist.kwdoc(Patch) for k in ('Rectangle', 'Circle', 'RegularPolygon', 'Polygon', 'Wedge', 'Arrow', 'FancyArrow', 'YAArrow', 'CirclePolygon', 'Ellipse', 'Arc', - 'FancyBboxPatch'): - artist.kwdocd[k] = patchdoc - -# define Patch.__init__ after the class so that the docstring can be -# auto-generated. -def __patch__init__(self, - edgecolor=None, - facecolor=None, - linewidth=None, - linestyle=None, - antialiased = None, - hatch = None, - fill=True, - **kwargs - ): - """ - The following kwarg properties are supported - - %(Patch)s - """ - artist.Artist.__init__(self) - - if linewidth is None: linewidth = mpl.rcParams['patch.linewidth'] - if linestyle is None: linestyle = "solid" - if antialiased is None: antialiased = mpl.rcParams['patch.antialiased'] + 'FancyBboxPatch', 'Patch'): + docstring.interpd.update({k:patchdoc}) - self.set_edgecolor(edgecolor) - self.set_facecolor(facecolor) - self.set_linewidth(linewidth) - self.set_linestyle(linestyle) - self.set_antialiased(antialiased) - self.set_hatch(hatch) - self.fill = fill - self._combined_transform = transforms.IdentityTransform() - - if len(kwargs): artist.setp(self, **kwargs) - -__patch__init__.__doc__ = cbook.dedent(__patch__init__.__doc__) % artist.kwdocd -Patch.__init__ = __patch__init__ +# define Patch.__init__ docstring after the class has been added to interpd +docstring.dedent_interpd(Patch.__init__.im_func) class Shadow(Patch): def __str__(self): return "Shadow(%s)"%(str(self.patch)) + @docstring.dedent_interpd def __init__(self, patch, ox, oy, props=None, **kwargs): """ Create a shadow of the given *patch* offset by *ox*, *oy*. @@ -400,7 +400,6 @@ def __init__(self, patch, ox, oy, props=None, **kwargs): self._ox, self._oy = ox, oy self._shadow_transform = transforms.Affine2D() self._update() - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd def _update(self): self.update_from(self.patch) @@ -451,6 +450,7 @@ def __str__(self): return self.__class__.__name__ \ + "(%g,%g;%gx%g)" % (self._x, self._y, self._width, self._height) + @docstring.dedent_interpd def __init__(self, xy, width, height, **kwargs): """ @@ -468,7 +468,6 @@ def __init__(self, xy, width, height, **kwargs): self._height = height # Note: This cannot be calculated until this is added to an Axes self._rect_transform = transforms.IdentityTransform() - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd def get_path(self): """ @@ -589,6 +588,7 @@ class RegularPolygon(Patch): def __str__(self): return "Poly%d(%g,%g)"%(self._numVertices,self._xy[0],self._xy[1]) + @docstring.dedent_interpd def __init__(self, xy, numVertices, radius=5, orientation=0, **kwargs): """ @@ -619,8 +619,6 @@ def __init__(self, xy, numVertices, radius=5, orientation=0, Patch.__init__(self, **kwargs) - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd - def _update_transform(self): self._poly_transform.clear() \ .scale(self.radius) \ @@ -665,6 +663,7 @@ class PathPatch(Patch): def __str__(self): return "Poly((%g, %g) ...)" % tuple(self._path.vertices[0]) + @docstring.dedent_interpd def __init__(self, path, **kwargs): """ *path* is a :class:`matplotlib.path.Path` object. @@ -680,7 +679,6 @@ def __init__(self, path, **kwargs): """ Patch.__init__(self, **kwargs) self._path = path - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd def get_path(self): return self._path @@ -692,6 +690,7 @@ class Polygon(Patch): def __str__(self): return "Poly((%g, %g) ...)" % tuple(self._path.vertices[0]) + @docstring.dedent_interpd def __init__(self, xy, closed=True, **kwargs): """ *xy* is a numpy array with shape Nx2. @@ -713,8 +712,6 @@ def __init__(self, xy, closed=True, **kwargs): self._path = Path(xy) self.set_closed(closed) - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd - def get_path(self): return self._path @@ -753,6 +750,7 @@ class Wedge(Patch): def __str__(self): return "Wedge(%g,%g)"%(self.theta1,self.theta2) + @docstring.dedent_interpd def __init__(self, center, r, theta1, theta2, width=None, **kwargs): """ Draw a wedge centered at *x*, *y* center with radius *r* that @@ -798,7 +796,6 @@ def __init__(self, center, r, theta1, theta2, width=None, **kwargs): v += np.asarray(center) self._path = Path(v,c) self._patch_transform = transforms.IdentityTransform() - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd def get_path(self): return self._path @@ -818,6 +815,7 @@ def __str__(self): [ 1.0, 0.0 ], [ 0.8, 0.3], [ 0.8, 0.1 ], [ 0.0, 0.1] ] ) + @docstring.dedent_interpd def __init__( self, x, y, dx, dy, width=1.0, **kwargs ): """ Draws an arrow, starting at (*x*, *y*), direction and length @@ -836,7 +834,6 @@ def __init__( self, x, y, dx, dy, width=1.0, **kwargs ): trans3 = transforms.Affine2D().translate(x, y) trans = trans1 + trans2 + trans3 self._patch_transform = trans.frozen() - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd def get_path(self): return self._path @@ -852,6 +849,7 @@ class FancyArrow(Polygon): def __str__(self): return "FancyArrow()" + @docstring.dedent_interpd def __init__(self, x, y, dx, dy, width=0.001, length_includes_head=False, \ head_width=None, head_length=None, shape='full', overhang=0, \ head_starts_at_zero=False,**kwargs): @@ -924,7 +922,6 @@ def __init__(self, x, y, dx, dy, width=0.001, length_includes_head=False, \ verts = np.dot(coords, M) + (x+dx, y+dy) Polygon.__init__(self, map(tuple, verts), **kwargs) - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd class YAArrow(Patch): """ @@ -936,6 +933,7 @@ class YAArrow(Patch): def __str__(self): return "YAArrow()" + @docstring.dedent_interpd def __init__(self, figure, xytip, xybase, width=4, frac=0.1, headwidth=12, **kwargs): """ Constructor arguments: @@ -970,7 +968,6 @@ def __init__(self, figure, xytip, xybase, width=4, frac=0.1, headwidth=12, **kwa self.frac = frac self.headwidth = headwidth Patch.__init__(self, **kwargs) - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd def get_path(self): # Since this is dpi dependent, we need to recompute the path @@ -1034,6 +1031,7 @@ class CirclePolygon(RegularPolygon): def __str__(self): return "CirclePolygon(%d,%d)"%self.center + @docstring.dedent_interpd def __init__(self, xy, radius=5, resolution=20, # the number of vertices **kwargs): @@ -1052,7 +1050,6 @@ def __init__(self, xy, radius=5, radius, orientation=0, **kwargs) - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd class Ellipse(Patch): @@ -1062,6 +1059,7 @@ class Ellipse(Patch): def __str__(self): return "Ellipse(%s,%s;%sx%s)"%(self.center[0],self.center[1],self.width,self.height) + @docstring.dedent_interpd def __init__(self, xy, width, height, angle=0.0, **kwargs): """ *xy* @@ -1087,7 +1085,6 @@ def __init__(self, xy, width, height, angle=0.0, **kwargs): self._path = Path.unit_circle() # Note: This cannot be calculated until this is added to an Axes self._patch_transform = transforms.IdentityTransform() - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd def _recompute_transform(self): """NOTE: This cannot be called until after this has been added @@ -1127,6 +1124,7 @@ class Circle(Ellipse): def __str__(self): return "Circle((%g,%g),r=%g)"%(self.center[0],self.center[1],self.radius) + @docstring.dedent_interpd def __init__(self, xy, radius=5, **kwargs): """ Create true circle at center *xy* = (*x*, *y*) with given @@ -1145,7 +1143,6 @@ def __init__(self, xy, radius=5, **kwargs): self.radius = radius Ellipse.__init__(self, xy, radius*2, radius*2, **kwargs) - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd def set_radius(self, radius): """ @@ -1175,6 +1172,7 @@ class Arc(Ellipse): def __str__(self): return "Arc(%s,%s;%sx%s)"%(self.center[0],self.center[1],self.width,self.height) + @docstring.dedent_interpd def __init__(self, xy, width, height, angle=0.0, theta1=0.0, theta2=360.0, **kwargs): """ The following args are supported: @@ -1212,7 +1210,6 @@ def __init__(self, xy, width, height, angle=0.0, theta1=0.0, theta2=360.0, **kwa self.theta1 = theta1 self.theta2 = theta2 - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd @allow_rasterization def draw(self, renderer): @@ -1987,9 +1984,11 @@ def transmute(self, x0, y0, width, height, mutation_size): _style_list["roundtooth"] = Roundtooth - __doc__ = cbook.dedent(__doc__) % \ - {"AvailableBoxstyles": _pprint_styles(_style_list)} + if __doc__: # __doc__ could be None if -OO optimization is enabled + __doc__ = cbook.dedent(__doc__) % \ + {"AvailableBoxstyles": _pprint_styles(_style_list)} +docstring.interpd.update(AvailableBoxstyles=_pprint_styles(BoxStyle._style_list)) class FancyBboxPatch(Patch): """ @@ -2007,6 +2006,7 @@ def __str__(self): return self.__class__.__name__ \ + "FancyBboxPatch(%g,%g;%gx%g)" % (self._x, self._y, self._width, self._height) + @docstring.dedent_interpd def __init__(self, xy, width, height, boxstyle="round", bbox_transmuter=None, @@ -2054,13 +2054,7 @@ def __init__(self, xy, width, height, self._mutation_aspect=mutation_aspect - kwdoc = dict() - kwdoc["AvailableBoxstyles"]=_pprint_styles(BoxStyle._style_list) - kwdoc.update(artist.kwdocd) - __init__.__doc__ = cbook.dedent(__init__.__doc__) % kwdoc - del kwdoc - - + @docstring.dedent_interpd def set_boxstyle(self, boxstyle=None, **kw): """ Set the box style. @@ -2092,12 +2086,6 @@ def set_boxstyle(self, boxstyle=None, **kw): self._bbox_transmuter = BoxStyle(boxstyle, **kw) - kwdoc = dict() - kwdoc["AvailableBoxstyles"]=_pprint_styles(BoxStyle._style_list) - kwdoc.update(artist.kwdocd) - set_boxstyle.__doc__ = cbook.dedent(set_boxstyle.__doc__) % kwdoc - del kwdoc - def set_mutation_scale(self, scale): """ Set the mutation scale. @@ -2682,9 +2670,9 @@ def connect(self, posA, posB): _style_list["bar"] = Bar - - __doc__ = cbook.dedent(__doc__) % \ - {"AvailableConnectorstyles": _pprint_styles(_style_list)} + if __doc__: + __doc__ = cbook.dedent(__doc__) % \ + {"AvailableConnectorstyles": _pprint_styles(_style_list)} @@ -3438,11 +3426,16 @@ def transmute(self, path, mutation_size, linewidth): _style_list["wedge"] = Wedge - __doc__ = cbook.dedent(__doc__) % \ - {"AvailableArrowstyles": _pprint_styles(_style_list)} + if __doc__: + __doc__ = cbook.dedent(__doc__) % \ + {"AvailableArrowstyles": _pprint_styles(_style_list)} +docstring.interpd.update( + AvailableArrowstyles = _pprint_styles(ArrowStyle._style_list), + AvailableConnectorstyles = _pprint_styles(ConnectionStyle._style_list), +) class FancyArrowPatch(Patch): """ @@ -3454,6 +3447,7 @@ def __str__(self): return self.__class__.__name__ \ + "FancyArrowPatch(%g,%g,%g,%g,%g,%g)" % tuple(self._q_bezier) + @docstring.dedent_interpd def __init__(self, posA=None, posB=None, path=None, arrowstyle="simple", @@ -3535,14 +3529,6 @@ def __init__(self, posA=None, posB=None, #self._draw_in_display_coordinate = True - kwdoc = dict() - kwdoc["AvailableArrowstyles"]=_pprint_styles(ArrowStyle._style_list) - kwdoc["AvailableConnectorstyles"]=_pprint_styles(ConnectionStyle._style_list) - - kwdoc.update(artist.kwdocd) - __init__.__doc__ = cbook.dedent(__init__.__doc__) % kwdoc - del kwdoc - def set_positions(self, posA, posB): """ set the begin end end positions of the connecting path. Use current vlaue if None. @@ -3768,6 +3754,7 @@ def __str__(self): return "ConnectionPatch((%g,%g),(%g,%g))" % \ (self.xy1[0],self.xy1[1],self.xy2[0],self.xy2[1]) + @docstring.dedent_interpd def __init__(self, xyA, xyB, coordsA, coordsB=None, axesA=None, axesB=None, arrowstyle="-", @@ -3859,8 +3846,6 @@ def __init__(self, xyA, xyB, coordsA, coordsB=None, # if True, draw annotation only if self.xy is inside the axes self._annotation_clip = None - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd - def _get_xy(self, x, y, s, axes=None): """ diff --git a/lib/matplotlib/projections/geo.py b/lib/matplotlib/projections/geo.py index 6e5dc4e80533..aa3500a99194 100644 --- a/lib/matplotlib/projections/geo.py +++ b/lib/matplotlib/projections/geo.py @@ -5,7 +5,6 @@ import matplotlib rcParams = matplotlib.rcParams -from matplotlib.artist import kwdocd from matplotlib.axes import Axes from matplotlib import cbook from matplotlib.patches import Circle diff --git a/lib/matplotlib/projections/polar.py b/lib/matplotlib/projections/polar.py index 15d4127df3d4..089acbd4ba50 100644 --- a/lib/matplotlib/projections/polar.py +++ b/lib/matplotlib/projections/polar.py @@ -5,10 +5,10 @@ import matplotlib rcParams = matplotlib.rcParams -from matplotlib.artist import kwdocd from matplotlib.axes import Axes import matplotlib.axis as maxis from matplotlib import cbook +from matplotlib import docstring from matplotlib.patches import Circle from matplotlib.path import Path from matplotlib.ticker import Formatter, Locator @@ -317,6 +317,7 @@ def set_yscale(self, *args, **kwargs): set_rscale = Axes.set_yscale set_rticks = Axes.set_yticks + @docstring.dedent_interpd def set_thetagrids(self, angles, labels=None, frac=None, **kwargs): """ @@ -353,8 +354,8 @@ def set_thetagrids(self, angles, labels=None, frac=None, for t in self.xaxis.get_ticklabels(): t.update(kwargs) return self.xaxis.get_ticklines(), self.xaxis.get_ticklabels() - set_thetagrids.__doc__ = cbook.dedent(set_thetagrids.__doc__) % kwdocd + @docstring.dedent_interpd def set_rgrids(self, radii, labels=None, angle=None, rpad=None, **kwargs): """ Set the radial locations and labels of the *r* grids. @@ -399,8 +400,6 @@ def set_rgrids(self, radii, labels=None, angle=None, rpad=None, **kwargs): t.update(kwargs) return self.yaxis.get_gridlines(), self.yaxis.get_ticklabels() - set_rgrids.__doc__ = cbook.dedent(set_rgrids.__doc__) % kwdocd - def set_xscale(self, scale, *args, **kwargs): if scale != 'linear': raise NotImplementedError("You can not set the xscale on a polar plot.") diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index 68cefaf5288e..7a2ec7fb4c37 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -3,6 +3,7 @@ import matplotlib from matplotlib import _pylab_helpers, interactive from matplotlib.cbook import dedent, silent_list, is_string_like, is_numlike +from matplotlib import docstring from matplotlib.figure import Figure, figaspect from matplotlib.backend_bases import FigureCanvasBase from matplotlib.image import imread as _imread @@ -119,16 +120,14 @@ def ion(): 'Turn interactive mode on.' matplotlib.interactive(True) +@docstring.copy_dedent(matplotlib.rc) def rc(*args, **kwargs): matplotlib.rc(*args, **kwargs) -if matplotlib.rc.__doc__ is not None: - rc.__doc__ = dedent(matplotlib.rc.__doc__) +@docstring.copy_dedent(matplotlib.rcdefaults) def rcdefaults(): matplotlib.rcdefaults() draw_if_interactive() -if matplotlib.rcdefaults.__doc__ is not None: - rcdefaults.__doc__ = dedent(matplotlib.rcdefaults.__doc__) # The current "image" (ScalarMappable) is tracked here on a # per-pylab-session basis: @@ -161,12 +160,11 @@ def sci(im): # (getp is simply imported) +@docstring.copy(_setp) def setp(*args, **kwargs): ret = _setp(*args, **kwargs) draw_if_interactive() return ret -if _setp.__doc__ is not None: - setp.__doc__ = _setp.__doc__ @@ -290,17 +288,13 @@ def get_current_fig_manager(): figManager = _pylab_helpers.Gcf.get_active() return figManager -# note we check for __doc__ is not None since py2exe optimize removes -# the docstrings +@docstring.copy_dedent(FigureCanvasBase.mpl_connect) def connect(s, func): return get_current_fig_manager().canvas.mpl_connect(s, func) -if FigureCanvasBase.mpl_connect.__doc__ is not None: - connect.__doc__ = dedent(FigureCanvasBase.mpl_connect.__doc__) +@docstring.copy_dedent(FigureCanvasBase.mpl_disconnect) def disconnect(cid): return get_current_fig_manager().canvas.mpl_disconnect(cid) -if FigureCanvasBase.mpl_disconnect.__doc__ is not None: - disconnect.__doc__ = dedent(FigureCanvasBase.mpl_disconnect.__doc__) def close(*args): """ @@ -351,12 +345,12 @@ def draw(): 'redraw the current figure' get_current_fig_manager().canvas.draw() +@docstring.copy_dedent(Figure.savefig) def savefig(*args, **kwargs): fig = gcf() return fig.savefig(*args, **kwargs) -if Figure.savefig.__doc__ is not None: - savefig.__doc__ = dedent(Figure.savefig.__doc__) +@docstring.copy_dedent(Figure.ginput) def ginput(*args, **kwargs): """ Blocking call to interact with the figure. @@ -367,9 +361,8 @@ def ginput(*args, **kwargs): If *timeout* is negative, does not timeout. """ return gcf().ginput(*args, **kwargs) -if Figure.ginput.__doc__ is not None: - ginput.__doc__ = dedent(Figure.ginput.__doc__) +@docstring.copy_dedent(Figure.waitforbuttonpress) def waitforbuttonpress(*args, **kwargs): """ Blocking call to interact with the figure. @@ -381,36 +374,31 @@ def waitforbuttonpress(*args, **kwargs): If *timeout* is negative, does not timeout. """ return gcf().waitforbuttonpress(*args, **kwargs) -if Figure.waitforbuttonpress.__doc__ is not None: - waitforbuttonpress.__doc__ = dedent(Figure.waitforbuttonpress.__doc__) # Putting things in figures +@docstring.copy_dedent(Figure.text) def figtext(*args, **kwargs): ret = gcf().text(*args, **kwargs) draw_if_interactive() return ret -if Figure.text.__doc__ is not None: - figtext.__doc__ = dedent(Figure.text.__doc__) +@docstring.copy_dedent(Figure.suptitle) def suptitle(*args, **kwargs): ret = gcf().suptitle(*args, **kwargs) draw_if_interactive() return ret -if Figure.suptitle.__doc__ is not None: - suptitle.__doc__ = dedent(Figure.suptitle.__doc__) +@docstring.Appender("Addition kwargs: hold = [True|False] overrides default hold state", "\n") +@docstring.copy_dedent(Figure.figimage) def figimage(*args, **kwargs): # allow callers to override the hold state by passing hold=True|False ret = gcf().figimage(*args, **kwargs) draw_if_interactive() gci._current = ret return ret -if Figure.figimage.__doc__ is not None: - figimage.__doc__ = dedent(Figure.figimage.__doc__) + """ -Addition kwargs: hold = [True|False] overrides default hold state""" def figlegend(handles, labels, loc, **kwargs): """ @@ -930,6 +918,7 @@ def ylim(*args, **kwargs): return ret +@docstring.dedent_interpd def xscale(*args, **kwargs): """ call signature:: @@ -946,10 +935,8 @@ def xscale(*args, **kwargs): ret = ax.set_xscale(*args, **kwargs) draw_if_interactive() return ret -xscale.__doc__ = dedent(xscale.__doc__) % { - 'scale': ' | '.join([repr(_x) for _x in get_scale_names()]), - 'scale_docs': get_scale_docs()} +@docstring.dedent_interpd def yscale(*args, **kwargs): """ call signature:: @@ -966,9 +953,6 @@ def yscale(*args, **kwargs): ret = ax.set_yscale(*args, **kwargs) draw_if_interactive() return ret -yscale.__doc__ = dedent(yscale.__doc__) % { - 'scale': ' | '.join([repr(_x) for _x in get_scale_names()]), - 'scale_docs': get_scale_docs()} def xticks(*args, **kwargs): """ @@ -1415,15 +1399,13 @@ def set_cmap(cmap): draw_if_interactive() +@docstring.copy_dedent(_imread) def imread(*args, **kwargs): return _imread(*args, **kwargs) -if _imread.__doc__ is not None: - imread.__doc__ = dedent(_imread.__doc__) +@docstring.copy_dedent(_imsave) def imsave(*args, **kwargs): return _imsave(*args, **kwargs) -if _imsave.__doc__ is not None: - imsave.__doc__ = dedent(_imsave.__doc__) def matshow(A, fignum=None, **kw): """ @@ -1607,16 +1589,19 @@ def getname_val(identifier): draw_if_interactive() -# This is added to docstrings of autogenerated plotting functions -__docstring_addendum = """ - -Additional kwargs: hold = [True|False] overrides default hold state""" +def autogen_docstring(base): + """Autogenerated wrappers will get their docstring from a base function + with an addendum.""" + msg = "Additional kwargs: hold = [True|False] overrides default hold state" + addendum = docstring.Appender(msg, '\n\n') + return lambda func: addendum(docstring.copy_dedent(base)(func)) ## Plotting part 2: autogenerated wrappers for axes methods ## # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.acorr) def acorr(x, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1631,11 +1616,10 @@ def acorr(x, hold=None, **kwargs): ax.hold(washold) return ret -if Axes.acorr.__doc__ is not None: - acorr.__doc__ = dedent(Axes.acorr.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.arrow) def arrow(x, y, dx, dy, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1650,11 +1634,10 @@ def arrow(x, y, dx, dy, hold=None, **kwargs): ax.hold(washold) return ret -if Axes.arrow.__doc__ is not None: - arrow.__doc__ = dedent(Axes.arrow.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.axhline) def axhline(y=0, xmin=0, xmax=1, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1669,11 +1652,10 @@ def axhline(y=0, xmin=0, xmax=1, hold=None, **kwargs): ax.hold(washold) return ret -if Axes.axhline.__doc__ is not None: - axhline.__doc__ = dedent(Axes.axhline.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.axhspan) def axhspan(ymin, ymax, xmin=0, xmax=1, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1688,11 +1670,10 @@ def axhspan(ymin, ymax, xmin=0, xmax=1, hold=None, **kwargs): ax.hold(washold) return ret -if Axes.axhspan.__doc__ is not None: - axhspan.__doc__ = dedent(Axes.axhspan.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.axvline) def axvline(x=0, ymin=0, ymax=1, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1707,11 +1688,10 @@ def axvline(x=0, ymin=0, ymax=1, hold=None, **kwargs): ax.hold(washold) return ret -if Axes.axvline.__doc__ is not None: - axvline.__doc__ = dedent(Axes.axvline.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.axvspan) def axvspan(xmin, xmax, ymin=0, ymax=1, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1726,11 +1706,10 @@ def axvspan(xmin, xmax, ymin=0, ymax=1, hold=None, **kwargs): ax.hold(washold) return ret -if Axes.axvspan.__doc__ is not None: - axvspan.__doc__ = dedent(Axes.axvspan.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.bar) def bar(left, height, width=0.80000000000000004, bottom=None, color=None, edgecolor=None, linewidth=None, yerr=None, xerr=None, ecolor=None, capsize=3, align='edge', orientation='vertical', log=False, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1745,11 +1724,10 @@ def bar(left, height, width=0.80000000000000004, bottom=None, color=None, edgeco ax.hold(washold) return ret -if Axes.bar.__doc__ is not None: - bar.__doc__ = dedent(Axes.bar.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.barh) def barh(bottom, width, height=0.80000000000000004, left=None, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1764,11 +1742,10 @@ def barh(bottom, width, height=0.80000000000000004, left=None, hold=None, **kwar ax.hold(washold) return ret -if Axes.barh.__doc__ is not None: - barh.__doc__ = dedent(Axes.barh.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.broken_barh) def broken_barh(xranges, yrange, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1783,11 +1760,10 @@ def broken_barh(xranges, yrange, hold=None, **kwargs): ax.hold(washold) return ret -if Axes.broken_barh.__doc__ is not None: - broken_barh.__doc__ = dedent(Axes.broken_barh.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.boxplot) def boxplot(x, notch=0, sym='b+', vert=1, whis=1.5, positions=None, widths=None, hold=None): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1802,11 +1778,10 @@ def boxplot(x, notch=0, sym='b+', vert=1, whis=1.5, positions=None, widths=None, ax.hold(washold) return ret -if Axes.boxplot.__doc__ is not None: - boxplot.__doc__ = dedent(Axes.boxplot.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.cohere) def cohere(x, y, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.window_hanning, noverlap=0, pad_to=None, sides='default', scale_by_freq=None, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1821,11 +1796,10 @@ def cohere(x, y, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.wi ax.hold(washold) return ret -if Axes.cohere.__doc__ is not None: - cohere.__doc__ = dedent(Axes.cohere.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.clabel) def clabel(CS, *args, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1840,11 +1814,10 @@ def clabel(CS, *args, **kwargs): ax.hold(washold) return ret -if Axes.clabel.__doc__ is not None: - clabel.__doc__ = dedent(Axes.clabel.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.contour) def contour(*args, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1859,11 +1832,10 @@ def contour(*args, **kwargs): ax.hold(washold) if ret._A is not None: gci._current = ret return ret -if Axes.contour.__doc__ is not None: - contour.__doc__ = dedent(Axes.contour.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.contourf) def contourf(*args, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1878,11 +1850,10 @@ def contourf(*args, **kwargs): ax.hold(washold) if ret._A is not None: gci._current = ret return ret -if Axes.contourf.__doc__ is not None: - contourf.__doc__ = dedent(Axes.contourf.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.csd) def csd(x, y, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.window_hanning, noverlap=0, pad_to=None, sides='default', scale_by_freq=None, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1897,11 +1868,10 @@ def csd(x, y, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.windo ax.hold(washold) return ret -if Axes.csd.__doc__ is not None: - csd.__doc__ = dedent(Axes.csd.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.errorbar) def errorbar(x, y, yerr=None, xerr=None, fmt='-', ecolor=None, elinewidth=None, capsize=3, barsabove=False, lolims=False, uplims=False, xlolims=False, xuplims=False, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1916,11 +1886,10 @@ def errorbar(x, y, yerr=None, xerr=None, fmt='-', ecolor=None, elinewidth=None, ax.hold(washold) return ret -if Axes.errorbar.__doc__ is not None: - errorbar.__doc__ = dedent(Axes.errorbar.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.fill) def fill(*args, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1935,11 +1904,10 @@ def fill(*args, **kwargs): ax.hold(washold) return ret -if Axes.fill.__doc__ is not None: - fill.__doc__ = dedent(Axes.fill.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.fill_between) def fill_between(x, y1, y2=0, where=None, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1954,11 +1922,10 @@ def fill_between(x, y1, y2=0, where=None, hold=None, **kwargs): ax.hold(washold) return ret -if Axes.fill_between.__doc__ is not None: - fill_between.__doc__ = dedent(Axes.fill_between.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.fill_betweenx) def fill_betweenx(y, x1, x2=0, where=None, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1973,11 +1940,10 @@ def fill_betweenx(y, x1, x2=0, where=None, hold=None, **kwargs): ax.hold(washold) return ret -if Axes.fill_betweenx.__doc__ is not None: - fill_betweenx.__doc__ = dedent(Axes.fill_betweenx.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.hexbin) def hexbin(x, y, C=None, gridsize=100, bins=None, xscale='linear', yscale='linear', extent=None, cmap=None, norm=None, vmin=None, vmax=None, alpha=1.0, linewidths=None, edgecolors='none', reduce_C_function=np.mean, mincnt=None, marginals=False, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -1992,11 +1958,10 @@ def hexbin(x, y, C=None, gridsize=100, bins=None, xscale='linear', yscale='linea ax.hold(washold) gci._current = ret return ret -if Axes.hexbin.__doc__ is not None: - hexbin.__doc__ = dedent(Axes.hexbin.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.hist) def hist(x, bins=10, range=None, normed=False, weights=None, cumulative=False, bottom=None, histtype='bar', align='mid', orientation='vertical', rwidth=None, log=False, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2011,11 +1976,10 @@ def hist(x, bins=10, range=None, normed=False, weights=None, cumulative=False, b ax.hold(washold) return ret -if Axes.hist.__doc__ is not None: - hist.__doc__ = dedent(Axes.hist.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.hlines) def hlines(y, xmin, xmax, colors='k', linestyles='solid', label='', hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2030,11 +1994,10 @@ def hlines(y, xmin, xmax, colors='k', linestyles='solid', label='', hold=None, * ax.hold(washold) return ret -if Axes.hlines.__doc__ is not None: - hlines.__doc__ = dedent(Axes.hlines.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.imshow) def imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=1.0, vmin=None, vmax=None, origin=None, extent=None, shape=None, filternorm=1, filterrad=4.0, imlim=None, resample=None, url=None, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2049,11 +2012,10 @@ def imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=1.0, ax.hold(washold) gci._current = ret return ret -if Axes.imshow.__doc__ is not None: - imshow.__doc__ = dedent(Axes.imshow.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.loglog) def loglog(*args, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2068,11 +2030,10 @@ def loglog(*args, **kwargs): ax.hold(washold) return ret -if Axes.loglog.__doc__ is not None: - loglog.__doc__ = dedent(Axes.loglog.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.pcolor) def pcolor(*args, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2087,11 +2048,10 @@ def pcolor(*args, **kwargs): ax.hold(washold) gci._current = ret return ret -if Axes.pcolor.__doc__ is not None: - pcolor.__doc__ = dedent(Axes.pcolor.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.pcolormesh) def pcolormesh(*args, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2106,11 +2066,10 @@ def pcolormesh(*args, **kwargs): ax.hold(washold) gci._current = ret return ret -if Axes.pcolormesh.__doc__ is not None: - pcolormesh.__doc__ = dedent(Axes.pcolormesh.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.pie) def pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.59999999999999998, shadow=False, labeldistance=1.1000000000000001, hold=None): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2125,11 +2084,10 @@ def pie(x, explode=None, labels=None, colors=None, autopct=None, pctdistance=0.5 ax.hold(washold) return ret -if Axes.pie.__doc__ is not None: - pie.__doc__ = dedent(Axes.pie.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.plot) def plot(*args, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2144,11 +2102,10 @@ def plot(*args, **kwargs): ax.hold(washold) return ret -if Axes.plot.__doc__ is not None: - plot.__doc__ = dedent(Axes.plot.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.plot_date) def plot_date(x, y, fmt='bo', tz=None, xdate=True, ydate=False, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2163,11 +2120,10 @@ def plot_date(x, y, fmt='bo', tz=None, xdate=True, ydate=False, hold=None, **kwa ax.hold(washold) return ret -if Axes.plot_date.__doc__ is not None: - plot_date.__doc__ = dedent(Axes.plot_date.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.psd) def psd(x, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.window_hanning, noverlap=0, pad_to=None, sides='default', scale_by_freq=None, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2182,11 +2138,10 @@ def psd(x, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.window_h ax.hold(washold) return ret -if Axes.psd.__doc__ is not None: - psd.__doc__ = dedent(Axes.psd.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.quiver) def quiver(*args, **kw): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2201,11 +2156,10 @@ def quiver(*args, **kw): ax.hold(washold) gci._current = ret return ret -if Axes.quiver.__doc__ is not None: - quiver.__doc__ = dedent(Axes.quiver.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.quiverkey) def quiverkey(*args, **kw): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2220,11 +2174,10 @@ def quiverkey(*args, **kw): ax.hold(washold) return ret -if Axes.quiverkey.__doc__ is not None: - quiverkey.__doc__ = dedent(Axes.quiverkey.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.scatter) def scatter(x, y, s=20, c='b', marker='o', cmap=None, norm=None, vmin=None, vmax=None, alpha=1.0, linewidths=None, faceted=True, verts=None, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2239,11 +2192,10 @@ def scatter(x, y, s=20, c='b', marker='o', cmap=None, norm=None, vmin=None, vmax ax.hold(washold) gci._current = ret return ret -if Axes.scatter.__doc__ is not None: - scatter.__doc__ = dedent(Axes.scatter.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.semilogx) def semilogx(*args, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2258,11 +2210,10 @@ def semilogx(*args, **kwargs): ax.hold(washold) return ret -if Axes.semilogx.__doc__ is not None: - semilogx.__doc__ = dedent(Axes.semilogx.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.semilogy) def semilogy(*args, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2277,11 +2228,10 @@ def semilogy(*args, **kwargs): ax.hold(washold) return ret -if Axes.semilogy.__doc__ is not None: - semilogy.__doc__ = dedent(Axes.semilogy.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.specgram) def specgram(x, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.window_hanning, noverlap=128, cmap=None, xextent=None, pad_to=None, sides='default', scale_by_freq=None, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2296,11 +2246,10 @@ def specgram(x, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.win ax.hold(washold) gci._current = ret[-1] return ret -if Axes.specgram.__doc__ is not None: - specgram.__doc__ = dedent(Axes.specgram.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.spy) def spy(Z, precision=0, marker=None, markersize=None, aspect='equal', hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2315,11 +2264,10 @@ def spy(Z, precision=0, marker=None, markersize=None, aspect='equal', hold=None, ax.hold(washold) gci._current = ret return ret -if Axes.spy.__doc__ is not None: - spy.__doc__ = dedent(Axes.spy.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.stem) def stem(x, y, linefmt='b-', markerfmt='bo', basefmt='r-', hold=None): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2334,11 +2282,10 @@ def stem(x, y, linefmt='b-', markerfmt='bo', basefmt='r-', hold=None): ax.hold(washold) return ret -if Axes.stem.__doc__ is not None: - stem.__doc__ = dedent(Axes.stem.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.step) def step(x, y, *args, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2353,11 +2300,10 @@ def step(x, y, *args, **kwargs): ax.hold(washold) return ret -if Axes.step.__doc__ is not None: - step.__doc__ = dedent(Axes.step.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.vlines) def vlines(x, ymin, ymax, colors='k', linestyles='solid', label='', hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2372,11 +2318,10 @@ def vlines(x, ymin, ymax, colors='k', linestyles='solid', label='', hold=None, * ax.hold(washold) return ret -if Axes.vlines.__doc__ is not None: - vlines.__doc__ = dedent(Axes.vlines.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.xcorr) def xcorr(x, y, normed=True, detrend=mlab.detrend_none, usevlines=True, maxlags=10, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2391,11 +2336,10 @@ def xcorr(x, y, normed=True, detrend=mlab.detrend_none, usevlines=True, maxlags= ax.hold(washold) return ret -if Axes.xcorr.__doc__ is not None: - xcorr.__doc__ = dedent(Axes.xcorr.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@autogen_docstring(Axes.barbs) def barbs(*args, **kw): ax = gca() # allow callers to override the hold state by passing hold=True|False @@ -2410,62 +2354,54 @@ def barbs(*args, **kw): ax.hold(washold) return ret -if Axes.barbs.__doc__ is not None: - barbs.__doc__ = dedent(Axes.barbs.__doc__) + __docstring_addendum # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@docstring.copy_dedent(Axes.cla) def cla(): ret = gca().cla() draw_if_interactive() return ret -if Axes.cla.__doc__ is not None: - cla.__doc__ = dedent(Axes.cla.__doc__) # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@docstring.copy_dedent(Axes.grid) def grid(b=None, **kwargs): ret = gca().grid(b, **kwargs) draw_if_interactive() return ret -if Axes.grid.__doc__ is not None: - grid.__doc__ = dedent(Axes.grid.__doc__) # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@docstring.copy_dedent(Axes.legend) def legend(*args, **kwargs): ret = gca().legend(*args, **kwargs) draw_if_interactive() return ret -if Axes.legend.__doc__ is not None: - legend.__doc__ = dedent(Axes.legend.__doc__) # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@docstring.copy_dedent(Axes.table) def table(**kwargs): ret = gca().table(**kwargs) draw_if_interactive() return ret -if Axes.table.__doc__ is not None: - table.__doc__ = dedent(Axes.table.__doc__) # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@docstring.copy_dedent(Axes.text) def text(x, y, s, fontdict=None, withdash=False, **kwargs): ret = gca().text(x, y, s, fontdict, withdash, **kwargs) draw_if_interactive() return ret -if Axes.text.__doc__ is not None: - text.__doc__ = dedent(Axes.text.__doc__) # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost +@docstring.copy_dedent(Axes.annotate) def annotate(*args, **kwargs): ret = gca().annotate(*args, **kwargs) draw_if_interactive() return ret -if Axes.annotate.__doc__ is not None: - annotate.__doc__ = dedent(Axes.annotate.__doc__) # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost @@ -2690,3 +2626,5 @@ def spectral(): if im is not None: im.set_cmap(cm.spectral) draw_if_interactive() + + diff --git a/lib/matplotlib/quiver.py b/lib/matplotlib/quiver.py index c68dd1475c5e..c9d9c8474b7e 100644 --- a/lib/matplotlib/quiver.py +++ b/lib/matplotlib/quiver.py @@ -22,6 +22,7 @@ import matplotlib.text as mtext import matplotlib.artist as martist from matplotlib.artist import allow_rasterization +from matplotlib import docstring import matplotlib.font_manager as font_manager from matplotlib.cbook import delete_masked_points from matplotlib.patches import CirclePolygon @@ -139,7 +140,7 @@ keyword arguments: %(PolyCollection)s -""" % martist.kwdocd +""" % docstring.interpd.params _quiverkey_doc = """ Add a key to a quiver plot. @@ -341,7 +342,14 @@ class Quiver(collections.PolyCollection): should be no performance penalty from putting the calculations in the draw() method. """ + + @docstring.Substitution(_quiver_doc) def __init__(self, ax, *args, **kw): + """ + The constructor takes one required argument, an Axes + instance, followed by the args and kwargs described + by the following pylab interface documentation: + %s""" self.ax = ax X, Y, U, V, C = self._parse_args(*args) self.X = X @@ -382,12 +390,6 @@ def on_dpi_change(fig): self.ax.figure.callbacks.connect('dpi_changed', on_dpi_change) - __init__.__doc__ = """ - The constructor takes one required argument, an Axes - instance, followed by the args and kwargs described - by the following pylab interface documentation: - %s""" % _quiver_doc - def _parse_args(self, *args): X, Y, U, V, C = [None]*5 args = list(args) @@ -704,7 +706,9 @@ def _h_arrows(self, length): arguments: %(PolyCollection)s -""" % martist.kwdocd +""" % docstring.interpd.params + +docstring.interpd.update(barbs_doc=_barbs_doc) class Barbs(collections.PolyCollection): ''' @@ -723,7 +727,13 @@ class Barbs(collections.PolyCollection): #This may be an abuse of polygons here to render what is essentially maybe #1 triangle and a series of lines. It works fine as far as I can tell #however. + @docstring.interpd def __init__(self, ax, *args, **kw): + """ + The constructor takes one required argument, an Axes + instance, followed by the args and kwargs described + by the following pylab interface documentation: + %(barbs_doc)s""" self._pivot = kw.pop('pivot', 'tip') self._length = kw.pop('length', 7) barbcolor = kw.pop('barbcolor', None) @@ -765,12 +775,6 @@ def __init__(self, ax, *args, **kw): self.set_UVC(u, v, c) - __init__.__doc__ = """ - The constructor takes one required argument, an Axes - instance, followed by the args and kwargs described - by the following pylab interface documentation: - %s""" % _barbs_doc - def _find_tails(self, mag, rounding=True, half=5, full=10, flag=50): ''' Find how many of each of the tail pieces is necessary. Flag diff --git a/lib/matplotlib/scale.py b/lib/matplotlib/scale.py index 8a2affdbdeb2..4e85632061b7 100644 --- a/lib/matplotlib/scale.py +++ b/lib/matplotlib/scale.py @@ -7,6 +7,7 @@ from ticker import NullFormatter, ScalarFormatter, LogFormatterMathtext, Formatter from ticker import NullLocator, LogLocator, AutoLocator, SymmetricalLogLocator, FixedLocator from transforms import Transform, IdentityTransform +from matplotlib import docstring class ScaleBase(object): """ @@ -460,3 +461,8 @@ def get_scale_docs(): docs.append(class_docs) docs.append("") return "\n".join(docs) + +docstring.interpd.update( + scale = ' | '.join([repr(x) for x in get_scale_names()]), + scale_docs = get_scale_docs().strip(), + ) diff --git a/lib/matplotlib/spines.py b/lib/matplotlib/spines.py index 0591efe3ee0c..1799db4a5078 100644 --- a/lib/matplotlib/spines.py +++ b/lib/matplotlib/spines.py @@ -5,6 +5,7 @@ import matplotlib.artist as martist from matplotlib.artist import allow_rasterization +from matplotlib import docstring import matplotlib.transforms as mtransforms import matplotlib.lines as mlines import matplotlib.patches as mpatches @@ -34,6 +35,7 @@ class Spine(mpatches.Patch): def __str__(self): return "Spine" + @docstring.dedent_interpd def __init__(self,axes,spine_type,path,**kwargs): """ - *axes* : the Axes instance containing the spine @@ -72,7 +74,6 @@ def __init__(self,axes,spine_type,path,**kwargs): # Behavior copied from mpatches.Ellipse: # Note: This cannot be calculated until this is added to an Axes self._patch_transform = mtransforms.IdentityTransform() - __init__.__doc__ = cbook.dedent(__init__.__doc__) % martist.kwdocd def set_patch_circle(self,center,radius): """set the spine to be circular""" diff --git a/lib/matplotlib/table.py b/lib/matplotlib/table.py index f0077e79444a..7036995ceff1 100644 --- a/lib/matplotlib/table.py +++ b/lib/matplotlib/table.py @@ -26,6 +26,7 @@ from artist import Artist, allow_rasterization from patches import Rectangle from cbook import is_string_like +from matplotlib import docstring from text import Text from transforms import Bbox @@ -539,4 +540,4 @@ def table(ax, return table -artist.kwdocd['Table'] = artist.kwdoc(Table) +docstring.interpd.update(Table=artist.kwdoc(Table)) diff --git a/lib/matplotlib/text.py b/lib/matplotlib/text.py index 40dddc704abf..c8f1ae3951c2 100644 --- a/lib/matplotlib/text.py +++ b/lib/matplotlib/text.py @@ -11,6 +11,7 @@ import matplotlib.artist as artist from matplotlib.artist import Artist from matplotlib.cbook import is_string_like, maxdict +from matplotlib import docstring from matplotlib.font_manager import FontProperties from matplotlib.patches import bbox_artist, YAArrow, FancyBboxPatch, \ FancyArrowPatch, Rectangle @@ -49,7 +50,7 @@ def get_rotation(rotation): # these are not available for the object inspector until after the # class is build so we define an initial set here for the init # function and they will be overridden after object defn -artist.kwdocd['Text'] = """ +docstring.interpd.update(Text = """ ========================== ========================================================================= Property Value ========================== ========================================================================= @@ -84,7 +85,7 @@ def get_rotation(rotation): y float zorder any number ========================== ========================================================================= - """ + """) @@ -978,8 +979,8 @@ def set_font_properties(self, fp): 'alias for set_fontproperties' self.set_fontproperties(fp) -artist.kwdocd['Text'] = artist.kwdoc(Text) -Text.__init__.im_func.__doc__ = cbook.dedent(Text.__init__.__doc__) % artist.kwdocd +docstring.interpd.update(Text = artist.kwdoc(Text)) +docstring.dedent_interpd(Text.__init__.im_func) class TextWithDash(Text): @@ -1341,7 +1342,7 @@ def set_figure(self, fig): Text.set_figure(self, fig) self.dashline.set_figure(fig) -artist.kwdocd['TextWithDash'] = artist.kwdoc(TextWithDash) +docstring.interpd.update(TextWithDash=artist.kwdoc(TextWithDash)) class _AnnotationBase(object): def __init__(self, @@ -1503,6 +1504,7 @@ class Annotation(Text, _AnnotationBase): """ def __str__(self): return "Annotation(%g,%g,%s)"%(self.xy[0],self.xy[1],repr(self._text)) + @docstring.dedent_interpd def __init__(self, s, xy, xytext=None, xycoords='data', @@ -1618,8 +1620,6 @@ def __init__(self, s, xy, else: self.arrow_patch = None - __init__.__doc__ = cbook.dedent(__init__.__doc__) % artist.kwdocd - def contains(self,event): t,tinfo = Text.contains(self,event) if self.arrow is not None: @@ -1762,5 +1762,5 @@ def draw(self, renderer): Text.draw(self, renderer) -artist.kwdocd['Annotation'] = Annotation.__init__.__doc__ +docstring.interpd.update(Annotation=Annotation.__init__.__doc__) From 6147c20be439a90248c039492304a78dc372ac4b Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Sat, 15 Aug 2009 18:37:25 +0000 Subject: [PATCH 0065/1000] Add CHANGELOG entry for Coombs docstring work. svn path=/trunk/matplotlib/; revision=7492 --- CHANGELOG | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index f5bd0990dc32..dfe8614d97f7 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2009-08-15 Docstrings are now manipulated with decorators defined + in a new module, docstring.py, thanks to Jason Coombs. - EF + 2009-08-14 Add support for image filtering for agg back end. See the example demo_agg_filter.py. -JJL From 47254fc5598c01946d9eff53ca3b74af4560d4ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Sat, 15 Aug 2009 20:00:09 +0000 Subject: [PATCH 0066/1000] get_sample_data improvements: remove old files from subdirectories and not only the top-level directory; try to handle the disconnected use case; use the perhaps more stable svnroot URL instead of the viewvc one svn path=/trunk/matplotlib/; revision=7493 --- lib/matplotlib/cbook.py | 80 +++++++++++++++++++++++++---------------- 1 file changed, 50 insertions(+), 30 deletions(-) diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index 9e065abeb3a5..d2f8a507464e 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -355,7 +355,7 @@ def is_scalar_or_string(val): class ViewVCCachedServer(urllib2.BaseHandler): """ Urllib2 handler that takes care of caching files. - The file cache.pck holds the directory of files to be cached. + The file cache.pck holds the directory of files that have been cached. """ def __init__(self, cache_dir, baseurl): self.cache_dir = cache_dir @@ -386,9 +386,14 @@ def read_cache(self): cache = cPickle.load(f) f.close() + # Earlier versions did not have the full paths in cache.pck + for url, (fn, x, y) in cache.items(): + if not os.path.isabs(fn): + cache[url] = (self.in_cache_dir(fn), x, y) + # If any files are deleted, drop them from the cache for url, (fn, _, _) in cache.items(): - if not os.path.exists(self.in_cache_dir(fn)): + if not os.path.exists(fn): del cache[url] self.cache = cache @@ -398,14 +403,20 @@ def remove_stale_files(self): Remove files from the cache directory that are not listed in cache.pck. """ - listed = set([fn for (_, (fn, _, _)) in self.cache.items()]) - for path in os.listdir(self.cache_dir): - if path not in listed and path != 'cache.pck': - thisfile = os.path.join(self.cache_dir, path) - if not os.path.isdir(thisfile): - matplotlib.verbose.report('ViewVCCachedServer:remove_stale_files: removing %s'%thisfile, - level='debug') - os.remove(thisfile) + # TODO: remove empty subdirectories + listed = set(fn for (_, (fn, _, _)) in self.cache.items()) + existing = reduce(set.union, + (set(os.path.join(dirpath, fn) for fn in filenames) + for (dirpath, _, filenames) in os.walk(self.cache_dir))) + matplotlib.verbose.report( + 'ViewVCCachedServer: files listed in cache.pck: %s' % listed, 'debug') + matplotlib.verbose.report( + 'ViewVCCachedServer: files in cache directory: %s' % existing, 'debug') + + for path in existing - listed - set([self.in_cache_dir('cache.pck')]): + matplotlib.verbose.report('ViewVCCachedServer:remove_stale_files: removing %s'%path, + level='debug') + os.remove(path) def write_cache(self): """ @@ -424,17 +435,12 @@ def cache_file(self, url, data, headers): fn = url[len(self.baseurl):] fullpath = self.in_cache_dir(fn) - #while os.path.exists(self.in_cache_dir(fn)): - # fn = rightmost + '.' + str(random.randint(0,9999999)) - - - - f = open(self.in_cache_dir(fn), 'wb') + f = open(fullpath, 'wb') f.write(data) f.close() # Update the cache - self.cache[url] = (fn, headers.get('ETag'), headers.get('Last-Modified')) + self.cache[url] = (fullpath, headers.get('ETag'), headers.get('Last-Modified')) self.write_cache() # These urllib2 entry points are used: @@ -459,9 +465,9 @@ def http_error_304(self, req, fp, code, msg, hdrs): """ url = req.get_full_url() fn, _, _ = self.cache[url] - cachefile = self.in_cache_dir(fn) - matplotlib.verbose.report('ViewVCCachedServer: reading data file from cache file "%s"'%cachefile) - file = open(cachefile, 'rb') + matplotlib.verbose.report('ViewVCCachedServer: reading data file from cache file "%s"' + %fn, 'debug') + file = open(fn, 'rb') handle = urllib2.addinfourl(file, hdrs, url) handle.code = 304 return handle @@ -470,6 +476,8 @@ def http_response(self, req, response): """ Update the cache with the returned file. """ + matplotlib.verbose.report('ViewVCCachedServer: received response %d: %s' + % (response.code, response.msg), 'debug') if response.code != 200: return response else: @@ -489,10 +497,10 @@ def get_sample_data(self, fname, asfileobj=True): store it in the cachedir. If asfileobj is True, a file object will be returned. Else the - path to the file as a string will be returned - + path to the file as a string will be returned. """ - + # TODO: time out if the connection takes forever + # (may not be possible with urllib2 only - spawn a helper process?) # quote is not in python2.4, so check for it and get it from # urllib if it is not available @@ -501,12 +509,24 @@ def get_sample_data(self, fname, asfileobj=True): import urllib quote = urllib.quote + # retrieve the URL for the side effect of refreshing the cache url = self.baseurl + quote(fname) - response = self.opener.open(url) - - - relpath = self.cache[url][0] - fname = self.in_cache_dir(relpath) + error = 'unknown error' + matplotlib.verbose.report('ViewVCCachedServer: retrieving %s' + % url, 'debug') + try: + response = self.opener.open(url) + except urllib2.URLError, e: + # could be a missing network connection + error = str(e) + + cached = self.cache.get(url) + if cached is None: + msg = 'file %s not in cache; received %s when trying to retrieve' \ + % (fname, error) + raise KeyError(msg) + + fname = cached[0] if asfileobj: return file(fname) @@ -519,7 +539,7 @@ def get_sample_data(fname, asfileobj=True): Check the cachedirectory ~/.matplotlib/sample_data for a sample_data file. If it does not exist, fetch it with urllib from the mpl svn repo - http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/sample_data/ + http://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/sample_data/ and store it in the cachedir. @@ -539,7 +559,7 @@ def get_sample_data(fname, asfileobj=True): if myserver is None: configdir = matplotlib.get_configdir() cachedir = os.path.join(configdir, 'sample_data') - baseurl = 'http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/sample_data/' + baseurl = 'http://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/sample_data/' myserver = get_sample_data.myserver = ViewVCCachedServer(cachedir, baseurl) return myserver.get_sample_data(fname, asfileobj=asfileobj) From e91c5a1c91c54b1b23c1b469ba72c5553ae3d1ce Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Sat, 15 Aug 2009 21:24:01 +0000 Subject: [PATCH 0067/1000] pyplot tracks current image at the figure and axes level; fixes ticket 1656374 svn path=/trunk/matplotlib/; revision=7494 --- CHANGELOG | 3 ++ boilerplate.py | 25 ++++++++-------- examples/pylab_examples/multi_image.py | 8 +++-- lib/matplotlib/axes.py | 22 ++++++++++++++ lib/matplotlib/cbook.py | 8 ++++- lib/matplotlib/figure.py | 13 +++++++- lib/matplotlib/pyplot.py | 41 +++++++++++++++----------- 7 files changed, 85 insertions(+), 35 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index dfe8614d97f7..644f1007f90d 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2009-08-15 Pyplot interface: the current image is now tracked at the + figure and axes level, addressing tracker item 1656374. - EF + 2009-08-15 Docstrings are now manipulated with decorators defined in a new module, docstring.py, thanks to Jason Coombs. - EF diff --git a/boilerplate.py b/boilerplate.py index 0769e2659f47..0acae9a8f496 100644 --- a/boilerplate.py +++ b/boilerplate.py @@ -1,5 +1,5 @@ # Wrap the plot commands defined in axes. The code generated by this -# file is pasted into pylab.py. We did try to do this the smart way, +# file is pasted into pyplot.py. We did try to do this the smart way, # with callable functions and new.function, but could never get the # docstrings right for python2.2. See # http://groups.google.com/group/comp.lang.python/browse_frm/thread/dcd63ec13096a0f6/1b14640f3a4ad3dc?#1b14640f3a4ad3dc @@ -13,7 +13,7 @@ import types # import the local copy of matplotlib, not the installed one -sys.path.insert(0, './lib') +#sys.path.insert(0, './lib') from matplotlib.axes import Axes from matplotlib.cbook import dedent @@ -104,16 +104,16 @@ def %(func)s(%(argspec)s): ) cmappable = { - 'contour' : 'if %(ret)s._A is not None: gci._current = %(ret)s', - 'contourf': 'if %(ret)s._A is not None: gci._current = %(ret)s', - 'hexbin' : 'gci._current = %(ret)s', - 'scatter' : 'gci._current = %(ret)s', - 'pcolor' : 'gci._current = %(ret)s', - 'pcolormesh' : 'gci._current = %(ret)s', - 'imshow' : 'gci._current = %(ret)s', - 'spy' : 'gci._current = %(ret)s', - 'quiver' : 'gci._current = %(ret)s', - 'specgram' : 'gci._current = %(ret)s[-1]', + 'contour' : 'if %(ret)s._A is not None: sci(%(ret)s)', + 'contourf': 'if %(ret)s._A is not None: sci(%(ret)s)', + 'hexbin' : 'sci(%(ret)s)', + 'scatter' : 'sci(%(ret)s)', + 'pcolor' : 'sci(%(ret)s)', + 'pcolormesh': 'sci(%(ret)s)', + 'imshow' : 'sci(%(ret)s)', + 'spy' : 'sci(%(ret)s)', + 'quiver' : 'sci(%(ret)s)', + 'specgram' : 'sci(%(ret)s[-1])', } @@ -233,3 +233,4 @@ def %(name)s(): # add all the colormaps (autumn, hsv, ....) for name in cmaps: print _fmtcmap%locals() + diff --git a/examples/pylab_examples/multi_image.py b/examples/pylab_examples/multi_image.py index 7537a353184e..cca58a7a32b0 100644 --- a/examples/pylab_examples/multi_image.py +++ b/examples/pylab_examples/multi_image.py @@ -5,7 +5,7 @@ It also illustrates colorbar tick labelling with a multiplier. ''' -from matplotlib.pyplot import figure, show, sci +from matplotlib.pyplot import figure, show, axes, sci from matplotlib import cm, colors from matplotlib.font_manager import FontProperties from numpy import amin, amax, ravel @@ -68,9 +68,11 @@ def __call__(self, leader): # The colorbar is also based on this master image. fig.colorbar(images[0], cax, orientation='horizontal') -# We need the following only if we want to run this +# We need the following only if we want to run this interactively and +# modify the colormap: -sci(images[0]) +axes(ax[0]) # Return the current axes to the first one, +sci(images[0]) # because the current image must be in current axes. show() diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index 929d749f1606..563fb6ee4444 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -838,6 +838,7 @@ def cla(self): self.tables = [] self.artists = [] self.images = [] + self._current_image = None # strictly for pyplot via _sci, _gci self.legend_ = None self.collections = [] # collection.Collection instances @@ -1309,6 +1310,27 @@ def get_yticklines(self): #### Adding and tracking artists + def _sci(self, im): + """ + helper for :func:`~matplotlib.pyplot.sci`; + do not use elsewhere. + """ + if isinstance(im, matplotlib.contour.ContourSet): + if im.collections[0] not in self.collections: + raise ValueError( + "ContourSet must be in current Axes") + elif im not in self.images and im not in self.collections: + raise ValueError( + "Argument must be an image, collection, or ContourSet in this Axes") + self._current_image = im + + def _gci(self): + """ + helper for :func:`~matplotlib.pyplot.gci`; + do not use elsewhere. + """ + return self._current_image + def has_data(self): '''Return *True* if any artists have been added to axes. diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index d2f8a507464e..dc04a6dde76a 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -1007,7 +1007,7 @@ def __setitem__(self, k, v): -class Stack: +class Stack(object): """ Implement a stack where elements can be pushed on and you can move back and forth. But no pop. Should mimic home / back / forward @@ -1023,6 +1023,12 @@ def __call__(self): if not len(self._elements): return self._default else: return self._elements[self._pos] + def __len__(self): + return self._elements.__len__() + + def __getitem__(self, ind): + return self._elements.__getitem__(ind) + def forward(self): 'move the position forward and return the current element' N = len(self._elements) diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index b61660ccbf1d..f37ae0f20e63 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -950,6 +950,17 @@ def sca(self, a): for func in self._axobservers: func(self) return a + def _gci(self): + """ + helper for :func:`~matplotlib.pyplot.gci`; + do not use elsewhere. + """ + for ax in reversed(self._axstack): + im = ax._gci() + if im is not None: + return im + return None + def add_axobserver(self, func): 'whenever the axes state change, func(self) will be called' self._axobservers.append(func) @@ -1039,7 +1050,7 @@ def savefig(self, *args, **kwargs): def colorbar(self, mappable, cax=None, ax=None, **kw): """ Create a colorbar for a ScalarMappable instance. - + Documentation for the pylab thin wrapper: %(colorbar_doc)s """ diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index 7a2ec7fb4c37..ad4dd6649c8b 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -129,8 +129,10 @@ def rcdefaults(): matplotlib.rcdefaults() draw_if_interactive() -# The current "image" (ScalarMappable) is tracked here on a -# per-pylab-session basis: +# The current "image" (ScalarMappable) is retrieved or set +# only via the pyplot interface using the following two +# functions: + def gci(): """ Get the current :class:`~matplotlib.cm.ScalarMappable` instance @@ -142,18 +144,20 @@ def gci(): :func:`~matplotlib.pyplot.pcolor` and :func:`~matplotlib.pyplot.scatter` create :class:`~matplotlib.collections.Collection` instances. + The current image is an attribute of the current axes, or the + nearest earlier axes in the current figure that contains an + image. """ - return gci._current -gci._current = None - + return gcf()._gci() def sci(im): """ Set the current image (target of colormap commands like :func:`~matplotlib.pyplot.jet`, :func:`~matplotlib.pyplot.hot` or - :func:`~matplotlib.pyplot.clim`). + :func:`~matplotlib.pyplot.clim`). The current image is an + attribute of the current axes. """ - gci._current = im + gca()._sci(im) ## Any Artist ## @@ -1598,7 +1602,6 @@ def autogen_docstring(base): ## Plotting part 2: autogenerated wrappers for axes methods ## - # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost @autogen_docstring(Axes.acorr) @@ -1830,7 +1833,7 @@ def contour(*args, **kwargs): draw_if_interactive() finally: ax.hold(washold) - if ret._A is not None: gci._current = ret + if ret._A is not None: sci(ret) return ret # This function was autogenerated by boilerplate.py. Do not edit as @@ -1848,7 +1851,7 @@ def contourf(*args, **kwargs): draw_if_interactive() finally: ax.hold(washold) - if ret._A is not None: gci._current = ret + if ret._A is not None: sci(ret) return ret # This function was autogenerated by boilerplate.py. Do not edit as @@ -1956,7 +1959,7 @@ def hexbin(x, y, C=None, gridsize=100, bins=None, xscale='linear', yscale='linea draw_if_interactive() finally: ax.hold(washold) - gci._current = ret + sci(ret) return ret # This function was autogenerated by boilerplate.py. Do not edit as @@ -2010,7 +2013,7 @@ def imshow(X, cmap=None, norm=None, aspect=None, interpolation=None, alpha=1.0, draw_if_interactive() finally: ax.hold(washold) - gci._current = ret + sci(ret) return ret # This function was autogenerated by boilerplate.py. Do not edit as @@ -2046,7 +2049,7 @@ def pcolor(*args, **kwargs): draw_if_interactive() finally: ax.hold(washold) - gci._current = ret + sci(ret) return ret # This function was autogenerated by boilerplate.py. Do not edit as @@ -2064,7 +2067,7 @@ def pcolormesh(*args, **kwargs): draw_if_interactive() finally: ax.hold(washold) - gci._current = ret + sci(ret) return ret # This function was autogenerated by boilerplate.py. Do not edit as @@ -2154,7 +2157,7 @@ def quiver(*args, **kw): draw_if_interactive() finally: ax.hold(washold) - gci._current = ret + sci(ret) return ret # This function was autogenerated by boilerplate.py. Do not edit as @@ -2190,7 +2193,7 @@ def scatter(x, y, s=20, c='b', marker='o', cmap=None, norm=None, vmin=None, vmax draw_if_interactive() finally: ax.hold(washold) - gci._current = ret + sci(ret) return ret # This function was autogenerated by boilerplate.py. Do not edit as @@ -2244,7 +2247,7 @@ def specgram(x, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.win draw_if_interactive() finally: ax.hold(washold) - gci._current = ret[-1] + sci(ret[-1]) return ret # This function was autogenerated by boilerplate.py. Do not edit as @@ -2262,7 +2265,7 @@ def spy(Z, precision=0, marker=None, markersize=None, aspect='equal', hold=None, draw_if_interactive() finally: ax.hold(washold) - gci._current = ret + sci(ret) return ret # This function was autogenerated by boilerplate.py. Do not edit as @@ -2628,3 +2631,5 @@ def spectral(): draw_if_interactive() + + From 37f1018e54d5242520fc7a7194e1f2d097d95111 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Sat, 15 Aug 2009 23:05:52 +0000 Subject: [PATCH 0068/1000] Small changes to bar kwarg handling in response to 1200213 svn path=/trunk/matplotlib/; revision=7495 --- lib/matplotlib/axes.py | 23 ++++++++++++----------- lib/matplotlib/pyplot.py | 4 ++-- 2 files changed, 14 insertions(+), 13 deletions(-) diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index 563fb6ee4444..77e9cc49b114 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -4076,19 +4076,11 @@ def step(self, x, y, *args, **kwargs): @docstring.dedent_interpd - def bar(self, left, height, width=0.8, bottom=None, - color=None, edgecolor=None, linewidth=None, - yerr=None, xerr=None, ecolor=None, capsize=3, - align='edge', orientation='vertical', log=False, - **kwargs - ): + def bar(self, left, height, width=0.8, bottom=None, **kwargs): """ call signature:: - bar(left, height, width=0.8, bottom=0, - color=None, edgecolor=None, linewidth=None, - yerr=None, xerr=None, ecolor=None, capsize=3, - align='edge', orientation='vertical', log=False) + bar(left, height, width=0.8, bottom=0, **kwargs) Make a bar plot with rectangles bounded by: @@ -4157,7 +4149,16 @@ def bar(self, left, height, width=0.8, bottom=None, .. plot:: mpl_examples/pylab_examples/bar_stacked.py """ if not self._hold: self.cla() - + color = kwargs.pop('color', None) + edgecolor = kwargs.pop('edgecolor', None) + linewidth = kwargs.pop('linewidth', None) + xerr = kwargs.pop('xerr', None) + yerr = kwargs.pop('yerr', None) + ecolor = kwargs.pop('ecolor', None) + capsize = kwargs.pop('capsize', 3) + align = kwargs.pop('align', 'edge') + orientation = kwargs.pop('orientation', 'vertical') + log = kwargs.pop('log', False) label = kwargs.pop('label', '') def make_iterable(x): if not iterable(x): diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index ad4dd6649c8b..03b3977e1522 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -1713,7 +1713,7 @@ def axvspan(xmin, xmax, ymin=0, ymax=1, hold=None, **kwargs): # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost @autogen_docstring(Axes.bar) -def bar(left, height, width=0.80000000000000004, bottom=None, color=None, edgecolor=None, linewidth=None, yerr=None, xerr=None, ecolor=None, capsize=3, align='edge', orientation='vertical', log=False, hold=None, **kwargs): +def bar(left, height, width=0.80000000000000004, bottom=None, hold=None, **kwargs): ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -1721,7 +1721,7 @@ def bar(left, height, width=0.80000000000000004, bottom=None, color=None, edgeco if hold is not None: ax.hold(hold) try: - ret = ax.bar(left, height, width, bottom, color, edgecolor, linewidth, yerr, xerr, ecolor, capsize, align, orientation, log, **kwargs) + ret = ax.bar(left, height, width, bottom, **kwargs) draw_if_interactive() finally: ax.hold(washold) From 2b03933f63023a9bc4a85ccc665408d1f5d787f2 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Sat, 15 Aug 2009 23:51:39 +0000 Subject: [PATCH 0069/1000] Add docstring.py; I forgot to add it when committing the Coombs patch svn path=/trunk/matplotlib/; revision=7496 --- lib/matplotlib/docstring.py | 112 ++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 lib/matplotlib/docstring.py diff --git a/lib/matplotlib/docstring.py b/lib/matplotlib/docstring.py new file mode 100644 index 000000000000..0b6e6b2e1594 --- /dev/null +++ b/lib/matplotlib/docstring.py @@ -0,0 +1,112 @@ +from matplotlib import cbook + +class Substitution(object): + """ + A decorator to take a function's docstring and perform string + substitution on it. + + This decorator should be robust even if func.__doc__ is None + (for example, if -OO was passed to the interpreter) + + Usage: construct a docstring.Substitution with a sequence or + dictionary suitable for performing substitution; then + decorate a suitable function with the constructed object. e.g. + + sub_author_name = Substitution(author='Jason') + + @sub_author_name + def some_function(x): + "%(author)s wrote this function" + + # note that some_function.__doc__ is now "Jason wrote this function" + + One can also use positional arguments. + + sub_first_last_names = Substitution('Edgar Allen', 'Poe') + + @sub_first_last_names + def some_function(x): + "%s %s wrote the Raven" + """ + def __init__(self, *args, **kwargs): + assert not (args and kwargs), "Only positional or keyword args are allowed" + self.params = args or kwargs + + def __call__(self, func): + func.__doc__ = func.__doc__ and func.__doc__ % self.params + return func + + def update(self, *args, **kwargs): + "Assume self.params is a dict and update it with supplied args" + self.params.update(*args, **kwargs) + + @classmethod + def from_params(cls, params): + """ + In the case where the params is a mutable sequence (list or dictionary) + and it may change before this class is called, one may explicitly use + a reference to the params rather than using *args or **kwargs which will + copy the values and not reference them. + """ + result = cls() + result.params = params + return result + +class Appender(object): + """ + A function decorator that will append an addendum to the docstring + of the target function. + + This decorator should be robust even if func.__doc__ is None + (for example, if -OO was passed to the interpreter). + + Usage: construct a docstring.Appender with a string to be joined to + the original docstring. An optional 'join' parameter may be supplied + which will be used to join the docstring and addendum. e.g. + + add_copyright = Appender("Copyright (c) 2009", join='\n') + + @add_copyright + def my_dog(has='fleas'): + "This docstring will have a copyright below" + pass + """ + def __init__(self, addendum, join=''): + self.addendum = addendum + self.join = join + + def __call__(self, func): + docitems = [func.__doc__, self.addendum] + func.__doc__ = func.__doc__ and ''.join(docitems) + return func + +def dedent(func): + "Dedent a docstring (if present)" + func.__doc__ = func.__doc__ and cbook.dedent(func.__doc__) + return func + +def copy(source): + "Copy a docstring from another source function (if present)" + def do_copy(target): + if source.__doc__: + target.__doc__ = source.__doc__ + return target + return do_copy + +# create a decorator that will house the various documentation that +# is reused throughout matplotlib +interpd = Substitution() + +def dedent_interpd(func): + """A special case of the interpd that first performs a dedent on + the incoming docstring""" + return interpd(dedent(func)) + +def copy_dedent(source): + """A decorator that will copy the docstring from the source and + then dedent it""" + # note the following is ugly because "Python is not a functional + # language" - GVR. Perhaps one day, functools.compose will exist. + # or perhaps not. + # http://mail.python.org/pipermail/patches/2007-February/021687.html + return lambda target: dedent(copy(source)(target)) From 9866f488a5a3bf50a596ce2b7e43be98d1ae0ae1 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Tue, 18 Aug 2009 02:41:43 +0000 Subject: [PATCH 0070/1000] Remove unmasked_index_ranges from lines.py; it is still in cbook.py svn path=/trunk/matplotlib/; revision=7497 --- lib/matplotlib/lines.py | 9 --------- 1 file changed, 9 deletions(-) diff --git a/lib/matplotlib/lines.py b/lib/matplotlib/lines.py index 5b433bcd9be3..150713f506e2 100644 --- a/lib/matplotlib/lines.py +++ b/lib/matplotlib/lines.py @@ -26,15 +26,6 @@ CARETLEFT, CARETRIGHT, CARETUP, CARETDOWN) = range(8) -# COVERAGE NOTE: Never called internally or from examples -def unmasked_index_ranges(mask, compressed = True): - warnings.warn("Import this directly from matplotlib.cbook", - DeprecationWarning) - # Warning added 2008/07/22 - from matplotlib.cbook import unmasked_index_ranges as _unmasked_index_ranges - return _unmasked_index_ranges(mask, compressed=compressed) - - def segment_hits(cx, cy, x, y, radius): """ Determine if any line segments are within radius of a From 755fe35e04b2edbd98ad5767687533863d575300 Mon Sep 17 00:00:00 2001 From: pkienzle Date: Tue, 18 Aug 2009 21:59:07 +0000 Subject: [PATCH 0071/1000] devel docs: minor typo svn path=/trunk/matplotlib/; revision=7503 --- doc/devel/documenting_mpl.rst | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/devel/documenting_mpl.rst b/doc/devel/documenting_mpl.rst index b0bcb916d167..08c3e6eab953 100644 --- a/doc/devel/documenting_mpl.rst +++ b/doc/devel/documenting_mpl.rst @@ -286,7 +286,7 @@ directory, I use the symlink directory. For example, from .. literalinclude:: ../../lib/matplotlib/mpl-data/matplotlibrc -On exception to this is when referring to the examples dir. Relative +One exception to this is when referring to the examples dir. Relative paths are extremely confusing in the sphinx plot extensions, so without getting into the dirty details, it is easier to simply include a symlink to the files at the top doc level directory. This way, API From ee0353af0590f82728251f6b3d577a5f19c2e33a Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 18 Aug 2009 22:13:11 +0000 Subject: [PATCH 0072/1000] Fix clipping on collections. svn path=/trunk/matplotlib/; revision=7504 --- lib/matplotlib/collections.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index 1a6997be469b..38b34c95e25d 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -208,8 +208,7 @@ def draw(self, renderer): transform, transOffset, offsets, paths = self._prepare_points() gc = renderer.new_gc() - gc.set_clip_rectangle(self.get_clip_box()) - gc.set_clip_path(self.get_clip_path()) + self._set_gc_clip(gc) renderer.draw_path_collection( gc, transform.frozen(), paths, self.get_transforms(), @@ -1210,8 +1209,7 @@ def draw(self, renderer): transOffset = transOffset.get_affine() gc = renderer.new_gc() - gc.set_clip_rectangle(self.get_clip_box()) - gc.set_clip_path(self.get_clip_path()) + self._set_clip_gc(gc) if self._shading == 'gouraud': triangles, colors = self.convert_mesh_to_triangles( From 407ebd901fc3e846b90fd2619468e2e9ebc3e781 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Tue, 18 Aug 2009 22:18:59 +0000 Subject: [PATCH 0073/1000] Small cleanup of logic in handling drawstyle in Line2D svn path=/trunk/matplotlib/; revision=7505 --- lib/matplotlib/lines.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/lines.py b/lib/matplotlib/lines.py index 150713f506e2..2759dd69fc37 100644 --- a/lib/matplotlib/lines.py +++ b/lib/matplotlib/lines.py @@ -99,6 +99,8 @@ class Line2D(Artist): drawStyles = {} drawStyles.update(_drawStyles_l) drawStyles.update(_drawStyles_s) + # Need a list ordered with long names first: + drawStyleKeys = _drawStyles_l.keys() + _drawStyles_s.keys() markers = _markers = { # hidden names deprecated '.' : '_draw_point', @@ -712,15 +714,14 @@ def set_linestyle(self, linestyle): any drawstyle in combination with a linestyle, e.g. 'steps--'. """ - # handle long drawstyle names before short ones ! - for ds in flatten([k.keys() for k in (self._drawStyles_l, - self._drawStyles_s)], is_string_like): + for ds in self.drawStyleKeys: # long names are first in the list if linestyle.startswith(ds): self.set_drawstyle(ds) if len(linestyle) > len(ds): linestyle = linestyle[len(ds):] else: linestyle = '-' + break if linestyle not in self._lineStyles: if linestyle in ls_mapper: From abf00b457bae5f18333db72e0cf9ae47df4ecf87 Mon Sep 17 00:00:00 2001 From: Ryan May Date: Thu, 20 Aug 2009 06:44:26 +0000 Subject: [PATCH 0074/1000] Fix problem with call to draw in pong demo. Also make draw use 10 ms timers instead of drawing on idle so that it doesn't peg the CPU. svn path=/trunk/matplotlib/; revision=7507 --- examples/event_handling/pipong.py | 38 ++++++++++++++--------------- examples/event_handling/pong_gtk.py | 5 ++-- examples/event_handling/pong_qt.py | 4 +-- 3 files changed, 24 insertions(+), 23 deletions(-) diff --git a/examples/event_handling/pipong.py b/examples/event_handling/pipong.py index 95d23844dcaf..8aa405fdfec2 100644 --- a/examples/event_handling/pipong.py +++ b/examples/event_handling/pipong.py @@ -12,17 +12,17 @@ 'e' up 'i' 'd' down 'k' -press 't' -- close these instructions +press 't' -- close these instructions (animation will be much faster) -press 'a' -- add a puck -press 'A' -- remove a puck -press '1' -- slow down all pucks -press '2' -- speed up all pucks -press '3' -- slow down distractors -press '4' -- speed up distractors +press 'a' -- add a puck +press 'A' -- remove a puck +press '1' -- slow down all pucks +press '2' -- speed up all pucks +press '3' -- slow down distractors +press '4' -- speed up distractors press ' ' -- reset the first puck -press 'n' -- toggle distractors on/off -press 'g' -- toggle the game on/off +press 'n' -- toggle distractors on/off +press 'g' -- toggle the game on/off """ @@ -56,7 +56,7 @@ def __init__(self, disp, pad, field): def _reset(self,pad): self.x = pad.x + pad.xoffset if pad.y < 0: - self.y = pad.y + pad.yoffset + self.y = pad.y + pad.yoffset else: self.y = pad.y - pad.yoffset self.vx = pad.x - self.x @@ -84,7 +84,7 @@ def update(self,pads): self._reset(pads[1]) return True if self.y < -1+fudge or self.y > 1-fudge: - self.vy *= -1.0 + self.vy *= -1.0 # add some randomness, just to make it interesting self.vy -= (randn()/300.0 + 1/300.0) * np.sign(self.vy) self._speedlimit() @@ -106,7 +106,7 @@ def _speedlimit(self): if self.vy < -self.vmax: self.vy = -self.vmax -class Game(object): +class Game(object): def __init__(self, ax): # create the initial line @@ -137,7 +137,7 @@ def __init__(self, ax): self.pads = [] self.pads.append( Pad(pA,0,padAy)) self.pads.append( Pad(pB,padBx,padBy,'r')) - self.pucks =[] + self.pucks =[] self.i = self.ax.annotate(instructions,(.5,0.5), name='monospace', verticalalignment='center', @@ -180,8 +180,8 @@ def draw(self, evt): for puck in self.pucks: if puck.update(self.pads): # we only get here if someone scored - self.pads[0].disp.set_label(" "+ str(self.pads[0].score)) - self.pads[1].disp.set_label(" "+ str(self.pads[1].score)) + self.pads[0].disp.set_label(" "+ str(self.pads[0].score)) + self.pads[1].disp.set_label(" "+ str(self.pads[1].score)) self.ax.legend(loc='center') self.leg = self.ax.get_legend() #self.leg.draw_frame(False) #don't draw the legend border @@ -189,7 +189,7 @@ def draw(self, evt): plt.setp(self.leg.get_texts(),fontweight='bold',fontsize='xx-large') self.leg.get_frame().set_facecolor('0.2') self.background = None - self.ax.draw() + self.ax.figure.canvas.draw() return True puck.disp.set_offsets([puck.x,puck.y]) self.ax.draw_artist(puck.disp) @@ -229,7 +229,7 @@ def key_press(self,event): self.pads[1].y -= .1 if self.pads[1].y < -1: self.pads[1].y = -1 - + if event.key == 'a': self.pucks.append(Puck(self.puckdisp,self.pads[randint(2)],self.ax.bbox)) if event.key == 'A' and len(self.pucks): @@ -242,7 +242,7 @@ def key_press(self,event): if event.key == '2': for p in self.pucks: p._faster() - + if event.key == 'n': self.distract = not self.distract @@ -254,4 +254,4 @@ def key_press(self,event): self.inst = not self.inst self.i.set_visible(self.i.get_visible()) if event.key == 'q': - plt.close() + plt.close() diff --git a/examples/event_handling/pong_gtk.py b/examples/event_handling/pong_gtk.py index 3d5ce4486399..d841e304318e 100644 --- a/examples/event_handling/pong_gtk.py +++ b/examples/event_handling/pong_gtk.py @@ -12,7 +12,7 @@ import numpy as np import matplotlib.pyplot as plt -import pipong +import pipong from numpy.random import randn, randint @@ -22,7 +22,8 @@ def start_anim(event): - gobject.idle_add(animation.draw,animation) +# gobject.idle_add(animation.draw,animation) + gobject.timeout_add(10,animation.draw,animation) canvas.mpl_disconnect(start_anim.cid) animation = pipong.Game(ax) diff --git a/examples/event_handling/pong_qt.py b/examples/event_handling/pong_qt.py index a64d57245703..be0d62b68440 100644 --- a/examples/event_handling/pong_qt.py +++ b/examples/event_handling/pong_qt.py @@ -18,7 +18,7 @@ import matplotlib.pyplot as plt import numpy as np import time -import pipong +import pipong from numpy.random import randn, randint class BlitQT(QObject): @@ -36,7 +36,7 @@ def timerEvent(self, evt): app = BlitQT() # for profiling app.tstart = time.time() -app.startTimer(0) +app.startTimer(10) plt.show() print 'FPS:' , app.animation.cnt/(time.time()-app.tstart) From 0e59d67bc251ec6e2ce735a14849ae09c8526899 Mon Sep 17 00:00:00 2001 From: Ryan May Date: Thu, 20 Aug 2009 06:55:52 +0000 Subject: [PATCH 0075/1000] Replace use of axesFrame (which disappeared with spines patch) with axesPatch. svn path=/trunk/matplotlib/; revision=7508 --- examples/event_handling/viewlims.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/event_handling/viewlims.py b/examples/event_handling/viewlims.py index d28cda98eab0..5bb7bf61a27d 100644 --- a/examples/event_handling/viewlims.py +++ b/examples/event_handling/viewlims.py @@ -40,7 +40,7 @@ def ax_update(self, ax): ax.set_autoscale_on(False) # Otherwise, infinite loop #Get the number of points from the number of pixels in the window - dims = ax.axesFrame.get_window_extent().bounds + dims = ax.axesPatch.get_window_extent().bounds self.width = int(dims[2] + 0.5) self.height = int(dims[2] + 0.5) From e24a6126704f51ef2d91fbcef5d21d85fcde30f4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Thu, 20 Aug 2009 16:19:22 +0000 Subject: [PATCH 0076/1000] Use curl instead of wget in release/osx/Makefile; curl comes preinstalled on OS X svn path=/trunk/matplotlib/; revision=7510 --- release/osx/Makefile | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/release/osx/Makefile b/release/osx/Makefile index 5866bdae946a..beacc45f75fc 100644 --- a/release/osx/Makefile +++ b/release/osx/Makefile @@ -29,12 +29,12 @@ clean: matplotlib-${MPLVERSION} *~ fetch: - wget http://www.zlib.net/zlib-${ZLIBVERSION}.tar.gz &&\ - wget http://internap.dl.sourceforge.net/sourceforge/libpng/libpng-${PNGVERSION}.tar.bz2 &&\ - wget http://download.savannah.gnu.org/releases/freetype/freetype-${FREETYPEVERSION}.tar.bz2&&\ - wget http://pypi.python.org/packages/source/b/bdist_mpkg/bdist_mpkg-${BDISTMPKGVERSION}.tar.gz&&\ + curl -LO http://www.zlib.net/zlib-${ZLIBVERSION}.tar.gz &&\ + curl -LO http://internap.dl.sourceforge.net/sourceforge/libpng/libpng-${PNGVERSION}.tar.bz2 &&\ + curl -LO http://download.savannah.gnu.org/releases/freetype/freetype-${FREETYPEVERSION}.tar.bz2&&\ + curl -LO http://pypi.python.org/packages/source/b/bdist_mpkg/bdist_mpkg-${BDISTMPKGVERSION}.tar.gz&&\ tar xvfz bdist_mpkg-${BDISTMPKGVERSION}.tar.gz &&\ - echo "You need to to install bdist_mpkg-${BDISTMPKGVERSION} now" + echo "You need to install bdist_mpkg-${BDISTMPKGVERSION} now" From b9bcf5a7e0a83f541e77b692738bb8fee2358261 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Thu, 20 Aug 2009 23:11:44 +0000 Subject: [PATCH 0077/1000] make autodateformatter customizable svn path=/trunk/matplotlib/; revision=7511 --- CHANGELOG | 3 ++ examples/pylab_examples/demo_ribbon_box.py | 1 + lib/matplotlib/dates.py | 53 ++++++++++++++++------ 3 files changed, 42 insertions(+), 15 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 644f1007f90d..688b25dd4a85 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2009-08-20 Added scaled dict to AutoDateFormatter for customized + scales - JDH + 2009-08-15 Pyplot interface: the current image is now tracked at the figure and axes level, addressing tracker item 1656374. - EF diff --git a/examples/pylab_examples/demo_ribbon_box.py b/examples/pylab_examples/demo_ribbon_box.py index 6d5d77567d89..9ab0be183ec1 100644 --- a/examples/pylab_examples/demo_ribbon_box.py +++ b/examples/pylab_examples/demo_ribbon_box.py @@ -136,5 +136,6 @@ def draw(self, renderer, *args, **kwargs): ax.set_xlim(years[0]-0.5, years[-1]+0.5) ax.set_ylim(0, 10000) + fig.savefig('ribbon_box.png') plt.show() diff --git a/lib/matplotlib/dates.py b/lib/matplotlib/dates.py index 73675a31c0ec..cd3055c32f15 100644 --- a/lib/matplotlib/dates.py +++ b/lib/matplotlib/dates.py @@ -378,6 +378,28 @@ class AutoDateFormatter(ticker.Formatter): """ This class attempts to figure out the best format to use. This is most useful when used with the :class:`AutoDateLocator`. + + + The AutoDateFormatter has a scale dictionary that maps the scale + of the tick (the distance in days between one major tick) and a + format string. The default looks like this:: + + self.scaled = { + 365.0 : '%Y', + 30. : '%b %Y', + 1.0 : '%b %d %Y', + 1./24. : '%H:%M:%D', + } + + + The algorithm picks the key in the dictionary that is >= the + current scale and uses that format string. You can customize this + dictionary by doing:: + + + formatter = AutoDateFormatter() + formatter.scaled[1/(24.*60.)] = '%M:%S' # only show min and sec + """ # This can be improved by providing some user-level direction on @@ -392,27 +414,28 @@ class AutoDateFormatter(ticker.Formatter): # possibility... def __init__(self, locator, tz=None): + """ + """ self._locator = locator - self._formatter = DateFormatter("%b %d %Y %H:%M:%S %Z", tz) self._tz = tz + self._formatter = DateFormatter("%b %d %Y %H:%M:%D", tz) + self.scaled = { + 365.0 : '%Y', + 30. : '%b %Y', + 1.0 : '%b %d %Y', + 1./24. : '%H:%M:%S', + } def __call__(self, x, pos=0): scale = float( self._locator._get_unit() ) - if ( scale == 365.0 ): - self._formatter = DateFormatter("%Y", self._tz) - elif ( scale == 30.0 ): - self._formatter = DateFormatter("%b %Y", self._tz) - elif ( (scale == 1.0) or (scale == 7.0) ): - self._formatter = DateFormatter("%b %d %Y", self._tz) - elif ( scale == (1.0/24.0) ): - self._formatter = DateFormatter("%H:%M:%S %Z", self._tz) - elif ( scale == (1.0/(24*60)) ): - self._formatter = DateFormatter("%H:%M:%S %Z", self._tz) - elif ( scale == (1.0/(24*3600)) ): - self._formatter = DateFormatter("%H:%M:%S %Z", self._tz) - else: - self._formatter = DateFormatter("%b %d %Y %H:%M:%S %Z", self._tz) + keys = self.scaled.keys() + keys.sort() + + for k in keys: + if k>=scale: + self._formatter = DateFormatter(self.scaled[k]) + break return self._formatter(x, pos) From dbfc19a28ee2f9ddc3d866c92ea250a726a1bc82 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Thu, 20 Aug 2009 23:15:07 +0000 Subject: [PATCH 0078/1000] make autodateformatter customizable svn path=/trunk/matplotlib/; revision=7512 --- lib/matplotlib/dates.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/dates.py b/lib/matplotlib/dates.py index cd3055c32f15..421bc7fa931b 100644 --- a/lib/matplotlib/dates.py +++ b/lib/matplotlib/dates.py @@ -413,12 +413,15 @@ class AutoDateFormatter(ticker.Formatter): # Or more simply, perhaps just a format string for each # possibility... - def __init__(self, locator, tz=None): + def __init__(self, locator, tz=None, defaultfmt='%Y-%m-%d'): """ + Autofmt the date labels. The default format is the one to use + if none of the times in scaled match """ self._locator = locator self._tz = tz - self._formatter = DateFormatter("%b %d %Y %H:%M:%D", tz) + self.defaultfmt = defaultfmt + self._formatter = DateFormatter(self.defaultfmt, tz) self.scaled = { 365.0 : '%Y', 30. : '%b %Y', @@ -432,11 +435,14 @@ def __call__(self, x, pos=0): keys = self.scaled.keys() keys.sort() + fmt = self.defaultfmt + for k in keys: if k>=scale: - self._formatter = DateFormatter(self.scaled[k]) + fmt = self.scaled[k] break + self._formatter = DateFormatter(fmt) return self._formatter(x, pos) From 1e84e973a25b7e34941917dbd263db288381e001 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Thu, 20 Aug 2009 23:16:11 +0000 Subject: [PATCH 0079/1000] make autodateformatter customizable svn path=/trunk/matplotlib/; revision=7513 --- lib/matplotlib/dates.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/matplotlib/dates.py b/lib/matplotlib/dates.py index 421bc7fa931b..6a247e0bbb15 100644 --- a/lib/matplotlib/dates.py +++ b/lib/matplotlib/dates.py @@ -432,12 +432,9 @@ def __init__(self, locator, tz=None, defaultfmt='%Y-%m-%d'): def __call__(self, x, pos=0): scale = float( self._locator._get_unit() ) - keys = self.scaled.keys() - keys.sort() - fmt = self.defaultfmt - for k in keys: + for k in sorted(self.scaled): if k>=scale: fmt = self.scaled[k] break From 65ebe493af642f64c96f6829fe4182f1c60c7be6 Mon Sep 17 00:00:00 2001 From: Ryan May Date: Fri, 21 Aug 2009 17:39:46 +0000 Subject: [PATCH 0080/1000] Add an example showing how to dynamically resample for plotting using event handling. svn path=/trunk/matplotlib/; revision=7515 --- examples/event_handling/resample.py | 53 +++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 examples/event_handling/resample.py diff --git a/examples/event_handling/resample.py b/examples/event_handling/resample.py new file mode 100644 index 000000000000..a9df778cd3e4 --- /dev/null +++ b/examples/event_handling/resample.py @@ -0,0 +1,53 @@ +import numpy as np +import matplotlib.pyplot as plt +from scikits.audiolab import wavread + +# A class that will downsample the data and recompute when zoomed. +class DataDisplayDownsampler(object): + def __init__(self, xdata, ydata): + self.origYData = ydata + self.origXData = xdata + self.numpts = 3000 + self.delta = xdata[-1] - xdata[0] + + def resample(self, xstart, xend): + # Very simple downsampling that takes the points within the range + # and picks every Nth point + mask = (self.origXData > xstart) & (self.origXData < xend) + xdata = self.origXData[mask] + ratio = int(xdata.size / self.numpts) + 1 + xdata = xdata[::ratio] + + ydata = self.origYData[mask] + ydata = ydata[::ratio] + + return xdata, ydata + + def update(self, ax): + # Update the line + lims = ax.viewLim + if np.abs(lims.width - self.delta) > 1e-8: + self.delta = lims.width + xstart, xend = lims.intervalx + self.line.set_data(*self.downsample(xstart, xend)) + ax.figure.canvas.draw_idle() + +# Read data +data = wavread('/usr/share/sounds/purple/receive.wav')[0] +ydata = np.tile(data[:, 0], 100) +xdata = np.arange(ydata.size) + +d = DataDisplayDownsampler(xdata, ydata) + +fig = plt.figure() +ax = fig.add_subplot(1, 1, 1) + +#Hook up the line +xdata, ydata = d.downsample(xdata[0], xdata[-1]) +d.line, = ax.plot(xdata, ydata) +ax.set_autoscale_on(False) # Otherwise, infinite loop + +# Connect for changing the view limits +ax.callbacks.connect('xlim_changed', d.update) + +plt.show() From 5221429ff8c9d8b7bb1cd36cfb5f043f70e21f4e Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Fri, 21 Aug 2009 18:35:47 +0000 Subject: [PATCH 0081/1000] Improve documentation re-build speed. svn path=/trunk/matplotlib/; revision=7516 --- doc/sphinxext/gen_gallery.py | 12 ++++++++---- doc/sphinxext/gen_rst.py | 3 +-- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/doc/sphinxext/gen_gallery.py b/doc/sphinxext/gen_gallery.py index db7d0fb9e83b..a3d5a16c0f5e 100644 --- a/doc/sphinxext/gen_gallery.py +++ b/doc/sphinxext/gen_gallery.py @@ -18,6 +18,10 @@ multiimage = re.compile('(.*)_\d\d') +def out_of_date(original, derived): + return (not os.path.exists(derived) or + os.stat(derived).st_mtime < os.stat(original).st_mtime) + def gen_gallery(app, doctree): if app.builder.name != 'html': return @@ -58,10 +62,10 @@ def gen_gallery(app, doctree): # Create thumbnails based on images in tmpdir, and place # them within the build tree - image.thumbnail( - str(os.path.join(origdir, filename)), - str(os.path.join(thumbdir, filename)), - scale=0.3) + orig_path = str(os.path.join(origdir, filename)) + thumb_path = str(os.path.join(thumbdir, filename)) + if out_of_date(orig_path, thumb_path): + image.thumbnail(orig_path, thumb_path, scale=0.3) m = multiimage.match(basename) if m is None: diff --git a/doc/sphinxext/gen_rst.py b/doc/sphinxext/gen_rst.py index bd7f5a96ae10..94418ac4a497 100644 --- a/doc/sphinxext/gen_rst.py +++ b/doc/sphinxext/gen_rst.py @@ -113,8 +113,7 @@ def generate_example_rst(app): fhsubdirIndex.write(' %s\n'%rstfile) - if (not out_of_date(fullpath, outputfile) and - not out_of_date(fullpath, outrstfile)): + if not out_of_date(fullpath, outrstfile): continue fh = file(outrstfile, 'w') From 237ba381bc6fd4e8caf571a59983b72472643309 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Sat, 22 Aug 2009 04:19:45 +0000 Subject: [PATCH 0082/1000] Changed the way the target OS X version is determined in _macosx.m. svn path=/trunk/matplotlib/; revision=7518 --- src/_macosx.m | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/src/_macosx.m b/src/_macosx.m index dfbd2a41524d..dc4190139090 100644 --- a/src/_macosx.m +++ b/src/_macosx.m @@ -5,11 +5,16 @@ #include "numpy/arrayobject.h" #include "path_cleanup.h" +/* Proper way to check for the OS X version we are compiling for, from + http://developer.apple.com/documentation/DeveloperTools/Conceptual/cross_development */ +#if __MAC_OS_X_VERSION_MIN_REQUIRED >= 1050 +#define COMPILING_FOR_10_5 +#endif static int nwin = 0; /* The number of open windows */ /* Use Atsui for Mac OS X 10.4, CoreText for Mac OS X 10.5 */ -#ifndef MAC_OS_X_VERSION_10_5 +#ifndef COMPILING_FOR_10_5 static int ngc = 0; /* The number of graphics contexts in use */ @@ -175,7 +180,7 @@ static int wait_for_stdin(void) return 1; } -#ifndef MAC_OS_X_VERSION_10_5 +#ifndef COMPILING_FOR_10_5 static int _init_atsui(void) { OSStatus status; @@ -451,7 +456,7 @@ static int _get_snap(GraphicsContext* self, enum e_quantize_mode* mode) self->cr = NULL; self->level = 0; -#ifndef MAC_OS_X_VERSION_10_5 +#ifndef COMPILING_FOR_10_5 if (ngc==0) { int ok = _init_atsui(); @@ -466,7 +471,7 @@ static int _get_snap(GraphicsContext* self, enum e_quantize_mode* mode) return (PyObject*) self; } -#ifndef MAC_OS_X_VERSION_10_5 +#ifndef COMPILING_FOR_10_5 static void GraphicsContext_dealloc(GraphicsContext *self) { @@ -1877,7 +1882,7 @@ static BOOL _clip(CGContextRef cr, PyObject* object) } -#ifdef MAC_OS_X_VERSION_10_5 +#ifdef COMPILING_FOR_10_5 static CTFontRef #else static ATSFontRef @@ -1891,7 +1896,7 @@ static BOOL _clip(CGContextRef cr, PyObject* object) const char* temp; const char* name = "Times-Roman"; CFStringRef string; -#ifdef MAC_OS_X_VERSION_10_5 +#ifdef COMPILING_FOR_10_5 CTFontRef font = 0; #else ATSFontRef font = 0; @@ -2091,7 +2096,7 @@ static BOOL _clip(CGContextRef cr, PyObject* object) string = CFStringCreateWithCString(kCFAllocatorDefault, temp, kCFStringEncodingMacRoman); -#ifdef MAC_OS_X_VERSION_10_5 +#ifdef COMPILING_FOR_10_5 font = CTFontCreateWithName(string, size, NULL); #else font = ATSFontFindFromPostScriptName(string, kATSOptionFlagsDefault); @@ -2109,20 +2114,20 @@ static BOOL _clip(CGContextRef cr, PyObject* object) { string = CFStringCreateWithCString(kCFAllocatorDefault, name, kCFStringEncodingMacRoman); -#ifdef MAC_OS_X_VERSION_10_5 +#ifdef COMPILING_FOR_10_5 font = CTFontCreateWithName(string, size, NULL); #else font = ATSFontFindFromPostScriptName(string, kATSOptionFlagsDefault); #endif CFRelease(string); } -#ifndef MAC_OS_X_VERSION_10_5 +#ifndef COMPILING_FOR_10_5 CGContextSelectFont(cr, name, size, kCGEncodingMacRoman); #endif return font; } -#ifdef MAC_OS_X_VERSION_10_5 +#ifdef COMPILING_FOR_10_5 static PyObject* GraphicsContext_draw_text (GraphicsContext* self, PyObject* args) { @@ -2821,7 +2826,7 @@ static void _data_provider_release(void* info, const void* data, size_t size) "_macosx.GraphicsContext", /*tp_name*/ sizeof(GraphicsContext), /*tp_basicsize*/ 0, /*tp_itemsize*/ -#ifdef MAC_OS_X_VERSION_10_5 +#ifdef COMPILING_FOR_10_5 0, /*tp_dealloc*/ #else (destructor)GraphicsContext_dealloc, /*tp_dealloc*/ From 5132d75a1d9faeb54b78030621c28c9382014669 Mon Sep 17 00:00:00 2001 From: Ryan May Date: Sat, 22 Aug 2009 20:16:09 +0000 Subject: [PATCH 0083/1000] Fix typo in QuadMesh. svn path=/trunk/matplotlib/; revision=7520 --- lib/matplotlib/collections.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index 38b34c95e25d..078925c77d73 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -1209,7 +1209,7 @@ def draw(self, renderer): transOffset = transOffset.get_affine() gc = renderer.new_gc() - self._set_clip_gc(gc) + self._set_gc_clip(gc) if self._shading == 'gouraud': triangles, colors = self.convert_mesh_to_triangles( From 6b784162ad8370d9352ffc3eb2d0726c51b200e3 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 23 Aug 2009 01:03:07 +0000 Subject: [PATCH 0084/1000] remove buildout support (testing will use plain buildbot) svn path=/trunk/matplotlib/; revision=7525 --- bootstrap.py | 52 ---------------------------------------------------- buildout.cfg | 31 ------------------------------- 2 files changed, 83 deletions(-) delete mode 100644 bootstrap.py delete mode 100644 buildout.cfg diff --git a/bootstrap.py b/bootstrap.py deleted file mode 100644 index b5b9c133752b..000000000000 --- a/bootstrap.py +++ /dev/null @@ -1,52 +0,0 @@ -############################################################################## -# -# Copyright (c) 2006 Zope Corporation and Contributors. -# All Rights Reserved. -# -# This software is subject to the provisions of the Zope Public License, -# Version 2.1 (ZPL). A copy of the ZPL should accompany this distribution. -# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY AND ALL EXPRESS OR IMPLIED -# WARRANTIES ARE DISCLAIMED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED -# WARRANTIES OF TITLE, MERCHANTABILITY, AGAINST INFRINGEMENT, AND FITNESS -# FOR A PARTICULAR PURPOSE. -# -############################################################################## -"""Bootstrap a buildout-based project - -Simply run this script in a directory containing a buildout.cfg. -The script accepts buildout command-line options, so you can -use the -c option to specify an alternate configuration file. - -$Id$ -""" - -import os, shutil, sys, tempfile, urllib2 - -tmpeggs = tempfile.mkdtemp() - -ez = {} -exec urllib2.urlopen('http://peak.telecommunity.com/dist/ez_setup.py' - ).read() in ez -ez['use_setuptools'](to_dir=tmpeggs, download_delay=0) - -import pkg_resources - -cmd = 'from setuptools.command.easy_install import main; main()' -if sys.platform == 'win32': - cmd = '"%s"' % cmd # work around spawn lamosity on windows - -ws = pkg_resources.working_set -assert os.spawnle( - os.P_WAIT, sys.executable, sys.executable, - '-c', cmd, '-mqNxd', tmpeggs, 'zc.buildout', - dict(os.environ, - PYTHONPATH= - ws.find(pkg_resources.Requirement.parse('setuptools')).location - ), - ) == 0 - -ws.add_entry(tmpeggs) -ws.require('zc.buildout') -import zc.buildout.buildout -zc.buildout.buildout.main(sys.argv[1:] + ['bootstrap']) -shutil.rmtree(tmpeggs) diff --git a/buildout.cfg b/buildout.cfg deleted file mode 100644 index 79f2756954e3..000000000000 --- a/buildout.cfg +++ /dev/null @@ -1,31 +0,0 @@ -[buildout] -parts = PIL test python -develop = . -eggs = matplotlib -find-links = http://astraw.com/mpl/ - -[test] -recipe = pbp.recipe.noserunner -# Use Andrew Straw's custom packaging of noserunner with plugin support. -eggs = - pbp.recipe.noserunner==0.2.6.2 - PIL - ${buildout:eggs} -working-directory = ${buildout:directory}/test -initialization = - sys.path.insert(0,'.') - from mplTest import MplNosePlugin -plugins = - MplNosePlugin() - -[python] -recipe = zc.recipe.egg -interpreter = python -eggs = - ${buildout:eggs} - -[PIL] -# This recipe based on http://www.koansys.com/tech/install-plone-with-zopeskel-buildout-needs-pil -# Build egg with Andrew Straw's custom packaging of setuptools-compatibile PIL without Tkinter. -recipe = zc.recipe.egg -egg = PIL==1.1.6 From fd71b24c04f521d1860703015797c5390c06c7c0 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Sun, 23 Aug 2009 01:31:40 +0000 Subject: [PATCH 0085/1000] updated 7 of 9 images; leaving 2 for pos control on buildbot svn path=/trunk/matplotlib/; revision=7526 --- test/README.txt | 9 +++++++++ test/consolidate_diff_images.sh | 2 +- .../baseline/TestAxes/empty_datetime.png | Bin 19909 -> 17149 bytes .../TestAxes/formatter_ticker_004.png | Bin 33400 -> 25485 bytes .../baseline/TestAnnotation/offset_points.png | Bin 22606 -> 22661 bytes .../baseline/TestAnnotation/polar_axes.png | Bin 61219 -> 62510 bytes .../baseline/TestFill/fill_units.png | Bin 60441 -> 58097 bytes .../test_plots/baseline/TestPlot/const_xy.png | Bin 30110 -> 30234 bytes .../baseline/TestPolar/polar_units.png | Bin 41725 -> 66239 bytes 9 files changed, 10 insertions(+), 1 deletion(-) diff --git a/test/README.txt b/test/README.txt index e1720022fb2b..d2622ecaad2a 100644 --- a/test/README.txt +++ b/test/README.txt @@ -288,3 +288,12 @@ The provided classes are as follows: reference and therefore needs to be called out as different that a simple measurement of time since a delta-t in one frame may not be the same in another. + + +Updating after diff +==================== + + python run-mpl-test.py --all --keep-failed + ./consolidate_diff_images.sh + # check your images, decide which are good + python movegood.py diff --git a/test/consolidate_diff_images.sh b/test/consolidate_diff_images.sh index 768c1d17f762..f128c4c054c0 100755 --- a/test/consolidate_diff_images.sh +++ b/test/consolidate_diff_images.sh @@ -4,4 +4,4 @@ set -e TARGET_DIR="diff-images" rm -rf $TARGET_DIR mkdir $TARGET_DIR -find . -name 'failed-diff-*png' | xargs mv --target-directory=$TARGET_DIR +find . -name 'failed-diff-*png' -exec mv {} $TARGET_DIR/ \; diff --git a/test/test_matplotlib/baseline/TestAxes/empty_datetime.png b/test/test_matplotlib/baseline/TestAxes/empty_datetime.png index 30d117bfa03f4cb22a623a269f6f224786b634df..cac8656db2cb09645d2ee928f6c59cd1ec42af3b 100644 GIT binary patch literal 17149 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 JFWq|lzW}N{1?&I- literal 19909 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%0DvO(FDsl&quFAS z*kW6=fXzT)&kdWy}>&E)`z4BWQH zt1gD4t-DWVAm`XugorNM3+mrBS>LX!r?-g9XaKp|+e*)+eb^8DS literal 33400 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 literal 22606 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 z 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 F{Tm&#jlci^ diff --git a/test/test_plots/baseline/TestAnnotation/polar_axes.png b/test/test_plots/baseline/TestAnnotation/polar_axes.png index 0dc614ecebf39500cb0350d7e22b836f1ed0eab2..dca151658f730bfc47a1c9b38e2441c4fa6d4e41 100644 GIT binary patch literal 62510 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 MJJ#l?wdbn;1FhaS)&Kwi literal 61219 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�yP0~daR7rRy9UpgU=eIxi(O4Lx@i>!H(tjH<9s0Km z+97Q{z4jZdlDa@;K$XdcmJOky?ggx z65WJbW<@wsldSBXcI=8G+4p&EZ}5qKqJSJHxcd@1G7o?K=AMR1!tO4H)!&r_AiuQ$ zr2xY0-D}$#)~&Fv0cmr}H|j+CU5mmkb^v^*L1q@m3)Mi3Zqe-e zO^e%;=hFU5@ssc8kXySnxB41;`tp6B>pTeI0p>Kq68$S4G?ky=gj-u%n}grUQkDJ3 zWl&UY5Kld5ZbG2R{^#HjU$`oVGr7kX^ewI=k0truZp7@Uuf@H(BEl9m`r%UlqYIo@ z(~2$q#mUBTihT0&-RUyUX=|o);(T0cpFN{SfKhzVk|Dyx!zGdCu-a*oPKqq)`$kIW z(nYXX;ee%5@x_sUC3 z0DaBh*LjgbnKk$P%Fu2@*90A*!gHych(@@fUmp*q>=V`#oX&~ z+IDDwdscbIbEn*SS`n-uklG&IqQIre7{%1%WTK4jbrZ}FCwd;?lbN=)6RBF8D+iuM zjLEd*y<=6sG91~~Y{u?hd`=c#?silAfggZ2E0@?Q03Sph>6}FFsi1w*hYJAbP#yIRbdZyo+i`}+P%Xotrh(Ft*_bJfS_kfvk z$qej5hzS)(LYko(xKn_WE& z8pGei38XCvOZ*H*PH7n#osUoMt&CP{L5-P5Nc8h^r%BnB$tG4XlRiA`7j|%z{GddT za*b8@%E-|f;izV&Otqi2jmS~Ww5UB55l?yla& z?{3MInB{oZy#Z7`8+ac+$P>Usf*g4>>QZnT@txrdb1MwQt8LGd z$qjzDOa!iyte=5)ABVVLLGAZi{rGF=Dy&+hp>=7FIY8 z6Mm$kX(GW+drF@a)_&;8Ez;sb^O_hwNyrQrM0leANmUd8cp9jnvqFLF57kluDEtcFeaDK~ zmly82lDcxJ;GEaKeN`1AwL%afzo7RZ*Bbp!Nt>R7*Nb;kK=97c%q&?n>PETx)Q_R)A(ATfa&Lae#Q*AZ${V!f1>f^b_Ogl6b`N$zoZq83S>GB>N@o`r7p}B z&F@^2z!V`eAV}F(kGY<;UpBDb1nU~2BqCNp5S)BBsh4W>x`n%b-@xvtc`@QRR4%vT z<4+!?A?B(3y{|7aE-p?pUipX?9Ca`%gJEtHAXKjD`h9qFu#gv4R6;CV$((_UxbD8} z&A@jWU!kpoCWrvxx6PUYAWnTQ3$P)^V+3?SD;ftDYS=I7p>J(nM3=}4NYw4`i~3*s zG)^ziF`acq$D2r5qHE%ePSjH~b;R*rHT}v-KnS|$Hs(PzD7kMT?jVF`@g%!)H^xzh zRfx$QTwgCG+};7^db2#d*=Z+xW+KZ-u+-oO4wxy393Ls!B;h2!6^qGpdNs46yOwp! zMl@UGss7BPz!Yg~Yj4ajciVmgRS~h8YiPud=wM8NLNTmzYB~j;uSy;asKL)F{ z*llbmvaZ$eC`}7fe3GI2=Rd~@T^h(1p++Uc|GY7=;e%fw)&qjuYv&%il4zC4PuJWL z^lLOK`2x%UaCdLZFxDtg3=rpCBN)f2M&17Z99U@yuiw0h2RzdJ`}algaNGVWWhP@1 z-0Mj4w&{HW~ z3*5^XjOvZ+EhJkx8OHvR9Js!{*B7+BFuf>y|5~aQ9B+iJljTf)bBl`#8C3$4R@>j7 z=dY7f!GUnYZde|SxZrf|IDVlFu=c;%J8=J=?+2boZfrP%y*e9aQ$S8hG;JjRAPx12 z&JH9V#NG(z9^AB8w|8dYlBZ0rijneseg>9x_r^`j|J5;4T`bemY6gL+0&;VO)ytCB zZT7BFslxV~Q6I3GB2*OhE8eITc4;FSR$3Zqvh7Ddl?=`TdO$2`U^Lo<^V_uH1)l3p zu&D+CBZ0U$_+(Wf;$fsH0hpeDC%$Z7!4>&I4YYa0G7UxU%hqPJC}eXR8|}YaI->-D zj-riZ!FdJJKgXZL!d#FJG0ZK+mtT{Ge;7LE{zMc`oCee=$0(QyywXgrb3N-u zoO6h+1}>b(68O6>4a9mPa`J?kt<5ovrw33Xxfph&t(OwfmR9(Hqbih@A}=g z|0%1cvbMI*MrZ_?7(NA{O*JdJ9RWP77})as$?f|CEDKp;==7}!*h90C!EVGdskH<0hjF3{sI zHf>-8Ph@0HPR@vnhUWC&6h8HnJP4vY+#}>8gn;{#bQ?y%9GRG&F5p2L<9@KQUDk!J z<#cxrg>D>0HCA8N5=VL?>mKKRwK<`3dcec)puthn(1d{nK`BqSVao*^AYq`OrT#gy zegIP^riUYFt@5BmWg-$1B>*;HV-SRwy8F~!Y>V9A&^2d_aqsk;#4!BTOc*~WuqcPy zi!h#I`Pb4^G9}|)oJV=Utdd_K8-d8*Ssn7#Q0uwX#S8bpjRT_x<890N?TfVmF;r~m1Agc_H zjNaV*e9Q2#*SkeSY^bt(!&v=e5+;^)CF=>=HyOEf`9;EjVQTH^d4KRF7(A8EE-sh1 zA9}&yS=7{&IYQxsxC%n_=O180hZz8v$SN@1e)e#RkkBv|5F!Vdl3QB9X)1jARb(K$ z%`d6Ep2$0$T86R(8V0hYS{#)jChPM-t>EmeKfRvi-F#c`btQ6TNE?VQ4ct5hB_-C> z=1>v*H3IxQ?BJq934zNF<};_un$GwG&Y*AW&%H&BxOUjt*}*#hpL5-`p(n}u$Hn-d z#EzFj7T5^%XgWJ00gL8}IFEw%Jg0A^oap}d)R9tKI@|}Dcsz9lyHFzF4G|N~e*n6> zyBlT+178hvydx$d(W!iN2V^^XGY>51e{f@r2D!=B$yBZz+dy#ToiaR1KsWqjr$mKxbLBvU&Vo>wnYnK-*RWs|tjJwDD1igyR_j0fj0 zW2s08(;7f1=MWZ7is}2RrajNj>nf1dbERT@*ai#ODa>>ACa|$5Cbx#y9En)8;#P3J z%mc;+t*o5#*sR9R&7k_4M0TO3OmKG0gI&tFSb1k>As8cefkEwx9C%o4#Yb}O#8v;x z3*ZEvJ7mHe&_9TrRFH~@9aMCq9HQT~W!Xy`$$Q?P+P`4)SCa8!Fjz2hfR+WGI}f0P`ZObjh#kyUA$CEqhi!r~g<iYu%c0j#Yf)*^wP$CIhP} zn8q@oRfz_lQtuzIza+kXjrby>m^+ppi3cvieFbbH_vOofJEW2n42A-z z|Em^PB&&&*1INn~)qA?TTM*YOG;%FpzTg9@X@)`io}DomImv;t2_X^$1Cd}AK!%wC zx60(>1Kk(_qgY_5`gdxK77WFMM}R{x(CF{`-<%hp%Iaoqf^d*zQ@cmq8VP%mfmW{G z%pph*;NgKpTPY0n5%wt@_UYv4U)j8DyhExW)}fr79z`O(3{Hr?$(q&cB4j=Ztewc1 z1nh8st-Bq9cj3hM`J2KFAM}hsA0)t78njpBNX&q_MF@sN8Wu~zR}5Ys#I?Bm-xJ;~ z@3J2Un<`?cgi$5T{)8_yWGYt$J#G?fmGQ&rl3?qN#h}`&daU!N7}$6fK)wP$(AN3NxVInm!!v@7 zK8^1z(@Xx^Mpz{Ct`c(_*n`A;&u_~Q(o$|J(wJ;2QVx#Oj^8tOKD|tgM^6%s7p#na z{=t<$ORc8ILjCsRzY33k-u%^ja#nCPBR5a}nRHtB{;AKZT^jGRG_4A*!-X0lmzfTk zdx#?k(7-gXt5b(xn)({n8;{FD{h^_!Z!;GftWJR5791x^-rhC8wgbVgig-G~6F0UO z#U4hxjK%&QY+n4%Op%+jot5!3ztZu1Ek^e%itkYWZrFS90|jPObVnqC&gS$*a@m6{ z)o5~*(9Rot+4{=jl1H6>m?3VKn#Na%v54nc_i6(|O2B|xGjN!%{7UtU!cEIkX<1R` zB57Ga48 z<|Txto0+jR5THY3J%EK?)8X{5{NC^?qtS?g049yXwboR-=CiQF3UtBB8*ucOcP#My z^jjuVb8+27xPgb_Fx}HO0o&HnhtIp@;8EAVQ0t<@~n zzxX`_=JNzlN2j2;%hvI-rz+wR>g0i;x7k_*;W>(P4zAivV;St9Js5r$bx2L>&jQa9 z7{?%t4GO%P$j8i>^fW z5pW2DJt-I*ut;|)Yr+@+rgEV)jX@H{lZY4YC`IWz$y|WUu)*{y77}86IPyg;g!$fU z8|-A~ilkrcbMgDln>!z-_%C1Xwz68s(Q$Xb@sBWC^vNJ!*`(4>9-<@1{pL6Ro1ulP z)$>Ao{!I0kzyI669|E+pimyaZPtP)|Q%~&0>-`_??t`hbgLx6&fe-{Oz=jtQ@!i$+ z!=h3hAu(|)G(^axWBuMAyD4$F2-lo$0YO*+NQJ)6TXVM<1Kf#*W!CFfJsg=fNJS}4 z7`Qo}KnE>7OxeZFK+ubOfKQ!`CsizW8e_sH_p{PQ3(>zFCgY(e#74ou+{Bz4^j7`( zTCCN3wV%?{naFt>sz9Y-g*LBQOYU^8(wFK74Zl2Q8JI)1YuCtNHrbN7Lr@}yyvF}? zKiVU5^N9B%x9%HIb(kTa7h6%J2*3X3b?QD@CY%3wh%AC-zx$6pfn20^()zZ*nJsiq ze(^7G))EwvjjLFos%(V&x!|5;{c z0!*`9uc@w>yc_hcMYkdwXLx*FxO>J4$=e`pNP|!AVD6b#ISeXEZ*_4Zu`v;Fym~aP z0Tn-7Gyhq`&69b-z!orFBIAF4+uy`SJ~>=6^N984qk)L@Mx$gf}AxT8F@fd^xRv| zmis7`DYN-{WXI(8Myw82D*K#az%rIqj>U7#g+TWF#7+8mr4nX=;`##Pfe(E7?GdnP z$0rkEqG+kN)c3sMZICJBx>d>BsEP$?{udL3-9C+tapdc<`uqMQnzsY*xBDVy3`O2|))_|Ekg?+h=O*si#+7Zq?G6f4j)=-rl zD;9Q)@zPCuRNpp|felqRrEZLxrfNz5VxV}sePso^P(xQ2Zn4@UiLdh#K*rJdnTVe= z?oRiX#8cQ?wkSpFJ~nl?#SG7oMQ{6&@?duws^$U|`+KBsN47b2jE0{=qW8h{fqzW# zw~<91Tcc{5=W3_6PnaJ^Qw4~T2Ks1w2JZM6BQ*mzF;i4j6!-@p zGPgPT!7yhr=Rr6SV2_Udj4%5y>P*EtSUY^0eBr%vL>GexIuRQDf#Bjq?4-p;AD2I5 zo&%V&0xAU&Wnxu0p$={gsIqzsWd7miDeUXV6LlIFF@SxAF~IeGi*5(v%Nr9 z1S*-}ll||IQOCMCccvyb{nV*e-c##K(SJ*sgZq`ffG?gZ_W%C^ptWq}7;{lZKwMXI2XtX9FibPQ4eBy-{M6FQqQgWJflJ52 z!Dr*+!$7344L`3bG00h$WO;S7hrzd01&kgb3|laVrpYt2T%@APJ}?zjN;rPl`TfL% zqUg5K({C#)_Ar6^nf8&4&khO&RC_`9;@NuOxe|Q2O5@4aZN%gPdKz5F>u+A_l(V?e z^DF)T?^hJS*PU2GmSKY|lO2_ffp#02jsoCuVf3scC}-Icr?YKj{jx_e=2G4GcgYYf znZvnf5UjD^9$7KBxKj!hm;91JlEY4|fyHmTQ{5*KkVlO-x&{3DvWUv?xZso zFxUulJ;hdD>1(eZU^#?JcqF4bqnyf)e31DZpxDPEP7x*r1%o8}Jej`Z?!SgqoDG{R z*G4AAym!QadK4uO6HrtlQ|C9m%rXGaW`(Zhn4#1J#Z9K!|;apStnn z+=*atjVQZrLErH8=|MzM;{-ypRTz}}>^?E{g|BA-S#F>y@EmRgqu)x&Tz=beek?uE z3ASuYmjd?!?^%F+zX?oGydqHaLo&Jn0uT%hFG6+VQoT`pe5N)0?w=^rt1cRqsIK|< z1qIEJFLX>zCr-MF-6dXsy{zNyEuoUY!c3uzIr~G2EHW#*QQ4ZO$4I#aBIM2{$i-{H zR|x>Q(!rS^9Ric>voOzBy550&Ilxm%W`IS@na5M14KKXcB^IcMgbdH3Gp!+O@b*L`2t zuP#r@vLBxHOhfc&c{R0i9vyCbCbXtrcUn!M9YK0p;DtjgD{sQPi@3u9vXVa+&*qk= zRGM_<1s(~yIAYjepPakj27xHRgiDjQ8P3ClwE4)=fi((Oh6L#qFD0Vnps?wtm+}z; zoeb$t8n;?fSj^uvw)EEeljmEh(_|9AZ$%W~vN_lo9VR;AnVaP;;A)t32$Jn4!wZ-L zZ#`n2UgzeJ9U|q+R!!nS+!gi5ztfCVtOnlJndt)_m9@PT`#teBxe^)tnGI8@&;r~( zwA=dT^jKa83Job71#)jpdbO+uCM4~nqN~og-j1wuPYT;f*%o9M`+>e*ZO_LqslpC zP~*q~VzADAcju$`PRVrN)Vt#*+FZ7D-9vNZ!&&vHI^-R+hYlXBZ*maQ0zWxPT#DjY zuny&?jYw{q#A0X8`nZU3Z(MWL;nc-F*VNab0HqxX8ba_D-A9x6i}>FQQpk|@H|()g zCugj|QpJE4ah{M%IXX(zutXnd`UuZh>bGEALc>KUt$i|ik< zc;v6cJ|vAC-Hd8U<*;Vq3o>494cFD9L;mYq{rAPpgUxM@r zH`F*rDh(XZyF;KFWS5p^hPNHuPUCvl{m;JgmIbXm12cb4ue+(Q?1xmHsE0jeN9J9Z zh~)(+%iNHpBg{<>K-YFRRR}Me+uUpW2Vk`^$X*ZlY|Ap^%@$8z*DSY0KCA<0 zIJ$Ha9Ook&wK(EQhVulCJ()T3mP=%Dzv?HJ!e84gL1|SW zOBy39O>MoLars$Kh7=u$zX+oKte^@)1%V)q2r5+iOEI}JHmvn&TWk=6K74QDrq(BJm0U*SmDsO-JU3xoXn!I zu&{$bpgA+2#1Fci2TTi$EY z`MSmKLL>`22gh>d)*lHnvqGK_U8OWz9wrUNt1XJ~MUxxxR)d=_;kI7=K!5zf(ErdE zUVs)P!UCiaN>uZJ+819jrH)6)$YAKw#rlfh z0T~dinRkDL6i@3(`UP3iL36RjxOg1Ae*(4RXjCTnGCjXz?C6!zK?0P(B>EAY}uO z(cH5CvFjl-sag`c18y2UxXVB=O4bvvEvMGZD=5=V)(uFp99+FokEQ$*V=I{owXu(R zvn1Ilpqee2|9X0XA80!NtUNyx?co3G7$ zGBZ5%V(LZlBB@LbMD74+YdR*Vq?W|0zbq#ih;OaL97d4GW-dllaFXCJC`LT*jjFjE z#EA@bnZ`@4WonD`4ExwGJn!+dA1XgFyko>0k*VMYKL-J+71e zhdPKfHIntXrHnpruTw`=E4Mv!OOLvjijj^_+6{gMSZ-6~dR-^>C<#7(R};6?paCv!?kkb9lW^YO$U! zWk&zOGKcaqP@L2vMoDKek3 zBt(fa=kZ+!)&VrP<;NI|qcjX+%qNa208gByFITq*a8SG|y1EE0qUFqSZRGO=+JuCI%{0Kho*`h;Er=5~t&k3Tc85(&;KJ|Q;Bwf@PfinydEF!Uu z{~h_#D}uJY@in^`ZIOzVcnW8!9AcI-&G^Div!M^JwY|O~!lB|gEPeOKvb&gq<4y@h zdz}LgoK-s?#e#mINYT^^&ofqo3}28eoT=fiXvq~ecPT%Fs(V=2mC+0Xo>22;-NzL7 z0}+m@cqgq@xwAxmleVa-SeE|g*if21(5Soki< z6^p&*NMCT1^tgeJ|08;sHx-;kH_$!t%ojTB>#}Z5b=?top@#mv%2J@P_FIVIVvDca zsi21QZkDLr+(RM4nXO>1j|R^Po@vq$nk}-flH5-ZfM zI-r_JC{_CM{_=G{$!@J}hX0uDA->R-6l*tpQ>~m_@94T=M$&9rKwFVr!l-9Q+;&T3 z@&*khvBm>YWKVwq9Khu^k!~sdsNF6aYU=0$m+k^>O40|#R@X}8?BtSg$o_;8M?=vT zljIpw3Ck?OQk;NDBTJa8mjI7Jd|1^{xyrWIgsa&TgG#d?jtM%b^kDnB3VxUnPr__# zWOs)nfSZR$zR4@NZoRHE7d6Z^iyog7*cd!ubi~VZ;f~|vdr734J-w9r#vGTa4nK=x zOg7^tHT0M$1e^w_$>%x^%LujHd4}@(wcDB7ZZfF(a~8gXggbgl<$gD?)f*L0R9?^C62VMv&2VMW3kLJJ-K3l;ytH+sx;qh2y4~GdB z-`kg#PmPSHDBy%}1=SoI3__hwebq z*!dLgm%Pf zPo#Si0Gqho}zLQ8cFR|QUP|MuH8)oLepE#V za)mubMU?FSlU_5B%vgeVNHDE`bxh+ufr{&AkxH9huV8KRMKw4%=f&djNf(8YHw#Ip z^zaZ8qMzGhYfE}i7E)!IQ5=V#*mfoPz3i{A+FMO;)0UJJY4|Iq>n?~!~mwd1=>(HhaB;P8C=MRGDI zjH{_FR&Bbupe1#onm%b^EJ7`X=0c)MQabTu% zsZPl$E-t><{SEsA(jYYTV^ ziX4uvaSmT9KF6)6CXWm#{NasiL1&>~s_`8J)xo2x$((T~r(Y7z-!1JZ9w*fp1sda4 z{66C>dnl5I1hpspcFYGv0;z8mQ(X2S!VVX;I(z;-JcC2c8;Iu@AYBB0jS|qJjPc47 zjQFQ?)V#wjWDasrUCp`+#t^3prNrLY4lI|~~0iBG4CkGHWy(Lf`*=itR9Mjw)^4>@lKO<6eK(FMCi z;r0b=ga3q7sbX08-{{vrH_z}JNq3xYm*Xk;eYP41ao&!s6d9n!{!vf3!}Uwk`T~r5 zH#{Adl)_v3XpPVozs+F{`=B*fc;>8}%0nfKXIU%4IQ4UJV%JQU`0OVVY{k$q)ib>SY9x!NK zfkHuk`w~aXlE~$i#>i7c$7~*JPrO1ADNYyI+a-R>427BXaZv_=xuCJzT^?d-=9X<5 zyX1mCyH)^*Hff2W36&P|r%H#dIv@ryEVo1hHG^f1@ot|$>laWbz+%4!4-n9y_341i z^QX8W_blECon`PmCqd2I5l0!1ep(s(ghR2Y2HRDufsqj&Ya2dk>LuAd4mHKmk9ll* zG<{Q{kDpOZ8P;}sr9b;kH!@;+yjM@;4@`}Q^yfbcnQm-DLHy-Yq-DWtuhThNoE(D^>s9AtSx~5>~euNBS2s%!cy&Z)#JIa`y^35(RwTQ zs?M()G0>2Q&u0;=U6nk28R5<>8BP+P$V8yGA{juk$dpuL>h+CoqJM@hT}h!lN))iI zGxM1`fvl|H-TqX^Z5&%WtQHOOG{LTQ2d{59jCz%|iB^~BEE|C@r8(6)Koj>OEp2^x z{RtZl&6_X06gyvT&-vsIv87*~XLPy{TcH%qqIWr&byA3DOb{{qX=gBFy#TDQt|{1h7M;aj41n*EXQ&{eF}Y zCG{-K*8((3cEHfMUku3TqamZCR{tW_fb989^0RAV0 z`P>@|c3hz7ctMc z^)RLQ{nYl+@hY~Tu26a#l^|C5^Yu(Fo8g)@)c81I-dI$uUE6y4`qew8T3tXj}1U7b7szZ5ELc6GNb=03vYF8>DwG$)^b$w_0^9lZGS>&;X{F~ zf+R;^tKdV!mM>{s5^e;qT)x@Q5|*c!?oq&t7Hw$J5B`BVY4a{2ri50hIUGL`^{B#d z2h5O5K&Z$<1cG;ZPxG_=p94@w0tU^GBn;;aN5N$v{22HLoc=a~XIc@0%7EA!22DSb zmks4~TsjR{7vW$=gc~W}=mfF8V5N+Pi^WYd<0&3Hwfgbg{yps#2Ahqty)hRgn8C}N zB54a=gSgr|@eX$G`s^+J-80n(W}kyaYj^FG7n$O&x8He=lmEQ;LAE$+7jHfa&k_nY zq;+N_#`zpuaK7_nBCQAEb$+@JvIz@Q%>|rZNAjvceE!q_a0XEUZ2WA!I4DCH_^p=H z$4;}&bXt2)*TCE`Lp>iKdjzctc+pU+GasS^s?4jgaH=j!Rr;a(d4hpxBdl8 z6dgycMA2yW#WV2d-5qJS6Y6lNfs*?FjnP&2il2Gh15SAW7G3*=$LsxTS=SVbEV0VL zOZiU5qAAQ8usB%VFO>%Y`=oo^v?J%8t?gFoSp6>1vaK* z^?!cOi>$^68ggMzQm9U+yeyN$ya@*PQ)-5~a*?=mIK{f*fI@P-;LNjx3xKogLh2GK zJ0#x=0j$n0PPY*)3p|-nuoL+%_OJ%1GFdddpl%xZXaQCVXWV4XJa-fNryzPRpL9ZI z_H6vTcK;)Y0VV}w!3lyyMTxr?oRrrU2tD*f zmBE)OLbIzOxAJYGvf3@%pwA(roBS)fu)xJ6-7G`?eeg0-CX+yJXI`}VU7~lA_eJu? z8y7g+rmCw^laLaN(AtpPK?>K>nJE{#10}^3ScH)2Sa`XiEy`mJw4e7zMNc9?(@+HZ ztiiY87L*=+LH+FFc%=eDO_7xM;BIR5+&$Dq7bv**K?kVP9&Q4T4m1K9;w?q3PE=e$g7d$B*FicV;B#H}?xfEQkgPXmr%OM$!+l-BSW5Yb7^{f_9YVpT8_{`Km}MV zlZ4QDzY!}H>y|<}v^W}!S4I2cYc^f9H`8h4cgb}9ycl?jYfcrbZ;G6|h^_uM$lMnC zW-uIuqnflTZL5*n+811$i>3O%J3F7>AZZDH5MQkd zJwH;0LAmqaXl#Dd$k#V)Ya;J?88_HYx10odm#w8Fps?%#7M0=v(100kT0-v%3N zonAn#%N%k1(mgY?>y8=1j`}ZUB9B+gD*qh@md_tx^-&(W=l^Pr%nKx5d7Clpb)tRd zy0OTkeG*>~b1ELxce>rqV2p;+e1)4|i&525Xy=W!DnZn9W$tOmXQ$)!Zb*(`FpG16 zWpniR{_$Qncqnjs+_%{+0g>TA)xBybSx?@#qM#N zXz_0b021wPkd=K`zIOGd4MHd|l%Gv+n@nx4Ce0GY#XOckUeV|z6*A@csR3mjdP z?Lt}pS#!JSVl%aKy0pgnT9M*GZA1CyY5s*F#UxY7#Tiql;w+~c``0KtZT1;*A5ZhNM9V;NS+B^|HKq!hfCe?p^;4oq{?o*vR>P>ad1>aKn*$y zkb7)6;lZ?EgqD<^4$mB9eXB)Z=c6B@UddLbr!cvHuGRI+593gKyf5Ryv~8LESyU`u zrAQ_)VGNr>|2$VXlSI4U{3<5tKt?jtzR;PvUYAS+#&dFGASS(eDps^Dm?S0@~yL%DsUCEF~5SgLV%(8xz# z143aBWPoCd6om)Vh*1!vHM4_q1GE&NI;iWxl9P3Ft8mI7&6XUHKTgy(Zog~BamN{r zy`~%m5+p*1C`AHCZ92l9pEBj<Bg|M*>?#l)i>W_y5;@-V+E!<)Cx4ox|bVpPnvL zn1X7+8Ta*n-#3P&H(pqKhL&@;1C4@R!4A4|_puh7 zIz=#~0gD&}nVdkhBQsKT{Yar~z9b+bD#^&nepISZ4xOKm*kA)C>x;E(vY-mNr>E!H z>keq<$g&Oat5AyXd+;qP4TNMo?3t=xr{iRsWjD_^YnirIIhVf`=1qcfN>l{UA3XBIq`Jwmx3}-WM1d*(N z;fjsil}v!cwAwD#8^D3*WpaKh#a|--_M8Pt0F?AxR}VLe7!}mbrGqBl9Ads3Jx4IY zOd1a@Y1U(I1tyJ&ntAU7zr&^Ij^G%QU!0MD`}Tln=?j))ZiMIl#q z(zP8P5z+Ces(rz=JbqCx$!xZ-lg>^jkG}rEDO~ZU`XU{yb#6Ys=Ij-xS-<1k4``^V z#{`Hp&l0W#rfe88j7PrK(W9%#u0>Vc=A3xX-j4Qowv(m<m?$j{&#*6{uqCgocs`imEN z^huU3(pwD55qeky}kN4POHGOeQNzm+nC~EsFeI zg8%+*&^1{_9@&vEB{+&!MQM;N?F)Q?wbvz#Z9)qEZ(CXpc)uP+<@P{xt=Wk@L3VM6 zwa7_5@MffLu@{3o;(&5%`l zy-~(qJo3&q4hi^R9jN%;~aex>0i^8 zbL0RS2DApm;mqSMy=XyPi-qWUH@?Jk=DpHR>a!6^s{o-#g1I|Pr(tdygBHMEGb$l^ zG}kr#SZz#sUuHy&Tio<=r2`*rSevX`n|l}kq=Y>NnZX8oW@Y?>6n|$KYUpM&PkY0^ zAl!=?3}g&Ywc~iaXDk=!+K3@O*M{jz=0t)YXJFiSY`O7^M<8w-$L%H}ASH8i+a>%# zDxBjFuqdRl7dD~X-UkuiL(8V-$BJ5BQ7A_g@MC2B0N3)XiF2n9h4J3y@kez^KJQmlUm?-Tuuv>X*w?-+pc%SeUQK#lu| z4wzD-w5%R~WOE>Q98f5fydP+4*vrPxA8*B;{RkEXcgUKrtdP&4NPFuFeq!IU2;NL9 zK55mYpVIAD7IEO{@Y$R~0?!^lE*&prS#`oO_<~>=veR4G@IXa{-vtq)lwPsJ5C|Z` z91uZ87?28($0tWhPgnQ>{hjiPv~JHMtK2&g%Qac? zAdi_;c&MI|RY&6*P+&PiHSP#J{B~w;8vYMf9}aGK>(_r_D7(FeRJCjhd3()sH!G!0 zS6liJC4f&zvvL2UKlsaiWZ~;!wdjRR$2>ysG*3iee{kMNf65a`>1UGk27BbhLe*)( zE6?rLhdq8pUPD~O)^N|$yf2<+wv*0hogxtaq7@Y;L%YTZuUHU`x zun5Znv^?P;(Qbv}FGVgCef_f4Pp<}u{sIZz!Ld|mXsEwe8NApKt$Dl=;J}gmyUp#a zwNk`?P$o1dw_UIA*_PGQ=fJ^2#T*H@>c@*t^2R_bWz&Kb2b9FY9BTa;#j?O83t`^5ZYuiN zJ$;6t*M7hEQv%Gf0x8imyI5Qn+bP*Sex(gA;|k zT9WIT#|=2mixA2Ifg@sK@FDLj9u%9I0OsX7i=t#h`={UOiw$la_I`o{l>tA^E@(#H z&fEsHA1vjzUV)rs{O=;pcO3o)3Bsv)m>hK!;_AghPuy_ZAV(!P7v!#sdVnx@=lkB! zT^HmVUOMk(FU2`$Mz8TZy8p%*P}iu|&b(;|RElaxH?}irEV#UAqK?AW6Nl#B zN2B1*?(#q-V~qq`GxmUQIPdr+RTRl9mm?0nbSo&vLPgpi((0!_MYe=kD2uy!$6Jgc zp+aOG_rUzwFRH1lAIRjDq&Fh)3VVmul+Y!8)f^~4#>m!S z(j^f@JQmv=y-#&^M;mslkh2M@*rxclM>>}Xw~-+5Ma_GOG6m2#5n^NH=yH$_NkgZy z#+6+}Hm7bLBumb!M-}XT?QYb~KZ~d1k5vst+YQP)-?mbKpnHGSABdan;q?Ly7%>Jw zFDM3hj_k zt(eaeUN(BbzTu!VO6z~vA;8wcg-5LG@`_|~Db`Am*!wjsz&iuC_KsOnzm$r3opHb# zSx45$_Xc-cM8u+*cM`$n#<(I)SQPR*I6oS&%*hInzLS>F7<*{I?T0l|w@N=-3*k#+ zWT`?x76+wMSl=$Ev@U2i5MTXBWB;oNwa|EpV|}s+uiWa-hFfW}9F}l6QgTANGI69r z4GXPlq*XN7+VuXKDPuHmS%+GNUa>WMUit@UPJn6a1m8ZbFpa1a2bd|ObHVOHk&3)1 zM!RaCrBXygS8KItu8*5+ms5>=!DA9l%HnR=k3Sz^Q}#rt*@Cohsqf$Si$y=JKL~#4#0-Bx*U(aBYr2 z?vnhlOQO>r^MuVx9O}$*0XJI{`Fwj&F+k{ed0?xHh}*t!9WyDgR1znp6c2jj+XtaL zY|M64O&U2I#;s4AppjtFH?W7Jyl?MDg~SMIAd#|!0q3i5(_Dvt;pbj-QDUV zyj^~H0kXlN3Oqa_H-$n3(EI!h5W%-&h4)Tv7z`04f&UqzCa}KYJhVvSzyrIA&L-)g zL{bhmco@Gjc(UO(PPYC_V4MAA9JE^6Km=eUGW!%-HCT@KkOu%tL21ZU%ixg-(niY; zc&AL_pHfjNV)Ab#<azX5Nw z**iiy-(h98r+7D#QmXAD(JHWNuOh4V{^4Rh=qf&|NhXNaV2B-K-pkT`f0~YY(^;3q zjsmB5s#xZ_LnRFis<-IcqYt#mUDrvzcsiG8=+3M+*GTy3J3ZM=KQghnbPeu~u<4zm zE|c<0+08|Mc+wWgR-p+zB|L3iqaasfjHB}SN|CH(To5Lvg_w%?yey2N-^2p`kPu>S zb5}_^L}xrGK=!Oeiiw16*$!|Aa)01Z%fDFQRDCUPCp{rP0VqYk$XN24?mH&QU2MZtZGarKhnaBL{nIP5tiNe$BU zLk@FQPmrppGF%goeb+q_Q$T_Jf3yG?+4^z+LKu?|LuliajmckTfgBqCY3zovV*VGE zeiDJcDKQ&{u%ElkV)4@0nDpZd2B}e{^YS+K=n}ive15UTjDX=3u!q7Y?2TNNX&Z*z z;)H7CP?61k0AZl>smTN9u?*_$kCn07?Aw5t*j;dhgCf2^V_5~95```4=)L-EjwCJ4 z(%$#^a&*ITKfj*44pIw%2;qU-A`e{mkiFpZxvUV`wLR=6ti^Ci5v!k7$YEO?pV6~UYJ=T zHX!)Q_PSYPGW;$<`Zy$Rld9@&ndjiC>vC~Q&93up_M@@Z8|sRN?(a@Cfv_}IU@&NE z5YUkQAHgz5{1Wg@qVs@pK49uz5{nPz(wQY-r@W7r{it1G7Uj)^3R)3Yj6fev%LwI= zpu2jd6tL5_{fo;ndzlupvG@BAo!@0q$*bgs-m11vjwyd6Q>*V)tU-?+KfVYb+65jz zRf?hL!K2F}ZZ-{Cq(Ix8$}P;|@f3Pd%4-FCz@t~G+_WcBoQ@O&=h$F~(vS>2!ca@P zhuBl1rMW0s% zj6M(wkpp{cY|;x^M0U=XzH$SmS9wyiF7%?V&Uqv1I@ltn*QDDVmQFf$@~&0(yvqv= z+f30i?Am(+J9q_Hj{@%di4|HIxyyuA?VZ06s_-ZEJN2WVW|>zVaB-;*|2?3cKdZHv@Kj^cfx7eV-+D1xjV=F5*OgX#16`5(~=rr_K z9g8MKNaCBBTB3eafwue+*vLRIU}cpxxXml>fPBY+TfPrALHi@G5`eE+v=K+C);F2p ze;x4$WI6}l0td9+1&$TsLP35jC~G@Q&DKs`OPxjUdELc|l7NSd0Ce2^{Ez>-X|lv5 zjyzqCOA0C^N|4R}awsSNqy{2&cY!Hsdt7(Akq(Gm-${Y%Z|9U6_jWSDI1?;sp($IV zsLLk|0k0&<8OyrCeQQ}a4IPX$(!f>2*F**%zv?Xa*nFJGbbD|sa#`0vON;d;Eg^Vc zFo60=l~e(BDU>zJV_c)jSq?M0s`2zLDjWvaz)*&uh2~|4z2_Y5@o-UX_Om>WD^LW* zouY#X-#;nzNHlAiyDKRNXpWUB^Imwe;CIdhmsOn9tN&3grKYX~+bx}~O_etz(%*$4{|C&Uib+CmKM&VK0e_xD;&28QUf zmTvz1N6sGH=X|7R=d^iBfZW!|fTgI#(SD4A0_}0pPI!rhwD}X%#M9f5mg=;bC zooN-#JVgUM_U5JB8{{}O2b`FUiK*nP74u_? z;lZt(XRP?0`;tibSYo29-r#tc+4IB&ekt6*yXtir6U)J2T_#|c1rOSviiPXeqvE;& zH>eRIH_H$`nZ!xeiIs5JNX7X-mdP7)TzIK6K3^bL&IIgAIq*XBWxqfn3rP~*PwOsR zy@0;LxNVZj&mJLh|1h*OUk9K@pEBYvwXH12WmnbWx}6KEpT*?GkYxQ816`pkw*+gT ztc|SQl+G&oW4p6x4$J5<0w4$e&RiYc#;XGNH*m#C|DxFLLS?1P2EJf~-h!Nsb#CTv z1``E}UzIGlM4fxSfF?rbf3ZrLJ>w4FU#Uwz7fPmlV;Q11-Ujp|2Cb&6# z7N#UaTrx=f4^Nj#&a}fo-o1MyC6$G^Xuu#2rW`(#+KtMHX4Mdk(Mw;7(YbFZ#mJ2t z8g~WWaGlen3Qnzr3Tbj5O*(IrD1dH-$i;2Djq# zud~OvRLA*e)`U*JGOoUN$L+=LE*XT9#P29eW|P;>Eq`M1OXIMcp2I`|o7WCp8nk2o zx%ufKlo?)+31H6uTL#nhB@w^GvPv_w|9pFN3kLmeRGp4evt0(YOe-E^WW(3%m-ifF zRL!2Rl3ZS61fSERDxu7q z-(D8FBphcNo%no1r3Djn8g!*sPb;mF(4e_i8Q6q+>XjPptQ zBu2$XSaJW*e(;Hm?Zb!d))hl%BpuM1DC!|439Mwj(umw`kGzeE0BZ^kwFk*u<&cU2 zv0Cpv3F#E-@C0YhIqNfBk1@Om3Pt;6M?YU>H5L%McpzW`Q$1gvp4?iQJkK}1K`1QK zV$^ETxpm)b`4wK!Sk(N;Q_?3Zkzl&~tQMU#5%B8LWNF$fsh`ah5*c7{8!}V=WA>LO^IkT6pW-Gy}dP=1DfmU!e*FlR3m2R<3{qX0*&_A;-nbE3lzTe!O zuJcGY5ydx~Ne@zy$?=MezHp*~Cg#_aS^u470-COxVas1xtktR2y9sKY)e6E5ejUei z3t|@*0P?PM&s~utMFtzeYdE}3ZH0ha5=gRwoLul)gq3}VMDSCi!?}QW`kmHRU_dgT zT~WK&{F_|UU6y*|7&7->Uj+{&gRBg z`su*x?BMy8A;m_T#4w?r#_h|Xh);_r_a@h6_4TO%eRqWcuQydyqLAm|iHvE4mvm9) za<}!I)L4DHk$x=N-t~gqsUh0)Y{hwD3J6zLZUOo@HBKKg{e_)&B zYvXKR%VE0j!nvQMA7w_BIkoB5X~1jkwBoJHwy)1Wo%(AI${)O##2Q*g(KXU7`*IYeE z)ikOyXLR4a4#L^m8|M@NWT{*`-+Z-j;Qt{!FlMA=CM!YsmaS@WQ1-#NE0YK1;?20b z#F3GaX&V&sQR1m-j(1_Q4ULf=Ue`rodfe298folx#>85)uvY zKNMd7ja9cmw(Zrx$-x^Tnve*8@b`w%w}d1yIei!0Wk_!F1IOODkKrU#l4EF{k7va^uKO(p&iM%li&vEXcp?DiJEP zFX;E0I!D6w)vpFc8ZF45d?>w^WUV&5mEa!pxmtj@C5`S%70?%Duv@2zXT|@9mxcM?eUqqvlUrJZW%q& zbGLmiYmblQn8JKm0;WzL+KAxlLYbe^QaHzv?ObUz=%~LAc8^Qt_ELYV%Isnhy4X0e zj125fdE~p4s(f{EPOP;>c|e%0$3tF}j=>j`yGj)c2CObZ__2oR+qR_^t?7^}c4Z3Z zv@K6c)ZwKlo#WpF=*b~L0rFm)=;9KcfE(1whY5_xkiIREI9~39IEyR^sr@hVDFKzQidRCrD~wNAT7~MwRC&+7<2P zKXedW99mcRw7nBQcI6o@`IemT)7wIUk1?tXj57H2W%UDTVJR7Itmwc%R`7>b$MT>h z9-qIdY#+2^BiEk%=(_GAxls>u@wm;K!H1lE9MTnl+`}4(f=1pt?~}jRAVD!K-sZ-; zHKHT~VHDxiQ)m3v?KpiYHVy$owc)q>G+Ub}F|*ezH*Sim7UIbNX28_`6VX7gJ_1Vw z^3ms#+?>BA?x3b37lx$8Q2c+~YFBQ;k2;ckd8e|ZGo_5Drv1V9QDINa&`Evvz5Q0$9f$mmeRgC(Tmz|IY$;J7H zJImS>rJ-8iC!XlAnyNF77#PUA+g9yXravm@ERxmdtuhF^Zp7KQ{V6}68_tVPdbg6# zJHN@QNr+`n1sP2jI~fOUXNu&^1I0cFp9Z~Y2|rK4v(~ z!Sx>g!Q|rnumr(gjHo7I>tHaQ;>|BRH;c0S@kBDi?K+NHcx|Gt9YMuY$MP6*5mkF} z_<_|WemNRnypxIN^Rvn;i#*s#Us>eFEXBIaOPtKlA|oQQ0h!FdmldLsaVIR#-<$Lg zjtYH^xaS4g&AEW>mfvE;pn^lvOCi$=+eC$f!$dbIQGOe|#YmVPoEZ^F?7#{EBj%vH zs?iTZQ}vA|5&M~T*RA?{ZMyNuu-kmdMg8>RR_ORc+0!H3>Zea-FE=E=X;zE0%jz}; zJi4(sO3pr*YDu*<7N6=UIT)(ti+8@Sx@s*T&*FQnCrj_LyYW@z2V>R;o;V7+ruEx& za2Mbyc>MXUR8H9S&s#G?{BWtib*{=On#Yyl2|Xciz&OxsH{b`bXavj^;o`%h)KyG)vZuekV86*jSb(_nvxJt8~z1V7Lb;A zD#-tkwS*dFf56<3ekva&Ywu!rb?GzFNdTu;B&-1r zM6*H*awD)S5p+99Ue4<*y=ZR4yErZQdpffdW=KD{Kh$Fp{O{uNYPMF0mhX$rsP}TwQ%!dvC}-A*>YZto^{BnCysMVQ?qvldYIUV6CnKS@G7k|(AbcLd38 zqxyt{yNWowewoPsm1D}e@i$%>Hc1G(kcT29JYK#yX#C@qXZ?}NpL`bg`scqtO&BKS zjZ?;OadAQBwSttBoSlbF9NCoUKnxdJRwjT%6@wyxfT_pYJCwTDF_mF6g16v16~ELN z{+pP@yOMc0ha&V5wO9xUp-4w-|9O3y7^rC(`$}Vd&6{`@zKLvU6s&p1c zb>1^OCR=;HA2($h+QG(eYw8MdS5)Az>jL%bJxDM%QRd(nhj&6L21bnoBL@f0RS(MN zIu@r`g;jGGdEvp+dA4jkMtb?GVGo{hi@!Z2)GUci2FJYWmlqR03lEckYm;XBT zXkPf*_7sOS)53ShoZbe=v58P*Z!fr?cQ>BQT40sxE#)=HFpz5vI7jAhfay>LcIzue zw{X{@1b0%GTTQ(4%SyxcRkA{USJJ?Q3z!+(_VpESc)SkB!v_!AdV9SeiYWh9@5C&D za6oB95@?ri#g-Xw`dAl&Y?? z1q2TcB4}&uw>QyK{^?{Y{_BPiAkZ|+_i$I@|439(xd{=rw1i$aK4nk_v58Yd;TJo_ zA?zc!@yGGW7F>Gf6k&b-@ogo3TM!8sbT@( zms|oJ?fkA7`};j1kAwu;n%*^keC=p;t`!(>LGMsQ4=SZo+wAg&b@sw-W1)I+jhLZUid{614<-NR^)A|NIgTgh3WCZ*Kb>7rx%#kRL|Eq1QxL zQ&3iheL1&v%8m?ahsP{v%#e|o9cx94G|TXA%d4<8d}z4ft^aUU**QkvBKQ@}E%B$I zT=Cvr#On9FLLB;ffm2BzGIfxZ^s_aPh5g0ShSxia^F9;RneW~C{RKbRzpVMO-(%Mq zaYo(|Y(i2AY&PQ1JHFA&o+T)=lO_@EKPRqCu3sK((?jSIy|6v;GETe?&do|4r4{fWF6N z6Wj88mM5#BN-a}pj0Pl6Fj>V%;b9&mP+j%F++zl*Ec_P`9N{sAH>=RlpgAY+;@Etj z!eHb7(Y9;~NFR7K5g7qYa;tx9+^srb;kJ>k4CYV6b1ZfQ9)gcbHf#h=?HQOqM@|fGPYeZso7)%m`gXnD6!! z?OTSQ5$2fd%T`Y=U~8U-VX2@KX&)RMe65Xl4Ro2RFFx-}g7X=>!89HqK76L0Y!5dw z)#>5Be2rNra>_^g_t?Tn*(DG9J@36g`I@h>Ad0hx-PxZ$_fdlZGN@s!=v(R;R^o8v z3&dH`B7>pCQ57Ak!;Cl`Z-33r<*FW3;h%~9Nm+M$8i3UOoW97YXn5p=B zVQVWM_DK1xd$>&D%jnnJ9WN>IvEa3wemNO?Pp6v&jvL%J zF{JXii47~zx@@*NCe78{7+`60{z6y2xA>@R_wcX>*09^*mYFICxrq{Imvz1q7iJLb z-Vm|l3X=yxMWYFubvHDy&F!ivS$X6#VMO8ZSd_)~sR(rb_;G*!!|&XWAK3*3 zNs)~1-NoO5*C^!qR=_>8I@2Ty2*ASH8jr_2`8)1`G&kd8p#>XT#jw46_-JtD88gH_ z2WjRhKn!r!iIh?dHE2qfUHJNt1m$|a^TEBg zm)Kf@2h#=UT;I}*ig@9-6dbwUtEOmNx(59c6^s7o+)p8EfA8jqeD0-yuBft^OHz^% z!cURrfQqFn3*6ak+ke1sW8Ul?3`QFTI6a^`@G}|f_@sGwd0qPAIgZ2o{O~54?I}r` zYi9teX|Klk$m2r}>xXR??EkC0H~+`FZM%jK$~>o}WR?nvRAlZjHwa0TIi*BqDRbt? zm?R~lqDaOFQ4%Gg%$2D^LWV+wckSo>-0x4%fAE~2>xc6yr{nkz`!=j?ZEJl=%+wx# zuhKz1e(zEDIb?Y7DTCdWFu!$F{iGvzORrc5G7$^{ZrNLJ9j%x>A zC*H-uq4s`+GlTEHsrnmGM{0BMe7|0SQTA1eyXw1v71i@wu#g|dx`FtEW@K_wDPm$` z*5Js&w1BGP>W!Yo?$%A4w%1!f548E~U++XNdv|j;3rG}NSnJB;kLP@pNgKi`N2K#G zf6p~9HyYW>^Rd|fh>&Vju&a9Fr9+N4w&b?lNMu5_Tn zgw-%I{Vx|_uT?*V$G?IzDgPL~?UeIjMh+pK$-UcO&I!tM%G};|DN`fDFXPUe%SUvi zgH>lQ8>VI*r(_+iICb$5yf}$n9GqS@;TRTqX;K|AL!=hUoa>Ovdhmd3Zz6FsVqe`{ z_0onrZ&kJOxOWFR2aSHxS=;){-=nTx)jEFsrgig{4mpgEGekLA zAVjO-=$P9gyXlJRGILup&&Cp2=~Dx3HvXlZ#N!%%9(XF(cYo!wJ%US22*n#=LyUN_ zPzm#QgrAomKXU)Po?rVVYA)T+izZp;qODo%;G~NUjnl@R`T^T@rLi0W;WJPSzx(cV zRUm#BinIk}OOYrrZ>neFuM>88D6gxui@twlrZ387V61vm?p?dfE;*h82}{ySCn>v-fcV!r?mJ zvzz366bc>DdJ%_OB^iXfiQNY*p1~{*N0r0Kzoi-LPh=+&#hDFuQ9+=&)#|F1>ReMf z_v6ItH~BT^oYdA{>22T~G##rM82ViA{32J$`q7s<$-9=@Iix1O(u&S|8T;q+YmfqH$_j??^eoWKwZ1uiX zxEl&q{dFt@L$^2)ppeR-MaZQX_NBG@8C`q%ud6-0p-Q(Zq*v9Ru4>JLZ&U~qH*wS= zXRRYfFQN%+-n#6(VJ|>;PdAnz!lxNuzr7`(B3xS`yEST&sw=irDOu}y5yz|EysJI9 zlu+r}g!XA{7hr2NYh9oRs^xue&Ukx$0w7Ci*}t*$TuUvo8*ncx|j_* zEPM&qpB>wOkAGT!7^<&sr*6XJd;oFpbZm}jvW91`ccP?T(qk8PQw?Vc-5`Xdn%Y{8 z5#Erl=!FG|?DxDoQY9rmGCp3Kz09RoSXGK?T$$TKlp^ zGaj`pm(0P;k#aCb;%{@`J(3nQnmhGbQQL&|{j#LHlq$C1uAqH`#9zo24x?=Hv;~Nh zCf?avtZI(iQWxN{I|UVJ8)#r-$sNn{-D!8OUk`&DGE#VX=tKjYkLJo1S?l^5 z_vflD&x_`Lqv~=E3=Up~jj!Pd?;d;IO9^{_1Vl9UuHiVq@MzV2sM0}0F90Xgi-P2}{q}#B}OtX=Pv(3(V_ae5#zrl|6W;wgp0q zvhC3^4!G7U1S~6Sio^@;C6c<>Iv;jWxB;wW89XxcFUcr#!ULE==g=OX<_OL>qj$%F zn|eiB`p;gY()r-S0jJs~+Rn<_dD4IPt^%VO>k%MP1j3@%=oiB_qY=@ARA%*t4AT|F z4tmHyT9?kt$j>TN;F((dYTLUudWJ!Jd{pv4x*zBHw)@5sTmt7mYcs|@{k7L<7Z^@T zzg2~ANigO3(BE7uSh!H@e$-UwlPROc8>V#Q^I~M~?=y=@G0&FN2-eM3*+Aq8& zGWybKh` zblBQ~BDsHj9POvG+d;841K2iv1qtUTkYOZJGjHCc{QTHgd665HPUFX-cTEg7=5Jp* zwQvExnO;d23MDQ(2&BRutmqZd-}R}nK6|hwx~F^1(f%GalGb^SEk}h}a#2-;LQF#p zGzuV3gcnN=MY&YOueFi>7a3@Q( zq;i3kv2WZ<>_^(&ntz!!Z*9K6_Fi*`IW(}?szg?&qxP2?y>qnS{O2;8Kk^oUC{De- zCaZL7zZ6dI;UpPE>`&`I_Mc zhf-!N^EwGe{>=v-&Zw#Lm$zkKjb9ghu0=IM*=_Dp01WCdr3*Bv644SsGBGv4zVF68 zj*PHs0|R&KTINS8=MYaooz%Qu4;i;Bs2j}wm78me7(MlP@m?;rrTFez%gu7(soQ$q zhgG(2jZ%x{G@7qNZpR>nSH?Q9#qgbxl@(okirMR{wtLMN9UI%-Dk$kjIW4etBh77v z*VRjEy7Af?PZ$e?wrtsgjfPdwQmO%AJa2YW+AvA&MJntf@r*c|Pxk{w$W2tbwJJd4 z4#$^1+_7{;c|OJOXCEmiDwG1x8uDGU?Sq7Iw)NAx@Y!X7kAuNnFUmhPmrJWs$TY!w zeo`2l-uiV6+ok~tzIr*@kr#!PA0kRkV2-0{t}tD}e)J1-hWk)SfZ}cL^yh#Gm2)r3 z8-1K5F0%g!*RGu$DmZ%Q&?b)UwFfpO>0hM(QLie0_QGf}rMTJKYnSdepfK{Oh?f|+)SF1L{|g7i8w058jStkTKJA(tvB4{QAt-7G<73T9om&o z^}}%_w~%!bBtK#pleq^|zc^zS8HcaE+M-U)6qixED0`uhwQQjJbJZ`3Lxi_@ZlK3j6SLJ;2c{$n1pXp`TE$%X2#16|8~)$BJ8FWET_IjcLBEnAXNH}) z)3{1lZ8{zIrBFm&FCS=TvyR%Z23BKynDY+r~SOk#H<`|yjbTPNR+ks7{cm+qrnM931RkF6l1olK;0n29^%dj z=xLu6&+uOX#oO%2wBCQG@4b;NFpUPI(spHe>3Rf=*T>Q7pB9gL7H4m~koU zr|y^b^(`AXD&lu9vtH?tgIs$^*E)-Ld$U40WVfq6q^l|aIgJmY5RY+42@gO%93r|U zn={uKoq@6u)iDcnFIYwF!$H{N*cCVYQ-eyaDZH;%DAjlu%-}O0?_b?)%X6dbphns1 zW%>v^?eUwBBr{^N*nThy&uXl9-xD>Msq_3wEb*)o6I-2;k%8AWfemT7AOkK%n@|ST z!FkaIalzbbJ(LL>8gyMY*}Fx5Re;07y&4r39MU^}vt~gPQyh^OBo!_!Zm^C{US(o+ zgP|#}PimSKwZLv56|~Jvt*VOA#eS!+#Eu4~JhJ#+Fi%Pyyo99Tj(T4&nk54bt&px8 z+L;&SRTZ!Yf)8z+x`_!rw#e(pMvqNQOh8XB{Ghm;`>6?)i_@!Z3lt8!tGeASf6Bc< zr*B2;T}{qMDxh84f?>|ZQW$)&^2(@>@Mdvh0XWDqUkAT%#7&s6o@R!fSlz z3EwADQB2(8rr(k+@Qb(OCC=e^d)m1&3~r~;rODs^ zL}e5%2a^F5qdVibI4zTdelOK#EV&oGk-a$c#$~ijrWp{D)bV0QqUR18Z3`yN%2tPU z4Yk~H)m?}Y#B`9Tqbx5kYuBT?hy=Oww3*mv%x~a2`KHqy^-C~3t)e(8-o`A9HXGbd zb^0Kkr$W)^Ums+nb^5VLNZc5bZ%upqIwZASdtc}D3OV(0@>-hjR;_vBGAbij_$+wl z&pW)`!a_n6Y@)9ldUr7(dz-MB5~?{7nV7FFun;3En<$Yn&mO9ng+INBqGC@Lg)34M z$BGRLl$$lb(YAi>jfn1hKqIrPbn0<=HEXo4#6cOVZbt3BSHhl170v>Df}D*2L}))q zSj>3#p-KJ<-P91w;ASVjob!tGpz3yvYzgBG0xXPyNQUp^BC}1E*G#r-w)^_8!LP`8BfV8hl~q+lhKRgq3=28Juh`4V%Ll+tf(vSRb+sC5 zRahF*#y5EAuBnxooSKr|@Hip07V60$*#v4TrK<@4vyQd}u< zBH<)*>tIwF3e%xb;uGm>~0V4sj zN2TemOxr#{heg=yb!X>#sm7bYal7Y4pVsNT9G~o53ZX)JN)H()X9&CyVdksNU{*7C= z1%^GSmCe5lBURxYa)}msRm5W+JR9UG>Flfi-$6`Y_`0R%NlQ?x{>ZDF9<2}JpVjqw z+>M)&yoeS71K!U*89m^wQjfQ_!mr?Dc6y@VB1XwbkmmGDzqL zV0^bk95--L0O=@QQEmON9Y344?tfXn=%8D9oYL@5{q>hGD$SB6c@`BsSiP+W zg*pmG4`vdI!vB@%UGc!L2Lo0Xt*+Pauy_^%WuZ?p@#9mM*f39E9#{EDJz)Gy*!)s1 z-OuSD${QrR%V?yQUacLuJ9~2z_r-;mKovEA&1Da@LWP!CY(>Li5&9&nYi0IYX`<#K z7ke8w9Bh)e)7*+-Hg223;BN43QX`4CfK~r?vU=+fALVuRB-@UB(Nj@sXy#bBV>m?= zmaGCqP93o?sso3GqinYCj?)yvA!w+Dey>rPx8z%?;Up2OEu>mo8v;9Td4ESO7654A zSB0W_octJ^hXL&AoQ{2P|2`q?crVW8b$^WsvEgmt3!ooPtEO3FpLx=^$35%(FQ)O@ zVA^}4A&f!87qgvn_lXcppCjFo7W_XK0QO?rt0Z zEiJVcpFM)bu8ec0n?2OEc=>MP9Z4XXY9 zFo!;J1oIPzsIomLbt9<9=Q&;8G#`w4lX@tmvfEBZs%oE5mdsaU=Qvm2H6Dj!QUtC& ztLYA)%SuxGzTj_GWzt*bx(X&1>KL@S{F`^}ITObznSow!tOlWuIIk7eF*Ftu)U={P zi2z_2tP@k(GQUqAyhb*XsuXY^Ry|(Dp<(_!<&CVTCNGGabjb_mfp%g~r=Oh_7hbs+ zRTX{hDt{A?;9ZVUG`CZzp#uMQzQra>27VJ^je^OfjRRzYeI;QpYouDU_e*j6??L}d zjFOH?GLe%*pd?a?twvo>m@kz5?q@f$f>MRU^KWQbqm&{T=f8V0(+jHWZnf?1)`_$Db4~=s!!*cVk-J1lS@*Tor z=SZS^LV7;*gJzE{v2YeT+WsiDc#D`=I&Kmwt$IiX8lrPMr&GeWFs~Np@6B4)=AC#_ zB=$Hd#x*C7(&=h5ZevUv&WP%XivB29^XSm}Hcp?XLGHh%P<06DzAi2SuW5m9I|0Vwt|zY~TlHkH%{kuH zmf0hgJw;%xWdFB0m8=qm57Q|j3XIZ!=yvM+GXWI3&#-}O?e+)zI_#u)U+>JUhh@yv z`L1?ATG_+FoO}?I3}HNj+8^;$s7L{ZJVvFR$x>!(s#lhk(1W%hW=kcHY>zg*=&EqR zitT}Z6s6$he7a?5H20A>|1-N3JPT!L-Y9kETdl|R}uumg5=w(s}DIl>{4^ zzW;T*iLZIprFFP)Qfy8^f#t~5zKE-&7o&yt`#P-7TFdY@+gtO}qcyBW^XdMFX&J*l zVyA$9dth>)7L3l&5|K}vH3l`Z1UIs2y!1;vnS0`*!eV}4nIkt%0v838IeK-Bgi)0U`JsE?KKFA~KlX)%=Du**di>xj zQO`Xp`neLq!a=V)xM7sH&;6%-_WNc!k00Xo8@3!)@Vvorw*5Sh-vo)Oh;+N0ddOHV z{hk*S7bAJ>b|@mziKlj-@<0z91K1R;?~U@E=K$}J%!#s+XoA7?xy{IxKWui2%Wl&h zJ1<(vpU2rz-l-3M+!tsU!bw4L)OtOocluZvE#++9bA#gBY$k>;?>577VmqPSfE0ny zw!v+0-gTV_gEQ>7|2WlJ*XzPjJp%xoHb=Q`E?o~YkgV^#3vu5>(c9?enfG%4@q3b= z=~vEseWgn87C7spwvXV)_o{h>_=UCB=Xa_v)f;6wj#>L(v`8*=`BAdXJxP*7h6`n7n?cPEf!?`PfiqGQW|Rk>U)XJL#)GbzfkNz7 zb@%V5g3u7v=3o&0j_t!uKV;07`W2f(d&Xp5y74c0)@ubgFD~%ptn3NtBGf>wm6+d? z!YwMw6qoygmAXHDX*+95z*#IFDS`qLroK}|q5qR}bsY=|3qSu(;Wg3lpeiEGz&&3Y3e9^%1;7iCzmIV)r7d80tM+*PgMzX5km{w7Jo#pm{ zHdkTI%@W-TX05UqVZKXKIWfYkNdaFx-t{!k@3%)z#}?I94giW3>&@G~>ZoRORW^J85@JNa^J|W?9ZSBoUs96jvuw%{=j-p*zSy?D)zhMTIj=(t1y_Ljvr-*-=Ou*3(hO(@` zxoHtnRt9%9nSh$nqojCubO;In{RsQe0at5zY@t+n>5s&(09S^38CJWJ#ai&>bsc{1 zRC$pev@qzKb$;U3_gAI~0iYIgBhqlC4X2k^tO93)>h5{3dr-spzN|R|e^6rIoXIxA zDkjo-!f2O)CN&n!6C6TyVMNsX;>CRuNiVy*H=t5_jmUoWeTB;aEqOO_KK6+x2Awif z_L+S*rebz|_hP+K{?8BvMHD?4F#YW0$hWH21{bgY=g%l8yg=}P0GSFfCV~Mw_UyuT zo_d=O*pz5l!1*#5iFE+NenC-DEa12nR<2-IiCicpFgbZWeqd&z3)**+P4az07(0NL z4d**r_Du?bsN04m7Qu9BLHtutQu{z&NsF}!y4(z|=dTrsONC{Cj> zjC{LCUpwOKhw946=p%C0-e>*4>b?HEYHQECkYa7;M@<#a0#;O^UL1p&0>a)}f^tvY z1l@>8NSx`d+>15QIJC9+M6#(h5A{2|@2r#>7{!L8^UZ+nAkN`Sm;qrelMVdMM4v*b zDC7nXA?Ahu<$)ypr{c=@YBqL0tTi?ATuC=%Z=RhcOj^fLOvhSbCKKQ(uux!1pU4tK z5&&&dZjHZ}gX0xzbG|s1u`8^Oe~|x!sgmaAiJ$S6rF)H!`LE7zeB#$Y6?tSM@v2}$ z!pV4lDc)_>C5?siamJ&op9_0qZE= zBbut7kxi=On|H<>zKqeiLP;8vtCm`inppC?LzSCj!jEjG@|SPII?_RZ)#VorpFyFZ zDGU>R5s_um#4RWoOBxQ$0)fS`Gw*d-$g%pc*X@CI`mH zor*d=shgM}GMGhyymcgTw+FcdGsWm`cVysIR#sM^Eqxes4YQe?pE_y$@b|9=Avo-i z$yI=R>A(PNnHliAG>}_tWO!k>Xz2^13KPFHQ4sJmo|SR-_$blb2#8$kQ*!z4AJ&Ki zoll(G!pN>1p8CA!~!J&hj%;MV& zm0xfJH$us(t2#jKy0pa=j0ZOk&7OOImOWx`sW0M3FPVr;p9O({49>t43YUt4XrCC2 z*kl{;IoH|B0z9<=L9Pa3({P+~S$g)j-A*dUFjE_X9GbBCAg2h7tQVur#TRnV?Nzw& zm+SGJP2pwK6Gg)#CwB;W9ypdYG0N~oZl+o!^y~(kh>5OwC?Rsa``iQG-|D&`jAXEl z?lER4sf~0ZY5_2A!R~6>x>)o)OcI9Xp=n{)pY!SeSj}0Xs&}PHv6}fM^TP zv}MQF&Dd*+Clb04wDvXN3XQ4a%K20IclC`5_|4V!vOjo#pr-7atWV59`}QnB-k@uJ zJ*V_du6yp&_F$Q!E>(>Vr`)R~YpWr*Q@|pI=lE7)9yl#f`chbV$A81)y zz}Usg-28JzS|sVsaN^_M*qQhZ;VlN8L&kjx8cAsi2+IyKiDS%BOMKEcyl4G5jxUdgH2;#j$Num4r@9)g`wC8P3AHrcVnI7wwLu$XVooaf$4#-*R zcTQ;^U{J*A0L){;z#uKyn~=YEV}^gDe_-_dwv*SguW3QEfcC?viqNAOCe2eDTh}~) zHRPQZKJcCG%!K3RJr08D&6idLwJkRlK3fS!L-^$VeZD8hKOvcr$=zp=3XsWPfd!$j zCKs|+gdkg+F^JOw^^TSPqu!e}k*i^aHu?MaS|PLEB?#w}MR{nuO~GsaE*Qa7okArX zkbLD;p5G3))N9%KNdL6tFH{T`%KIy8suk(jyg4gf!EV#98R-dB7suovkWD27_eSX-cXUYhdbXv$P|Z**xY$8n_b2P+GT#~MB9k*n z0=I763W+hyLWZuL(Zx*)n;i&p^iiUy8$V?Kc2zAH98g}98$U86l9gd> zWYQ~S#wgqYi$Gx$;w~4>CokRj{lc%$<-s_gpA?S10RIj1$AOt|$x)=1!nM!nuV}+4M`+ihq;$GTAQ0r?Df`ZI9=I;`0>A*X(>{GhI8<>)eN|w` zxF^UcXBYHoMYxE4DT-6(YwvfS?|Xg~b2+SbVIs)@Od1_6wZ8C#`GQqT?-%x_J11(Y zj-C$KDH)dKX5Zkzak;Bv9dGJ*tyq}7c&C9X!_l|D2eMdjLKQ;Jk^4_Dt7Z~&pXv1T9BAv zUhYPRD~EbKJ6pSGRs{CXIay|AW@>?)9}>SK$GS>TP*C~O?}oA0Au*%4Y+m@$!L=h> zUW`NGs7UdgmxjANcbR;w+jI3%TD^PvaVAsYuO6uIGF2H$I(Q#qEiP1wUB*U7uVBZrrn`J{;>w{aVY=F!#Eh#wEaO$< zGL@An6;Y;4pqUEg^{^#e@kcT{E^nvm_`f?gVH*9O8?fO0R!Z^O1NSt!-y8)ZMd7)Z zgv8b@)#$D@X-YXpKK1Vo@@(VaCC@^*Ao})-QdF@ugy0CTuUV7N!|7A9){eV;j*VY&El6Mh?=7%$fJB8YN{t7~N#)_u z`w}an>fCfCN}Ht=B|M8i*<2)_d{L0Fe;NQg#u6>f#@o$F`!}OwT&*h}y)qj{yc|h) zc2GMpdnWk63d^&4oeV!;g$vvwkuB7eWmg7spBXh~!(yVs%WIC%yHI!DI8i zn0#Sg5miSP7r@w&R^MrZeK+flTr*OIph%nicvvk1+z)EK+ZoW)o;|3~@bSP}Wl?!5 z_oSdm?9G(Ah+`~RV9dPTl^5N4f8WZW;_qfrxs}Q?`ZFJ=Jvd(f4Sshw^RD2lbv=r& zZrwrUW(y8847{~nTx4KGai~flB<=!v6KFv(2t?SlyZ8^bDQ7xzQ`oq>lR?q31#gWY z+z=ojUO>j#2Kz=#*<(AisO$Zvf2GCG^tU_D_;PgQDQl*c2upltiGQ#I|Mucp(t|_& z(?Ok&Y;=7YfphX&ez~lwx(541dnX!gE_3ZOf6OGd?vsXjD~HHotMI=o8O9Q_u7jFm zpPq6cx0}Kg2cYU^4=HNIZA7d%T0CYn@pYig9t^X>Kov;G0Ac~>*4s-Mn_eEz{qe2PZ__mih z{M^m%{Rt=KSgx-88%RhSs_L5O1A#f=%DC{2H6v&2@jLNTg_ zMk|2O@NKskg-c1Wr}LN{GXpV1y7B9$QYXT$9jEOs$2i+}WoeE)RMhlSD<%?$*?U##g$eSkbwC>71ro_U` z>{ccmq1+sFIDk!hGmrUxDb{TT{k^Ke!m`X^AzRgxEz=i^>LjV=rEmHIZeI4xA9~{4 zf&M%iWCkJ7tAT^PLRkNAM+SG6AKMpkw9KrmqwVK4iJ>sCs_syCyRx)2D7L+xAxqxy{gi z{l=tixMuM%MCfA~dYbenD)%v1F7Z?4a)O9c>dE)WIs4ds*$cSkOCj%Lb(viW5ao+KDL;lgI zgiyT6K+lLKVJ|&U0z3d%h;V@!0zV;UwA7bv>&5~S@-n}&9p~*;4jcGm!MnU5H*+Wd z*U&iuy~lbMH4^(T8(v#2y5sL$buvZNlTOn}M#OALtmo6M#lYXeAw~vdpYjEApEsM$LDWG_9 z1{gF?%zob*0k{pOq`Uyf!@|QE@b(bXLM2Cz_bX2?{4z8=>a(e)dYF}UBrvFw)>nv& zGfV5tU5g4A8moq`Y0t#svEE&+<|#wZm~Prg7KcZ@{b`z$B;;^CzuaM?c$v|@R{|14 zQB>}=zFK#c?Pr&QZ)~zRFi07gTFTwsnBq6PDZoC?^|||OZ+L`MEKSIWG+DAEo+cR| zQ>3FDoSkC_2W=IU+>05y6$=k`}+7{Fy?y`?t|ns!BGfn1A?TqQ>2D{Y0Bg`EBS zT}uC$vnv*MhA8}Hx zF`Ljmc<>d5=d!2Y@e-S_$+@|wUS~Di-pU4YexbRo&wy%!Oe*bCuU=(?pg@7sr#+I! z9i`vCe;+96w5%l)bW(c`ybL80?0FVEyMtPO$|&!l=ljS5orTA#zn6ydCYCox-255% z_}O{=@W;$|Oa0I59JTOqvQYZHJJ4>`R!8A&jx=U}hy6ASt#q3N^u1U7bRa5ouMogGhvzi6?+XOUS^t3?@2v}=FfNOPbZdc>QGGmwba&}GhbBB zKj@Lnv;DZ8m*r)tMn+avO*^}+bq^gXP^85{9T?eQ0K2ZB$h`o~h(JB(lC|5!(Q-1# z%F2>I22}6_(skGs3mgcJxJkE)(U2R$?VP~8ICiUy5$m+r0zkkW= zfp_9c_0qUAxtCL@PvsTXhey2QrdlJW6Oe;{4cJk$AeSQ6isHh?rt?{V5yzQ@J1!F;UI7vi}9zT8!oOY_~Wb8oHj^{FbtdS!- zz+)tmoM=`7up68>5rw(QR}2eD>~(Z<%CivRDsjcVJw#qw5Ik>Ijh0h0YKS#XhQ_Dz ze$xZujXOytH#X)t)>FcA{``6Gg&z;NczGkx6lFXd6|ktgInjfAm1jXqll}1F%Pn_& zFJrlth>;2i2*3l7uv*eh9tk)8(^c2J{^A1PU2$wWv7Lvc9@;vd+_1oBohooGBRfO{ z+t(4exEf|(BEEip1!r1Cu(BlBAzkpr2j*zG7SxJa=&@R3_l>NOAS;7&bh)xpned*` z)o*gp(&VW>`Xpjw4vbSREiLD9ZV#1qcXe6gC-4ADsHZ%NFs2^3eW7Ek+K^ZqB_WATQ?%vFpwH!8tpfVh&o%sS6 z-{0RKIGpCgj*?azRR}&`#DNp9zbIMM2ODLV8N6V`h<8!-zv-xM7H*@)qn4I2u#7sh zYa`ss8Bv0HPm~XX@5=zp^;~l2ee7<6%ziGp^)!(-0imp(s3I5`1Y%5OgP{UmcsLdW zlaG3~9rx-J87aY5S-9vEd=!Cs5JNncV_I`pIBDUAN3@)Y4h`7xY-m*LF&~jZ_$whU_p=CL>FfwLlKP@3w5Xi&T@|?m*0p34}{! zWZk%n5w}11cwX54dxc(+nwl3vkT7|qt)8<2M=V-j@~C>!djI|_`0Ya`Fs~-IcNlyT zAb1l$zpUFgT{Qgct zun-4MP^^Ams(P~rip03BSgJG4*jbo`M<}AA!cX8V822GpO|~65yf4oLa=Q3gs#9LEzxPu zo;}3H7~bk+Xe#4>_|~~Lm*Z#fLJhG$u8nhn;?Y*Hu!IumWdSN z3W@zX+2A8Colq*E%`;)iGl{al9B_)NtI}jo62k42(0=^R5q<2QFF|4SkQ0-oW z6jA_rkfH;>o;`bZ7kcyi?|ooSGCU_5QiHM~J|!g*dcJrA27vrxxJNn-d=LmJoIE`A zK0ZF@k`Elh)t+VC1dU}lZ|w8*+-+`d&bm(yF&)HGq|hk=fm(V?DlPb;5RbXH59@<1G{{3dfI_o(7gH9-e920 zW);yDA|bG1lZ7=`TykdJGw^%V={1vc;Cm7rw^$Y3I#hDLc4agjSP*Ce;K7l;%&jMhu4Oy z;vqyson1irjK?FZYcHFc*kBMFGQe67#>BgteVT2n$wzJ7u_GL#*td<1|C4&q7o+D) z!I7S&G6rF)yixV{5b7)Bk1&HlgmXa9zbC%%;X(<2EjE_J(ee1i-7rk%HLR`EOB!V! zm6r0rLA9Z|S^iQLR<~)|La#1#K3nbpGtgu`ZDhppHMqlkq>aKUl|z9^AsQW6^g>h| z|1wUEM6G~?%Eie^2?z+7UtHvy@bUI8UgT(`GU6@j2iIJ|bueVW3oqr`wQG5YF3CD_ za+%SuVr;#G$Aj^`fvM@4HR@24fI>lm`>?*`Q60Nn{~Ilcd#r-@f2x_n-D~6ZSTDHH ztX`w0riRKInhM;=!9Z?9Dk^-URDC}1mXwr0Pqq$Y2~u!i)R2KUj^w;baZFX|4CG@Q z>+9>qvgzpQOWzJSX=>(ik*`1`+Pb>B=$|?R6hg=-vDVVOaR1>$W;!}L?Y`MNn3)qZ zbUnSu))FT>Gf)6447cV~{~8*i$J%LTYH;u>M9);Gb!A{65~dZzq027)dDuFRnlLQT z^<)>m)$YCG92^|;fB$Z{tnJr@`Xco9ZHuBdeND})wG`^_2cW$pCe+(amy79<>H|qw zq4nDFs-B+XnHv(wXo~Zw|MT?XOf^N5_6H9%fLB%oT zp5o$NMFZej38|{4p~#Jh7!k0cWO)6`j8%1T$*tg|-BI;BAyg8vK*XU!VRckb36ce# z`&Wbt@lTG9jxtDBm>qX8C!r$YDmkRQiaOqd)ZP@vk$%1;ofy!(T=(B!Ig!7*&UyF6 zDbIDxbZB1*qZ3z$@6%Q~#mZQ60&fmtkDT&z*Nca5>xW~gaXeEBpL}=ERhp2V?I%v0 zK*ZAk9SB%%Yinzm6PiC{^N@9q;Ey5Vkc#g&LXWM~dL2Q(kZLriqy);fV8_QBrsDaM zOV{M76*m3vU+iRYkjX#)_kX#N4kyn-sgoeRp zoM&q;oNF@=B8x=Gea_eYxbc1CPnBGe6T+#{G&kRbQw?~_wa;(ProSc#0r+g&%qg?i zsNjjmaBW|o;Oy)y!pdtXuGxH;!{Q9#nkinGh-T+k#PUv-p+>;Q6DOheYG?Ku+X^!7 zLkG#(?d=u7;bNPB*%lW9lgt0S%b2ytB_!B>X#O7#CahJJ1boJ1Ngg9>Tqv!sF8IN) zIPTO2qyw^clbXtBEU}IZZ_)bl{%QaD$9wqp1x{XGM!cJdv;F16X&Q!x@fnAaR^S46PKhdE4wEB2SH5&(waf91)Ep_a8j|$$>3Z$MUNaJ3sD;lHN6Ca*kT`#2J32MP(}JI5coG> z+l4qAwEBZ88-ek@4dExjCYz{N{+qe8qUq&TnsM0ISD9!nfRADW0VkL;zQRPb1rr>C z9zy5h1&%D4xs&=EqT65j+pGVNW*GWSv}+WK5~iF>pS{CQfmcLOUQDuqCa=P|Ls<_8 zJi;;|3)+d~X%s@F+#E_tki?||4u;X?6SQ(TPS!+JFCv0MDY9Dq{o6NdP-4g-HC#O5 zTosD38b7k*Ymm9((S)NsApSQH8z{)=BSb3{hy>#T3%myFK6r&9@Wl80+Q*F(5n+;D zT58hP))s*Q6S!H?pJt(VjOF-9fZQ8;Q2e56=Yn}^dd4`OEKf{K%pfoz?PfuIJPLnE z@*iXreuXMsLQHQBSQ(CPS5Z4r6U1b_C;PPpe_i!Zyq%qs!v$1=6Y>q(pFkIrh8hEe z%Vi(dHZ>grvF}C8Y`6U#CcOj#gkDWs0hfRg{|B01p`6rzU_jv4O@ZaN@y{Z@Lx@zP z2%PL%c(}Pm!Pam+_6KEg6gGzwhi~{))xLbGiCYb;tk8@@`JGYV0!E-i+w<2nvZ3qh zFVR1+!qrNaw$L;-ZrgrG$>!y1;l{$PTer#-TU2@*c76I31sXQrpF{fkD0`#O=56fh zz4UW?=3EolF$R_MgHabQZAEl_S$sv<6u}iHYG~&;$HvC2&z)m|q5`qW#nU?1rV3D` z1+G@LC-o9!pc)5#5N23BQUXDmC1faR8J)8BY2!rp_RH8@;uQKdazhCq9d0)XC zdwcuvz`(#0%e^Gy6Lu6z7q;51G}ZuV2vmUysdL*3qHs7TEof0YiviNup!HC=I4wqg zA5fs(qX*@Yx!ChW0wD#v3Zm=KvRq5bkjXZQ)nViH_{J(mOt{IKxaGQaaH09CRqhn|)~LCOGpQG)<`H7)h} zb$amSo;-PSI>XpQ!_i&QpuV3#N>lBWRj$Tax8o*bAwQgPv2X;C#jE0>yK6*4| zEOXl*`Qq5r9AgR6T%r?`AIJ!4vU7%xeVoaEjoi|z{e~t}I0b{r(*7>ggfC z5~0c#V5TlED9N>33Q)Uq)gKuJtNky1H43q z=o``iK6hi{bC~IJIg}hnDqunm172ub*ppO#GzCS^>C^Y)PMN`d<9Ta+e(M=c>N=dYk9DtYC~mFP5|?{C+EjCW>WY)s0|46#_gd>OBD6ri|BEQ2Chus(9wT|C+a zMk7I?U0hr^QBYWL{JYbQ6096>P<7AK~MrTmraOAjAD40-hE(a6UKvEAc% z*?1DfBJuNlC3m2yr<))Kdux|w2XT?R*AJ~3lzyJ(ycxCKfgM#L2>mTR_c*yqHbTTn zoPaJ!vNzs2S9HTyITUG=tTcH~)vZ5NY6YG`FT`eKY%UKRSED?EO(BNL1eFd73Yz=J z8xfKH{p>o8ClL`1g+S6nAX#XGB@N&hvSwlbhW5H*6)6xa%I4;`x|jAUDV@Z^Bnft; z@*EjCLt-bQDM3MN8Mq9UUXlu29D$WqFX0I&E7&Ocawb(w4?=`t_0>zWd;nFTCN_WK zebND4-N4LDQPKjD3Ji5V6me#^A8SW5Q2M}v^#!TAaqSsLrD_k58eY?B)hb5PW^kFY f{=fGx?^bA}EOPEM-2dK1!9RLh`kIfa)|dZ3p&5lA diff --git a/test/test_plots/baseline/TestFill/fill_units.png b/test/test_plots/baseline/TestFill/fill_units.png index 9b3a052557444b8851b54b7d84255cbaf52d92f4..6af42951b65df9962f83a09632a4ed9e042e30af 100644 GIT binary patch literal 58097 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 CD1WX1 literal 60441 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�LRBx|~Y36}q0TkHDHOIy#{0AZ4N92B3dz@G` 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 G`~Dwt6Ou>( diff --git a/test/test_plots/baseline/TestPlot/const_xy.png b/test/test_plots/baseline/TestPlot/const_xy.png index 13fe9009f352d1c95f69c394ded1196d9c4f6c29..bac903f6a7aa13bf18d042a943e8c58a8586235d 100644 GIT binary patch literal 30234 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

    5lro8pA)oAY~Y!uP9@DN*cN@ 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 Date: Sun, 23 Aug 2009 01:32:06 +0000 Subject: [PATCH 0086/1000] add script for moving good saved images to baseline svn path=/trunk/matplotlib/; revision=7527 --- test/README.build_slaves | 4 +++ test/movegood.py | 53 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 57 insertions(+) create mode 100644 test/README.build_slaves create mode 100644 test/movegood.py diff --git a/test/README.build_slaves b/test/README.build_slaves new file mode 100644 index 000000000000..a11b6c0bd0ee --- /dev/null +++ b/test/README.build_slaves @@ -0,0 +1,4 @@ +There can be two different types of build slaves: virtualenv and +python source install with clean installs of numpy and mpl. Both of +these will need nose installed. + diff --git a/test/movegood.py b/test/movegood.py new file mode 100644 index 000000000000..89235911874b --- /dev/null +++ b/test/movegood.py @@ -0,0 +1,53 @@ +import os, sys, glob, shutil +import matplotlib.cbook as cbook + +savedresults_dir = 'saved-results' +baseline_dir = 'baseline' +diff_dir = 'diff-images' +basename = 'failed-diff-' +nbase = len(basename) + +failed = set() +for fname in glob.glob(os.path.join(diff_dir, '%s*.png'%basename)): + ind = fname.find(basename) + fname = fname[ind+nbase:] + failed.add(fname) + +datad = dict() +for fpath in cbook.get_recursive_filelist('.'): + if not fpath.endswith('.png'): continue + if fpath.find(diff_dir)>0: continue + rel_dir, fname = os.path.split(fpath) + + + saved = fpath.find(savedresults_dir)>0 + baseline = fpath.find(baseline_dir)>0 + + if saved: + datad.setdefault(fname, [None,None])[0] = fpath + elif baseline: + datad.setdefault(fname, [None,None])[1] = fpath + +nfailed = len(failed) +for ithis, fname in enumerate(sorted(failed)): + data = datad.get(fname) + if data is not None: + saved, baseline = data + #print ithis, fname, saved, baseline + if saved is None: + print 'could not find saved data for', fname + elif baseline is None: + print 'could not find baseline data for', fname + else: + x = raw_input('Copy %d of %d\n saved="%s" to\n baseline="%s" (n|Y):'%(ithis, nfailed, saved, baseline)) + if x.lower()=='y' or x=='': + shutil.copy(saved, baseline) + print ' copied' + elif x.lower()=='n': + print ' skipping' + else: + print ' skipping unrecognized response="%s"'%x + print + + else: + print 'could not find data for', fname From f17a3042a871f690132ad1350cf9eda4bea8ab17 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 23 Aug 2009 05:18:45 +0000 Subject: [PATCH 0087/1000] add buildbot scripts svn path=/trunk/matplotlib/; revision=7535 --- test/_buildbot_install.py | 15 +++++++++++++++ test/_buildbot_test.py | 15 +++++++++++++++ test/_buildbot_util.py | 20 ++++++++++++++++++++ 3 files changed, 50 insertions(+) create mode 100644 test/_buildbot_install.py create mode 100644 test/_buildbot_test.py create mode 100644 test/_buildbot_util.py diff --git a/test/_buildbot_install.py b/test/_buildbot_install.py new file mode 100644 index 000000000000..7a235466b601 --- /dev/null +++ b/test/_buildbot_install.py @@ -0,0 +1,15 @@ +"""This script will install matplotlib to a virtual environment to +faciltate testing.""" +import shutil, os, sys +from subprocess import Popen, PIPE, STDOUT + +from _buildbot_util import check_call + +TARGET='PYmpl' + +if os.path.exists(TARGET): + shutil.rmtree(TARGET) + +check_call('virtualenv %s'%(TARGET,)) +TARGET_py = os.path.join(TARGET,'bin','python') +check_call('%s setup.py install'%TARGET_py) diff --git a/test/_buildbot_test.py b/test/_buildbot_test.py new file mode 100644 index 000000000000..e4faffff53dd --- /dev/null +++ b/test/_buildbot_test.py @@ -0,0 +1,15 @@ +"""This script will install matplotlib to a virtual environment to +faciltate testing.""" +import shutil, os, sys +from subprocess import Popen, PIPE, STDOUT + +from _buildbot_util import check_call + +TARGET=os.path.abspath('PYmpl') + +if not os.path.exists(TARGET): + raise RuntimeError('the virtualenv target directory was not found') + +TARGET_py = os.path.join(TARGET,'bin','python') +check_call('%s run-mpl-test.py --all'%TARGET_py, + cwd='test') diff --git a/test/_buildbot_util.py b/test/_buildbot_util.py new file mode 100644 index 000000000000..acd6a893c4c8 --- /dev/null +++ b/test/_buildbot_util.py @@ -0,0 +1,20 @@ +"""Module to help _buildbot_*.py scripts.""" + +import shutil, os, sys +from subprocess import Popen, PIPE, STDOUT + +def check_call(args,**kwargs): + # print + # print args + # print '**kwargs' + # print kwargs + # print + + # This use of Popen is copied from matplotlib.texmanager (Use of + # close_fds seems a bit mysterious.) + + p = Popen(args, shell=True, + close_fds=(sys.platform!='win32'),**kwargs) + p.wait() + if p.returncode!=0: + raise RuntimeError('returncode is %s'%p.returncode) From 4cf8a3aec43e01c4ced358031a70618d6d9ddd20 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 23 Aug 2009 05:36:23 +0000 Subject: [PATCH 0088/1000] test script exits with non-zero exit code upon failure svn path=/trunk/matplotlib/; revision=7537 --- test/run-mpl-test.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/test/run-mpl-test.py b/test/run-mpl-test.py index f654aebed70a..f72b8aa46906 100755 --- a/test/run-mpl-test.py +++ b/test/run-mpl-test.py @@ -89,8 +89,8 @@ sys.exit( 0 ) ### Run nose -nose.run( argv = args, - plugins = [ MplNosePlugin() ] ) +success = nose.run( argv = args, + plugins = [ MplNosePlugin() ] ) ### do other stuff here @@ -104,3 +104,4 @@ sys.stdout = originalStdout sys.stderr = originalStderr +sys.exit(not success) From cfd1f01b98fa3172ec926fb12985e90a749a9dcf Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 23 Aug 2009 06:43:53 +0000 Subject: [PATCH 0089/1000] Remove trailing whitespace from source code file. (This is mostly just a touch of the file to test the buildbot change detector.) svn path=/trunk/matplotlib/; revision=7538 --- make.osx | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/make.osx b/make.osx index 8c8097f1bb59..239965ef65bb 100644 --- a/make.osx +++ b/make.osx @@ -1,4 +1,4 @@ -# build mpl into a local install dir with +# build mpl into a local install dir with # PREFIX=/Users/jdhunter/dev make -f make.osx fetch deps mpl_install PYVERSION=2.6 @@ -21,7 +21,7 @@ clean: rm -rf zlib-${ZLIBVERSION}.tar.gz libpng-${PNGVERSION}.tar.bz2 \ freetype-${FREETYPEVERSION}.tar.bz2 bdist_mpkg-${BDISTMPKGVERSION}.tar.gz \ bdist_mpkg-${BDISTMPKGVERSION} \ - zlib-${ZLIBVERSION} libpng-${PNGVERSION} freetype-${FREETYPEVERSION} + zlib-${ZLIBVERSION} libpng-${PNGVERSION} freetype-${FREETYPEVERSION} fetch: ${PYTHON} -c 'import urllib; urllib.urlretrieve("http://www.zlib.net/zlib-${ZLIBVERSION}.tar.gz", "zlib-${ZLIBVERSION}.tar.gz")' &&\ @@ -78,7 +78,7 @@ mpl_build: export MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} &&\ export CFLAGS=${CFLAGS_DEPS} &&\ export LDFLAGS=${LDFLAGS_DEPS} &&\ - python setup.py build + python setup.py build mpl_install: export MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} &&\ From 2de61bc5db3c7be94324921e38fda77bf72254d6 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 23 Aug 2009 07:25:37 +0000 Subject: [PATCH 0090/1000] Remove trailing whitespace. (This is most a touch of a file to test the buildbot.) svn path=/trunk/matplotlib/; revision=7539 --- test/_buildbot_util.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/_buildbot_util.py b/test/_buildbot_util.py index acd6a893c4c8..66ebede1a501 100644 --- a/test/_buildbot_util.py +++ b/test/_buildbot_util.py @@ -13,7 +13,7 @@ def check_call(args,**kwargs): # This use of Popen is copied from matplotlib.texmanager (Use of # close_fds seems a bit mysterious.) - p = Popen(args, shell=True, + p = Popen(args, shell=True, close_fds=(sys.platform!='win32'),**kwargs) p.wait() if p.returncode!=0: From f8cb64e2bf9429372e1abe873bf639bfc82682f9 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Sun, 23 Aug 2009 18:37:08 +0000 Subject: [PATCH 0091/1000] added buildbot script for sage box svn path=/trunk/matplotlib/; revision=7540 --- test/_buildbot_mac_sage.sh | 2 ++ 1 file changed, 2 insertions(+) create mode 100755 test/_buildbot_mac_sage.sh diff --git a/test/_buildbot_mac_sage.sh b/test/_buildbot_mac_sage.sh new file mode 100755 index 000000000000..9850b8b922c6 --- /dev/null +++ b/test/_buildbot_mac_sage.sh @@ -0,0 +1,2 @@ +#!/bin/sh +PREFIX=/Users/jdh2358/devbb make -f make.osx mpl_install From 5dad40141eb0dd33c17b81054bad147f77020af8 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Sun, 23 Aug 2009 18:59:07 +0000 Subject: [PATCH 0092/1000] fixes to sage build slave svn path=/trunk/matplotlib/; revision=7543 --- test/README.build_slaves | 6 ++++++ test/_buildbot_mac_sage.sh | 12 ++++++++++-- 2 files changed, 16 insertions(+), 2 deletions(-) diff --git a/test/README.build_slaves b/test/README.build_slaves index a11b6c0bd0ee..1f1879479b84 100644 --- a/test/README.build_slaves +++ b/test/README.build_slaves @@ -2,3 +2,9 @@ There can be two different types of build slaves: virtualenv and python source install with clean installs of numpy and mpl. Both of these will need nose installed. +Dependencies +=================== +buildbot and twisted +nose +pil +virtualenv diff --git a/test/_buildbot_mac_sage.sh b/test/_buildbot_mac_sage.sh index 9850b8b922c6..68f5f1a27e3a 100755 --- a/test/_buildbot_mac_sage.sh +++ b/test/_buildbot_mac_sage.sh @@ -1,2 +1,10 @@ -#!/bin/sh -PREFIX=/Users/jdh2358/devbb make -f make.osx mpl_install +#!/bin/bash +set -e +export PYTHON=/Users/jdh2358/dev/bin/python +export PREFIX=/Users/jdh2358/devbb +export PYTHONPATH=${PREFIX}/lib/python2.6/site-packages:/Users/jdh2358/dev/lib/python2.6/site-packages + +make -f make.osx mpl_install +echo ${PYTHONPATH} + +cd test && python run-mpl-test.py --all --keep-failed \ No newline at end of file From 31a92ca14a711db606e7c76661686236ac1e06f0 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 23 Aug 2009 19:12:20 +0000 Subject: [PATCH 0093/1000] erase /home/astraw/.matplotlib before testing svn path=/trunk/matplotlib/; revision=7544 --- test/_buildbot_test.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/_buildbot_test.py b/test/_buildbot_test.py index e4faffff53dd..3cd0715bce8b 100644 --- a/test/_buildbot_test.py +++ b/test/_buildbot_test.py @@ -10,6 +10,9 @@ if not os.path.exists(TARGET): raise RuntimeError('the virtualenv target directory was not found') +check_call('%s -c "import shutil,matplotlib; x=matplotlib.get_configdir(); shutil.rmtree(x)"'%TARGET_py) + +shutil.rmtree( os.expanduser( os.path.join('~','.matplotlib'))) TARGET_py = os.path.join(TARGET,'bin','python') check_call('%s run-mpl-test.py --all'%TARGET_py, cwd='test') From b790be3fc891e1d71a2725ab7963997405efa152 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Sun, 23 Aug 2009 19:12:30 +0000 Subject: [PATCH 0094/1000] flush config dir and use rc on build slaves svn path=/trunk/matplotlib/; revision=7545 --- test/_buildbot_mac_sage.sh | 8 +++++--- test/matplotlibrc | 6 +++--- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/test/_buildbot_mac_sage.sh b/test/_buildbot_mac_sage.sh index 68f5f1a27e3a..2188525e1cc4 100755 --- a/test/_buildbot_mac_sage.sh +++ b/test/_buildbot_mac_sage.sh @@ -1,8 +1,10 @@ #!/bin/bash set -e -export PYTHON=/Users/jdh2358/dev/bin/python -export PREFIX=/Users/jdh2358/devbb -export PYTHONPATH=${PREFIX}/lib/python2.6/site-packages:/Users/jdh2358/dev/lib/python2.6/site-packages +rm -rf ${HOME}/.matplotlib/* + +export PYTHON=${HOME}/dev/bin/python +export PREFIX=${HOME}/devbb +export PYTHONPATH=${PREFIX}/lib/python2.6/site-packages:${HOME}/dev/lib/python2.6/site-packages make -f make.osx mpl_install echo ${PYTHONPATH} diff --git a/test/matplotlibrc b/test/matplotlibrc index a2b843786a9b..59ddf24deed0 100644 --- a/test/matplotlibrc +++ b/test/matplotlibrc @@ -1,3 +1,3 @@ -#This is an empty matplotlibrc so that the tests use the -#matplotlib default config and not the user's config. This keeps -#settings like font sizes from causing the image comparison tests to fail. +backend : Agg +font.family : sans-serif +font.sans-serif : Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif From dc351d143b09b650dc8c87973dc6bcd22560a16c Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 23 Aug 2009 19:14:04 +0000 Subject: [PATCH 0095/1000] erase /home/astraw/.matplotlib before testing (fix) svn path=/trunk/matplotlib/; revision=7546 --- test/_buildbot_test.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/_buildbot_test.py b/test/_buildbot_test.py index 3cd0715bce8b..ecde54d64918 100644 --- a/test/_buildbot_test.py +++ b/test/_buildbot_test.py @@ -10,9 +10,8 @@ if not os.path.exists(TARGET): raise RuntimeError('the virtualenv target directory was not found') +TARGET_py = os.path.join(TARGET,'bin','python') check_call('%s -c "import shutil,matplotlib; x=matplotlib.get_configdir(); shutil.rmtree(x)"'%TARGET_py) -shutil.rmtree( os.expanduser( os.path.join('~','.matplotlib'))) -TARGET_py = os.path.join(TARGET,'bin','python') check_call('%s run-mpl-test.py --all'%TARGET_py, cwd='test') From b20ed68cc04105fc02e69cb96263725320ac4b1f Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 23 Aug 2009 19:19:03 +0000 Subject: [PATCH 0096/1000] keep failed images svn path=/trunk/matplotlib/; revision=7547 --- test/_buildbot_test.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/_buildbot_test.py b/test/_buildbot_test.py index ecde54d64918..5639d520e6e6 100644 --- a/test/_buildbot_test.py +++ b/test/_buildbot_test.py @@ -13,5 +13,5 @@ TARGET_py = os.path.join(TARGET,'bin','python') check_call('%s -c "import shutil,matplotlib; x=matplotlib.get_configdir(); shutil.rmtree(x)"'%TARGET_py) -check_call('%s run-mpl-test.py --all'%TARGET_py, +check_call('%s run-mpl-test.py --all --keep-failed'%TARGET_py, cwd='test') From 9d906045fc937bc0341261ff8841f01db210bf8f Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 24 Aug 2009 02:37:21 +0000 Subject: [PATCH 0097/1000] buildbot: add script to consolidate failed images svn path=/trunk/matplotlib/; revision=7548 --- test/_buildbot_test_postmortem.py | 104 ++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 test/_buildbot_test_postmortem.py diff --git a/test/_buildbot_test_postmortem.py b/test/_buildbot_test_postmortem.py new file mode 100644 index 000000000000..dad9051d05b1 --- /dev/null +++ b/test/_buildbot_test_postmortem.py @@ -0,0 +1,104 @@ +"""For all failed image comparisons, gather the baseline image, the +current image and the absdiff image into a single directory specified +by target_dir. + +This is meant to be run from the mplroot directory.""" + +import os, sys, glob, shutil + +roots = ['test_matplotlib','test_plots'] +savedresults_dir = 'saved-results' +baseline_dir = 'baseline' +basename = 'failed-diff-' +target_dir = os.path.abspath('status_images') +nbase = len(basename) + +def listFiles(root, patterns='*', recurse=1, return_folders=0): + """ + Recursively list files + + from Parmar and Martelli in the Python Cookbook + """ + import os.path, fnmatch + # Expand patterns from semicolon-separated string to list + pattern_list = patterns.split(';') + # Collect input and output arguments into one bunch + class Bunch: + def __init__(self, **kwds): self.__dict__.update(kwds) + arg = Bunch(recurse=recurse, pattern_list=pattern_list, + return_folders=return_folders, results=[]) + + def visit(arg, dirname, files): + # Append to arg.results all relevant files (and perhaps folders) + for name in files: + fullname = os.path.normpath(os.path.join(dirname, name)) + if arg.return_folders or os.path.isfile(fullname): + for pattern in arg.pattern_list: + if fnmatch.fnmatch(name, pattern): + arg.results.append(fullname) + break + # Block recursion if recursion was disallowed + if not arg.recurse: files[:]=[] + + os.path.walk(root, visit, arg) + + return arg.results + +def get_recursive_filelist(args): + """ + Recurse all the files and dirs in *args* ignoring symbolic links + and return the files as a list of strings + """ + files = [] + + for arg in args: + if os.path.isfile(arg): + files.append(arg) + continue + if os.path.isdir(arg): + newfiles = listFiles(arg, recurse=1, return_folders=1) + files.extend(newfiles) + + return [f for f in files if not os.path.islink(f)] + +def path_split_all(fname): + """split a file path into a list of directories and filename""" + pieces = [fname] + previous_tails = [] + while 1: + head,tail = os.path.split(pieces[0]) + if head=='': + return pieces + previous_tails + pieces = [head] + previous_tails.insert(0,tail) + +if 1: + if os.path.exists(target_dir): + shutil.rmtree(target_dir) + os.chdir('test') + for fpath in get_recursive_filelist(roots): + # only images + if not fpath.endswith('.png'): continue + + pieces = path_split_all( fpath ) + if pieces[1]!=savedresults_dir: + continue + root = pieces[0] + testclass = pieces[2] + fname = pieces[3] + if not fname.startswith(basename): + # only failed images + continue + origname = fname[nbase:] + testname = os.path.splitext(origname)[0] + + # make a name for the test + teststr = '%s.%s.%s'%(root,testclass,testname) + this_targetdir = os.path.join(target_dir,teststr) + os.makedirs( this_targetdir ) + shutil.copy( os.path.join(root,baseline_dir,testclass,origname), + os.path.join(this_targetdir,'baseline.png') ) + shutil.copy( os.path.join(root,savedresults_dir,testclass,origname), + os.path.join(this_targetdir,'actual.png') ) + shutil.copy( os.path.join(root,savedresults_dir,testclass,fname), + os.path.join(this_targetdir,'absdiff.png') ) From f4bb8329fbd840aabda0cda231e5ad49ff3e73e9 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 24 Aug 2009 03:21:12 +0000 Subject: [PATCH 0098/1000] buildbot: set file permissions on files to upload svn path=/trunk/matplotlib/; revision=7549 --- test/_buildbot_test_postmortem.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/_buildbot_test_postmortem.py b/test/_buildbot_test_postmortem.py index dad9051d05b1..eac57fbecc02 100644 --- a/test/_buildbot_test_postmortem.py +++ b/test/_buildbot_test_postmortem.py @@ -102,3 +102,8 @@ def path_split_all(fname): os.path.join(this_targetdir,'actual.png') ) shutil.copy( os.path.join(root,savedresults_dir,testclass,fname), os.path.join(this_targetdir,'absdiff.png') ) + + os.chmod(this_targetdir,0755) + os.chmod(os.path.join(this_targetdir,'baseline.png'),0744) + os.chmod(os.path.join(this_targetdir,'actual.png'),0744) + os.chmod(os.path.join(this_targetdir,'absdiff.png'),0744) From 623f753a6e1ee34c0e002eb1075402b8bdc52a15 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 24 Aug 2009 03:23:40 +0000 Subject: [PATCH 0099/1000] buildbot: set file permissions on files to upload (fix) svn path=/trunk/matplotlib/; revision=7550 --- test/_buildbot_test_postmortem.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/_buildbot_test_postmortem.py b/test/_buildbot_test_postmortem.py index eac57fbecc02..e36faf26bdc0 100644 --- a/test/_buildbot_test_postmortem.py +++ b/test/_buildbot_test_postmortem.py @@ -103,6 +103,7 @@ def path_split_all(fname): shutil.copy( os.path.join(root,savedresults_dir,testclass,fname), os.path.join(this_targetdir,'absdiff.png') ) + os.chmod(target_dir,0755) os.chmod(this_targetdir,0755) os.chmod(os.path.join(this_targetdir,'baseline.png'),0744) os.chmod(os.path.join(this_targetdir,'actual.png'),0744) From ddf031d4bdd2058c9cfbb9c94764a593f37be71c Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 24 Aug 2009 03:26:13 +0000 Subject: [PATCH 0100/1000] buildbot: revert set file permissions svn path=/trunk/matplotlib/; revision=7551 --- test/_buildbot_test_postmortem.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/test/_buildbot_test_postmortem.py b/test/_buildbot_test_postmortem.py index e36faf26bdc0..dad9051d05b1 100644 --- a/test/_buildbot_test_postmortem.py +++ b/test/_buildbot_test_postmortem.py @@ -102,9 +102,3 @@ def path_split_all(fname): os.path.join(this_targetdir,'actual.png') ) shutil.copy( os.path.join(root,savedresults_dir,testclass,fname), os.path.join(this_targetdir,'absdiff.png') ) - - os.chmod(target_dir,0755) - os.chmod(this_targetdir,0755) - os.chmod(os.path.join(this_targetdir,'baseline.png'),0744) - os.chmod(os.path.join(this_targetdir,'actual.png'),0744) - os.chmod(os.path.join(this_targetdir,'absdiff.png'),0744) From 777d62e3cef613895b80835f5f78215a519b29e1 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 25 Aug 2009 15:32:13 +0000 Subject: [PATCH 0101/1000] Merged revisions 7567 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7567 | mdboom | 2009-08-25 11:31:10 -0400 (Tue, 25 Aug 2009) | 2 lines Support Line2D objects without associated Axes objects. ........ svn path=/trunk/matplotlib/; revision=7568 --- lib/matplotlib/lines.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/lines.py b/lib/matplotlib/lines.py index fb8d9c2a3983..6a6b540a16da 100644 --- a/lib/matplotlib/lines.py +++ b/lib/matplotlib/lines.py @@ -453,7 +453,7 @@ def recache(self): self._y = self._xy[:, 1] # just a view self._subslice = False - if len(x) > 100 and self._is_sorted(x): + if self.axes and len(x) > 100 and self._is_sorted(x): self._subslice = True if hasattr(self, '_path'): interpolation_steps = self._path._interpolation_steps @@ -490,7 +490,7 @@ def _is_sorted(self, x): def draw(self, renderer): if self._invalid: self.recache() - if self._subslice: + if self._subslice and self.axes: # Need to handle monotonically decreasing case also... x0, x1 = self.axes.get_xbound() i0, = self._x.searchsorted([x0], 'left') From 4817af08e067899f1e1564baf7afa3eedac86779 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 25 Aug 2009 20:06:13 +0000 Subject: [PATCH 0102/1000] Merged revisions 7569 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7569 | mdboom | 2009-08-25 16:04:34 -0400 (Tue, 25 Aug 2009) | 2 lines Fix cohere_pairs docstring so it builds with new versions of Sphinx ........ svn path=/trunk/matplotlib/; revision=7570 --- lib/matplotlib/mlab.py | 105 +++++++++++++++++++++-------------------- 1 file changed, 54 insertions(+), 51 deletions(-) diff --git a/lib/matplotlib/mlab.py b/lib/matplotlib/mlab.py index 8376fbda23b6..6ad3197d9268 100644 --- a/lib/matplotlib/mlab.py +++ b/lib/matplotlib/mlab.py @@ -497,77 +497,80 @@ def cohere_pairs( X, ij, NFFT=256, Fs=2, detrend=detrend_none, returnPxx=False): u""" - Cxy, Phase, freqs = cohere_pairs( X, ij, ...) + Call signature:: - Compute the coherence and phase for all pairs ij, in X. + Cxy, Phase, freqs = cohere_pairs( X, ij, ...) - Parameters - ---------- - X: array - a numSamples*numCols array + Compute the coherence and phase for all pairs *ij*, in *X*. - ij: list of tuples - Each tuple is a pair of indexes into the columns of X for which you want to - compute coherence. For example, if X has 64 columns, and you want to - compute all nonredundant pairs, define ij as + *X* is a *numSamples* * *numCols* array + + *ij* is a list of tuples. Each tuple is a pair of indexes into + the columns of X for which you want to compute coherence. For + example, if *X* has 64 columns, and you want to compute all + nonredundant pairs, define *ij* as:: ij = [] for i in range(64): for j in range(i+1,64): ij.append( (i,j) ) - preferSpeedOverMemory: optional, bool + *preferSpeedOverMemory* is an optional bool. Defaults to true. If + False, limits the caching by only making one, rather than two, + complex cache arrays. This is useful if memory becomes critical. + Even when *preferSpeedOverMemory* is False, :func:`cohere_pairs` + will still give significant performace gains over calling + :func:`cohere` for each pair, and will use subtantially less + memory than if *preferSpeedOverMemory* is True. In my tests with + a 43000,64 array over all nonredundant pairs, + *preferSpeedOverMemory* = True delivered a 33% performance boost + on a 1.7GHZ Athlon with 512MB RAM compared with + *preferSpeedOverMemory* = False. But both solutions were more + than 10x faster than naively crunching all possible pairs through + :func:`cohere`. + + Returns:: + + (Cxy, Phase, freqs) - Defaults to true. If false, limits the caching by only making one, rather - than two, complex cache arrays. This is useful if memory becomes critical. - Even when preferSpeedOverMemory is false, cohere_pairs will still give - significant performace gains over calling cohere for each pair, and will - use subtantially less memory than if preferSpeedOverMemory is true. In my - tests with a 43000,64 array over all nonredundant pairs, - preferSpeedOverMemory=1 delivered a 33% performace boost on a 1.7GHZ Athlon - with 512MB RAM compared with preferSpeedOverMemory=0. But both solutions - were more than 10x faster than naievly crunching all possible pairs through - cohere. - - Returns - ------- + where: - (Cxy, Phase, freqs), where: - - Cxy: dictionary of (i,j) tuples -> coherence vector for that - pair. Ie, Cxy[(i,j) = cohere(X[:,i], X[:,j]). Number of - dictionary keys is len(ij) + - *Cxy*: dictionary of (*i*, *j*) tuples -> coherence vector for + that pair. I.e., ``Cxy[(i,j) = cohere(X[:,i], X[:,j])``. + Number of dictionary keys is ``len(ij)``. - Phase: dictionary of phases of the cross spectral density at - each frequency for each pair. keys are (i,j). + - *Phase*: dictionary of phases of the cross spectral density at + each frequency for each pair. Keys are (*i*, *j*). - freqs: vector of frequencies, equal in length to either the - coherence or phase vectors for any i,j key. + - *freqs*: vector of frequencies, equal in length to either the + coherence or phase vectors for any (*i*, *j*) key. - Eg, to make a coherence Bode plot: + Eg., to make a coherence Bode plot:: subplot(211) plot( freqs, Cxy[(12,19)]) subplot(212) plot( freqs, Phase[(12,19)]) - For a large number of pairs, cohere_pairs can be much more - efficient than just calling cohere for each pair, because it - caches most of the intensive computations. If N is the number of - pairs, this function is O(N) for most of the heavy lifting, - whereas calling cohere for each pair is O(N^2). However, because - of the caching, it is also more memory intensive, making 2 - additional complex arrays with approximately the same number of - elements as X. - - See test/cohere_pairs_test.py in the src tree for an example - script that shows that this cohere_pairs and cohere give the same - results for a given pair. - - See also - -------- - :func: psd - """ + For a large number of pairs, :func:`cohere_pairs` can be much more + efficient than just calling :func:`cohere` for each pair, because + it caches most of the intensive computations. If :math:`N` is the + number of pairs, this function is :math:`O(N)` for most of the + heavy lifting, whereas calling cohere for each pair is + :math:`O(N^2)`. However, because of the caching, it is also more + memory intensive, making 2 additional complex arrays with + approximately the same number of elements as *X*. + + See :file:`test/cohere_pairs_test.py` in the src tree for an + example script that shows that this :func:`cohere_pairs` and + :func:`cohere` give the same results for a given pair. + + .. sealso:: + + :func:`psd` + For information about the methods used to compute + :math:`P_{xy}`, :math:`P_{xx}` and :math:`P_{yy}`. + """ numRows, numCols = X.shape # zero pad if X is too short From 8045cdf51622a91d9b0d277ccfbff886b49de778 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Thu, 27 Aug 2009 20:30:51 +0000 Subject: [PATCH 0103/1000] correct baseline image with radial gridlines bug fixed svn path=/trunk/matplotlib/; revision=7578 --- .../baseline/TestPolar/polar_wrap_180.png | Bin 39560 -> 57986 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/test/test_plots/baseline/TestPolar/polar_wrap_180.png b/test/test_plots/baseline/TestPolar/polar_wrap_180.png index 9e7143b8f4590f3949310a7b650342612a33da98..25ad89cd9c69216c730c3a0c1db15f1d46c1f7b0 100644 GIT binary patch literal 57986 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 I#&iAu0<|*4zW@LL literal 39560 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�q~ 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

    u>(oUyr;Ug{E9Ew!b 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 Date: Thu, 27 Aug 2009 20:32:28 +0000 Subject: [PATCH 0104/1000] correct baseline image with radial gridlines bug fixed svn path=/trunk/matplotlib/; revision=7579 --- .../baseline/TestPolar/polar_wrap_360.png | Bin 39977 -> 58384 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/test/test_plots/baseline/TestPolar/polar_wrap_360.png b/test/test_plots/baseline/TestPolar/polar_wrap_360.png index 5e349878b8fb6f0fd7ee59d2eaeb10a3a3e8b8f7..8a478d51eb2773f2cd2adb20edb8edaed134bcba 100644 GIT binary patch literal 58384 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 literal 39977 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 Date: Thu, 27 Aug 2009 20:35:07 +0000 Subject: [PATCH 0105/1000] correct baseline image (very small tick/spine placement differences) svn path=/trunk/matplotlib/; revision=7580 --- .../baseline/TestPlot/shaped_data.png | Bin 32662 -> 32888 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/test/test_plots/baseline/TestPlot/shaped_data.png b/test/test_plots/baseline/TestPlot/shaped_data.png index 471d446fb0ed867a6e999e06d2dad1b022cae31c..05c6db25b95721127577e30c4e21f85d283a7382 100644 GIT binary patch literal 32888 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 From b232cf0d1eb54a405a7430eccd265c498ea2379f Mon Sep 17 00:00:00 2001 From: Jeff Whitaker Date: Fri, 28 Aug 2009 12:20:11 +0000 Subject: [PATCH 0106/1000] fix typo in comment svn path=/trunk/matplotlib/; revision=7581 --- examples/pylab_examples/shading_example.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/pylab_examples/shading_example.py b/examples/pylab_examples/shading_example.py index 4f68a2ef1273..a70791f78d7a 100644 --- a/examples/pylab_examples/shading_example.py +++ b/examples/pylab_examples/shading_example.py @@ -4,14 +4,14 @@ # example showing how to make shaded relief plots # like mathematica -# (http://reference.wolfram.com/mathematica/ref/ReliefPlot.html ) +# (http://reference.wolfram.com/mathematica/ref/ReliefPlot.html) # or Generic Mapping Tools # (http://gmt.soest.hawaii.edu/gmt/doc/gmt/html/GMT_Docs/node145.html) # test data X,Y=np.mgrid[-5:5:0.05,-5:5:0.05] Z=np.sqrt(X**2+Y**2)+np.sin(X**2+Y**2) -# creat light source object. +# create light source object. ls = LightSource(azdeg=0,altdeg=65) # shade data, creating an rgb array. rgb = ls.shade(Z,plt.cm.copper) From 57c7721fde345fcf1d8ca9f470f19a63288aaf02 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 30 Aug 2009 00:03:25 +0000 Subject: [PATCH 0107/1000] remove 'import *' usage svn path=/trunk/matplotlib/; revision=7586 --- test/test_matplotlib/TestAxes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_matplotlib/TestAxes.py b/test/test_matplotlib/TestAxes.py index 48c4dd065ae5..93dbc541073f 100644 --- a/test/test_matplotlib/TestAxes.py +++ b/test/test_matplotlib/TestAxes.py @@ -2,7 +2,7 @@ """The Axes unit-test class implementation.""" #======================================================================= -from mplTest import * +from mplTest import MplTestCase #======================================================================= # Add import modules below. From 6292646fac4b708a241e20933222ce3039b276d7 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 30 Aug 2009 00:08:34 +0000 Subject: [PATCH 0108/1000] testing: add missing import and add SF bug ID svn path=/trunk/matplotlib/; revision=7587 --- test/test_matplotlib/TestAxes.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/test/test_matplotlib/TestAxes.py b/test/test_matplotlib/TestAxes.py index 93dbc541073f..75892c2af609 100644 --- a/test/test_matplotlib/TestAxes.py +++ b/test/test_matplotlib/TestAxes.py @@ -2,7 +2,7 @@ """The Axes unit-test class implementation.""" #======================================================================= -from mplTest import MplTestCase +from mplTest import MplTestCase, units #======================================================================= # Add import modules below. @@ -88,6 +88,8 @@ def test_formatter_ticker( self ): fig.savefig( fname ) self.checkImage( fname ) + # See SF bug 2846058 + # https://sourceforge.net/tracker/?func=detail&aid=2846058&group_id=80706&atid=560720 fname = self.outFile( "formatter_ticker_005.png" ) ax.set_xlabel( "x-label 005" ) ax.autoscale_view() From 284e8dcdbf7624f6e9d977ca996cfe19c9033324 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Sun, 30 Aug 2009 03:44:06 +0000 Subject: [PATCH 0109/1000] sync before merge svn path=/trunk/matplotlib/; revision=7590 --- make.osx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/make.osx b/make.osx index 239965ef65bb..0e1da02bbd84 100644 --- a/make.osx +++ b/make.osx @@ -5,7 +5,7 @@ PYVERSION=2.6 PYTHON=python${PYVERSION} ZLIBVERSION=1.2.3 PNGVERSION=1.2.33 -FREETYPEVERSION=2.3.7 +FREETYPEVERSION=2.3.5 MACOSX_DEPLOYMENT_TARGET=10.4 ## You shouldn't need to configure past this point From 2584587e0d9ac0567d5b4bc1beac9fbf255b3135 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Sun, 30 Aug 2009 03:45:21 +0000 Subject: [PATCH 0110/1000] Merged revisions 7589 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7589 | jdh2358 | 2009-08-29 22:40:08 -0500 (Sat, 29 Aug 2009) | 1 line added minor kwarg to get_?ticklines and applied ginpu patch ........ svn path=/trunk/matplotlib/; revision=7591 --- doc/users/license.rst | 2 +- lib/matplotlib/blocking_input.py | 98 +++++++++++++++++++++++--------- lib/matplotlib/figure.py | 9 ++- 3 files changed, 79 insertions(+), 30 deletions(-) diff --git a/doc/users/license.rst b/doc/users/license.rst index 29a2587d4439..c57ad98bf624 100644 --- a/doc/users/license.rst +++ b/doc/users/license.rst @@ -28,7 +28,7 @@ to reproduce, analyze, test, perform and/or display publicly, prepare derivative works, distribute, and otherwise use matplotlib |version| alone or in any derivative version, provided, however, that JDH's License Agreement and JDH's notice of copyright, i.e., "Copyright (c) -2002-2008 John D. Hunter; All Rights Reserved" are retained in +2002-2009 John D. Hunter; All Rights Reserved" are retained in matplotlib |version| alone or in any derivative version prepared by Licensee. diff --git a/lib/matplotlib/blocking_input.py b/lib/matplotlib/blocking_input.py index 81009674b73e..1d49772fce8d 100644 --- a/lib/matplotlib/blocking_input.py +++ b/lib/matplotlib/blocking_input.py @@ -114,14 +114,24 @@ class BlockingMouseInput(BlockingInput): Class that creates a callable object to retrieve mouse clicks in a blocking way. - This class will also retrieve keyboard clicks and treat them like + This class will also retrieve keyboard clicks and treat them like appropriate mouse clicks (delete and backspace are like mouse button 3, enter is like mouse button 2 and all others are like mouse button 1). """ - def __init__(self, fig): + + button_add = 1 + button_pop = 3 + button_stop = 2 + + def __init__(self, fig, mouse_add=1, mouse_pop=3, mouse_stop=2): BlockingInput.__init__(self, fig=fig, eventslist=('button_press_event', 'key_press_event') ) + self.button_add = mouse_add + self.button_pop = mouse_pop + self.button_stop= mouse_stop + + def post_event(self): """ @@ -133,19 +143,19 @@ def post_event(self): self.key_event() else: self.mouse_event() - + def mouse_event(self): '''Process a mouse click event''' event = self.events[-1] button = event.button - if button == 3: - self.button3(event) - elif button == 2: - self.button2(event) + if button == self.button_pop: + self.mouse_event_pop(event,-1) + elif button == self.button_stop: + self.mouse_event_stop(event) else: - self.button1(event) + self.mouse_event_add(event) def key_event(self): ''' @@ -154,16 +164,16 @@ def key_event(self): ''' event = self.events[-1] - key = event.key + key = event.key.lower() - if key == 'backspace' or key == 'delete': - self.button3(event) - elif key == 'enter': - self.button2(event) + if key in ['backspace', 'delete']: + self.mouse_event_pop(event) + elif key in ['escape', 'enter']: # on windows XP and wxAgg, the enter key doesn't seem to register + self.mouse_event_stop(event) else: - self.button1(event) + self.mouse_event_add(event) - def button1( self, event ): + def mouse_event_add( self, event ): """ Will be called for any event involving a button other than button 2 or 3. This will add a click if it is inside axes. @@ -171,34 +181,34 @@ def button1( self, event ): if event.inaxes: self.add_click(event) else: # If not a valid click, remove from event list - BlockingInput.pop(self) + BlockingInput.pop(self,-1) - def button2( self, event ): + def mouse_event_stop( self, event ): """ Will be called for any event involving button 2. Button 2 ends blocking input. """ # Remove last event just for cleanliness - BlockingInput.pop(self) + BlockingInput.pop(self,-1) # This will exit even if not in infinite mode. This is # consistent with matlab and sometimes quite useful, but will # require the user to test how many points were actually # returned before using data. - self.fig.canvas.stop_event_loop() + self.fig.canvas.stop_event_loop(event) - def button3( self, event ): + def mouse_event_pop( self, event ): """ Will be called for any event involving button 3. Button 3 removes the last click. """ # Remove this last event - BlockingInput.pop(self) + BlockingInput.pop(self,-1) # Now remove any existing clicks if possible if len(self.events)>0: - self.pop() + self.pop(event,-1) def add_click(self,event): """ @@ -211,11 +221,23 @@ def add_click(self,event): # If desired plot up click if self.show_clicks: + + # make sure we don't mess with the axes zoom + xlim = event.inaxes.get_xlim() + ylim = event.inaxes.get_ylim() + + # plot the clicks self.marks.extend( event.inaxes.plot([event.xdata,], [event.ydata,], 'r+') ) + + # before we draw, make sure to reset the limits + event.inaxes.set_xlim(xlim) + event.inaxes.set_ylim(ylim) self.fig.canvas.draw() - def pop_click(self,index=-1): + + + def pop_click(self,event,index=-1): """ This removes a click from the list of clicks. Defaults to removing the last click. @@ -223,25 +245,49 @@ def pop_click(self,index=-1): self.clicks.pop(index) if self.show_clicks: + + # make sure we don't mess with the axes zoom + xlim = event.inaxes.get_xlim() + ylim = event.inaxes.get_ylim() + mark = self.marks.pop(index) mark.remove() + + # before we draw, make sure to reset the limits + event.inaxes.set_xlim(xlim) + event.inaxes.set_ylim(ylim) self.fig.canvas.draw() + # NOTE: I do NOT understand why the above 3 lines does not work + # for the keyboard backspace event on windows XP wxAgg. + # maybe event.inaxes here is a COPY of the actual axes? - def pop(self,index=-1): + + def pop(self,event,index=-1): """ This removes a click and the associated event from the object. Defaults to removing the last click, but any index can be supplied. """ - self.pop_click(index) + self.pop_click(event,index) BlockingInput.pop(self,index) - def cleanup(self): + def cleanup(self,event=None): # clean the figure if self.show_clicks: + if event: + # make sure we don't mess with the axes zoom + xlim = event.inaxes.get_xlim() + ylim = event.inaxes.get_ylim() + for mark in self.marks: mark.remove() self.marks = [] + + if event: + # before we draw, make sure to reset the limits + event.inaxes.set_xlim(xlim) + event.inaxes.set_ylim(ylim) + self.fig.canvas.draw() # Call base class to remove callbacks diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index f37ae0f20e63..3d3de14993bd 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -1095,11 +1095,12 @@ def subplots_adjust(self, *args, **kwargs): ax.update_params() ax.set_position(ax.figbox) - def ginput(self, n=1, timeout=30, show_clicks=True): + def ginput(self, n=1, timeout=30, show_clicks=True, mouse_add=1, mouse_pop=3, mouse_stop=2): """ call signature:: - ginput(self, n=1, timeout=30, show_clicks=True) + ginput(self, n=1, timeout=30, show_clicks=True, + mouse_add=1, mouse_pop=3, mouse_stop=2) Blocking call to interact with the figure. @@ -1120,7 +1121,9 @@ def ginput(self, n=1, timeout=30, show_clicks=True): manager) selects a point. """ - blocking_mouse_input = BlockingMouseInput(self) + blocking_mouse_input = BlockingMouseInput(self, mouse_add =mouse_add, + mouse_pop =mouse_pop, + mouse_stop=mouse_stop) return blocking_mouse_input(n=n, timeout=timeout, show_clicks=show_clicks) From c49d23fb43ae4edc5f49db2757543b08bd220dd0 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 30 Aug 2009 04:43:54 +0000 Subject: [PATCH 0111/1000] testing: use standard nose mechanism for printing test name svn path=/trunk/matplotlib/; revision=7592 --- test/_buildbot_test.py | 2 +- test/mplTest/MplNosePlugin.py | 4 ---- 2 files changed, 1 insertion(+), 5 deletions(-) diff --git a/test/_buildbot_test.py b/test/_buildbot_test.py index 5639d520e6e6..294b3d015c7f 100644 --- a/test/_buildbot_test.py +++ b/test/_buildbot_test.py @@ -13,5 +13,5 @@ TARGET_py = os.path.join(TARGET,'bin','python') check_call('%s -c "import shutil,matplotlib; x=matplotlib.get_configdir(); shutil.rmtree(x)"'%TARGET_py) -check_call('%s run-mpl-test.py --all --keep-failed'%TARGET_py, +check_call('%s run-mpl-test.py --verbose --all --keep-failed'%TARGET_py, cwd='test') diff --git a/test/mplTest/MplNosePlugin.py b/test/mplTest/MplNosePlugin.py index e9df203780b5..06ed996f4875 100644 --- a/test/mplTest/MplNosePlugin.py +++ b/test/mplTest/MplNosePlugin.py @@ -702,10 +702,6 @@ def startTest( self, test ): rmdir( self.outputDir ) mkdir( self.outputDir, recursive = True ) - # sys.stdout.write( "%s\n %s \n" % (test.id(), test.shortDescription()) ) - print "%s" % (test.id()) - print " %s" % (test.shortDescription()) - #-------------------------------------------------------------------- def stopContext( self, context ): """Called after the tests in a context have run and the context has been From 894b969fd0643a7d3a337c83ae22f0672b460960 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 30 Aug 2009 04:44:03 +0000 Subject: [PATCH 0112/1000] fix typo svn path=/trunk/matplotlib/; revision=7593 --- lib/matplotlib/cbook.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index 54a406fb23ff..165ae6b8388e 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -910,7 +910,7 @@ def visit(arg, dirname, files): def get_recursive_filelist(args): """ - Recurs all the files and dirs in *args* ignoring symbolic links + Recurse all the files and dirs in *args* ignoring symbolic links and return the files as a list of strings """ files = [] From c9dfccd958ee6479e0a0b13d229aa746ab2f352c Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 30 Aug 2009 04:44:11 +0000 Subject: [PATCH 0113/1000] buildbot: wipe build directory to ensure clean rebuilds svn path=/trunk/matplotlib/; revision=7594 --- test/_buildbot_install.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/test/_buildbot_install.py b/test/_buildbot_install.py index 7a235466b601..8403e386935a 100644 --- a/test/_buildbot_install.py +++ b/test/_buildbot_install.py @@ -10,6 +10,11 @@ if os.path.exists(TARGET): shutil.rmtree(TARGET) +if 1: + build_path = 'build' + if os.path.exists(build_path): + shutil.rmtree(build_path) + check_call('virtualenv %s'%(TARGET,)) TARGET_py = os.path.join(TARGET,'bin','python') check_call('%s setup.py install'%TARGET_py) From 43791657afa36736d09b040b0eb51a9045c263d4 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 30 Aug 2009 04:44:28 +0000 Subject: [PATCH 0114/1000] testing: add support for KnownFailures svn path=/trunk/matplotlib/; revision=7595 --- CHANGELOG | 4 +++ lib/matplotlib/testing/__init__.py | 0 lib/matplotlib/testing/decorators.py | 24 ++++++++++++++++ lib/matplotlib/testing/noseclasses.py | 41 +++++++++++++++++++++++++++ setup.py | 1 + test/mplTest/MplNosePlugin.py | 10 +++++-- test/run-mpl-test.py | 3 +- test/test_matplotlib/TestAxes.py | 2 ++ 8 files changed, 82 insertions(+), 3 deletions(-) create mode 100644 lib/matplotlib/testing/__init__.py create mode 100644 lib/matplotlib/testing/decorators.py create mode 100644 lib/matplotlib/testing/noseclasses.py diff --git a/CHANGELOG b/CHANGELOG index 688b25dd4a85..e14d3ce126b0 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +2009-08-29 Added matplotlib.testing package, which contains a Nose + plugin and a decorator that lets tests be marked as + KnownFailures - ADS + 2009-08-20 Added scaled dict to AutoDateFormatter for customized scales - JDH diff --git a/lib/matplotlib/testing/__init__.py b/lib/matplotlib/testing/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py new file mode 100644 index 000000000000..e3353106ad1d --- /dev/null +++ b/lib/matplotlib/testing/decorators.py @@ -0,0 +1,24 @@ +from matplotlib.testing.noseclasses import KnownFailureTest +import sys + +def knownfailureif(fail_condition, msg=None): + # based on numpy.testing.dec.knownfailureif + if msg is None: + msg = 'Test known to fail' + def known_fail_decorator(f): + # Local import to avoid a hard nose dependency and only incur the + # import time overhead at actual test-time. + import nose + def failer(*args, **kwargs): + try: + # Always run the test (to generate images). + result = f(*args, **kwargs) + except: + if fail_condition: + raise KnownFailureTest(msg) + else: + raise + # Fixme: Should raise KnownFailureDidNotFail if fail_condition==True? + return result + return nose.tools.make_decorator(f)(failer) + return known_fail_decorator diff --git a/lib/matplotlib/testing/noseclasses.py b/lib/matplotlib/testing/noseclasses.py new file mode 100644 index 000000000000..284678be0c36 --- /dev/null +++ b/lib/matplotlib/testing/noseclasses.py @@ -0,0 +1,41 @@ +import os +from nose.plugins.errorclass import ErrorClass, ErrorClassPlugin + +class KnownFailureTest(Exception): + '''Raise this exception to mark a test as a known failing test.''' + pass + +class KnownFailure(ErrorClassPlugin): + '''Plugin that installs a KNOWNFAIL error class for the + KnownFailureClass exception. When KnownFailureTest is raised, + the exception will be logged in the knownfail attribute of the + result, 'K' or 'KNOWNFAIL' (verbose) will be output, and the + exception will not be counted as an error or failure. + + This is based on numpy.testing.noseclasses.KnownFailure. + ''' + enabled = True + knownfail = ErrorClass(KnownFailureTest, + label='KNOWNFAIL', + isfailure=False) + + def options(self, parser, env=os.environ): + env_opt = 'NOSE_WITHOUT_KNOWNFAIL' + parser.add_option('--no-knownfail', action='store_true', + dest='noKnownFail', default=env.get(env_opt, False), + help='Disable special handling of KnownFailureTest ' + 'exceptions') + + def configure(self, options, conf): + if not self.can_configure: + return + self.conf = conf + disable = getattr(options, 'noKnownFail', False) + if disable: + self.enabled = False + + def addError( self, test, err ): + # Fixme (Really weird): if I don't leave empty method here, + # nose gets confused and KnownFails become testing errors when + # using the MplNosePlugin and MplTestCase. + pass diff --git a/setup.py b/setup.py index 18ac8f40ecbd..c241dceaf4bb 100644 --- a/setup.py +++ b/setup.py @@ -50,6 +50,7 @@ 'matplotlib', 'matplotlib.backends', 'matplotlib.projections', + 'matplotlib.testing', # 'matplotlib.toolkits', 'mpl_toolkits', 'mpl_toolkits.mplot3d', diff --git a/test/mplTest/MplNosePlugin.py b/test/mplTest/MplNosePlugin.py index 06ed996f4875..b23422802b32 100644 --- a/test/mplTest/MplNosePlugin.py +++ b/test/mplTest/MplNosePlugin.py @@ -12,6 +12,7 @@ from path_utils import * import directories as dirs from MplTestCase import MplTestCase +from matplotlib.testing.noseclasses import KnownFailureTest #======================================================================= @@ -48,7 +49,8 @@ class MplNosePlugin( Plugin ): TEST_ERRORED = -1 TEST_FAILED = 0 - TEST_PASSED = 1 + TEST_KNOWN_FAILED = 1 + TEST_PASSED = 2 #-------------------------------------------------------------------- # Some 'property' functions @@ -148,7 +150,11 @@ def addError( self, test, err ): err : 3-tuple sys.exc_info() tuple """ - self.testResults.append( (test, self.TEST_ERRORED, err) ) + (type, value, traceback) = err + if isinstance(value,KnownFailureTest): + self.testResults.append( (test, self.TEST_KNOWN_FAILED, err) ) + else: + self.testResults.append( (test, self.TEST_ERRORED, err) ) #-------------------------------------------------------------------- def addFailure( self, test, err ): diff --git a/test/run-mpl-test.py b/test/run-mpl-test.py index f72b8aa46906..f443c8389512 100755 --- a/test/run-mpl-test.py +++ b/test/run-mpl-test.py @@ -44,6 +44,7 @@ import nose from mplTest import MplNosePlugin, path_utils +from matplotlib.testing.noseclasses import KnownFailure if '--clean' in args: # perform the cleaning process and exit @@ -90,7 +91,7 @@ ### Run nose success = nose.run( argv = args, - plugins = [ MplNosePlugin() ] ) + plugins = [ MplNosePlugin(), KnownFailure() ] ) ### do other stuff here diff --git a/test/test_matplotlib/TestAxes.py b/test/test_matplotlib/TestAxes.py index 75892c2af609..06a7e0794b60 100644 --- a/test/test_matplotlib/TestAxes.py +++ b/test/test_matplotlib/TestAxes.py @@ -3,6 +3,7 @@ #======================================================================= from mplTest import MplTestCase, units +from matplotlib.testing.decorators import knownfailureif #======================================================================= # Add import modules below. @@ -57,6 +58,7 @@ def test_empty_datetime( self ): self.checkImage( fname ) #-------------------------------------------------------------------- + @knownfailureif(True, "Fails due to SF bug 2846058") def test_formatter_ticker( self ): """Test Some formatter and ticker issues.""" From 19f883a95556f4c0105eab8be38583f82ff35508 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Sun, 30 Aug 2009 06:29:58 +0000 Subject: [PATCH 0115/1000] New version of empty_datetime.png; it is not clear what caused the change, but the new version is nicer, so let's hope it is produced consistently now. The difference is that there is no x ticklabel on the far left. svn path=/trunk/matplotlib/; revision=7596 --- .../baseline/TestAxes/empty_datetime.png | Bin 17149 -> 17208 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/test/test_matplotlib/baseline/TestAxes/empty_datetime.png b/test/test_matplotlib/baseline/TestAxes/empty_datetime.png index cac8656db2cb09645d2ee928f6c59cd1ec42af3b..0fc59db402b34f3aaed53fb8715541c596d68808 100644 GIT binary patch literal 17208 zcmeHvc{tT=yLR-*Q<6j^V@f6Bq0GxvW`)u!vl0oRj4dphk;+VF8N$Mnc^-PoxH2Rx zvod6!XUp(icklbWdw=gf_CEIa$NuNrZ^!YZWv%ra?)$pV>paiv`aQlnTB`K>j_%vF zYZtw`n$p!>yLR*J+C{DR`yTjBq|1~0@Z&ef3+mT?hd&;_oBP1)z4z7h9e3?wxP|_s zN|jHs+O>;km%5VTwTIDDeK@0Q%iFc{%~XnEIv2l2J!5}<)$CpIaIATxv4Ge}EAf4r z#O1S@rY@JgI%X$q&t>UbzfXHcCo~f2J`y?JEMOMpu5R(fH#PN-xB>3%J5Em&1=gFs z%rARj9`?>eNX_9X&u70-qNUD-5eRTCyB<+d^>h9DM>;LdZ|D~y%m>ly8XX1n7tz0PFgLx&IZQBhHeIt+kRu*NlyG*f(D)dq=Q*V8I%q=ZR?z82t zT@nbV5dT!YIzCOEgNXYBFRqJAF>FQm3hM|`qbXgb| z)PI~a2Ea%7$9_5!Q$n*(UExtbn@-0aG+a99{tmwGVx%qQAwm9Vtr#K>4Y8tZ=I z{P}BcD^vX6QnbVIloj<$mtOh!ERB7=*zZZP9q-Ohf5jzhkdTmI{^zs33w^Ew^#p8s zSr{!ku=qZ;y&KDur)U|tm;)E%p2)e*7)8jq67|CPD66yK*6jq}Pd^TNfBLbaf9&JO zk2!A3)+k(;W(Q2QVx;+eeSLH8b%|PiO?X~72*=xHqDsa8aeIp*jEjSqXlP5*^}Cm4 zRGf1uN<5QUWyG{QPknynAo0jQEyv$idJ`A6-S5AylGas$FFk*^MWN<3rPqbk8n(Vu zQKiO>?T`59_j(F0Pmr@_r+=*R30*)p@h^<}-?a!yzu|B=(fi*OeBZnYYiZGecn|5y zwKVOh&z+gam&7e)Goq{g*yI0rBziSJ{N&8oo1}=HZ&^&ew!{^@|=+`wLqADcf7K zUf}>GbpgjN4#V9BLZyiivkChWCvO_-K2v;^Qv!XTgihPl)#dPsUV^!ci;Zo(q%T1lMImrLL~bu*=dsBb;it!9y#hl`7>iE~kk$^@W9n6SA^> zwv;@pZzrUs4US6KO+6TZ^N>0+4gKy7*le0hL$Vo`TQ{JVnFKj`+Ez zM#I1$GD9!>!c|?}>Ks8v#__J)luL1P#w*i3r$j_VczGAToNHFA^xR5v9Bpb%zafm` zOw6XEZtQDfG8~HN+KQ?pQJgv85ZbdB^z0`;c{7AZM|1f4`-ki2-cc{K>oZz~u!Xx; z!W#E%ER7#$WMmZe+i#!`jkZyM zH#`Csj|RYb)wed5%Vjw#Ka26eZ+E?V_Xz#?;{`SPcGZ!6zoVD8PxGK3|9bQP^F>hG z3u$2fz3TBHPR_IM-n|QY`}TCMWpl;Umi)%pajSMhXo#?>$%P9SPRPlboYacedwCoQ zAP++}dxolT=b2vpip>R0wsUu0eXg!nx3(rEB_;WM`VkNk5^`u2C|+LK+Mr)+p}i@a z_`SE!oOVfEwE$QPijEef zqN9RELiIT9lGoONkJjxp6)8i7<`=G$f%bNsnW!F>cIxD2F zub*QG3=70`N~>;Z{M$$cWrm3{ z5ZIuaiAgN_s>&M<{_N~*6D~gZ_)RXF&re?-7GQA?JAUd^t+Ts2g-gmosXO0hw4fZA zpy-`1N4m0atNPNIw!=)#sq?FpmiQ7ghsj6xY z)x4ISp;YZ=@F6t7HuM$<8<$+8rlwB1_31^j=pD2U?yEKwjZbnii#3| z+YSl~J1KBIBcQGA8d?7p;CcfrlEpv;{ty$>ab8}3`R$@I%1mi%sjGc`Q&Si$1SwL? zX1GyeAjETPqj(0=^$V=p^hI1JY7*?Mi+TXZ=;9q@OQDELi_MN^hfK89>h7) z13o@ta4^}OW7{L1W?ETM=sgr(wC7(6`+q%4=U0S0*v}!UlaQFm2Z{|s)?#IeLtE(4h z%x2%NJ%HO+h%fN^h_Tn@ml=gJ18Gdrm#5SpD*_pDZabIC!X}ToM>)(2q~vq{{7O zVSe5BuQoR(vv?i0pDg|P=LIRx%_5`+0O&E>Q|iI7;SM9c%@x4lc-7UzSDOscnHH~S zX#xLg?JXGj`SYRG`4vT~`FN9ZHv~BcygyA#2mCvoKiyNPy|B1wQT2#Q^k&r~-a=FN z>3k$fa6_*p;2eK(%m{R`UMg3we%)Qg#x@C`XE8Y%C<`TKtSv1Vxi_ufz9oZoK%54@ zC3tM?u2pZ*gKP@l$&(GhUwaGE2qEO3-kMNsTl;we#s9P0)e=)-!cVq?K&j)kn=Jw{g=)KNA*yKElfS;>*c$9sK z6eCT)f?^Ho|3Q88`UgQjZ6vp=u+3NHjx}4}8>lcodj2lYPz}E67gdz2!_n6j*!Cm= z()M$`F&%VNfW!aGNc>;D2myzNM@H(a9`EJ@33cJ(MLrRcD|eb>@%3B4d5*6RcvTvC zZ7m<-;1IlW}VMwhc9_`MC3x4u&EF|yEsrsW_3+X zfd`cm{SPm49Poa1R7|5IL;pC_$x8vU?kjcEg#$vs@x;%&p`)z+Leh3Pv_(4si;}s% zz8>^90V^Q&a4vp7o2XJya4;WF{MvTG-LJg9FJC(JxYTmGs^wd^|Kbhx!KcDE)(~i! zBB943sK)~$t2N)|M&UGoTX;r>AQ*FgwRkT>IVGhtSi%Wx`t?w5&$S;f{eJ-?>;DCe zCr+I3@!6c2ltMa?_5epf6rkJ7*NkxdISKe=PHrxrsAx`|%V@#W)D&skgocI&;i507 ze#NJIjI%|M4%>cVqo5H1JP}bKuzC4pWsRY%l*^t#_iO{609c;cow*#qZHPU>%Gl%^ zStdb|k!QF)<{tNg(Hp*;d+M^ANkgckJf-#h<(DV;l8rjH;md#FVDG@zc?pSH&BSbm zeLl26R)c|pgVwYoKQ=cv2a~g}#96b~6g%R3DmK9C+xvRTY^5-R>{5%x&Ogvk9CbmA z82^L97UTKP6}IVUgg-i5l6vrPb}g5{^bd5uo{!J*a6wrx0je(m#5T0I*U0zv>rl8R z{cN-6P#9lY=)Hte(sN;C2CroIq8hvVL6URRFRoKfR#m#9uGy zwlR?Hn&CpB0Alqrvt`GjV-tilH{@dyxI?1mbq4_jxK?9CEnb@6xzhml-3d55IH%y2 z84nH)nvb=-+oSt%AX02a|Nc~n@-s}u7cG6Ix*^g(Ud)X``%3S_&BsbgN@`@HabE#= zhsHTMIp(CWvwSm#DO#LBgR*T5Z{Cc@Y|edJsAe^-18t{gJ@m_6U<2}lx=FxNe*3Lx zhlvkis@k19cYG-w={K_KR!Ci}5MCe7!M%XB`EPxtf?B+zgTwY*1-$zxCKNdKeML{t z3Ll@TJ_@(6|8PTnV`Cr)*nX~>!?#idd57mMTpD;UaGBou>qU<1tQI4q6n-NwTy?OP zx!Srl$yeOEEwye1E-1}HUmCYy?oTms?Q@Qdjy5uekNQ2 zZ2xb6aqmP*IsWAKO2CB@Z>uGF?R!rD??r>Z?zH+t>ePns;{UK?x3C z?RVD(dlN;UlG1-@Kt;>CUq=M7xVRV@Gf-KB_A;HU3*yr>hf3U4^&o0OFL^I`2>YGgaHm=)GoQ3y7Lvm%>&2t zD4o`ZYL{vC=%er2y4Y-8|K(K-tNf4qk{l)+^`WD)j*EtW+tb^t`Bg#?lb=m+Q!8(W zG#~C|@eBv6styd_qzljYIe@YvA@dxR1S{hXru$9`CM_*Z)P3ci@2giK?Dl0>K=hxu zb?a6?R|ofDeo3{L6#+`azv#er9e!1q-*$PcA?prCC8=nlmXZ^b~SKb<1RQWzCN0~ZT zzP&N&+!QTkpraE{Ah3(yYcaGdRz80GxR`(diFAAuKNVv6@d=GVxtp_bj=8S@NtGL) z1g=kqp?x{l(a{l$ZU1rqq2t@|MlHug4K7p56ifz91xZW)+H`2Gmj32mn%}}lpey+e z`BGi6v9ZL^GuT#O2Lp788$(keDekK?24Ly&_JHP0CmT7wUYTgu#BPnMd&m4#X?Kjp zE&dFwrS0TzZqH#^8|v-k_al@qbWV%Zn$8^(3{l(Jq0RscQUmsW1dhte7zqBkZ{0e> zohgW9kEO4w$g*K%V7C(EreUz5q>EkC>R3HInqF&Z+z;W3;N4#q#`Kocb}E* zDt1iK3mf^y`mM{tE?Ouw1(KPFfs1sQ9!jqpioy|V@~cdLs(d!lSDFf~wey$S20uI; zn41c6gmm9u3XG9))lgJ?41Lou3)Fz+fc~}1ROc~XUPVPkFz8QUFh(<#JD#Xhj@az4 zmP+~CL28+i^_kMyU#;2sT5b|(SmU1EyLTspapo}hT~W$uEWpR8&S5&A-0+k^?ljrh zHDkRa2L{fUF0>JidqQhjN4+r>p|wpmk1LyB1FUxn`1f%+-uw93 zie;_f$rEb)&j`!&l9GCpUtm8#Ja+6DdT~R} zG7L6mynMAk-Fc$z>ud$3Nq|iV(&P#s1MbVMvvbqM*_td^_mON}meO~R6h^;9Bm(Dd zEp{B80AnEmdT4Daah?WeNv&WDj)Uib#X8S@|L6vNv@viEjl7C1n`0pw*B3`^baVoU zrj`9RQqd5-3&ZsWFxapK^9RciA!K0bllaxXlrW2NsA72^KIr&!%M(Ec7$j>P-kM0y zGNQyvIjUf>r?jF|VNFUbo4M?(?`MDOO*N5jM%O~%8`b}ClM1Kd8?#_!Yx7vX5tcT! z``6M=J)?Fw4B^!Vi#y$!o!F6OY6_C(2H6%?@f%pxHV~=K(B>l$O6&*ZGEK@$PV(_t zsi?e|bWbG^4GXp44nfzvWmwpO?0~D&j+4uL%`VXa*=(pCBRx`L+Z-#~ooOhM3F(i% zfW<=5Ob-kU+^9S5Kc+3el|*0_I)C}{Wh^Pj3EukobW>iY@wKDi@G<|rkesp-F7<;P ze#Q%sOU73e;tK~nOI;>AE@Oo`_;snP%YPYRRY3*87qCag$L{0oMS^4$~4F)^n2}WMaINr!mhNVrXk!G z^gxSh@PnWCPIqKRL2&d74DFnSD?5X$yM4gs@odxImoX-%lb&YyOn6*e7P4?vl$DFO zi}umc8LNJY_6mT|A;v;83yU=c+{=V%0u>b%YiNEgy^)z|fp#ejg_MvTB)j;v!FNZC z3lVKhm$E3^0AKOia;D$6uN9b5X@TteaPUzsE+UFE=+s$9iQ6u9+hnyv6+XhfW8YOU%YtA_x+gm-#iJAun$Vn0p*VuBd%K#;U(e3P-$&n%7+=&gu6$ zKPW;=0Hr*y!w*j7GdGBWbgV)lL$&^zDOxc~!<&XYKr+-k*GE{_N5V~$97Y;My|z89 zfPBmgRyGdJI$q>jcql;kYe_3DvkkdqEV5-RqTeYFLk~@#B=duK>;2w6g|z zEg(-7VfT$?+*dLVfDL}}!UZE%8{SkeTgeyewBiS4=kHkTq4 z1fa>)cNb{tNhBu52b{9^`?X?8;W061Q4?T`vRaCl3J2Fc8Za zkE`5;5rXUK*DnJSi;0M2*V%Y_)3d(^1o{5)sd0}MWTId?|3O*(w$S_^~R z+9QnDpU5>uIo$MCx<> z?~iGhK&ueR%67d)SE9~aB^(yG?u38XQtj!UCnzAG8TW8-ZzeW943KFY+BX?6+94A3 z!_1{2I5;>FcDO?hzfn|P;Zz^Qca)tyU82uPH=DAx;`|*rE*ZufR0VDjGuqQ{kf8@O z3GR=k^HeoL^q^W_OtOFecZ_NDKLYh54f8>EAc$^&RFK1wa;v?Lgo*7(p+H^$H^|@u z7x%f$yPKt#>|{f!sF@CSx}0Me3(a`8u{Qw`{(K{pi7i@xbj92qs4s?X_uT z;xbSd-k($EJzSQA$P(|AI7FSlI)Jj2giAw$br!~@f!dY%p#0L->cHgqx0JqutQ)6>y? zgNd-F&~H-jVOqcjwnvPY_k!2vyej!^jF22bUr$eOs?;Oo@F2|%Ay1dA}t2f0T*;wH%^?w29|Q(^hr zpp+TTmP`sElo}p3C-3fpIf?V9Ppd(o5+T?KZa>r%U?2m$y$gl~_tIcJ9NpCC>3 z$ORsFrkK3^Kt3J<&<*BT#z*74>`wUg{d|ELzIAr(Ho%KZgIOVL?~?(4>Ooor889se zb0Vf>{w=_~2}pS{fWbKT8L7tl`YYa_-a#_PUnd&rgI71*Jy5KjWm3NMGs^yYJDuw9 zWgoS0;0@-3IN11;PPhnvx-+*~E*%i**}$4RQ5Pz|caJ;=w^d zMk#0L=;*|tV*@3VU|iz#71&PJ_Tz5;W}spamgML0O%Kd1EUW;)@?dJP1dKMU?9R~{ zKwbP)cC8ciXo(bVIS)NRs-Y5}rX`zF;eSU4`w#~IjSOzeK|0Jq&fmR%{{t#8*k*3d z`wdM^9SxxZld`M5iSnCsPYDE=;<^F*m|ocH;3otPWC{EJjGfI<`DJ0Rbw5woACvm~ zA~GZTr7oF!_UtJEdNL>o-Q;gjJjY@0(^9nKI)LKhLGHp0Ot-vyY6q*~I@6n$sPeiM z8YUnDGQ+PL-TXJo`p;MS0hl5J!u|)foJ89uvKE0*vC?gGl!IexrM?J(D0s6rz?6X) zVAHRqCBTHHgxty?h#Q#pda8I98!YeG*w zIInGe3A^60<>TT|-?2N5ATPaedUTsMcALjY?H>+w^3!c|?DO$IJyV_*GfR_20CIF4 zp@YjF0t%JY*f@k1^2pmfxrfwihX!t&jF6pfDK`f9xdu#(bGE(oIe0H(tv*$ z!>nnK?ZQ~1e*?hQa6Z`tMla&y!S3IC;6NBSz9!Zk8T?@uzJ#Ns1cCz;i*X1Va0^u4 zYsH-5<%QYpgi$)8=?LO644ttr~vFfpCWA?;MRyokjj#?u%j5f0H%yn@E6F>_VB zQA^_7oiF!EXn3x2bHPsu*zb(Jepoh!UBWH|YPTAIRx)@vqISKKU{D<<(4qKn7rV+1S{w!t^ljU^wiIhXey6gY=V+W`Ab)^u{wsOv~IT{ENPUBy|Jt zXB=83M2NA-w{KHnHawySKU+M?MStKx2S}z;Eq#d1YXBl9Kv_~QMI^w`43YxiU$n8? z6)BQ44M$(=MFMAsaW-rHuzt8>q97~x@|-sYT(}NokZ=RxX{@Vj0XA~jy%PNfaRiW< z&KB#Sc9&tIgmIAO=Ygk709$(e`0)me=OMW>=|2xL)M2Y|;yLXc46Wlg z=WE5Fz(6U?gKr&WW=;|=n|ngm(nd+u4SB=~{M8^V8Nadg71kbBTfRqX8~7PZlm(2kLs!EP7MbbLAq3$79~sA0-<%Klvk&G)^Wj#cEgF~$ zb$@{A*8+QT7kq|E=0f4-*Sb(hfpXq}aeL((u|N`R2P(?L_;poSp;KOxl{JcT0o}cf z1R-NLT!fb6?sJ0JCd-I9h6NgHs54q}~S?&Jw-LYJEl z2&~d)XN~Jh=KW>39IqWu^vnPLqWth!0qy&RQJR1 z@}i7$Tb}skC!0t2A?+3 zEGtav-j)JUsH}uWO>>}G2SdO9Ap$qF&^4Yop#)Rm!pQDKG9X`D9j8<#FTu-;W`ZH{ z8lY2_1WS1pavpX!2k;38jA|H&3(_3O7-}BX&$}Dg>pFlh(4+J8%dc|np!WU*4i0dk z1xkL^y3Fkq=PIG*y;G7Be|)A(9wpo#u44pXN$n9IrF=>^DVocILJZyf%*&DIzk>UL zySLtSd><4Vp=8GJj3P`^wjDUFkQ|7bY{1Rk1&4ckIm^r0y|mtMHfy2}Q*8kq(6$dB z{=h@#EkOebs5=um?LH|d?`pD!v{mZ~>{++3?-$2zL2O3ss=Q(p3wI)* ze`+Sc;qA+p!-R~AbSihY-Qn}uiG^O|X!+GauThwsqTjpsE3oZULJ6mAl*sKDVK5qj zlr?s_55roye|*ptvrw2HU$p+<*AGFEE1?5Kn(C4Do`LP3;Wi)Vhidz_o3PD0nUqOs z9V0F;yp~Sy?Kg`91Kgu~`W2~)|Aexg1{gwyJwqB|89I62fQ*;gxk_>nPw_UocVT|< zU5V?g30AhU2>A)neNBa6JQrK7%Qb3v2!xnQR{4rS=GEkvFttePhQYbBFi8RrQA{Jv zLQhZM4#Q+6TuQ(^MwbWj!IT}3SA4qEWf|8F{YY}rwPyKjB=6j(#R>=b+80x{OP$6O zpj%9IT?N~0t{zi~|Gu08ON(hbrP{Q!91i~!Y${#@PQM&!L!3|l_0~X|^JIq=2#bLX z8l;z?2HJLHM2OpTT!KQ3>&w3FO&}ng_W7j2&wmP?o)@|Q=%_I*kUD@B%W-@ZJU+W;8f1`eMU z$e|S;bqX3fHtmFD)I-LD8A|y2^(%ZpZn;g@PP?isFeOQl6fS%N+n$tk;`OUnZ7^&+ z@!6ND@23^WZG&txW$2F=+Vnt{ih=nFTbEU_(V!PbYRr8wq=Fv_y^#lvrlU+uiEtFx z#!nyz^Norf?6@O;HV)*2W?t@gQ!NlSN6kJSJS=R=J~^m_u?mgaHLO1KNYMdR!ibOgHUKK zZsjH{l3SlMxmYU^u~!s%^uPb!0zEff25z|wAWXS#$Nf_Tk${4JOW%iEPlfbzl+Kc_ zl5&>hch>z0CJ*_mp=RZwi^|YHC+j>BGFjIIw?u>HAW+e%xq`+3Iq;b9_>53!)kF zJDZL%;2*&y0NYvaDtmWG^fxBB;VNxZ-*9{d z>3;#NG^ei#%0!AJcOA69;$hgJ4UhsSrVYg!*j$@4^EC7`+kn9!-?C>5iqm_qtx3~- zcydHpZfgbR|9@=&IR39*_XLv~hlV}O2Gda#KiJkP2Lk|=gg9e5Ay>OMT(Sgz*_F4= zSu~ZSuG4U3?Er%C9z4^P0>K$K>2_?i^8gnn709VHJQx6)tVx4Y#${>U`MblSk;k+* zVV1Z%eDO$RL_``0o^}{Pi;HDn+q19ka2q_7fb8nY9aE3bgUR70tw4rjAQ~X@S_qJp zE0bhxY_q%qOqE@Q^oER#VlSfQ8(|YMdj^tg0zKNH3Lw!6VBF*U-V%5$!jJjSOeU2@ z8A*a*P>|6wfR%w#!vMOZg|riBbKsjxFWBu`zzyzPYVmVUD@HSYO;HlsNalhAi@ayD zrVyy2MDQ}-UC%P<8@eKC54Tu^s2|i|aYVWZ=O3^ca8#c6pPrz-xyx@T)xl zU6(SE;X{YRM+a#ij50Bpn$QVdH{u!%Tmb^vGD?2pXFTD0_RJZLtm2slK7+Pp|4WoK-(!@t9`l zx>=H5c6i2#!p|4#sRKy{$Eu(8R#RX3GF#aqRowiF2bx=fBgzxalQg^hu4mY1K8cMXqlfD0{jH6aWa z^CV1S7#Tr7`a$31+LF=1uUo6#;GGG03i*slH^apYLTF`!Rq`^9?&V0?n%hioF}Jn(j(x^r5W^v;8N9Oe;3~W~HU2 z%|N(kJB_#AwX#avz(91Rj}?Dc^$Z(@jg;SfmJ+lz(TVX``;ajDgnL~-wyCMKC1Cnsk%6hXpU+LGXupwY*%#COo(NsqjJ5qFx$OW)nyeLokb zXo<5|m~{ZIUDejscKmidpsX?;j|b73DtLSP&CGDI%d|o93-a;4dbspZ2l}j9INU?( zt7X``s;a8`HQh|r%F{6DfOZo2RI>6kwB$^;Y{f8~g)%sRD1&)N#jjZl*BVZ7^tA`C z8i=i7W1&l=tmNEC!x*>9^(9(rF+J|Egg7hq6Gmq#5mPOTjAr5(?z?M8i?y_P5^Ryh z>_DYI0JgHOuI~5`EoB(-ds9+U()vEnx=6G$7!xX_tC+GI3%D|@)?$ixOMSnD7ucJDUtr#u{lcDTw@2ZivV`2(7211_mbn1^Ed+1 zV2A#->#kkYf1>{{z#E`s=zcNKrm-dxT|+HF6k&r;&DtCoKh3jK2crRI@F2_;Q&Vp6 zQvGUbYTo{F>%w^KLi@?Tu7+36w7MMl7L4o4?t6aWQsntGCpxnA3GI;v-7p`IkuH#) z(2wQ?kK_;-KqBz)xg-?JV(;aig`iXZaH7M!yrSE_fT$LrD!a=aAuVFAF)J)JDGnq2nqecSnrr>JbD`5_4qM+i zF*%tF&e?(Xg! zK~m1j%1Qo08T0Y0YLKjCT7OdR*;9;!7C0t4GhO vDTty6*8*Ps?bnZBX5?SL{-0fwo!z~4U2l%fw_bUviqPxxoO@sQ>-Wa!{_%d@%NSZvRPEaP`_`Ik&bij+#Z?WZ{d-yVQczIr zS5a2DMnOS+jDmvd#vi-knF!~{w(zja;gX8ZAMoYzhp8|8yvJ5q&w+x1{xjo6y<05siuT%B&8Z^MyeIvczRoR#Abm!)%Cq%jBp;HY=$H4`J;oyH zI+qrHX7_wEocAQNm!F+08ZG{Q4SN_)h~o4yo+fJajqSqwhv@P2b1Eu$_;h6NALvID z{$uFj^@oS(;orafpIL-8Eki>gf9ch?o3kzz!G(nqd-m)JOpf*1C?yS4cvoQNKT#iI zX69>dZf?oEDWzB9Y<2j}5jYiFnZ3T8vB8W*YX#OfRWvojN&W6w0zUiU{Sx|la`c~4S}4UuW4^>BoTt#-SHF)5QY zeO|x5JZs6d&@S=t^?myMd95_5mz&dbInZNgi&U|CkP=?|UXC)AO3HaU0Nx(n6B87~ z#l?lg;gWoIp>v_K`HZJ}_UzdqR#pS+5*LGu7cV{|vrE{@ZLef`t9*UFpI20raHR^u z@*$ne^p7*^8&g?{1_jpFN}Olp==u1y&VvM2Sq(7GMD z_=4&h&HZ*fFMPsCzI#DC9-H=Mi{;#X9xg6=+0BFpm3KMBW%@^A3Cr(Do)A94%c%~f{ik@a&e??q&kq>er^6X z!v)V3d{h)014GgJXe6x9wGGnTsk7#dA=2)v%9k!Z_Vrz!>eMvCjU1lnD=B!*DQh%1 zIB2>!T(kI%*|>VLJ&ihy77qM}*j{Dc=lhOwxszrO2e!sOmhs;9cqi*!ej|+6*mEVc zEz8&#!{P6W;fN*f-9t|we$KL^+QeV_1ikcf0GqU%&NXdqv-QQ1mTZ$Mxo@!56jX1h zuD!@A-g=Go3GPz z`@p&6Cy?Vbb={(ikf;{1Tt21I2FPUlq_=m!sN+4QE`r&s+cBx#s5|o}UR8wF7r+*dqyLa!rNCw$= zo-L0z%NILMomd(phNq;h7gtM>gLzkpOV(?)3)e(NMR|A<2C0>E?luIeiWDg@3G4GPFfhQYQnmTkHkHBC;5t(SGmX9FCQ;b#`TPdr#?PCBVPqioVfhu z%NM+9DZEYY^!tZvkbDPJG&Dq9Lb!Q(6%`Z~7Z*2Y$;LY?#`aJQj$W`&*jyX(zXqko zVYEJwhK{Lv$Y0hdaR@snW@9@90#nH9}sXJ@aHwk-OJ^Mv#W3bUn48n|E2 zm=zRw#Kd&I`?2!*%WT|h--k-jA5?z^2z<2elbmRd_i>!-zq$JW8$T2(g7b_%Zet>O zWd7IJ#pxX4ZZ|}LFqPj_iUjPdgERhg3kxp-t`jG!70xeV;y z&r)5*>1}9DPEwDYopXE+1*!`F_u7aXs4IEMtyWfukBGr}yNN!!2aBzE?F3N3FQ&V4G<*~+S zv$_5;tiZLFGDhTW`8{_e-s|VO6j~tbPgZ$JfrK$6OM#p?b zP3<*gMUT1rK)ENctgNxj=Dd6bxqNf6?pm3f6K?#258mx9yhHBlhyM;z``zbM?ClBl zv9iVyVisILC4-+n-L>w$Gq+O%EFACH3-5mzyuc(RyLa#2;ab5gp#tgi=R3B`Wyz~E z!PK+|s(l%_O}{+dgO3U}?$VQ+82tcOo!+Te@3(WLFw`U(wSE*jvt6L9X z@khe{AC^kZm1^r?!%i8`=6C|~96EG}D?>jIA9Mzxszw#VLD`npRs@A8Ku!t>1XWfl z)HF7Rg$n9kfl%`NGai6l)L~SuE63cQhlj`4x0;$Bb1bWDHDVu|#8ub=5I`qTL0az_ z*ghfud|$Q=V!ehB_>YC&_;~BlYYu6BD8Sqx4bX<5>L}y6@uOhD6*IWt>d|kF&Coxm zmv=w(HOsl${sOz9?}#!SJ#$ClSR5RO;?1pzE(yUiH(boPkRsrFP1wE7>igZ@J%Gj zv8&GbmX>Q1omsKHc2(>_F)>DFCMYW&?;m@p^QdBL#)jZdveqM*s=W6>v_xX>e}X;5 z^7T>Hqi65F-UQPi6dt8%mZyDPY6nT{+2W(UMqud;0{=RAR%(^%Q zepGmSqY^URm7@gUngA9B=#FH2*(~_(8hrgCp|g8M^WQQ|86}0^@;}DGtI@|y&*P9J zyg|e*Y;h0nP4<6CbeXY-@VrC-i7fzNQ27;;FqL%F`^w+X{@Xi*rTG_LgiwB83HNei_ zEHVaBQEiAzwd+|%!d+cmL4kqCxwxXGT*AuSNwwgp@p5y^U%DhPYcp56^rrILxAg}l z6G@Q?URxWB1r=NBNgC1mBSVNdMEPx;j9I5+x8 z(~HNsz?HO0)y<0W0Q<3G;|8)nZ(XEZFsXXO4jjX9mS5@0m6yKNG_k~Nb0P=wGDjjT zGuPX{Binr!D_{-{4b6X8p`UR(=|Mq<5HeO)R#toqhMdlLHXt{vB%&hL?9)TapwLj>owX|2;SK{E>8t_i-vayj zTr>D4Ah3m(N>|}B|AB;4?klZvabGC>zDvW=#BBNv2{}36h8EVMXoDgn1-ZC@`lmU1 zV?${!;J}Q}O^6>KT zfhg)hC4kUGP#1uI9{I$#XXN4R6V)Tndy!T+)R_I9su^jpq=7OFH{n2Qw6Zw6u9jw z(GT3Awzjs1rf4at{2}fN&knf^!914v~l&K1ij=5@45?UuTqQ*(*Taz`z;TYrx zzbqF{IP~q?H_-<_PD4!(udY^BQCANwau|#0EGLuZ z!f82N{pt|398A2?}sLXV<{++1v^bI{QD|7F+Ujaf0imjw& zOCw6+xP^rU0i3yaVirL{Mx{3sYtziv5)xbGIL68R@jF+d96wCh)+f$&g0Jk(ck{?Sfhu1xf)RNoe=jRXj@#BYm zPgxHT+|5~o8#mT+NHp;4-gN!HhjJ zTNKW7{qS-?bGmuu$8X~6PNLkGrV;rD+d^I7oJ&L&?3^9Aq_n@e#Hpl_M{tA-pnl&!5ZeSO6& zJL>1kPo6wU@FcI=_Ym`J3atA~!9r~Lcw7F(>(`sSUjeb@4oi4#7J96->$YSV6v)x@ z-qXY5A8|Zo%(#(#sn}&s|39ykO>5C>t%3=c`sZj>SbW~3wdi-3+Lx;!O!)>to|@rM9wj|p}gnLA@e|E9fgFV zANR3`bt(9P0$Qp<*N;pTwgNJ=JQOVb$?Cx#md=o;ERLpFY9;ox3|J&n4_)kB7GwP1i5zVP!4 zP0K94@|>PiL`zHS5l07cG^vPTp&>XR;24q{rmU(US3`g zm0WMbg+eQ$4b1NGmPFMVA)AV={Ek#@rL2-!NnrtjYgnv*6=U`77;*6iKLK1+qdM*e zT~wXAo=#tAmAc;JJ@6rz?X@9&2z&b;2YdTm=b3Id@=O8kEge}-TvQs!$?ihCA^RRa zji{7xL;Dv80A;XG##DSFM=!T~#}xFty}}&$nS^1k(?9sy0h)#Q+1jD}s;FC^RmLks zw<;LJP;fyjWf6Qxpi>}g6o!{+j~+NGs?hI6wnCOg2EBJ~3$p39uj>oVZk0wNprzDvfG5)P#7S#-!oL^Lj*-A*&&itu;wK7}Z5ex_$WeE5L+ z>ZqCI0c3;A{zRQw_{|e8eNN$qUh5-^vO7z%TwHH1yl7N+;2w@Fc6W?WQcGBm1v4zT0Fo9%>7 z$bDsH-}4WCT&?nBH6OS;)sdkOo+`VzbyPGla-=O)+ifbN;65zT%Bxf5e<(jE^ooh& zhmZSTNT+FxVJ$G#a?<4xH?w2iTTMJ|(~q(0EzE8Nlhu23L8%WeAFSH1_w~ZwfL%w= zCh;DR=f3>93H8&$PZ?VeG;79SQt^1`ku-h$c)AaO@sqtPBp(ilJAOaw`8HV5se%Eo zG%1(awjS#eb>X^}liEr5EG$wvBpsCjrgN?Pii<5fMcfA%`7~1SlT%q0nb6AG7zsDt zE%3ZS-67s>79+d87LUIkV-96&IF-w~)*(BC=Chc%b#2^aCdS&m-i~o^H4VS8a68cT z8R&`S-)p|)y)nT@c89!fgC@*9a3C6i=VGy>>8|+wEMiT$xnd0s4SC+r@sk@XQ|$zy zt)EZm>uJ|zhwZFmzz>mjo_?Ee(R$f?hdeL^h&MCm3HqiR+CCXKOY%J}8equ7;=zM- zDC}h$(3(t{e8;GsLm;#fg!-~geAbWcRH-`*vD4wIO{gp%<&1q7)+;r!Q$JmI zu2}81ben8DiN$(OrY7e?e~X2cHO+HlxjE9hSjFVd9Y-KVly$!pImSj$^7EtRwQ7!g zR%RQvbvl9B$o1maFJBzLy*#{{FT1_qj{@J1RlEZ_c9x)jmI-wttw0`*a_)5fj!rFJ z|C11&(X8TTe}`v$Q+B^L`B!+=Pt+=62SJ-6zz5@%1H!l#x{5-a9`lcQ z`1n*IQxu2m4=YZ#rE-It5`_FKP#KED%e)7naVLyo@pn%*S%X~iO#Hr`+C^k9cmA8V1v{@T0m~(?=Rtpvx=Xupd|bReye|$ilien}nav-;o7&rF5MtxL>X^nbo4ysZ= z=dQZCvT_qJnHeCAMQQhYA#DNHWJtXZGA0^oYHg5x&_m8B+XBtH0WFK`?yJ)l72fSU zzsqcCwf4#lIt_=xeN>+-d0GmuXbiU49eTsm$8XC&e}cGOp<|VIJwt!hXC}mHHBA*9mJLA0`@l!fojj?MRW!A#aNgzfi z)FZ~)1773|4k_n)^B&kEPH68xx@&4W{z2Xc z0Gqu4<^Xn%u9H8&wmcDCns&c7WN zLnJ3o@zpXcQ77=h33c(l;iVWIZ2Q30tV={h1Rl0|_52)4mJcvz)&}ji^#?mcoICft zm4htce6Wil?BX~))8D1+FS2RtWvDAx+WE|DdwmSWj3h{E&yi5wWtR$aG)mdam!Fr- zd(VHSWnp4UGWq_x82|(;-5T}k<;z^i?rxaGK~#t6en84;GGS+3n`Q|C>6K>C{?fXXUdVkxP2kDu!_jK`a^I2{WBq65Mf1-0b; zHvU+88u#U9CEyZ(=!CG4kb5vfg++m1o>b_KQc+U03Iv0-vmIWVg4RUGn_+|X$1t0mUP17 zW2{?^0P4}wl))I}?^=d!Utb!t1g3>r)sW?)eWkdZ?U7U7&1jr*W3|VImPcL>r3d0p z_wJ>5Zfz0t@*i}?ox9)Ggm{4)jF_VB4>xjCf#?O)oC1RD2o`rIJ}dF|J%{u z5gAa$)-b%SR|3AJ96lQ7``G?yK`3s0v5Hemp3zgL7?=}oQ;r>`1pS1WwK z#x8#vB&y}3)}@b3ADP~MlKk0=v5sNgl)S|A$AjKNEw|U;=os&990S81Iyy#%K#0V32&qJ^_{$(2Q}E3g=#YLu zqqiI$^A}M&aJr{J^U@^^O-0C-t0P+23m$79(X<>?DK0RFnHdlPYHp z4b(B@QZIsQ{iDJdJM#1Mla>$iv=hBWIb}pY@qT`E!pMF}*URxBC@3k_!GiKbEUeB5 z*NKLiLzx8C&Wr~0a={~j(#Qj5`5nFMSGQ*%rNrqiDJ>t>2&Gdu)(_lEWH{;uY`{kEDypDxy?sRv$)3J*pB_;oO@}wrleFpZJ`zCToMkc+>GRs1ssBLTWZ8Gv~{GJ!cgY5V)ePt-Vr4>ZdEl7*+Xm zcESV=2n6ITNU3(|NaBx_Ov?))Wch6xxw_(*XJ|R_5yf z9V^|IS?y5M$6+vf1#C&!N-a+?)(}M~uo2l;B2o0;ib($IF7VQ4lBwL<5?_6wxD8 zmd}7ud21jLOT_#f85x;?v6J^8@go8P-UBkVfDC0ncR!^0E3U+4t^;!10vt_8n3G1Q zh{}UC#1U9GD}hQJ%|liGJx8NrlGB0uSs)<-1>kxe!4anU++YR>EA4QkqXt)MQZ$uW zvYZrY-2#T`^|g|+p#hjkf2Ic{A{pL^ts{tm3tHkh5eHX`*gC87FH0Cd0iVSr`n**H z@xwe2x%(AfTe%4dl`@qx!$ok_w$?F(8+145@Q0=zIxH1hSl@ciP3KE`gBl&ME3noX zc=LY7bp%R)`FYUD+kp9_R457`Nr!yQE5=SkTE@E1UO*R2^pSnH2>Fl(Q2}H-Ru+S8 zhgGxc%#6mz)XZ)f^MRZ=E&(zC0T?u{ev7>E@p}z5H48-R_HXuRvHo zR~dmeF1zoH8 zuJe{1LeL&+f+-_Beq%Gxt%B61t(kg%oiV?3e{ac;i0fJ$b1T2F#LZ^-%yG!a6yyPG zCu^)*t!vZ|u}?vX%e(kwx4xla`hX`1k&sE@g5E)gq8dVh?*0ccF9|RjVWFcFQoit= z6@>)6Kf{y1mmq{>y#}snc@3ojbv-A{xu^6nHZZt}%paH}XQ zve@C~1_T|*%Vj!zxNGQ|^j78hA03ZhE=FyAVpX%esEBLyayowlo*}r74K5L7JHe6S zNkOl0ozq5z650;$_2^)Z*a^mbyURV@tp>`=WELtJi>-RjW3kAoYRaGv9a-2L=Jd&m z*m>{@9iR>BiDLzE#kor>_Em5Oht>qz>seGjSqM{yQE_i@Z7Ffo?W`s$l^l& zDT<`kd~lwS;h`Tk;*f%A!d=fawAj%KYnb064OoIfw{`wm4vl;aXc%O$F)=Z9lVQS0 zb7*J?Sx>F8+rvw{gbv~w$I8RP!ji!6(}zexnC>|WeRnLlxx$Fpm(75SkK7a3FQ5#s z%`OaJSjDZ|%ws*T&lL_GKose);PoF%r-7PeXvIG#`XtdTmV?X_u<9=@f^G;XaKhP? zn00p;b@2n8f1bbNaqZ&T&~V;Qk0t1@H!WCxUhnM$Y)^ptb1|DKN;3wWT3yJ8xwX7o z8_N@J5dHT7RF_}y#WX>~0r7HJwH7ZrJ@A|#-({Z<9|N6HK=hL&&nRi!r0rex*#C&R ziE0swh6Riw5Ys48+~iw!Y5=-i@r0X|oIXFM0XYs0v}PI1m}lruh=B0c2T_wEdIdU8vD8B<=PQuC)v%OJ}@y%<94>P~aUu ze*CwjC(ZOE;~z!G*3MeO5a-5cT25rK!v+A{?rhC@r%k>qxQ1@6k#Zb=4~BAQypn%+ z)^zF4HaQ|Z++0l63h29G_FbzKmb505H(`rpte?>Gpr~jrg_5ha}mMS zSVynW_V(3unz2Zw_AbjuKoKrDjNSut$_eg|DE8j*A`dvh@CA~W5USU)?J#~+l|?-k zJO+dP8MemBnbg+q<jsxB0}7!ej0wYZa3a!XFlL{D-;Q;CXDdU>Lzb%Ky{2QZ>S(CVUN#F_G01PlICF%%17$WY;vox=G zxe9$T6oD|4-#X@u>|O)wB1M3Jxp5THuDIB@5>CPrv6y~xn_yOH9Bhcww7zY*gTv2H zlx489>=jIg)t)nbE(7fla8;Q!Fss@OR&|4nakW%F6nx~bqfuqN+eYmbX}4wDO-b8w zTx|^b!({JY*x?G;LA`rl6ZC9;?A*-%}qCCF9G8EdGC4u(3zrKP1Eivk12rk0fI)^> zQ`6OGahsT}mmy$2kOy}9Wm<9|i_uzo%zu6uYv_EOlm~BF!(4@tK((=k$Yi*^BvHhu z^v80OpkroHD)1Is z@7Ds{5V=F_WlSMhtr!CRU_T#+h7nyYp5LDox{AE4H^y|elAWHyKm<+|4Ifg73EDQ`Ez|^v@4^CdHaR5M?LV$q!= zh2uYbIPT`=cAt3{)5VpzN?%{ljf#oaUI344?;mK7g%0JZO(Ea67l=d`BY{Qqou)!1 z1UnmCYg5j#JF7k2K+AubU#zUhm3wWm#L9ZV>F@9VLVSGxLe_SvC)rs?Ahi3*_@vc= z`jBL!QMs-+oz=#fG{bFi}vzxUULrkje2SB~s3_ zy?W#rcdhypnyRX*!bD^fn9~6rlA1Zkg^M_;X>4o^_dM~)c&yETr4HuuD(lhgA1%%( zb6w!ty?b|Daxx#7pp3wX8_fDD&T7X1E^mL#fP#3eBg>d`W@e_jy&YRfYIKy8l)M9@ zQFhQbG2XWF@W8-?fzc1W)6udcMYg{#eK7y*=oLN&-SSqiFWRQwZdNBwoY*T(m$X!Z z0cq6S+N#Z*^WN>2jD*Ay!RzTMo}TOOP@I{PaoEP04DQ@GnR-qU}gUzXNfINh~ zz{`%DtmR|NITvn~!LfOg2zS^iv~>#kt~t+qh6?Gmc5~&+DBMRujcpxCHDYuFKkyRq z5rI7`FsqlYI$1OJ4jiYszu(CH$hCHueTYv@oe1~2ak$HHvF+=-&!S~AX0?aT6ku@1 zVzRpJr0>uOy#seJpAi%L6X47D&6_u_potpOBBgLI)7131YD33H>cX=fCt8jiIpXVU zLpw>&f$@cqr~>qLFzV}VcaI^=$k*u3((nxSJPFb_Fo@5|ISZYsL$E!sfa8o$PQHY_ z*s;%#A0IxMDQfnD-#8}L&(BX0HX}DTw{mlR$pr2~amtS0j*eY|L5U(A+~oSoN$oJ- zjYe&0OBoD?4SJ8h&|QQHJq0$5>uDwt!y^z7XD(dO6F2WPugw7~v$#fk)$_o_pK%Wr zJjjwQaCbmlQPBlSDXI933}IBBN@%G#rxais%?JHm0Qa)M5wp;y3zNOh*`bmP&q3q7f-P_!6@!HELZJG!;C)!fm+1pMbE?A&Nsdd2lHj9Kqk zfDu?4g1$hW%wc=Gz;%GTYdg&P`ucFECSt3#4b5tU%tq>#;I7~Ypz*rkp2r+`k$G8J z+5i56nk8822hcO>0vCxeIyyQHH$rv+axWQm7z-M}GCL?|U8ULeeiHO}7uaSwFi=n$ zzE~0P`$Fn!gOjtePSp{FSlQU>Sy))?jT$Nh4LH`A;SUa6m4L{yCzGVf^Dq1i=SH!VcjWI6g3nw JFWq|lzW}N{1?&I- From 319a78ecd66736adc12c3ac3206bdc3ebad6d851 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Sun, 30 Aug 2009 10:33:01 +0000 Subject: [PATCH 0116/1000] Improve multipage pdf documentation svn path=/trunk/matplotlib/; revision=7597 --- doc/api/backend_pdf_api.rst | 7 +++++++ doc/api/index_backend_api.rst | 1 + doc/faq/howto_faq.rst | 29 ++++++++++++++++++++++++++ lib/matplotlib/backends/backend_pdf.py | 20 +++++++++--------- lib/matplotlib/figure.py | 6 +++++- 5 files changed, 52 insertions(+), 11 deletions(-) create mode 100644 doc/api/backend_pdf_api.rst diff --git a/doc/api/backend_pdf_api.rst b/doc/api/backend_pdf_api.rst new file mode 100644 index 000000000000..115863d61875 --- /dev/null +++ b/doc/api/backend_pdf_api.rst @@ -0,0 +1,7 @@ + +:mod:`matplotlib.backends.backend_pdf` +====================================== + +.. automodule:: matplotlib.backends.backend_pdf + :members: + :show-inheritance: diff --git a/doc/api/index_backend_api.rst b/doc/api/index_backend_api.rst index 01dfdd4a93ed..efda381de865 100644 --- a/doc/api/index_backend_api.rst +++ b/doc/api/index_backend_api.rst @@ -8,5 +8,6 @@ matplotlib backends backend_gtkagg_api.rst backend_qt4agg_api.rst backend_wxagg_api.rst + backend_pdf_api.rst dviread.rst type1font.rst diff --git a/doc/faq/howto_faq.rst b/doc/faq/howto_faq.rst index fcdbfe6521a2..49c6aa360771 100644 --- a/doc/faq/howto_faq.rst +++ b/doc/faq/howto_faq.rst @@ -68,6 +68,35 @@ on individual elements, eg:: ax.set_xlabel('volts', alpha=0.5) +.. _howto-multipage: + +Save multiple plots in one pdf file +----------------------------------- + +Many image file formats can only have one image per file, but some +formats support multi-page files. Currently only the pdf backend has +support for this. To make a multi-page pdf file, first initialize the +file:: + + from matplotlib.backends.backend_pdf import PdfPages + pp = PdfPages('multipage.pdf') + +You can give the :class:`~matplotlib.backends.backend_pdf.PdfPages` +object to :func:`~matplotlib.pyplot.savefig`, but you have to specify +the format:: + + savefig(pp, format='pdf') + +A simpler way is to call +:meth:`PdfPages.savefig `:: + + pp.savefig() + +Finally, the multipage pdf object has to be closed:: + + pp.close() + + .. _howto-subplots-adjust: Move the edge of an axes to make room for tick labels diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index bcf7c72ea625..7179bffdda86 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -348,7 +348,7 @@ def _flush(self): self.compressobj = None class PdfFile(object): - """PDF file with one page.""" + """PDF file object.""" def __init__(self, filename): self.nextObject = 1 # next free object id @@ -1923,18 +1923,18 @@ class PdfPages(object): """ A multi-page PDF file. - Use like this: + Use like this:: - # Initialize: - pdf_pages = PdfPages('foo.pdf') + # Initialize: + pp = PdfPages('foo.pdf') - # As many times as you like, create a figure fig, then either: - fig.savefig(pdf_pages, format='pdf') # note the format argument! - # or: - pdf_pages.savefig(fig) + # As many times as you like, create a figure fig, then either: + fig.savefig(pp, format='pdf') # note the format argument! + # or: + pp.savefig(fig) - # Once you are done, remember to close the object: - pdf_pages.close() + # Once you are done, remember to close the object: + pp.close() (In reality PdfPages is a thin wrapper around PdfFile, in order to avoid confusion when using savefig and forgetting the format diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index 3d3de14993bd..0a75e197df1e 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -981,10 +981,14 @@ def savefig(self, *args, **kwargs): Arguments: *fname*: - A string containing a path to a filename, or a Python file-like object. + A string containing a path to a filename, or a Python file-like object, + or possibly some backend-dependent object such as + :class:`~matplotlib.backends.backend_pdf.PdfPages`. If *format* is *None* and *fname* is a string, the output format is deduced from the extension of the filename. + If *fname* is not a string, remember to specify *format* to + ensure that the correct backend is used. Keyword arguments: From 19fed4a62d76d86375a607f27fd443e258627909 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 30 Aug 2009 15:43:39 +0000 Subject: [PATCH 0117/1000] buildbot: delete build directory when re-building svn path=/trunk/matplotlib/; revision=7599 --- test/_buildbot_mac_sage.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/test/_buildbot_mac_sage.sh b/test/_buildbot_mac_sage.sh index 2188525e1cc4..9bccfe1db56e 100755 --- a/test/_buildbot_mac_sage.sh +++ b/test/_buildbot_mac_sage.sh @@ -1,6 +1,7 @@ #!/bin/bash set -e rm -rf ${HOME}/.matplotlib/* +rm -rf build export PYTHON=${HOME}/dev/bin/python export PREFIX=${HOME}/devbb From 140d12252fe49156a6ffb05b780e722f78807c41 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Sun, 30 Aug 2009 16:25:46 +0000 Subject: [PATCH 0118/1000] Merged revisions 7598,7600 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7598 | jdh2358 | 2009-08-30 08:35:12 -0500 (Sun, 30 Aug 2009) | 1 line applied Gael's ginput patch ........ r7600 | jdh2358 | 2009-08-30 11:22:38 -0500 (Sun, 30 Aug 2009) | 1 line some unit cleanup; fix sf bug 2846058 ........ svn path=/trunk/matplotlib/; revision=7601 --- examples/units/annotate_with_units.py | 7 +++---- examples/units/bar_demo2.py | 4 ++-- examples/units/radian_demo.py | 6 +++--- lib/matplotlib/axes.py | 26 ++++++++++++++++++++++---- lib/matplotlib/blocking_input.py | 7 ++----- lib/matplotlib/collections.py | 2 ++ lib/matplotlib/figure.py | 9 +++++++-- 7 files changed, 41 insertions(+), 20 deletions(-) diff --git a/examples/units/annotate_with_units.py b/examples/units/annotate_with_units.py index d73a1ae51e01..deb06f378295 100644 --- a/examples/units/annotate_with_units.py +++ b/examples/units/annotate_with_units.py @@ -1,8 +1,7 @@ - -import pylab +import matplotlib.pyplot as plt from basic_units import cm -fig = pylab.figure() +fig = plt.figure() ax = fig.add_subplot(111) @@ -23,5 +22,5 @@ ax.set_xlim(0*cm, 4*cm) ax.set_ylim(0*cm, 4*cm) -pylab.show() +plt.show() diff --git a/examples/units/bar_demo2.py b/examples/units/bar_demo2.py index 7f1bcaa59107..7c00757d8df1 100644 --- a/examples/units/bar_demo2.py +++ b/examples/units/bar_demo2.py @@ -25,11 +25,11 @@ ax3 = fig.add_subplot(2,2,3) ax3.bar(cms, cms, bottom=bottom, width=width, xunits=inch, yunits=cm) -ax3.set_xlim(3, 6) # scalars are interpreted in current units +ax3.set_xlim(2, 6) # scalars are interpreted in current units ax4 = fig.add_subplot(2,2,4) ax4.bar(cms, cms, bottom=bottom, width=width, xunits=inch, yunits=inch) #fig.savefig('simple_conversion_plot.png') -ax4.set_xlim(3*cm, 6*cm) # cm are converted to inches +ax4.set_xlim(2*cm, 6*cm) # cm are converted to inches show() diff --git a/examples/units/radian_demo.py b/examples/units/radian_demo.py index 64a64e44c4de..3eeca931e75d 100644 --- a/examples/units/radian_demo.py +++ b/examples/units/radian_demo.py @@ -7,15 +7,15 @@ from basic_units import radians, degrees, cos from matplotlib.pyplot import figure, show -x = np.arange(0, 15, 0.01) * radians +x = [val*radians for val in np.arange(0, 15, 0.01)] fig = figure() fig.subplots_adjust(hspace=0.3) ax = fig.add_subplot(211) -ax.plot(x, cos(x), xunits=radians) +line1, = ax.plot(x, cos(x), xunits=radians) ax = fig.add_subplot(212) -ax.plot(x, cos(x), xunits=degrees) +line2, = ax.plot(x, cos(x), xunits=degrees) show() diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index e96e518ddda0..adad7765d270 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -203,10 +203,24 @@ def _xy_from_xy(self, x, y): if self.axes.xaxis is not None and self.axes.yaxis is not None: bx = self.axes.xaxis.update_units(x) by = self.axes.yaxis.update_units(y) - if bx: - x = self.axes.convert_xunits(x) - if by: - y = self.axes.convert_yunits(y) + + if self.command!='plot': + # the Line2D class can handle unitized data, with + # support for post hoc unit changes etc. Other mpl + # artists, eg Polygon which _process_plot_var_args + # also serves on calls to fill, cannot. So this is a + # hack to say: if you are not "plot", which is + # creating Line2D, then convert the data now to + # floats. If you are plot, pass the raw data through + # to Line2D which will handle the conversion. So + # polygons will not support post hoc conversions of + # the unit type since they are not storing the orig + # data. Hopefully we can rationalize this at a later + # date - JDH + if bx: + x = self.axes.convert_xunits(x) + if by: + y = self.axes.convert_yunits(y) x = np.atleast_1d(x) #like asanyarray, but converts scalar to array y = np.atleast_1d(y) @@ -4270,10 +4284,14 @@ def make_iterable(x): if self.xaxis is not None: left = self.convert_xunits( left ) width = self.convert_xunits( width ) + if xerr is not None: + xerr = self.convert_xunits( xerr ) if self.yaxis is not None: bottom = self.convert_yunits( bottom ) height = self.convert_yunits( height ) + if yerr is not None: + yerr = self.convert_yunits( yerr ) if align == 'edge': pass diff --git a/lib/matplotlib/blocking_input.py b/lib/matplotlib/blocking_input.py index 1d49772fce8d..09ed6d9afbfc 100644 --- a/lib/matplotlib/blocking_input.py +++ b/lib/matplotlib/blocking_input.py @@ -17,9 +17,6 @@ Note: Subclass of BlockingMouseInput. Used by clabel """ -import time -import numpy as np - from matplotlib import path, verbose from matplotlib.cbook import is_sequence_of_strings @@ -151,7 +148,7 @@ def mouse_event(self): button = event.button if button == self.button_pop: - self.mouse_event_pop(event,-1) + self.mouse_event_pop(event) elif button == self.button_stop: self.mouse_event_stop(event) else: @@ -162,7 +159,7 @@ def key_event(self): Process a key click event. This maps certain keys to appropriate mouse click events. ''' - + event = self.events[-1] key = event.key.lower() diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index 078925c77d73..2503470b7f7b 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -819,7 +819,9 @@ def __init__(self, segments, # Can be None. def set_segments(self, segments): if segments is None: return _segments = [] + for seg in segments: + if not np.ma.isMaskedArray(seg): seg = np.asarray(seg, np.float_) _segments.append(seg) diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index 0a75e197df1e..2f7bf4cf3c15 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -12,12 +12,11 @@ """ import numpy as np -import time import artist from artist import Artist, allow_rasterization from axes import Axes, SubplotBase, subplot_class_factory -from cbook import flatten, allequal, Stack, iterable, dedent +from cbook import flatten, allequal, Stack, iterable import _image import colorbar as cbar from image import FigureImage @@ -1118,6 +1117,12 @@ def ginput(self, n=1, timeout=30, show_clicks=True, mouse_add=1, mouse_pop=3, mo Right clicking cancels last input. + The buttons used for the various actions (adding points, removing + points, terminating the inputs) can be overriden via the + arguments *mouse_add*, *mouse_pop* and *mouse_stop*, that give + the associated mouse button: 1 for left, 2 for middle, 3 for + right. + The keyboard can also be used to select points in case your mouse does not have one or more of the buttons. The delete and backspace keys act like right clicking (i.e., remove last point), the enter key From e8f18199cb138374c972bd1fb02dacb6debe1dfc Mon Sep 17 00:00:00 2001 From: John Hunter Date: Sun, 30 Aug 2009 16:29:30 +0000 Subject: [PATCH 0119/1000] removed known failure decorator for sf bug 2846058 svn path=/trunk/matplotlib/; revision=7602 --- test/test_matplotlib/TestAxes.py | 1 - 1 file changed, 1 deletion(-) diff --git a/test/test_matplotlib/TestAxes.py b/test/test_matplotlib/TestAxes.py index 06a7e0794b60..e4c16ac2eb78 100644 --- a/test/test_matplotlib/TestAxes.py +++ b/test/test_matplotlib/TestAxes.py @@ -58,7 +58,6 @@ def test_empty_datetime( self ): self.checkImage( fname ) #-------------------------------------------------------------------- - @knownfailureif(True, "Fails due to SF bug 2846058") def test_formatter_ticker( self ): """Test Some formatter and ticker issues.""" From 34853c2a3e8f40c0e15cfc58ea3b4d4dce11826f Mon Sep 17 00:00:00 2001 From: John Hunter Date: Sun, 30 Aug 2009 17:55:08 +0000 Subject: [PATCH 0120/1000] fix formatter4 unit test and image svn path=/trunk/matplotlib/; revision=7603 --- test/test_matplotlib/TestAxes.py | 1 + .../TestAxes/formatter_ticker_004.png | Bin 25485 -> 33382 bytes 2 files changed, 1 insertion(+) diff --git a/test/test_matplotlib/TestAxes.py b/test/test_matplotlib/TestAxes.py index e4c16ac2eb78..e2edd5555101 100644 --- a/test/test_matplotlib/TestAxes.py +++ b/test/test_matplotlib/TestAxes.py @@ -86,6 +86,7 @@ def test_formatter_ticker( self ): fname = self.outFile( "formatter_ticker_004.png" ) ax.plot( xdata, ydata2, color='green', xunits="hour" ) + ax.set_xlabel( "x-label 004" ) fig.savefig( fname ) self.checkImage( fname ) diff --git a/test/test_matplotlib/baseline/TestAxes/formatter_ticker_004.png b/test/test_matplotlib/baseline/TestAxes/formatter_ticker_004.png index 613bd1053cc1a9d1f43dbb432fca5c02c0a9b637..ebdbc54169ef8a28dbd3348f6aaf31f299e9bb3e 100644 GIT binary patch literal 33382 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%0DvO(FDsl&quFAS z*kW6=fXzT)&kdWy}>&E)`z4BWQH zt1gD4t-DWVAm`XugorNM3+mrBS>LX!r?-g9XaKp|+e*)+eb^8DS From e8b8b496e0e04a123febd240d054dbc755544665 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Sun, 30 Aug 2009 18:05:43 +0000 Subject: [PATCH 0121/1000] updated baseline empty datetime svn path=/trunk/matplotlib/; revision=7604 --- .../baseline/TestAxes/empty_datetime.png | Bin 17208 -> 16763 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/test/test_matplotlib/baseline/TestAxes/empty_datetime.png b/test/test_matplotlib/baseline/TestAxes/empty_datetime.png index 0fc59db402b34f3aaed53fb8715541c596d68808..e9fa1bf1ed41075ac629ab835e46fbe48146183d 100644 GIT binary patch literal 16763 zcmeHvcUaTe)-HAv4K?{ayV!Oy zFfi;ALz_3|w$2NH7mCJ*>@UX?{ilX)o_{VdHxj+29^R9xv69WU&P4w@k zbg48e28JUHiZYkA-D0N)-Hou6^7=W;`$-Q(U#AD8D<&rE-TtBRLprs@B*LH}rR}KT z%x!D^`12h$ac_d+?ewiu>W{^?ANM=xr{r{^<+OF&wk8$v)EhjfPEC)kf9q8)etYed zw@2Pu<#l0`E_?FU>NLw4ZqJ@R8(U>87N*1S&iA#n`mZOCA2Mu4FZ{lF2m0G=#}V}K z?5Hn#_~Xf6Z~hl9!gqNSlX!{w23|)xrAOJ^JbBC3t&PcwVXYpk*L~>N6&hJMBqU@% z3(N61ap%wrHr?T*XPaPK#&~^~9DaVi94+RQ8Y}Lsw6ZwC%fl0C5!X}9uNM2Frbb4; z!X>+M>3iV(`YKtOzCuaS%{7^C-M%5mxWb%N7t~(m<-yE6(N~mdWnVRIey^g8IT#T^p!bePTz`QkF z>VvtXxP8{H;i%Imou|6@EZ#eHY_tDE&&4)*$FVrqZ8$azC3or3w?6%T`sx#vlRXJHLt`c# zv;=u(@%5@j{u;qyWf?5YlMZJ^x_C@em%08L7jzCoXMP5c3ZXj^e!Ja*&QgH*?f&LZ0#_uGV+u>y& z;bK3**SyTGUv*_~dLH<>`Er7!*T__EbtEj}7qhKfx1M#KHJbRG`0)Jg&qsU<7~uvt z`<*+IqF3cv#(}|UKj#qR;YlN#6y0v)VP-Cyt7A_wD6&2a7e}A7d~Sa0meRd@h5r7( zafoV|crRNhDk+7Y)Jj!=)25OjX#;xa6X;fB$~- z<@wQeSbymVG}A2{o01Pot^NEcmT=CdTOj&^jZWSijxyOe-CNLnQ^)7|?4Z_W%wwsD zf4S!0t8fEN?fKrHM4DQPZTpjL`-|tl2PTwHKKKL1FKKAd6Xun>7nyBXq7-w{b~7e! zS3uxrbjE+b%77kj{I+QeJouj3vJV~@>h?*ahrizZ|85aZ$^w`^;}FwKN=izG2nc=g z;>f}nQ7YFqO33(B+$Gn@pFi(rXr?@^sjY1cKdA+$ID8=s9g#6SLPP!GDzDK%;i?xI zT4_pm?qnsWrYb2ZJ#~}dQdCr&s~CKG==4Zxj9q9v#sh@}-}&>}l1pD1-KX>FM}{}n zOH^Vmw%j-b!}&VxlU~y+z7w6CmZofA@ah;pf1tktOv0QPk2woKqo}49`TBLJ`Vj)9 z+fb8$b9ScaoZ{heoGI#Q5*ha7EwCgW_l3c}KBzT(yQY_K9`MM|Pgzqll(^)( ziSgL!)5;g^ho)Wo;Zuqbh@6s@A3lCeaU5+LJ$oHK_L}F2?^2%Am|8$!;AxjgUP(z4 z85x(EzERiy?OblsYO$h6&FY?oFmB(g0IT*XMns)O*hC;$a^-eeD?5Dt?%AOSqw+2; z#YT>ee6@9uU8d{lWs~^Kk&jGL;r(_Ms_`DPV$94t_wJ2s4C8NxSB)eOAOduX0Z>s7 z($B!X4pqmGdqf&u9KCu>KtQECOP@FFxN0b`{PPAabY41a%D<)hil}F2r{;T$#Ic;dU=opFnP38?RPVVRSX(7jn!?f171O(JFF<6>sMKSY=Z@(=!`%ZS;dvT&e zetv%5ye&yqk_0;xnVx>aYPgCpY#VdliYLKm-92wEh+U*F7(pK^Ppj`zTc)n?MB5v` z-#Ep!9i5!`jvtq6Z*MmrZHfqe_3BilMSy?9>&p+#TVusSqoYr@wY5Q3`h1nC@$Joz z$@arlXWf3@*tus<1f>23II_v|!Cch1LKxh4_Z|S&Kvv;MfaJzUI}gAilmGtxyZKP1 zdwcG6sZ}wqV0j6y;B-93WrI#rc5^GOTx?ek4G%w-rWO}k7sTE?-u7m6uAZAo<|G=A zSI=Nk*m6tfe}Y)YJ-`Tk8QpU?^_Dwl7Fu;2|J;%BqIBC|aQfdqr~E6dCC?0dkTDbO zDS@3?`dWCM>{AX74)c9Bxekggz3ceoRP6jYY`lL`#fF z6hdTRTx*nEp9mnE5mS{Y$MBN`^}Nk3Et~nGj5O~^@bG-_9!T(7r8d5QxZPrLyzQ*> zq&8r6SXZWQGbjLa@(=-d-+*I`2)bo+AhBQP+(sHgc+Xn4a+Hlm8p_BdU-jD?8WqKl zzCF*92MFCVrA zp6{q%WR1-;oW*VQ=Vxj9P+uI?Iwl!^=@#7h7EM#rImUN~4^LUt__uC)6>{k=b2+!y z%3?@mrG$Rr?GWM;P(i*^r!TmuLfJ`oXJQ&ZDpf`Y0#IYuWlGBT+8&j8gMW5t|~oja$M^yZDMOtR0$ z`ut>OZWGEwmo6E;60sMu>COsaHF3NAWDol-DJB@X^z%Mxr98Je)59Wmu_`bBxa{cY zh&J^{OAJ5Ar-B61pR~7f5U-h{lyBX23g!K2+n5VB$I<$?y^-IZbPxu5$1H$Zy|Q)7 zr@w&oFaG`Sb;iE{QsD*KVJYuQumco5Jw3%f?T3?b8s*QDz<)0s!7%}MU-d%$MI)S~{6mW=%iBU;> z%M)n{<{uvIoL}rvR|bMTQZnp)Af$senU#g5>Dxy?#JM#Ax~io->Yn9kzIj6KjRHY> z?9ANS?4O*{jxu>(zu<5B0M0R=HLdYC4Tkh!DEFM>BvERkayS8F-f%D=xcUc^4$Re8isww;(x$J^o>9)4 z%8W6zG;qS?5x>0E8hbL3MKIKxzS8@jIHp%XKi{!q4Pc;n)@ftWsAXkkXF*a2JbikK zn1KlAb6G%X@Oj$b$TJ-lzn4Dp>0>Tu-D76%y8#Gs9TrCxFap*6vyHE z(y#hW{3Bv@{}%L?IQ~-M|Lv`a=R4m`p%D>$F(UTVikaSTS7nmz2Fu&u-n_cJJeIJrSoRCSwr;8k21i24 z$jB(Kfa8}TYEc!>3jpH1HYab@n?IUxQ66UcI_aqIQV5u{%*@QSbp*5C-rg}fVb`u* z=3n34-_OM*^hPddrQ-*3?zPVwF>1ELt^dY$UO{qo`WzxxGP1H;aZ2#6^gHk*(vkOR zDF)PLx}GSDwfOnWa!J6jwby82Va8?3F4~V zS#yL{tA8i0BgzT*CIW5fG?K?)WN6KnlAbTD_ky3-?2ec{YWrAVLg6)isp@uj^5A7DagaaEBEXLn%TC!94E33ibBC+?j0_HRDh1$ zi&rqTuQac3xar*YS|mTB|G4>JWMo9a$S4;1BrB9DOR0L&oPRxu8Cz5@x%TsFo`CX@ z=Yp#HLW_u3l_i+!eCN(}=Fb#ztw zU!odT;V)7BFAYo|Iz@M4xVl_QE;%__!N9;Eqd!j6;mZC42P^<5!8sRhS|wKtQ>J>NOb9rr2zi>`rluGY$`{#A zv59n%QVnDVu)#6b%!yq5PEZB;vr19pMJYW5m}Su%sffdsR|0cG))W%@0G3yAi{r>n zWDc$;x%P_;xm^Xo=G)C8@B+cIib}X_Ad4b6cc{{}E%T>+3!5uJdQcmEi-RuaA4QPA z)mms>BpoF21@w8oeftKM)yO%?8}Aqzo0>wAzAm=~fJg@EOw|KtaKL>m4u~zw@@Ulc zCflK3F~=;u_NB}z4SZfjjThvNq@^V{X6D`^8{LflVgTbWOUrk5!-b`X;f|)K@BE|g zM6Iw@Q)?v;vB0}`3zY81Gqg4kiLA^aP)=4odDkH(;zaCVZr8h$X+Xh)TBV6 zb^sPr61VqKqCsQ|kjPUG6;L|C`~R$Ey$&TR^qr4? zk5izi6B-k9S}Rp0q@h6}TGFdrz_?tyy`v+=X{`0W0NSk`zYjgYKCKO8Z7y{nAyN-E z4==b&wXObO(E}ybJYWC#(W8dRuFTO8d9Dzk_sw}`^~a7Ly$o)G+7b-$ZfnrFBfgjM zleBD)9RfJUurI^0fkO0;yH$O;GuD7PCF$6^Hq1b+J|Kx85~6faCLQMNpfp^D&0Ms`y{ z{gdwxZ+Wq6HcVZz4Q4xm+;^$BQ*GTGH}I;ZrClamt`+eMn&;`nOp@sMat{|c!XH&FO%@eJ(;beLL?_-fyU zDnoiV$h0p@NwR^35RiSq%osjR(wq!2jN5+u44UK+d%{KAS30>S#@m^=vhasUtn37b zi#~J+cGpwpJ_9CL6IF}bAJW17QWTD^JDET; zhq5djT|K?u-!8`o#!R+t82zrRr*{IhqGrJ@Rqzp+L(WkKyl8{%z%bpRB##0LIE0yS z`WunfnV^QU)s6y7^$IC)9;p}AMxmNp4EKgJd)hyF*#TDX>-CM5D3v&I?2sF2Pj8-? z-@$_i{Vnui2srA^$ms(*15+q-w15MP>iPr^S|p30K|@Wz0jL;@ii-MTW4{&SP*oO1 zLFLB!YQFujq=$s4sGdRL?W0JqCwQ+Y%CvTB!6ui{sr{pXBcavw8G9a{=cR5jL!u=j zJXLh4b)3-h0k6xB=7($YL(6s5UIk93sJdKh!B^LlCr*6!g`x2oM_!ODb?o zaagKV?Vm8yBG?6S^M-wxd*d(g@nuIc-@et54`NG!i&g-awq)%U7U@1`TC)Qf6u$U& z+m(k89zcm8Ros2vd{wN!*tP?Y&72%*44YviP*9J8ebw?UTWAyTUY#k~l<__g%@aR6 z9o#?Z(7Y~ZKOS__E_1uZRR)K*TX(bEF1Xcl@7ssRxUcUv4T7x;g|>&*`jOAsMbwzM zB+~KtH}b*V5b0C%qs=p{GXNo2tTXU616Wz(YHzQ1lRqI+&sny1Lc_u&B)nV?+H4n? z$WwwP14)q<6W|jU!W}VjOJ>2o8^A~CU=dE+s>g~Z;_Z>P@A5XXrd$FdU)s7ev zEfc|y%@VBcl0iSbW3{c1d@akZ@K7CTLZBGt3e*Cz#oZJ&SMjP9cZI}j=0ypv#>pZtz))=_o zeb9VC&)rxN#<)zsq@ow0-%aXA6X3 zc8Fkz#j*++rAJy=L8bAQrDZ1G8p?xvp>+VP@2utJk9pHORLEUybZ*{gp{o{uZh57}z#P5x3%nT7K zy1|`c70|okxh@OfPL=EO`k%IR`T;-Ap4-=V!A*i{%y9~fKQ`>Wnw@1>qQ=9+lWbh! zl7!!X@ZL(DMa!!TVTVrZAniCZTR{dTX_HeXXID8V*GMEr9pG0(%@&mlt(P2IF7#*+ z6O7c0th+`Qh*D8|*e@boQ3&xP(>n0@4N$Uq7~z*U1!{=Lai#dauCa3jhv;2t*o7ki zv|*3}mHqZ|ZZ_CWaL}=D&8fFV^FHK-cKHcz-@g0JlB^eji7h0`4bjfAP)Na2lMu04 zpf|grM5&J@auCD-C{Zv0<*>ef#AwmOP5AR!IL5J~B?cK6#?4@&Y) zdksM{r9fX#C)h##2}y>XV0Sm)?B@H0iul$4K>1%t_&x#h>6!7b?;qxapN>!vIzv85 z?uYutu@fg0_Hv3JgA#Cf7{B^ce+4KABPpBjwd&$NkrE{{@+l++Hcc6zIt6-ZkR0SO ziJYYy)kxh@UktdwQ<0>y- zgPYblK7M=8&Yf*=Dp)Eq>rkjdjGrS)m<4k}+m4y3>G_Knb$YV&&4RflJ@s-cX2oYZ z(t_#hSgr9EE4AsMe=KZF$GGY;WXBUeTlO*D`t&l9)%adW6*Lc&!@ALzNWn$Gu-OhD z&e+W=RG2`c(}t&bgC&w6SzN;wvDScXVQp%f^yJBt$@FV)7H3L^yCHh50J#?vHrDtl zYnRof=!KB$HHL9hf`Ffd*0@W$yu7?c!1rIp$J^YUJW3~Dl1VxORnL438?x=U%Q zCpQ;_Z3ps5xN+l0!5Gb{f=H9INkr-LAM%-D&;vmAn>pxAZF`xOB>)bBM-c=o8#{X@^g(r|C`YknB%Ubg3JVK+11g{g zFnxH84lfIJy?psQVLHEAX<&Am#s=klReOlMY~9@Wi&pJ2;KSrJM+%mejWF7LLjTPFa!0gfw)lAP1@$8M9I zCs7Ku>o0Dp>Gb;i51_%%_WnJ2yc5{mkZ>Ci6t}kIkdQ}TrP)ASoClL0l zEA4Qe=^&4$-8~Lr9Cg5O|86YV1n6OBuRYkqT>_$y9yIisT?+`>=0Jvdem7`GDFU7G z>cxxKJ9q9}`E-uBG~hi;?YHlNGff8#Iemsqf>7*)Y%~dFHP1SJ)mO=Ix;NH{8^33b zoEPbK8jaAk1_o9LMOaC)A{I+nUzxf9WV|3hA3j}aNsP}%K?13J_1Q3FH>%&UXc_z1 z{{JOwF8G8(z(RM^823?18Qb5PL?hIhygUp!Lya(#)F(Z-b_}lm;R|No(#SGUX1%Hu;qo+4e0Rv#h0MB2p{i$ z^AHQmBp^pFU?tV-EvSfWFbR5~mvr^K1*{dY0UOxQ#co6UE~pduR*4Sk5P^Pm zJC69gt6rxFqg?=%jGvs~Wi)}iH^?=?5TLb@0{$*gC}>NxjyQ!~oNpHHfpwaIjael7 zY*bvl{aG415D31V8sYtus0kK8yr1SKY(VVJHY|c{fE)IrO+ZsX5wO3FxnQ4k3w<0k zDUCyBa|X7L=xfmP=iRV;+tQzQ{Oi^GT0ySrfDC0-VmAoqdG$CJo8U#&hk4H}k92`z zw+5;YX&#RjBpYgRtjQH4| zJ$t%fwpKtK0E>H;28eRMVuMCOjLz!sjE>RrsBidv8vU89IvKGvgvcoU;a7%CX8|I6 zKuvQ(MVm-#1mw-FT2a!?HUKMq-FOG(9(l+ZlF&V1m9<xK3ZC z6c8nMH!!o4KbTzeAdwf#*>PIhvNOR_tXD9HY<GzfWhu%zxb)@l3z(Ycsy31sqcZsL|strp#T8cXlsY7B}fu#>Q5WkKRq=OKYJ)c zWb926#jogH*($rueJ2kmp+ngsc81$E&TQRz2jD-lp36gJ*Y4ecm{hzY(9wym%&7BL z?KNE0;9`ve+lqwz*aY_qk}=}6F0ePSfqN@lbB(}(0qK^GkG`^QhT5Ui)VU}6OL7O? zNI|HV8aWrxUhwwq+Yem@H$QFz+df4Cgvvbl9Z&s1_whKEO959@Sw_O ziu+N+0<45!0`9|y4|fr6JX00_}dtD$q(v$4>$(rGkd3 z(7|gfhJ}Wn=i`%QKY#nH6I&5a7m%^+k^#p+Ao`H6dZ2l{kK7iCypE~v?95@G4T3Qd z;4}%j2i=*v>QTbibD(>z%dGzS1Tf#+yu7?}v--VeMH~`tpVK0NKHmmsXc5}gb+N-* z!-o<@fFFEDy^2UUflTg(RzPboKTTYEEmq(ptV;Au5UyDW-o;_EwgTIT>E7JE$+Cyh zwe%|^szj%f>Vtc>?P0qOO6K^nW8*1NCU_{BN)i{U_HEF~KK&axxF1n9(CS_Y4I&5# zQQX_)5_BN3Wd&oXFWa=jDqLpTVK+@KxlE^n=tub(i*0FaY=dgS#PB**1dDOn)ipsu zeb4~7*>IA&foHQ!1?qy?hKC$qkXC~OrICrjEowC9pNBq7FgtRN9z7~<)t)>r{9URt zVGXFGuE+bRZt3o<=3bDp|zpg)o-^U%@R07(;d&o}}zXUmk88EF=-4u=iZpDmvf zniwc6(2L}Q<13rZ*ru-eC^Hr5J8Mn@YNnIw+Dp{TP~R8@^YJ)&{0Lnomds-)h7GRX&E8V2bI z^)X_u^V3qHO#wzhlgo#`#NH~eibqeL^f`I2Or%*%f5~glGn4Oqd-I`xtYj@W2gh{7 zkiY-h+5+(`KyCMCzb;Z-6npn(dqF#c-5?|U{cXB8uOGkbg1O7Q5Y7MA8|-$B+t1g; zFTqmlw>MTH!zTm7XXE0^f$T9TRy`bWfL|Ls^JZ6SgtmHH{~=sTN{SVjovjH{(0Vz2 zZuLraf$-jYrWl0gz#-zm%9$OmzMfk-uY_{J6F!L~ zdLvkt77e~ool)XJy%EN(t_ZSENQV#gsz!4nygNvHY@zS7HN$9kY) zZU#{LvElB$+>+ByHP?$wH&o%1vOO1apXTpN2qAAcTe|1znsqMjo&0gb)eubcn<$m}SJ9Uu=x-_6tMaYrN(Bwnz z4@%HLVuuJG{eg54_8j`^P*1?)Z{50O4cG)^0*Q#!J?{8W%PuZ#Z>5&0`7ICiePx>LwSxPR3Q{&Y<6!95`^` z^e0$Q!4!gV?S#!`D?;>nt57f|2_LeyLKPbsW(2UuDPUA|142)3(1$m`S{Y6_WW{+R zJ3eV4>%c4 z6|A85mZks#v|V;BF5WW+W?%xDun)RQ63X@f$v{GoKze?u5PC_A-&P81CbZ(_)Fo#$YKFve(TKD~hZ22P7EXLA5jP`9B z>C(O41&!E)00I~)6xpZXh3qI3Tn5zA>#3!#*Lned>S}AP5VF>*#Y;>q)YHL5rvS2F z)VQCU-}wf&k{&S`z4ZjN)eD!8^KeSIz4bb%)D=xRZ_}+JVn2keua)=PxtEM~jAQsJ z0dk52nyWgV(t<+)9JF1bKjCd?J`Gj@cmf+68y;%RC#WyAJURe~Y=IYe!w;0ok)G7f z2t~#nvLWH8U5M5qe-q6V?RocBavM>4@fPGzq-jfG=V#`@#Gr77tazWpF_g9S%1lZh%s03uTf`Zw-fl`MR zxZ%E|_VXi+Xo?7o0{X=rI8P{JWEsQ4dNvt}3i&gjmi=*9LE}4Z!^O5SI+;4ETAG^E zyqktt?IEYB#avW{0PeZ&V@#XrPa{gMW~oJ=tzB9p>O|s{R%BfvMP{22%8})XW!y+q z8^iO1kfo7_?SnnkgFW1(YOJAlnVLG?L+ zAbUb}seoF417t_>w1C@<(UU>nuumjiSx_ zC~8z z<;c{m)mJ6);48Iy=Vpho03IFS;J8z5oO~j<{>>_l+ylQ?&<75tqEhq;EgI4fKwbLe zmz7o+b-T)JE?*nNk4^VHKhX0asTCVcd*&b2(G5>6uRE<6XlN@^V!gf1pbF8BJtXi^a_SD4M`4u_NR=J2J%-EJm(dwtN&10#ZZ9fX}C^*NknWB zR0*U+T;7|+`x=o3l}>_CjDS)xY~{|Sw)X|}_#u$@!sYPu6=VrtgcyXjHe1i36sTIf zopOUd3rG}Rkn6p2h$ovGZSGt5PC3jQyvEJqTGu}gW}p{5NFznkMbjuue$L7d`J|?$ z0lrbk^0f<{;gE=War&+r1A2he##@IAX7Mz|d8#JE{T{!Nj zxFurSckqS#s#Z6yE|@zPxv5}=*g^|*&h=`^BMa2DEQ$p934PgyBDP=NCW6Y-6uI+d z-wXGs*QZJ^EOvf^5o7ASsjha9I3G(y{PBrjt?gAn(ft>tFerzR!z& zq-H@oIGFy;gGgV-1*ugtaXqJHkKv*sd3a2{y(R1F>q!$GX~tqx8_N-bElhzIF=RU7 zdRcdIaq)KmhwQ3uwwB#hwY9b5_r$@i3$i~-f$ROpgFG&qRbyJ5mXwv1v#VLp@13W+ zQzo&Qw#t1~EYn#smhkH3tJv6Q z&|6gtp7wX}<<5wUvw_oTEIF9lZ?ArUKuAu- z?_Bce%S;tyrpzo4_4OGn(rEP{M&IP-3Pb$_H~(1vV>}gar7UAlwpyQD{9YRa*JF@OB{F|Vko>nZI3XU%2WT2J-;Cn|oY;LDL={qW(#Gk^TC&&Rc4yb;%Z^R2jwF6I5mDDlggzTts#$)Ki@B>4wO0Z16O4Q zW8^6myy{>Z_T(CWv5|2rc@(}_me0l-8ZExIoJph^iQ){cs zs$O+=F{X1$W7`gC5_mioV0xo2jDGp$)4#SWT$31&905(GGM^1^F%T?K>I-Am{a53* z>|nTi+iQ6~g#*mR{`w`GzrD!tLXHPI;H=<%c?z|Anvn efB7qZoEDafs+c)_brsf}K~YvsCg;kH2mb?p5&yOT literal 17208 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 vDTty6*8*Ps?bnZBX5?SL{-0fwo!z~4U2l%fw_b Date: Sun, 30 Aug 2009 18:30:29 +0000 Subject: [PATCH 0122/1000] buildbot: prevent DirectoryUpload failure when all tests pass svn path=/trunk/matplotlib/; revision=7605 --- test/_buildbot_test_postmortem.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/_buildbot_test_postmortem.py b/test/_buildbot_test_postmortem.py index dad9051d05b1..5a4c4b87ada6 100644 --- a/test/_buildbot_test_postmortem.py +++ b/test/_buildbot_test_postmortem.py @@ -75,6 +75,7 @@ def path_split_all(fname): if 1: if os.path.exists(target_dir): shutil.rmtree(target_dir) + os.makedirs( target_dir ) # prevent buildbot DirectoryUpload failure os.chdir('test') for fpath in get_recursive_filelist(roots): # only images From c7f90083dd492ea6b59a6123dc57a34c309e71df Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Sun, 30 Aug 2009 20:26:05 +0000 Subject: [PATCH 0123/1000] add TextPath class in text.py. Update demo_text_path.py svn path=/trunk/matplotlib/; revision=7606 --- examples/pylab_examples/demo_text_path.py | 174 +++++---------------- lib/matplotlib/text.py | 176 ++++++++++++++++++++++ 2 files changed, 216 insertions(+), 134 deletions(-) diff --git a/examples/pylab_examples/demo_text_path.py b/examples/pylab_examples/demo_text_path.py index e0ec0dbe2a05..65d37c4acd32 100644 --- a/examples/pylab_examples/demo_text_path.py +++ b/examples/pylab_examples/demo_text_path.py @@ -4,147 +4,54 @@ import matplotlib.pyplot as plt from matplotlib.image import BboxImage import numpy as np -from matplotlib.transforms import Affine2D, IdentityTransform +from matplotlib.transforms import IdentityTransform -import matplotlib.font_manager as font_manager -from matplotlib.ft2font import FT2Font, KERNING_DEFAULT, LOAD_NO_HINTING -from matplotlib.font_manager import FontProperties -from matplotlib.path import Path import matplotlib.patches as mpatches from matplotlib.offsetbox import AnnotationBbox,\ AnchoredOffsetbox, AuxTransformBox -#from matplotlib.offsetbox import - from matplotlib.cbook import get_sample_data +from matplotlib.text import TextPath -class TextPatch(mpatches.PathPatch): - - FONT_SCALE = 100. - - def __init__(self, xy, s, size=None, prop=None, bbox_image=None, - *kl, **kwargs): - if prop is None: - prop = FontProperties() - - if size is None: - size = prop.get_size_in_points() - - self._xy = xy - self.set_size(size) - self.text_path = self.text_get_path(prop, s) - - mpatches.PathPatch.__init__(self, self.text_path, *kl, **kwargs) +class PathClippedImagePatch(mpatches.PathPatch): + """ + The given image is used to draw the face of the patch. Internally, + it uses BboxImage whose clippath set to the path of the patch. + FIXME : The result is currently dpi dependent. + """ + def __init__(self, path, bbox_image, **kwargs): + mpatches.PathPatch.__init__(self, path, **kwargs) + self._facecolor = "none" self._init_bbox_image(bbox_image) - + def set_facecolor(self, color): + pass + def _init_bbox_image(self, im): - if im is None: - self.bbox_image = None - else: - bbox_image = BboxImage(self.get_window_extent, - norm = None, - origin=None, - ) - bbox_image.set_transform(IdentityTransform()) + bbox_image = BboxImage(self.get_window_extent, + norm = None, + origin=None, + ) + bbox_image.set_transform(IdentityTransform()) - bbox_image.set_data(im) - self.bbox_image = bbox_image + bbox_image.set_data(im) + self.bbox_image = bbox_image def draw(self, renderer=None): - if self.bbox_image is not None: - # the clip path must be updated every draw. any solution? -JJ - self.bbox_image.set_clip_path(self.text_path, self.get_transform()) - self.bbox_image.draw(renderer) + # the clip path must be updated every draw. any solution? -JJ + self.bbox_image.set_clip_path(self._path, self.get_transform()) + self.bbox_image.draw(renderer) mpatches.PathPatch.draw(self, renderer) - def set_size(self, size): - self._size = size - - def get_size(self): - return self._size - - def get_patch_transform(self): - tr = Affine2D().scale(self._size/self.FONT_SCALE, self._size/self.FONT_SCALE) - return tr.translate(*self._xy) - - def glyph_char_path(self, glyph, currx=0.): - - verts, codes = [], [] - for step in glyph.path: - if step[0] == 0: # MOVE_TO - verts.append((step[1], step[2])) - codes.append(Path.MOVETO) - elif step[0] == 1: # LINE_TO - verts.append((step[1], step[2])) - codes.append(Path.LINETO) - elif step[0] == 2: # CURVE3 - verts.extend([(step[1], step[2]), - (step[3], step[4])]) - codes.extend([Path.CURVE3, Path.CURVE3]) - elif step[0] == 3: # CURVE4 - verts.extend([(step[1], step[2]), - (step[3], step[4]), - (step[5], step[6])]) - codes.extend([Path.CURVE4, Path.CURVE4, Path.CURVE4]) - elif step[0] == 4: # ENDPOLY - verts.append((0, 0,)) - codes.append(Path.CLOSEPOLY) - - verts = [(x+currx, y) for (x,y) in verts] - - return verts, codes - - - def text_get_path(self, prop, s): - - fname = font_manager.findfont(prop) - font = FT2Font(str(fname)) - - font.set_size(self.FONT_SCALE, 72) - - cmap = font.get_charmap() - lastgind = None - - currx = 0 - - verts, codes = [], [] - - for c in s: - - ccode = ord(c) - gind = cmap.get(ccode) - if gind is None: - ccode = ord('?') - gind = 0 - glyph = font.load_char(ccode, flags=LOAD_NO_HINTING) - - - if lastgind is not None: - kern = font.get_kerning(lastgind, gind, KERNING_DEFAULT) - else: - kern = 0 - currx += (kern / 64.0) #/ (self.FONT_SCALE) - - verts1, codes1 = self.glyph_char_path(glyph, currx) - verts.extend(verts1) - codes.extend(codes1) - - - currx += (glyph.linearHoriAdvance / 65536.0) #/ (self.FONT_SCALE) - lastgind = gind - - return Path(verts, codes) - if 1: fig = plt.figure(1) @@ -156,10 +63,12 @@ def text_get_path(self, prop, s): from matplotlib._png import read_png fn = get_sample_data("lena.png", asfileobj=False) arr = read_png(fn) - p = TextPatch((0, 0), "!?", size=150, fc="none", ec="k", - bbox_image=arr, - transform=IdentityTransform()) - p.set_clip_on(False) + + text_path = TextPath((0, 0), "!?", size=150) + p = PathClippedImagePatch(text_path, arr, ec="k", + transform=IdentityTransform()) + + #p.set_clip_on(False) # make offset box offsetbox = AuxTransformBox(IdentityTransform()) @@ -176,21 +85,21 @@ def text_get_path(self, prop, s): ax = plt.subplot(212) - shadow1 = TextPatch((3, -2), "TextPath", size=70, fc="none", ec="0.6", lw=3, - transform=IdentityTransform()) - shadow2 = TextPatch((3, -2), "TextPath", size=70, fc="0.3", ec="none", - transform=IdentityTransform()) - arr = np.arange(256).reshape(1,256)/256. - text_path = TextPatch((0, 0), "TextPath", size=70, fc="none", ec="none", lw=1, - bbox_image=arr, - transform=IdentityTransform()) + + text_path = TextPath((0, 0), "TextPath", size=70) + text_patch = PathClippedImagePatch(text_path, arr, ec="none", + transform=IdentityTransform()) + + shadow1 = mpatches.Shadow(text_patch, 3, -2, props=dict(fc="none", ec="0.6", lw=3)) + shadow2 = mpatches.Shadow(text_patch, 3, -2, props=dict(fc="0.3", ec="none")) + # make offset box offsetbox = AuxTransformBox(IdentityTransform()) offsetbox.add_artist(shadow1) offsetbox.add_artist(shadow2) - offsetbox.add_artist(text_path) + offsetbox.add_artist(text_patch) # place the anchored offset box using AnnotationBbox ab = AnnotationBbox(offsetbox, (0.5, 0.5), @@ -198,7 +107,7 @@ def text_get_path(self, prop, s): boxcoords="offset points", box_alignment=(0.5,0.5), ) - + #text_path.set_size(10) ax.add_artist(ab) @@ -206,8 +115,5 @@ def text_get_path(self, prop, s): ax.set_ylim(0, 1) - - - plt.draw() plt.show() diff --git a/lib/matplotlib/text.py b/lib/matplotlib/text.py index c8f1ae3951c2..eb21d2a84bd5 100644 --- a/lib/matplotlib/text.py +++ b/lib/matplotlib/text.py @@ -23,6 +23,11 @@ import matplotlib.nxutils as nxutils +from matplotlib.path import Path +import matplotlib.font_manager as font_manager +from matplotlib.ft2font import FT2Font, KERNING_DEFAULT, LOAD_NO_HINTING + + def _process_text_args(override, fontdict=None, **kwargs): "Return an override dict. See :func:`~pyplot.text' docstring for info" @@ -1764,3 +1769,174 @@ def draw(self, renderer): docstring.interpd.update(Annotation=Annotation.__init__.__doc__) + +class TextPath(Path): + """ + Create a path from the text. + """ + + # TODO : math text is currently not supported, but it would not be easy. + + FONT_SCALE = 100. + + def __init__(self, xy, s, size=None, prop=None, + _interpolation_steps=1, + *kl, **kwargs): + """ + Create a path from the text. No support for TeX yet. Note that + it simply is a path, not an artist. You need to use the + PathPatch (or other artists) to draw this path onto the + canvas. + + xy : position of the text. + s : text + size : font size + prop : font property + """ + + + if prop is None: + prop = FontProperties() + + if size is None: + size = prop.get_size_in_points() + + + self._xy = xy + self.set_size(size) + + self._cached_vertices = None + + self._vertices, self._codes = self.text_get_vertices_codes(prop, s) + + self.should_simplify = False + self.simplify_threshold = rcParams['path.simplify_threshold'] + self.has_nonfinite = False + self._interpolation_steps = _interpolation_steps + + + def set_size(self, size): + """ + set the size of the text + """ + self._size = size + self._invalid = True + + def get_size(self): + """ + get the size of the text + """ + return self._size + + def _get_vertices(self): + """ + Return the cached path after updating it if necessary. + """ + self._revalidate_path() + return self._cached_vertices + + def _get_codes(self): + """ + Return the codes + """ + return self._codes + + vertices = property(_get_vertices) + codes = property(_get_codes) + + def _revalidate_path(self): + """ + update the path if necessary. + + The path for the text is initially create with the font size + of FONT_SCALE, and this path is rescaled to other size when + necessary. + + """ + if self._invalid or \ + (self._cached_vertices is None): + tr = Affine2D().scale(self._size/self.FONT_SCALE, + self._size/self.FONT_SCALE).translate(*self._xy) + self._cached_vertices = tr.transform(self._vertices) + self._invalid = False + + + def glyph_char_path(self, glyph, currx=0.): + """ + convert the glyph to vertices and codes. Mostly copied from + backend_svg.py. + """ + verts, codes = [], [] + for step in glyph.path: + if step[0] == 0: # MOVE_TO + verts.append((step[1], step[2])) + codes.append(Path.MOVETO) + elif step[0] == 1: # LINE_TO + verts.append((step[1], step[2])) + codes.append(Path.LINETO) + elif step[0] == 2: # CURVE3 + verts.extend([(step[1], step[2]), + (step[3], step[4])]) + codes.extend([Path.CURVE3, Path.CURVE3]) + elif step[0] == 3: # CURVE4 + verts.extend([(step[1], step[2]), + (step[3], step[4]), + (step[5], step[6])]) + codes.extend([Path.CURVE4, Path.CURVE4, Path.CURVE4]) + elif step[0] == 4: # ENDPOLY + verts.append((0, 0,)) + codes.append(Path.CLOSEPOLY) + + verts = [(x+currx, y) for (x,y) in verts] + + return verts, codes + + + def text_get_vertices_codes(self, prop, s): + """ + convert the string *s* to vertices and codes using the + provided font property *prop*. Mostly copied from + backend_svg.py. + """ + + fname = font_manager.findfont(prop) + font = FT2Font(str(fname)) + + font.set_size(self.FONT_SCALE, 72) + + cmap = font.get_charmap() + lastgind = None + + currx = 0 + + verts, codes = [], [] + + + # I'm not sure if I get kernings right. Needs to be verified. -JJL + + for c in s: + + ccode = ord(c) + gind = cmap.get(ccode) + if gind is None: + ccode = ord('?') + gind = 0 + glyph = font.load_char(ccode, flags=LOAD_NO_HINTING) + + + if lastgind is not None: + kern = font.get_kerning(lastgind, gind, KERNING_DEFAULT) + else: + kern = 0 + currx += (kern / 64.0) #/ (self.FONT_SCALE) + + verts1, codes1 = self.glyph_char_path(glyph, currx) + verts.extend(verts1) + codes.extend(codes1) + + + currx += (glyph.linearHoriAdvance / 65536.0) #/ (self.FONT_SCALE) + lastgind = gind + + return verts, codes + From b8ebabea2181df68e1973150639eab66420dc331 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Mon, 31 Aug 2009 00:38:43 +0000 Subject: [PATCH 0124/1000] Merged revisions 7607 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7607 | leejjoon | 2009-08-30 20:32:12 -0400 (Sun, 30 Aug 2009) | 1 line fix sf bug #2839919 ........ svn path=/trunk/matplotlib/; revision=7608 --- lib/matplotlib/legend.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/legend.py b/lib/matplotlib/legend.py index 64764c7acfa9..401ad8785513 100644 --- a/lib/matplotlib/legend.py +++ b/lib/matplotlib/legend.py @@ -591,8 +591,9 @@ def _init_legend_box(self, handles, labels): # We calculate number of lows in each column. The first # (num_largecol) columns will have (nrows+1) rows, and remaing # (num_smallcol) columns will have (nrows) rows. - nrows, num_largecol = divmod(len(handleboxes), self._ncol) - num_smallcol = self._ncol-num_largecol + ncol = min(self._ncol, len(handleboxes)) + nrows, num_largecol = divmod(len(handleboxes), ncol) + num_smallcol = ncol-num_largecol # starting index of each column and number of rows in it. largecol = safezip(range(0, num_largecol*(nrows+1), (nrows+1)), @@ -860,3 +861,4 @@ def _find_best_position(self, width, height, renderer, consider=None): return ox, oy + From 84707ed1e8e941e38846bf1425a87cae2d43065b Mon Sep 17 00:00:00 2001 From: John Hunter Date: Mon, 31 Aug 2009 02:33:21 +0000 Subject: [PATCH 0125/1000] update make.osx to find the local freetype etc svn path=/trunk/matplotlib/; revision=7609 --- lib/matplotlib/backends/backend_agg.py | 4 ++-- make.osx | 15 ++++++++------- 2 files changed, 10 insertions(+), 9 deletions(-) diff --git a/lib/matplotlib/backends/backend_agg.py b/lib/matplotlib/backends/backend_agg.py index a694b9a7b24b..7a26a2852939 100644 --- a/lib/matplotlib/backends/backend_agg.py +++ b/lib/matplotlib/backends/backend_agg.py @@ -140,8 +140,8 @@ def draw_text(self, gc, x, y, s, prop, angle, ismath): # space) in the following call to draw_text_image). font.set_text(s, 0, flags=LOAD_FORCE_AUTOHINT) font.draw_glyphs_to_bitmap() - - #print x, y, int(x), int(y) + + #print x, y, int(x), int(y), s self._renderer.draw_text_image(font.get_image(), int(x), int(y) + 1, angle, gc) diff --git a/make.osx b/make.osx index 0e1da02bbd84..11070586fee0 100644 --- a/make.osx +++ b/make.osx @@ -10,10 +10,7 @@ MACOSX_DEPLOYMENT_TARGET=10.4 ## You shouldn't need to configure past this point -CFLAGS="-Os -arch ppc -arch i386 -I{$PREFIX}/include" - -LDFLAGS="-arch ppc -arch i386 -L${PREFIX}/lib" - +PKG_CONFIG_PATH="${PREFIX}/lib/pkgconfig" CFLAGS_DEPS="-arch i386 -arch ppc -I${PREFIX}/include -I${PREFIX}/include/freetype2 -isysroot /Developer/SDKs/MacOSX10.4u.sdk" LDFLAGS_DEPS="-arch i386 -arch ppc -L${PREFIX}/lib -syslibroot,/Developer/SDKs/MacOSX10.4u.sdk" @@ -32,7 +29,7 @@ fetch: zlib: - unset PKG_CONFIG_PATH &&\ + export PKG_CONFIG_PATH=${PKG_CONFIG_PATH} &&\ rm -rf zlib-${ZLIBVERSION} &&\ tar xvfz zlib-${ZLIBVERSION}.tar.gz &&\ cd zlib-${ZLIBVERSION} &&\ @@ -44,7 +41,7 @@ zlib: unset MACOSX_DEPLOYMENT_TARGET png: zlib - unset PKG_CONFIG_PATH &&\ + export PKG_CONFIG_PATH=${PKG_CONFIG_PATH} &&\ rm -rf libpng-${PNGVERSION} &&\ tar xvfj libpng-${PNGVERSION}.tar.bz2 cd libpng-${PNGVERSION} &&\ @@ -58,7 +55,7 @@ png: zlib freetype: zlib - unset PKG_CONFIG_PATH &&\ + export PKG_CONFIG_PATH=${PKG_CONFIG_PATH} &&\ rm -rf ${FREETYPEVERSION} &&\ tar xvfj freetype-${FREETYPEVERSION}.tar.bz2 &&\ cd freetype-${FREETYPEVERSION} &&\ @@ -75,13 +72,17 @@ deps: zlib png freetype echo 'all done' mpl_build: + export PKG_CONFIG_PATH=${PKG_CONFIG_PATH} &&\ export MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} &&\ export CFLAGS=${CFLAGS_DEPS} &&\ export LDFLAGS=${LDFLAGS_DEPS} &&\ python setup.py build mpl_install: + export PKG_CONFIG_PATH=${PKG_CONFIG_PATH} &&\ export MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} &&\ export CFLAGS=${CFLAGS_DEPS} &&\ export LDFLAGS=${LDFLAGS_DEPS} &&\ + export LD_LIBRARY_PATH=${PREFIX}/lib &&\ + export DYLD_LIBRARY_PATH=${PREFIX}/lib &&\ python setup.py install --prefix=${PREFIX} From ef62147ca9dec1e3c2ac6b113d61d4b8732cb7bd Mon Sep 17 00:00:00 2001 From: John Hunter Date: Mon, 31 Aug 2009 02:42:44 +0000 Subject: [PATCH 0126/1000] make the buildbot point to devbb svn path=/trunk/matplotlib/; revision=7610 --- test/_buildbot_mac_sage.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/test/_buildbot_mac_sage.sh b/test/_buildbot_mac_sage.sh index 9bccfe1db56e..36a91e681d1a 100755 --- a/test/_buildbot_mac_sage.sh +++ b/test/_buildbot_mac_sage.sh @@ -3,6 +3,7 @@ set -e rm -rf ${HOME}/.matplotlib/* rm -rf build +export PATH=${HOME}/dev/bin:$PATH export PYTHON=${HOME}/dev/bin/python export PREFIX=${HOME}/devbb export PYTHONPATH=${PREFIX}/lib/python2.6/site-packages:${HOME}/dev/lib/python2.6/site-packages From 9166b9f234f3bee12a56f9bd57e7a5e3d9f31250 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Mon, 31 Aug 2009 02:48:42 +0000 Subject: [PATCH 0127/1000] update known good baselines using freetype 2.3.5 svn path=/trunk/matplotlib/; revision=7611 --- .../baseline/TestAxes/empty_datetime.png | Bin 16763 -> 16866 bytes .../TestTickers/RRuleLocator_bounds.png | Bin 24174 -> 22174 bytes .../baseline/TestAnnotation/offset_points.png | Bin 22661 -> 22680 bytes .../baseline/TestFill/fill_units.png | Bin 58097 -> 58326 bytes .../test_plots/baseline/TestPlot/const_xy.png | Bin 30234 -> 30220 bytes .../baseline/TestPlot/shaped_data.png | Bin 32888 -> 32896 bytes .../baseline/TestPlot/single_date.png | Bin 25053 -> 26302 bytes 7 files changed, 0 insertions(+), 0 deletions(-) diff --git a/test/test_matplotlib/baseline/TestAxes/empty_datetime.png b/test/test_matplotlib/baseline/TestAxes/empty_datetime.png index e9fa1bf1ed41075ac629ab835e46fbe48146183d..7fd243a6f363a71ae4fec815c08be01b51d7cef7 100644 GIT binary patch literal 16866 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 c)`7b1!g0^F#Ub`g!j^_wy|SMS{aKhN_R`v3p{ literal 16763 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 diff --git a/test/test_matplotlib/baseline/TestTickers/RRuleLocator_bounds.png b/test/test_matplotlib/baseline/TestTickers/RRuleLocator_bounds.png index 986d4045a8890a7af479396ca608b2aeda1ab204..6667a5bea6c69de331af3c72b64c842892172999 100644 GIT binary patch literal 22174 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 literal 24174 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 diff --git a/test/test_plots/baseline/TestFill/fill_units.png b/test/test_plots/baseline/TestFill/fill_units.png index 6af42951b65df9962f83a09632a4ed9e042e30af..e79731f634edec43517ad6bea47a0c80e4c84476 100644 GIT binary patch literal 58326 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

    WJ$>^iaTAeS9GTC0ev!02jwbt)Ga0t8SP$%Sfa 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 CD1WX1 diff --git a/test/test_plots/baseline/TestPlot/const_xy.png b/test/test_plots/baseline/TestPlot/const_xy.png index bac903f6a7aa13bf18d042a943e8c58a8586235d..350cc0de9e10bde9cb840ab0ecfca53b3592a451 100644 GIT binary patch literal 30220 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 iU1t6N!T{ece(xDMP=EWf_G+p{E`@tVE$K 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 CPe025 literal 32888 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’d}MoGR7=BW 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 literal 25053 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 From 01a6186f183f9236b08f3329e6ec9239c3244cfb Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 31 Aug 2009 04:46:55 +0000 Subject: [PATCH 0128/1000] buildbot: force error to test reporting abilities svn path=/trunk/matplotlib/; revision=7612 --- test/test_matplotlib/TestAxes.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/test/test_matplotlib/TestAxes.py b/test/test_matplotlib/TestAxes.py index e2edd5555101..142cc30da132 100644 --- a/test/test_matplotlib/TestAxes.py +++ b/test/test_matplotlib/TestAxes.py @@ -45,6 +45,8 @@ def tearDown( self ): #-------------------------------------------------------------------- def test_empty_datetime( self ): """Test plotting empty axes with dates along one axis.""" + if 1: + raise RuntimeError('error forced to test buildbot error reporting') fname = self.outFile( "empty_datetime.png" ) t0 = datetime(2009, 1, 20) From 74afc2ec590b12345cd89c5c3f428e84bfde6331 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 31 Aug 2009 05:23:37 +0000 Subject: [PATCH 0129/1000] buildbot: removed forced error svn path=/trunk/matplotlib/; revision=7613 --- test/test_matplotlib/TestAxes.py | 2 -- 1 file changed, 2 deletions(-) diff --git a/test/test_matplotlib/TestAxes.py b/test/test_matplotlib/TestAxes.py index 142cc30da132..e2edd5555101 100644 --- a/test/test_matplotlib/TestAxes.py +++ b/test/test_matplotlib/TestAxes.py @@ -45,8 +45,6 @@ def tearDown( self ): #-------------------------------------------------------------------- def test_empty_datetime( self ): """Test plotting empty axes with dates along one axis.""" - if 1: - raise RuntimeError('error forced to test buildbot error reporting') fname = self.outFile( "empty_datetime.png" ) t0 = datetime(2009, 1, 20) From a05498785f3701eee42bbf0bdb5f09604e758256 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 31 Aug 2009 15:31:46 +0000 Subject: [PATCH 0130/1000] [2832896] raster scale error in PDF, EPS output svn path=/trunk/matplotlib/; revision=7614 --- lib/matplotlib/backends/backend_agg.py | 2 +- lib/matplotlib/image.py | 8 +++----- src/_backend_agg.cpp | 4 ++-- 3 files changed, 6 insertions(+), 8 deletions(-) diff --git a/lib/matplotlib/backends/backend_agg.py b/lib/matplotlib/backends/backend_agg.py index 7a26a2852939..809763932e80 100644 --- a/lib/matplotlib/backends/backend_agg.py +++ b/lib/matplotlib/backends/backend_agg.py @@ -140,7 +140,7 @@ def draw_text(self, gc, x, y, s, prop, angle, ismath): # space) in the following call to draw_text_image). font.set_text(s, 0, flags=LOAD_FORCE_AUTOHINT) font.draw_glyphs_to_bitmap() - + #print x, y, int(x), int(y), s self._renderer.draw_text_image(font.get_image(), int(x), int(y) + 1, angle, gc) diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index 35f1b435318c..6769e408554f 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -141,7 +141,7 @@ def draw(self, renderer, *args, **kwargs): gc = renderer.new_gc() gc.set_clip_rectangle(self.axes.bbox.frozen()) gc.set_clip_path(self.get_clip_path()) - renderer.draw_image(gc, round(l), round(b), im) + renderer.draw_image(gc, l, b, im) def contains(self, mouseevent): """ @@ -421,10 +421,8 @@ def make_image(self, magnification=1.0): ty = (ymin-self.axes.viewLim.y0)/dyintv * numrows l, b, r, t = self.axes.bbox.extents - widthDisplay = (round(r) + 0.5) - (round(l) - 0.5) - heightDisplay = (round(t) + 0.5) - (round(b) - 0.5) - widthDisplay *= magnification - heightDisplay *= magnification + widthDisplay = (round(r*magnification) + 0.5) - (round(l*magnification) - 0.5) + heightDisplay = (round(t*magnification) + 0.5) - (round(b*magnification) - 0.5) im.apply_translation(tx, ty) # resize viewport to display diff --git a/src/_backend_agg.cpp b/src/_backend_agg.cpp index 6285a245e11a..b8c956d163cb 100644 --- a/src/_backend_agg.cpp +++ b/src/_backend_agg.cpp @@ -803,8 +803,8 @@ RendererAgg::draw_image(const Py::Tuple& args) { args.verify_length(4); GCAgg gc(args[0], dpi); - double x = Py::Float(args[1]); - double y = Py::Float(args[2]); + double x = mpl_round(Py::Float(args[1])); + double y = mpl_round(Py::Float(args[2])); Image *image = static_cast(args[3].ptr()); bool has_clippath = false; From 19e9bd9f80f56ccb8bd1edfc3f721e8f1555a40d Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 31 Aug 2009 16:48:46 +0000 Subject: [PATCH 0131/1000] buildbot: allow passing arguments to select virtualenv and nose This is useful for getting the buildbot to run Python2.4. svn path=/trunk/matplotlib/; revision=7615 --- test/_buildbot_install.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/test/_buildbot_install.py b/test/_buildbot_install.py index 8403e386935a..609ab186d368 100644 --- a/test/_buildbot_install.py +++ b/test/_buildbot_install.py @@ -2,9 +2,21 @@ faciltate testing.""" import shutil, os, sys from subprocess import Popen, PIPE, STDOUT +from optparse import OptionParser from _buildbot_util import check_call +usage = """%prog [options]""" +parser = OptionParser(usage) +parser.add_option('--virtualenv',type='string',default='virtualenv', + help='string to invoke virtualenv') +parser.add_option('--easy-install-nose',action='store_true',default=False, + help='run "easy_install nose" in the virtualenv') +(options, args) = parser.parse_args() +if len(args)!=0: + parser.print_help() + sys.exit(0) + TARGET='PYmpl' if os.path.exists(TARGET): @@ -15,6 +27,10 @@ if os.path.exists(build_path): shutil.rmtree(build_path) -check_call('virtualenv %s'%(TARGET,)) +check_call('%s %s'%(options.virtualenv,TARGET)) TARGET_py = os.path.join(TARGET,'bin','python') +TARGET_easy_install = os.path.join(TARGET,'bin','easy_install') + +if options.easy_install_nose: + check_call('%s nose'%TARGET_easy_install) check_call('%s setup.py install'%TARGET_py) From cf3a22e0799ea43b60ea1fd07c64798a56ad5658 Mon Sep 17 00:00:00 2001 From: Ryan May Date: Mon, 31 Aug 2009 17:42:37 +0000 Subject: [PATCH 0132/1000] Merged revisions 7616-7618 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7616 | ryanmay | 2009-08-31 12:27:12 -0500 (Mon, 31 Aug 2009) | 1 line Update barb_demo.py with an example using masked arrays. ........ r7617 | ryanmay | 2009-08-31 12:29:41 -0500 (Mon, 31 Aug 2009) | 1 line Pull _parse_args out of Quiver and Barbs classes, as we have multiple, diverging copies of the same code. Now the shared code will actually be shared. ........ r7618 | ryanmay | 2009-08-31 12:34:50 -0500 (Mon, 31 Aug 2009) | 1 line Use atleast_1d instead of asanyarray. This allows passing in scalars to quiver/barbs. ........ svn path=/trunk/matplotlib/; revision=7619 --- examples/pylab_examples/barb_demo.py | 13 ++++- lib/matplotlib/quiver.py | 73 +++++++++++----------------- 2 files changed, 41 insertions(+), 45 deletions(-) diff --git a/examples/pylab_examples/barb_demo.py b/examples/pylab_examples/barb_demo.py index ecbdd95f7e2f..71e948fbdf9e 100644 --- a/examples/pylab_examples/barb_demo.py +++ b/examples/pylab_examples/barb_demo.py @@ -28,7 +28,7 @@ ax.barbs(data['x'], data['y'], data['u'], data['v'], length=8, pivot='middle') #Showing colormapping with uniform grid. Fill the circle for an empty barb, -#don't round the values, and change some of the size parameters +#don't round the values, and change some of the size parameters ax = plt.subplot(2,2,3) ax.barbs(X, Y, U, V, np.sqrt(U*U + V*V), fill_empty=True, rounding=False, sizes=dict(emptybarb=0.25, spacing=0.2, height=0.3)) @@ -39,4 +39,15 @@ barbcolor=['b','g'], barb_increments=dict(half=10, full=20, flag=100), flip_barb=True) +#Masked arrays are also supported +masked_u = np.ma.masked_array(data['u']) +masked_u[4] = 1000 #Bad value that should not be plotted when masked +masked_u[4] = np.ma.masked + +#Identical plot to panel 2 in the first figure, but with the point at +#(0.5, 0.25) missing (masked) +fig2 = plt.figure() +ax = fig2.add_subplot(1, 1, 1) +ax.barbs(data['x'], data['y'], masked_u, data['v'], length=8, pivot='middle') + plt.show() diff --git a/lib/matplotlib/quiver.py b/lib/matplotlib/quiver.py index c9d9c8474b7e..c1eabaeef124 100644 --- a/lib/matplotlib/quiver.py +++ b/lib/matplotlib/quiver.py @@ -325,6 +325,33 @@ def contains(self, mouseevent): quiverkey_doc = _quiverkey_doc +# This is a helper function that parses out the various combination of +# arguments for doing colored vector plots. Pulling it out here +# allows both Quiver and Barbs to use it +def _parse_args(*args): + X, Y, U, V, C = [None]*5 + args = list(args) + + # The use of atleast_1d allows for handling scalar arguments while also + # keeping masked arrays + if len(args) == 3 or len(args) == 5: + C = np.atleast_1d(args.pop(-1)) + V = np.atleast_1d(args.pop(-1)) + U = np.atleast_1d(args.pop(-1)) + if U.ndim == 1: + nr, nc = 1, U.shape[0] + else: + nr, nc = U.shape + if len(args) == 2: # remaining after removing U,V,C + X, Y = [np.array(a).ravel() for a in args] + if len(X) == nc and len(Y) == nr: + X, Y = [a.ravel() for a in np.meshgrid(X, Y)] + else: + indexgrid = np.meshgrid(np.arange(nc), np.arange(nr)) + X, Y = [np.ravel(a) for a in indexgrid] + return X, Y, U, V, C + + class Quiver(collections.PolyCollection): """ Specialized PolyCollection for arrows. @@ -351,7 +378,7 @@ def __init__(self, ax, *args, **kw): by the following pylab interface documentation: %s""" self.ax = ax - X, Y, U, V, C = self._parse_args(*args) + X, Y, U, V, C = _parse_args(*args) self.X = X self.Y = Y self.XY = np.hstack((X[:,np.newaxis], Y[:,np.newaxis])) @@ -390,26 +417,6 @@ def on_dpi_change(fig): self.ax.figure.callbacks.connect('dpi_changed', on_dpi_change) - def _parse_args(self, *args): - X, Y, U, V, C = [None]*5 - args = list(args) - if len(args) == 3 or len(args) == 5: - C = np.asanyarray(args.pop(-1)) - V = np.asanyarray(args.pop(-1)) - U = np.asanyarray(args.pop(-1)) - if U.ndim == 1: - nr, nc = 1, U.shape[0] - else: - nr, nc = U.shape - if len(args) == 2: # remaining after removing U,V,C - X, Y = [np.array(a).ravel() for a in args] - if len(X) == nc and len(Y) == nr: - X, Y = [a.ravel() for a in np.meshgrid(X, Y)] - else: - indexgrid = np.meshgrid(np.arange(nc), np.arange(nr)) - X, Y = [np.ravel(a) for a in indexgrid] - return X, Y, U, V, C - def _init(self): """initialization delayed until first draw; allow time for axes setup. @@ -762,7 +769,7 @@ def __init__(self, ax, *args, **kw): kw['facecolors'] = flagcolor #Parse out the data arrays from the various configurations supported - x, y, u, v, c = self._parse_args(*args) + x, y, u, v, c = _parse_args(*args) self.x = x self.y = y xy = np.hstack((x[:,np.newaxis], y[:,np.newaxis])) @@ -942,28 +949,6 @@ def _make_barbs(self, u, v, nflags, nbarbs, half_barb, empty_flag, length, return barb_list - #Taken shamelessly from Quiver - def _parse_args(self, *args): - X, Y, U, V, C = [None]*5 - args = list(args) - if len(args) == 3 or len(args) == 5: - C = ma.masked_invalid(args.pop(-1), copy=False).ravel() - V = ma.masked_invalid(args.pop(-1), copy=False) - U = ma.masked_invalid(args.pop(-1), copy=False) - nn = np.shape(U) - nc = nn[0] - nr = 1 - if len(nn) > 1: - nr = nn[1] - if len(args) == 2: # remaining after removing U,V,C - X, Y = [np.array(a).ravel() for a in args] - if len(X) == nc and len(Y) == nr: - X, Y = [a.ravel() for a in np.meshgrid(X, Y)] - else: - indexgrid = np.meshgrid(np.arange(nc), np.arange(nr)) - X, Y = [np.ravel(a) for a in indexgrid] - return X, Y, U, V, C - def set_UVC(self, U, V, C=None): self.u = ma.masked_invalid(U, copy=False).ravel() self.v = ma.masked_invalid(V, copy=False).ravel() From 670ec856cd2388591b89e005f200f07ea7eefb3c Mon Sep 17 00:00:00 2001 From: Reinier Heeres Date: Mon, 31 Aug 2009 19:50:13 +0000 Subject: [PATCH 0133/1000] Colormap work: - Simplify data for existing colormaps - Add a few colormaps - Allow setting of gamma - Allow using functions svn path=/trunk/matplotlib/; revision=7620 --- lib/matplotlib/_cm.py | 4770 +++----------------------------------- lib/matplotlib/cm.py | 27 +- lib/matplotlib/colors.py | 49 +- 3 files changed, 323 insertions(+), 4523 deletions(-) diff --git a/lib/matplotlib/_cm.py b/lib/matplotlib/_cm.py index 449e638db061..885a9f8bee2f 100644 --- a/lib/matplotlib/_cm.py +++ b/lib/matplotlib/_cm.py @@ -4,6 +4,8 @@ """ +import numpy as np + _binary_data = { 'red' : ((0., 1., 1.), (1., 0., 0.)), 'green': ((0., 1., 1.), (1., 0., 0.)), @@ -32,95 +34,114 @@ 'green': ((0., 0., 0.),(1.0, 0.7812, 0.7812)), 'blue': ((0., 0., 0.),(1.0, 0.4975, 0.4975))} -_flag_data = {'red': ((0., 1., 1.),(0.015873, 1.000000, 1.000000), - (0.031746, 0.000000, 0.000000),(0.047619, 0.000000, 0.000000), - (0.063492, 1.000000, 1.000000),(0.079365, 1.000000, 1.000000), - (0.095238, 0.000000, 0.000000),(0.111111, 0.000000, 0.000000), - (0.126984, 1.000000, 1.000000),(0.142857, 1.000000, 1.000000), - (0.158730, 0.000000, 0.000000),(0.174603, 0.000000, 0.000000), - (0.190476, 1.000000, 1.000000),(0.206349, 1.000000, 1.000000), - (0.222222, 0.000000, 0.000000),(0.238095, 0.000000, 0.000000), - (0.253968, 1.000000, 1.000000),(0.269841, 1.000000, 1.000000), - (0.285714, 0.000000, 0.000000),(0.301587, 0.000000, 0.000000), - (0.317460, 1.000000, 1.000000),(0.333333, 1.000000, 1.000000), - (0.349206, 0.000000, 0.000000),(0.365079, 0.000000, 0.000000), - (0.380952, 1.000000, 1.000000),(0.396825, 1.000000, 1.000000), - (0.412698, 0.000000, 0.000000),(0.428571, 0.000000, 0.000000), - (0.444444, 1.000000, 1.000000),(0.460317, 1.000000, 1.000000), - (0.476190, 0.000000, 0.000000),(0.492063, 0.000000, 0.000000), - (0.507937, 1.000000, 1.000000),(0.523810, 1.000000, 1.000000), - (0.539683, 0.000000, 0.000000),(0.555556, 0.000000, 0.000000), - (0.571429, 1.000000, 1.000000),(0.587302, 1.000000, 1.000000), - (0.603175, 0.000000, 0.000000),(0.619048, 0.000000, 0.000000), - (0.634921, 1.000000, 1.000000),(0.650794, 1.000000, 1.000000), - (0.666667, 0.000000, 0.000000),(0.682540, 0.000000, 0.000000), - (0.698413, 1.000000, 1.000000),(0.714286, 1.000000, 1.000000), - (0.730159, 0.000000, 0.000000),(0.746032, 0.000000, 0.000000), - (0.761905, 1.000000, 1.000000),(0.777778, 1.000000, 1.000000), - (0.793651, 0.000000, 0.000000),(0.809524, 0.000000, 0.000000), - (0.825397, 1.000000, 1.000000),(0.841270, 1.000000, 1.000000), - (0.857143, 0.000000, 0.000000),(0.873016, 0.000000, 0.000000), - (0.888889, 1.000000, 1.000000),(0.904762, 1.000000, 1.000000), - (0.920635, 0.000000, 0.000000),(0.936508, 0.000000, 0.000000), - (0.952381, 1.000000, 1.000000),(0.968254, 1.000000, 1.000000), - (0.984127, 0.000000, 0.000000),(1.0, 0., 0.)), - 'green': ((0., 0., 0.),(0.015873, 1.000000, 1.000000), - (0.031746, 0.000000, 0.000000),(0.063492, 0.000000, 0.000000), - (0.079365, 1.000000, 1.000000),(0.095238, 0.000000, 0.000000), - (0.126984, 0.000000, 0.000000),(0.142857, 1.000000, 1.000000), - (0.158730, 0.000000, 0.000000),(0.190476, 0.000000, 0.000000), - (0.206349, 1.000000, 1.000000),(0.222222, 0.000000, 0.000000), - (0.253968, 0.000000, 0.000000),(0.269841, 1.000000, 1.000000), - (0.285714, 0.000000, 0.000000),(0.317460, 0.000000, 0.000000), - (0.333333, 1.000000, 1.000000),(0.349206, 0.000000, 0.000000), - (0.380952, 0.000000, 0.000000),(0.396825, 1.000000, 1.000000), - (0.412698, 0.000000, 0.000000),(0.444444, 0.000000, 0.000000), - (0.460317, 1.000000, 1.000000),(0.476190, 0.000000, 0.000000), - (0.507937, 0.000000, 0.000000),(0.523810, 1.000000, 1.000000), - (0.539683, 0.000000, 0.000000),(0.571429, 0.000000, 0.000000), - (0.587302, 1.000000, 1.000000),(0.603175, 0.000000, 0.000000), - (0.634921, 0.000000, 0.000000),(0.650794, 1.000000, 1.000000), - (0.666667, 0.000000, 0.000000),(0.698413, 0.000000, 0.000000), - (0.714286, 1.000000, 1.000000),(0.730159, 0.000000, 0.000000), - (0.761905, 0.000000, 0.000000),(0.777778, 1.000000, 1.000000), - (0.793651, 0.000000, 0.000000),(0.825397, 0.000000, 0.000000), - (0.841270, 1.000000, 1.000000),(0.857143, 0.000000, 0.000000), - (0.888889, 0.000000, 0.000000),(0.904762, 1.000000, 1.000000), - (0.920635, 0.000000, 0.000000),(0.952381, 0.000000, 0.000000), - (0.968254, 1.000000, 1.000000),(0.984127, 0.000000, 0.000000), - (1.0, 0., 0.)), - 'blue': ((0., 0., 0.),(0.015873, 1.000000, 1.000000), - (0.031746, 1.000000, 1.000000),(0.047619, 0.000000, 0.000000), - (0.063492, 0.000000, 0.000000),(0.079365, 1.000000, 1.000000), - (0.095238, 1.000000, 1.000000),(0.111111, 0.000000, 0.000000), - (0.126984, 0.000000, 0.000000),(0.142857, 1.000000, 1.000000), - (0.158730, 1.000000, 1.000000),(0.174603, 0.000000, 0.000000), - (0.190476, 0.000000, 0.000000),(0.206349, 1.000000, 1.000000), - (0.222222, 1.000000, 1.000000),(0.238095, 0.000000, 0.000000), - (0.253968, 0.000000, 0.000000),(0.269841, 1.000000, 1.000000), - (0.285714, 1.000000, 1.000000),(0.301587, 0.000000, 0.000000), - (0.317460, 0.000000, 0.000000),(0.333333, 1.000000, 1.000000), - (0.349206, 1.000000, 1.000000),(0.365079, 0.000000, 0.000000), - (0.380952, 0.000000, 0.000000),(0.396825, 1.000000, 1.000000), - (0.412698, 1.000000, 1.000000),(0.428571, 0.000000, 0.000000), - (0.444444, 0.000000, 0.000000),(0.460317, 1.000000, 1.000000), - (0.476190, 1.000000, 1.000000),(0.492063, 0.000000, 0.000000), - (0.507937, 0.000000, 0.000000),(0.523810, 1.000000, 1.000000), - (0.539683, 1.000000, 1.000000),(0.555556, 0.000000, 0.000000), - (0.571429, 0.000000, 0.000000),(0.587302, 1.000000, 1.000000), - (0.603175, 1.000000, 1.000000),(0.619048, 0.000000, 0.000000), - (0.634921, 0.000000, 0.000000),(0.650794, 1.000000, 1.000000), - (0.666667, 1.000000, 1.000000),(0.682540, 0.000000, 0.000000), - (0.698413, 0.000000, 0.000000),(0.714286, 1.000000, 1.000000), - (0.730159, 1.000000, 1.000000),(0.746032, 0.000000, 0.000000), - (0.761905, 0.000000, 0.000000),(0.777778, 1.000000, 1.000000), - (0.793651, 1.000000, 1.000000),(0.809524, 0.000000, 0.000000), - (0.825397, 0.000000, 0.000000),(0.841270, 1.000000, 1.000000), - (0.857143, 1.000000, 1.000000),(0.873016, 0.000000, 0.000000), - (0.888889, 0.000000, 0.000000),(0.904762, 1.000000, 1.000000), - (0.920635, 1.000000, 1.000000),(0.936508, 0.000000, 0.000000), - (0.952381, 0.000000, 0.000000),(0.968254, 1.000000, 1.000000), - (0.984127, 1.000000, 1.000000),(1.0, 0., 0.))} +_flag_data = { + 'red': lambda x: 0.75 * np.sin((x * 31.5 + 0.25) * np.pi) + 0.5, + 'green': lambda x: np.sin(x * 31.5 * np.pi), + 'blue': lambda x: 0.75 * np.sin((x * 31.5 - 0.25) * np.pi) + 0.5, +} + +_prism_data = { + 'red': lambda x: 0.75 * np.sin((x * 20.9 + 0.25) * np.pi) + 0.67, + 'green': lambda x: 0.75 * np.sin((x * 20.9 - 0.25) * np.pi) + 0.33, + 'blue': lambda x: -1.1 * np.sin((x * 20.9) * np.pi), +} + +_bwr_data = ((0.0, 0.0, 1.0), (1.0, 1.0, 1.0), (1.0, 0.0, 0.0)) +_brg_data = ((0.0, 0.0, 1.0), (1.0, 0.0, 0.0), (0.0, 1.0, 0.0)) + +# Gnuplot palette functions +gfunc = { + 0: lambda x: 0, + 1: lambda x: 0.5, + 2: lambda x: 1, + 3: lambda x: x, + 4: lambda x: x**2, + 5: lambda x: x**3, + 6: lambda x: x**4, + 7: lambda x: np.sqrt(x), + 8: lambda x: np.sqrt(np.sqrt(x)), + 9: lambda x: np.sin(x * np.pi / 2), + 10: lambda x: np.cos(x * np.pi / 2), + 11: lambda x: np.abs(x - 0.5), + 12: lambda x: (2 * x - 1)**2, + 13: lambda x: np.sin(x * np.pi), + 14: lambda x: np.abs(np.cos(x * np.pi)), + 15: lambda x: np.sin(x * 2 * np.pi), + 16: lambda x: np.cos(x * 2 * np.pi), + 17: lambda x: np.abs(np.sin(x * 2 * np.pi)), + 18: lambda x: np.abs(np.cos(x * 2 * np.pi)), + 19: lambda x: np.abs(np.sin(x * 4 * np.pi)), + 20: lambda x: np.abs(np.cos(x * 4 * np.pi)), + 21: lambda x: 3 * x, + 22: lambda x: 3 * x - 1, + 23: lambda x: 3 * x - 2, + 24: lambda x: np.abs(3 * x - 1), + 25: lambda x: np.abs(3 * x - 2), + 26: lambda x: (3 * x - 1) / 2, + 27: lambda x: (3 * x - 2) / 2, + 28: lambda x: np.abs((3 * x - 1) / 2), + 29: lambda x: np.abs((3 * x - 2) / 2), + 30: lambda x: x / 0.32 - 0.78125, + 31: lambda x: 2 * x - 0.84, + 32: lambda x: gfunc32(x), + 33: lambda x: np.abs(2 * x - 0.5), + 34: lambda x: 2 * x, + 35: lambda x: 2 * x - 0.5, + 36: lambda x: 2 * x - 1. +} + +def gfunc32(x): + ret = np.zeros(len(x)) + m = (x < 0.25) + ret[m] = 4 * x[m] + m = (x >= 0.25) & (x < 0.92) + ret[m] = -2 * x[m] + 1.84 + m = (x >= 0.92) + ret[m] = x[m] / 0.08 - 11.5 + return ret + +_gnuplot_data = { + 'red': gfunc[7], + 'green': gfunc[5], + 'blue': gfunc[15], +} + +_gnuplot2_data = { + 'red': gfunc[30], + 'green': gfunc[31], + 'blue': gfunc[32], +} + +_ocean_data = { + 'red': gfunc[23], + 'green': gfunc[28], + 'blue': gfunc[3], +} + +_afmhot_data = { + 'red': gfunc[34], + 'green': gfunc[35], + 'blue': gfunc[36], +} + +_rainbow_data = { + 'red': gfunc[33], + 'green': gfunc[13], + 'blue': gfunc[10], +} + +_seismic_data = ( + (0.0, 0.0, 0.3), (0.0, 0.0, 1.0), + (1.0, 1.0, 1.0), (1.0, 0.0, 0.0), + (0.5, 0.0, 0.0)) + +_terrain_data = ( + (0.00, (0.2, 0.2, 0.6)), + (0.15, (0.0, 0.6, 1.0)), + (0.25, (0.0, 0.8, 0.4)), + (0.50, (1.0, 1.0, 0.6)), + (0.75, (0.5, 0.36, 0.33)), + (1.00, (1.0, 1.0, 1.0))) _gray_data = {'red': ((0., 0, 0), (1., 1, 1)), 'green': ((0., 0, 0), (1., 1, 1)), @@ -249,77 +270,6 @@ (0.952381, 0.951711, 0.951711),(0.968254, 0.968075, 0.968075), (0.984127, 0.984167, 0.984167),(1.0, 1.0, 1.0))} -_prism_data = {'red': ((0., 1., 1.),(0.031746, 1.000000, 1.000000), - (0.047619, 0.000000, 0.000000),(0.063492, 0.000000, 0.000000), - (0.079365, 0.666667, 0.666667),(0.095238, 1.000000, 1.000000), - (0.126984, 1.000000, 1.000000),(0.142857, 0.000000, 0.000000), - (0.158730, 0.000000, 0.000000),(0.174603, 0.666667, 0.666667), - (0.190476, 1.000000, 1.000000),(0.222222, 1.000000, 1.000000), - (0.238095, 0.000000, 0.000000),(0.253968, 0.000000, 0.000000), - (0.269841, 0.666667, 0.666667),(0.285714, 1.000000, 1.000000), - (0.317460, 1.000000, 1.000000),(0.333333, 0.000000, 0.000000), - (0.349206, 0.000000, 0.000000),(0.365079, 0.666667, 0.666667), - (0.380952, 1.000000, 1.000000),(0.412698, 1.000000, 1.000000), - (0.428571, 0.000000, 0.000000),(0.444444, 0.000000, 0.000000), - (0.460317, 0.666667, 0.666667),(0.476190, 1.000000, 1.000000), - (0.507937, 1.000000, 1.000000),(0.523810, 0.000000, 0.000000), - (0.539683, 0.000000, 0.000000),(0.555556, 0.666667, 0.666667), - (0.571429, 1.000000, 1.000000),(0.603175, 1.000000, 1.000000), - (0.619048, 0.000000, 0.000000),(0.634921, 0.000000, 0.000000), - (0.650794, 0.666667, 0.666667),(0.666667, 1.000000, 1.000000), - (0.698413, 1.000000, 1.000000),(0.714286, 0.000000, 0.000000), - (0.730159, 0.000000, 0.000000),(0.746032, 0.666667, 0.666667), - (0.761905, 1.000000, 1.000000),(0.793651, 1.000000, 1.000000), - (0.809524, 0.000000, 0.000000),(0.825397, 0.000000, 0.000000), - (0.841270, 0.666667, 0.666667),(0.857143, 1.000000, 1.000000), - (0.888889, 1.000000, 1.000000),(0.904762, 0.000000, 0.000000), - (0.920635, 0.000000, 0.000000),(0.936508, 0.666667, 0.666667), - (0.952381, 1.000000, 1.000000),(0.984127, 1.000000, 1.000000), - (1.0, 0.0, 0.0)), - 'green': ((0., 0., 0.),(0.031746, 1.000000, 1.000000), - (0.047619, 1.000000, 1.000000),(0.063492, 0.000000, 0.000000), - (0.095238, 0.000000, 0.000000),(0.126984, 1.000000, 1.000000), - (0.142857, 1.000000, 1.000000),(0.158730, 0.000000, 0.000000), - (0.190476, 0.000000, 0.000000),(0.222222, 1.000000, 1.000000), - (0.238095, 1.000000, 1.000000),(0.253968, 0.000000, 0.000000), - (0.285714, 0.000000, 0.000000),(0.317460, 1.000000, 1.000000), - (0.333333, 1.000000, 1.000000),(0.349206, 0.000000, 0.000000), - (0.380952, 0.000000, 0.000000),(0.412698, 1.000000, 1.000000), - (0.428571, 1.000000, 1.000000),(0.444444, 0.000000, 0.000000), - (0.476190, 0.000000, 0.000000),(0.507937, 1.000000, 1.000000), - (0.523810, 1.000000, 1.000000),(0.539683, 0.000000, 0.000000), - (0.571429, 0.000000, 0.000000),(0.603175, 1.000000, 1.000000), - (0.619048, 1.000000, 1.000000),(0.634921, 0.000000, 0.000000), - (0.666667, 0.000000, 0.000000),(0.698413, 1.000000, 1.000000), - (0.714286, 1.000000, 1.000000),(0.730159, 0.000000, 0.000000), - (0.761905, 0.000000, 0.000000),(0.793651, 1.000000, 1.000000), - (0.809524, 1.000000, 1.000000),(0.825397, 0.000000, 0.000000), - (0.857143, 0.000000, 0.000000),(0.888889, 1.000000, 1.000000), - (0.904762, 1.000000, 1.000000),(0.920635, 0.000000, 0.000000), - (0.952381, 0.000000, 0.000000),(0.984127, 1.000000, 1.000000), - (1.0, 1.0, 1.0)), - 'blue': ((0., 0., 0.),(0.047619, 0.000000, 0.000000), - (0.063492, 1.000000, 1.000000),(0.079365, 1.000000, 1.000000), - (0.095238, 0.000000, 0.000000),(0.142857, 0.000000, 0.000000), - (0.158730, 1.000000, 1.000000),(0.174603, 1.000000, 1.000000), - (0.190476, 0.000000, 0.000000),(0.238095, 0.000000, 0.000000), - (0.253968, 1.000000, 1.000000),(0.269841, 1.000000, 1.000000), - (0.285714, 0.000000, 0.000000),(0.333333, 0.000000, 0.000000), - (0.349206, 1.000000, 1.000000),(0.365079, 1.000000, 1.000000), - (0.380952, 0.000000, 0.000000),(0.428571, 0.000000, 0.000000), - (0.444444, 1.000000, 1.000000),(0.460317, 1.000000, 1.000000), - (0.476190, 0.000000, 0.000000),(0.523810, 0.000000, 0.000000), - (0.539683, 1.000000, 1.000000),(0.555556, 1.000000, 1.000000), - (0.571429, 0.000000, 0.000000),(0.619048, 0.000000, 0.000000), - (0.634921, 1.000000, 1.000000),(0.650794, 1.000000, 1.000000), - (0.666667, 0.000000, 0.000000),(0.714286, 0.000000, 0.000000), - (0.730159, 1.000000, 1.000000),(0.746032, 1.000000, 1.000000), - (0.761905, 0.000000, 0.000000),(0.809524, 0.000000, 0.000000), - (0.825397, 1.000000, 1.000000),(0.841270, 1.000000, 1.000000), - (0.857143, 0.000000, 0.000000),(0.904762, 0.000000, 0.000000), - (0.920635, 1.000000, 1.000000),(0.936508, 1.000000, 1.000000), - (0.952381, 0.000000, 0.000000),(1.0, 0.0, 0.0))} - _spring_data = {'red': ((0., 1., 1.),(1.0, 1.0, 1.0)), 'green': ((0., 0., 0.),(1.0, 1.0, 1.0)), 'blue': ((0., 1., 1.),(1.0, 0.0, 0.0))} @@ -1470,4362 +1420,176 @@ # an evolution of the GIST package, both by David H. Munro. # They are released under a BSD-like license (see LICENSE_YORICK in # the license directory of the matplotlib source distribution). -_gist_earth_data = {'blue': [(0.0, 0.0, 0.0), (0.0042016808874905109, -0.18039216101169586, 0.18039216101169586), (0.0084033617749810219, -0.22745098173618317, 0.22745098173618317), (0.012605042196810246, -0.27058824896812439, 0.27058824896812439), (0.016806723549962044, -0.31764706969261169, 0.31764706969261169), (0.021008403971791267, -0.36078432202339172, 0.36078432202339172), (0.025210084393620491, -0.40784314274787903, 0.40784314274787903), (0.029411764815449715, -0.45490196347236633, 0.45490196347236633), (0.033613447099924088, -0.45490196347236633, 0.45490196347236633), (0.037815127521753311, -0.45490196347236633, 0.45490196347236633), (0.042016807943582535, -0.45490196347236633, 0.45490196347236633), (0.046218488365411758, -0.45490196347236633, 0.45490196347236633), (0.050420168787240982, -0.45882353186607361, 0.45882353186607361), (0.054621849209070206, -0.45882353186607361, 0.45882353186607361), (0.058823529630899429, -0.45882353186607361, 0.45882353186607361), (0.063025213778018951, -0.45882353186607361, 0.45882353186607361), (0.067226894199848175, -0.45882353186607361, 0.45882353186607361), (0.071428574621677399, -0.46274510025978088, 0.46274510025978088), (0.075630255043506622, -0.46274510025978088, 0.46274510025978088), (0.079831935465335846, -0.46274510025978088, 0.46274510025978088), (0.08403361588716507, -0.46274510025978088, 0.46274510025978088), (0.088235296308994293, -0.46274510025978088, 0.46274510025978088), (0.092436976730823517, -0.46666666865348816, 0.46666666865348816), (0.09663865715265274, -0.46666666865348816, 0.46666666865348816), (0.10084033757448196, -0.46666666865348816, 0.46666666865348816), (0.10504201799631119, -0.46666666865348816, 0.46666666865348816), (0.10924369841814041, -0.46666666865348816, 0.46666666865348816), (0.11344537883996964, -0.47058823704719543, 0.47058823704719543), (0.11764705926179886, -0.47058823704719543, 0.47058823704719543), (0.12184873968362808, -0.47058823704719543, 0.47058823704719543), (0.1260504275560379, -0.47058823704719543, 0.47058823704719543), (0.13025210797786713, -0.47058823704719543, 0.47058823704719543), (0.13445378839969635, -0.47450980544090271, 0.47450980544090271), (0.13865546882152557, -0.47450980544090271, 0.47450980544090271), (0.1428571492433548, -0.47450980544090271, 0.47450980544090271), (0.14705882966518402, -0.47450980544090271, 0.47450980544090271), (0.15126051008701324, -0.47450980544090271, 0.47450980544090271), (0.15546219050884247, -0.47843137383460999, 0.47843137383460999), (0.15966387093067169, -0.47843137383460999, 0.47843137383460999), (0.16386555135250092, -0.47843137383460999, 0.47843137383460999), (0.16806723177433014, -0.47843137383460999, 0.47843137383460999), (0.17226891219615936, -0.47843137383460999, 0.47843137383460999), (0.17647059261798859, -0.48235294222831726, 0.48235294222831726), (0.18067227303981781, -0.48235294222831726, 0.48235294222831726), (0.18487395346164703, -0.48235294222831726, 0.48235294222831726), (0.18907563388347626, -0.48235294222831726, 0.48235294222831726), (0.19327731430530548, -0.48235294222831726, 0.48235294222831726), (0.1974789947271347, -0.48627451062202454, 0.48627451062202454), (0.20168067514896393, -0.48627451062202454, 0.48627451062202454), (0.20588235557079315, -0.48627451062202454, 0.48627451062202454), (0.21008403599262238, -0.48627451062202454, 0.48627451062202454), (0.2142857164144516, -0.48627451062202454, 0.48627451062202454), (0.21848739683628082, -0.49019607901573181, 0.49019607901573181), (0.22268907725811005, -0.49019607901573181, 0.49019607901573181), (0.22689075767993927, -0.49019607901573181, 0.49019607901573181), (0.23109243810176849, -0.49019607901573181, 0.49019607901573181), (0.23529411852359772, -0.49019607901573181, 0.49019607901573181), (0.23949579894542694, -0.49411764740943909, 0.49411764740943909), (0.24369747936725616, -0.49411764740943909, 0.49411764740943909), (0.24789915978908539, -0.49411764740943909, 0.49411764740943909), (0.25210085511207581, -0.49411764740943909, 0.49411764740943909), (0.25630253553390503, -0.49411764740943909, 0.49411764740943909), (0.26050421595573425, -0.49803921580314636, 0.49803921580314636), (0.26470589637756348, -0.49803921580314636, 0.49803921580314636), (0.2689075767993927, -0.49803921580314636, 0.49803921580314636), (0.27310925722122192, -0.49803921580314636, 0.49803921580314636), (0.27731093764305115, -0.49803921580314636, 0.49803921580314636), (0.28151261806488037, -0.50196081399917603, 0.50196081399917603), (0.28571429848670959, -0.49411764740943909, 0.49411764740943909), (0.28991597890853882, -0.49019607901573181, 0.49019607901573181), (0.29411765933036804, -0.48627451062202454, 0.48627451062202454), (0.29831933975219727, -0.48235294222831726, 0.48235294222831726), (0.30252102017402649, -0.47843137383460999, 0.47843137383460999), (0.30672270059585571, -0.47058823704719543, 0.47058823704719543), (0.31092438101768494, -0.46666666865348816, 0.46666666865348816), (0.31512606143951416, -0.46274510025978088, 0.46274510025978088), (0.31932774186134338, -0.45882353186607361, 0.45882353186607361), (0.32352942228317261, -0.45098039507865906, 0.45098039507865906), (0.32773110270500183, -0.44705882668495178, 0.44705882668495178), (0.33193278312683105, -0.44313725829124451, 0.44313725829124451), (0.33613446354866028, -0.43529412150382996, 0.43529412150382996), (0.3403361439704895, -0.43137255311012268, 0.43137255311012268), (0.34453782439231873, -0.42745098471641541, 0.42745098471641541), (0.34873950481414795, -0.42352941632270813, 0.42352941632270813), (0.35294118523597717, -0.41568627953529358, 0.41568627953529358), (0.3571428656578064, -0.4117647111415863, 0.4117647111415863), (0.36134454607963562, -0.40784314274787903, 0.40784314274787903), (0.36554622650146484, -0.40000000596046448, 0.40000000596046448), (0.36974790692329407, -0.3960784375667572, 0.3960784375667572), (0.37394958734512329, -0.39215686917304993, 0.39215686917304993), (0.37815126776695251, -0.38431373238563538, 0.38431373238563538), (0.38235294818878174, -0.3803921639919281, 0.3803921639919281), (0.38655462861061096, -0.37647059559822083, 0.37647059559822083), (0.39075630903244019, -0.36862745881080627, 0.36862745881080627), (0.39495798945426941, -0.364705890417099, 0.364705890417099), (0.39915966987609863, -0.36078432202339172, 0.36078432202339172), (0.40336135029792786, -0.35294118523597717, 0.35294118523597717), (0.40756303071975708, -0.3490196168422699, 0.3490196168422699), (0.4117647111415863, -0.34509804844856262, 0.34509804844856262), (0.41596639156341553, -0.33725491166114807, 0.33725491166114807), (0.42016807198524475, -0.3333333432674408, 0.3333333432674408), (0.42436975240707397, -0.32941177487373352, 0.32941177487373352), (0.4285714328289032, -0.32156863808631897, 0.32156863808631897), (0.43277311325073242, -0.31764706969261169, 0.31764706969261169), (0.43697479367256165, -0.31372550129890442, 0.31372550129890442), (0.44117647409439087, -0.30588236451148987, 0.30588236451148987), (0.44537815451622009, -0.30196079611778259, 0.30196079611778259), (0.44957983493804932, -0.29803922772407532, 0.29803922772407532), (0.45378151535987854, -0.29019609093666077, 0.29019609093666077), (0.45798319578170776, -0.28627452254295349, 0.28627452254295349), (0.46218487620353699, -0.27843138575553894, 0.27843138575553894), (0.46638655662536621, -0.27450981736183167, 0.27450981736183167), (0.47058823704719543, -0.27843138575553894, 0.27843138575553894), (0.47478991746902466, -0.28235295414924622, 0.28235295414924622), (0.47899159789085388, -0.28235295414924622, 0.28235295414924622), (0.48319327831268311, -0.28627452254295349, 0.28627452254295349), (0.48739495873451233, -0.28627452254295349, 0.28627452254295349), (0.49159663915634155, -0.29019609093666077, 0.29019609093666077), (0.49579831957817078, -0.29411765933036804, 0.29411765933036804), (0.5, 0.29411765933036804, -0.29411765933036804), (0.50420171022415161, 0.29803922772407532, -0.29803922772407532), (0.50840336084365845, 0.29803922772407532, -0.29803922772407532), (0.51260507106781006, 0.30196079611778259, -0.30196079611778259), (0.51680672168731689, 0.30196079611778259, -0.30196079611778259), (0.52100843191146851, 0.30588236451148987, -0.30588236451148987), (0.52521008253097534, 0.30980393290519714, -0.30980393290519714), (0.52941179275512695, 0.30980393290519714, -0.30980393290519714), (0.53361344337463379, 0.31372550129890442, -0.31372550129890442), (0.5378151535987854, 0.31372550129890442, -0.31372550129890442), (0.54201680421829224, 0.31764706969261169, -0.31764706969261169), (0.54621851444244385, 0.32156863808631897, -0.32156863808631897), (0.55042016506195068, 0.32156863808631897, -0.32156863808631897), (0.55462187528610229, 0.32156863808631897, -0.32156863808631897), (0.55882352590560913, 0.32549020648002625, -0.32549020648002625), (0.56302523612976074, 0.32549020648002625, -0.32549020648002625), (0.56722688674926758, 0.32549020648002625, -0.32549020648002625), (0.57142859697341919, 0.32941177487373352, -0.32941177487373352), (0.57563024759292603, 0.32941177487373352, -0.32941177487373352), (0.57983195781707764, 0.32941177487373352, -0.32941177487373352), (0.58403360843658447, 0.3333333432674408, -0.3333333432674408), (0.58823531866073608, 0.3333333432674408, -0.3333333432674408), (0.59243696928024292, 0.3333333432674408, -0.3333333432674408), (0.59663867950439453, 0.33725491166114807, -0.33725491166114807), (0.60084033012390137, 0.33725491166114807, -0.33725491166114807), (0.60504204034805298, 0.33725491166114807, -0.33725491166114807), (0.60924369096755981, 0.34117648005485535, -0.34117648005485535), (0.61344540119171143, 0.34117648005485535, -0.34117648005485535), (0.61764705181121826, 0.34117648005485535, -0.34117648005485535), (0.62184876203536987, 0.34509804844856262, -0.34509804844856262), (0.62605041265487671, 0.34509804844856262, -0.34509804844856262), (0.63025212287902832, 0.34509804844856262, -0.34509804844856262), (0.63445377349853516, 0.3490196168422699, -0.3490196168422699), (0.63865548372268677, 0.3490196168422699, -0.3490196168422699), (0.6428571343421936, 0.3490196168422699, -0.3490196168422699), (0.64705884456634521, 0.35294118523597717, -0.35294118523597717), (0.65126049518585205, 0.35294118523597717, -0.35294118523597717), (0.65546220541000366, 0.35294118523597717, -0.35294118523597717), (0.6596638560295105, 0.35686275362968445, -0.35686275362968445), (0.66386556625366211, 0.35686275362968445, -0.35686275362968445), (0.66806721687316895, 0.35686275362968445, -0.35686275362968445), (0.67226892709732056, 0.36078432202339172, -0.36078432202339172), (0.67647057771682739, 0.36078432202339172, -0.36078432202339172), (0.680672287940979, 0.36078432202339172, -0.36078432202339172), (0.68487393856048584, 0.364705890417099, -0.364705890417099), (0.68907564878463745, 0.364705890417099, -0.364705890417099), (0.69327729940414429, 0.364705890417099, -0.364705890417099), (0.6974790096282959, 0.36862745881080627, -0.36862745881080627), (0.70168066024780273, 0.36862745881080627, -0.36862745881080627), (0.70588237047195435, 0.36862745881080627, -0.36862745881080627), (0.71008402109146118, 0.37254902720451355, -0.37254902720451355), (0.71428573131561279, 0.37254902720451355, -0.37254902720451355), (0.71848738193511963, 0.37254902720451355, -0.37254902720451355), (0.72268909215927124, 0.37647059559822083, -0.37647059559822083), (0.72689074277877808, 0.37647059559822083, -0.37647059559822083), (0.73109245300292969, 0.3803921639919281, -0.3803921639919281), (0.73529410362243652, 0.3803921639919281, -0.3803921639919281), (0.73949581384658813, 0.3803921639919281, -0.3803921639919281), (0.74369746446609497, 0.38431373238563538, -0.38431373238563538), (0.74789917469024658, 0.38431373238563538, -0.38431373238563538), (0.75210082530975342, 0.38431373238563538, -0.38431373238563538), (0.75630253553390503, 0.38823530077934265, -0.38823530077934265), (0.76050418615341187, 0.38823530077934265, -0.38823530077934265), (0.76470589637756348, 0.38823530077934265, -0.38823530077934265), (0.76890754699707031, 0.39215686917304993, -0.39215686917304993), (0.77310925722122192, 0.39215686917304993, -0.39215686917304993), (0.77731090784072876, 0.39215686917304993, -0.39215686917304993), (0.78151261806488037, 0.3960784375667572, -0.3960784375667572), (0.78571426868438721, 0.3960784375667572, -0.3960784375667572), (0.78991597890853882, 0.40784314274787903, -0.40784314274787903), (0.79411762952804565, 0.41568627953529358, -0.41568627953529358), (0.79831933975219727, 0.42352941632270813, -0.42352941632270813), (0.8025209903717041, 0.43529412150382996, -0.43529412150382996), (0.80672270059585571, 0.44313725829124451, -0.44313725829124451), (0.81092435121536255, 0.45490196347236633, -0.45490196347236633), (0.81512606143951416, 0.46274510025978088, -0.46274510025978088), (0.819327712059021, 0.47450980544090271, -0.47450980544090271), (0.82352942228317261, 0.48235294222831726, -0.48235294222831726), (0.82773107290267944, 0.49411764740943909, -0.49411764740943909), (0.83193278312683105, 0.5058823823928833, -0.5058823823928833), (0.83613443374633789, 0.51372551918029785, -0.51372551918029785), (0.8403361439704895, 0.52549022436141968, -0.52549022436141968), (0.84453779458999634, 0.5372549295425415, -0.5372549295425415), (0.84873950481414795, 0.54509806632995605, -0.54509806632995605), (0.85294115543365479, 0.55686277151107788, -0.55686277151107788), (0.8571428656578064, 0.56862747669219971, -0.56862747669219971), (0.86134451627731323, 0.58039218187332153, -0.58039218187332153), (0.86554622650146484, 0.58823531866073608, -0.58823531866073608), (0.86974787712097168, 0.60000002384185791, -0.60000002384185791), (0.87394958734512329, 0.61176472902297974, -0.61176472902297974), (0.87815123796463013, 0.62352943420410156, -0.62352943420410156), (0.88235294818878174, 0.63529413938522339, -0.63529413938522339), (0.88655459880828857, 0.64705884456634521, -0.64705884456634521), (0.89075630903244019, 0.65882354974746704, -0.65882354974746704), (0.89495795965194702, 0.66666668653488159, -0.66666668653488159), (0.89915966987609863, 0.67843139171600342, -0.67843139171600342), (0.90336132049560547, 0.69019609689712524, -0.69019609689712524), (0.90756303071975708, 0.70196080207824707, -0.70196080207824707), (0.91176468133926392, 0.7137255072593689, -0.7137255072593689), (0.91596639156341553, 0.72549021244049072, -0.72549021244049072), (0.92016804218292236, 0.74117648601531982, -0.74117648601531982), (0.92436975240707397, 0.75294119119644165, -0.75294119119644165), (0.92857140302658081, 0.76470589637756348, -0.76470589637756348), (0.93277311325073242, 0.7764706015586853, -0.7764706015586853), (0.93697476387023926, 0.78823530673980713, -0.78823530673980713), (0.94117647409439087, 0.80000001192092896, -0.80000001192092896), (0.94537812471389771, 0.81176471710205078, -0.81176471710205078), (0.94957983493804932, 0.82745099067687988, -0.82745099067687988), (0.95378148555755615, 0.83921569585800171, -0.83921569585800171), (0.95798319578170776, 0.85098040103912354, -0.85098040103912354), (0.9621848464012146, 0.86274510622024536, -0.86274510622024536), (0.96638655662536621, 0.87843137979507446, -0.87843137979507446), (0.97058820724487305, 0.89019608497619629, -0.89019608497619629), (0.97478991746902466, 0.90196079015731812, -0.90196079015731812), (0.97899156808853149, 0.91764706373214722, -0.91764706373214722), (0.98319327831268311, 0.92941176891326904, -0.92941176891326904), (0.98739492893218994, 0.94509804248809814, -0.94509804248809814), (0.99159663915634155, 0.95686274766921997, -0.95686274766921997), (0.99579828977584839, 0.97254902124404907, -0.97254902124404907), (1.0, 0.9843137264251709, 0.9843137264251709)], -'green': [(0.0, 0.0, 0.0), (0.0042016808874905109, 0.0, 0.0), -(0.0084033617749810219, 0.0, 0.0), (0.012605042196810246, 0.0, 0.0), -(0.016806723549962044, 0.0, 0.0), (0.021008403971791267, 0.0, 0.0), -(0.025210084393620491, 0.0, 0.0), (0.029411764815449715, 0.0, 0.0), -(0.033613447099924088, 0.011764706112444401, 0.011764706112444401), -(0.037815127521753311, 0.023529412224888802, 0.023529412224888802), -(0.042016807943582535, 0.031372550874948502, 0.031372550874948502), -(0.046218488365411758, 0.043137256056070328, 0.043137256056070328), -(0.050420168787240982, 0.050980392843484879, 0.050980392843484879), -(0.054621849209070206, 0.062745101749897003, 0.062745101749897003), -(0.058823529630899429, 0.070588238537311554, 0.070588238537311554), -(0.063025213778018951, 0.08235294371843338, 0.08235294371843338), -(0.067226894199848175, 0.090196080505847931, 0.090196080505847931), -(0.071428574621677399, 0.10196078568696976, 0.10196078568696976), -(0.075630255043506622, 0.10980392247438431, 0.10980392247438431), -(0.079831935465335846, 0.12156862765550613, 0.12156862765550613), -(0.08403361588716507, 0.12941177189350128, 0.12941177189350128), -(0.088235296308994293, 0.14117647707462311, 0.14117647707462311), -(0.092436976730823517, 0.14901961386203766, 0.14901961386203766), -(0.09663865715265274, 0.16078431904315948, 0.16078431904315948), -(0.10084033757448196, 0.16862745583057404, 0.16862745583057404), -(0.10504201799631119, 0.17647059261798859, 0.17647059261798859), -(0.10924369841814041, 0.18823529779911041, 0.18823529779911041), -(0.11344537883996964, 0.19607843458652496, 0.19607843458652496), -(0.11764705926179886, 0.20392157137393951, 0.20392157137393951), -(0.12184873968362808, 0.21568627655506134, 0.21568627655506134), -(0.1260504275560379, 0.22352941334247589, 0.22352941334247589), -(0.13025210797786713, 0.23137255012989044, 0.23137255012989044), -(0.13445378839969635, 0.23921568691730499, 0.23921568691730499), -(0.13865546882152557, 0.25098040699958801, 0.25098040699958801), -(0.1428571492433548, 0.25882354378700256, 0.25882354378700256), -(0.14705882966518402, 0.26666668057441711, 0.26666668057441711), -(0.15126051008701324, 0.27450981736183167, 0.27450981736183167), -(0.15546219050884247, 0.28235295414924622, 0.28235295414924622), -(0.15966387093067169, 0.29019609093666077, 0.29019609093666077), -(0.16386555135250092, 0.30196079611778259, 0.30196079611778259), -(0.16806723177433014, 0.30980393290519714, 0.30980393290519714), -(0.17226891219615936, 0.31764706969261169, 0.31764706969261169), -(0.17647059261798859, 0.32549020648002625, 0.32549020648002625), -(0.18067227303981781, 0.3333333432674408, 0.3333333432674408), -(0.18487395346164703, 0.34117648005485535, 0.34117648005485535), -(0.18907563388347626, 0.3490196168422699, 0.3490196168422699), -(0.19327731430530548, 0.35686275362968445, 0.35686275362968445), -(0.1974789947271347, 0.364705890417099, 0.364705890417099), -(0.20168067514896393, 0.37254902720451355, 0.37254902720451355), -(0.20588235557079315, 0.3803921639919281, 0.3803921639919281), -(0.21008403599262238, 0.38823530077934265, 0.38823530077934265), -(0.2142857164144516, 0.39215686917304993, 0.39215686917304993), -(0.21848739683628082, 0.40000000596046448, 0.40000000596046448), -(0.22268907725811005, 0.40784314274787903, 0.40784314274787903), -(0.22689075767993927, 0.41568627953529358, 0.41568627953529358), -(0.23109243810176849, 0.42352941632270813, 0.42352941632270813), -(0.23529411852359772, 0.42745098471641541, 0.42745098471641541), -(0.23949579894542694, 0.43529412150382996, 0.43529412150382996), -(0.24369747936725616, 0.44313725829124451, 0.44313725829124451), -(0.24789915978908539, 0.45098039507865906, 0.45098039507865906), -(0.25210085511207581, 0.45490196347236633, 0.45490196347236633), -(0.25630253553390503, 0.46274510025978088, 0.46274510025978088), -(0.26050421595573425, 0.47058823704719543, 0.47058823704719543), -(0.26470589637756348, 0.47450980544090271, 0.47450980544090271), -(0.2689075767993927, 0.48235294222831726, 0.48235294222831726), -(0.27310925722122192, 0.49019607901573181, 0.49019607901573181), -(0.27731093764305115, 0.49411764740943909, 0.49411764740943909), -(0.28151261806488037, 0.50196081399917603, 0.50196081399917603), -(0.28571429848670959, 0.50196081399917603, 0.50196081399917603), -(0.28991597890853882, 0.5058823823928833, 0.5058823823928833), -(0.29411765933036804, 0.5058823823928833, 0.5058823823928833), -(0.29831933975219727, 0.50980395078659058, 0.50980395078659058), -(0.30252102017402649, 0.51372551918029785, 0.51372551918029785), -(0.30672270059585571, 0.51372551918029785, 0.51372551918029785), -(0.31092438101768494, 0.51764708757400513, 0.51764708757400513), -(0.31512606143951416, 0.5215686559677124, 0.5215686559677124), -(0.31932774186134338, 0.5215686559677124, 0.5215686559677124), -(0.32352942228317261, 0.52549022436141968, 0.52549022436141968), -(0.32773110270500183, 0.52549022436141968, 0.52549022436141968), -(0.33193278312683105, 0.52941179275512695, 0.52941179275512695), -(0.33613446354866028, 0.53333336114883423, 0.53333336114883423), -(0.3403361439704895, 0.53333336114883423, 0.53333336114883423), -(0.34453782439231873, 0.5372549295425415, 0.5372549295425415), -(0.34873950481414795, 0.54117649793624878, 0.54117649793624878), -(0.35294118523597717, 0.54117649793624878, 0.54117649793624878), -(0.3571428656578064, 0.54509806632995605, 0.54509806632995605), -(0.36134454607963562, 0.54901963472366333, 0.54901963472366333), -(0.36554622650146484, 0.54901963472366333, 0.54901963472366333), -(0.36974790692329407, 0.55294120311737061, 0.55294120311737061), -(0.37394958734512329, 0.55294120311737061, 0.55294120311737061), -(0.37815126776695251, 0.55686277151107788, 0.55686277151107788), -(0.38235294818878174, 0.56078433990478516, 0.56078433990478516), -(0.38655462861061096, 0.56078433990478516, 0.56078433990478516), -(0.39075630903244019, 0.56470590829849243, 0.56470590829849243), -(0.39495798945426941, 0.56862747669219971, 0.56862747669219971), -(0.39915966987609863, 0.56862747669219971, 0.56862747669219971), -(0.40336135029792786, 0.57254904508590698, 0.57254904508590698), -(0.40756303071975708, 0.57254904508590698, 0.57254904508590698), -(0.4117647111415863, 0.57647061347961426, 0.57647061347961426), -(0.41596639156341553, 0.58039218187332153, 0.58039218187332153), -(0.42016807198524475, 0.58039218187332153, 0.58039218187332153), -(0.42436975240707397, 0.58431375026702881, 0.58431375026702881), -(0.4285714328289032, 0.58823531866073608, 0.58823531866073608), -(0.43277311325073242, 0.58823531866073608, 0.58823531866073608), -(0.43697479367256165, 0.59215688705444336, 0.59215688705444336), -(0.44117647409439087, 0.59215688705444336, 0.59215688705444336), -(0.44537815451622009, 0.59607845544815063, 0.59607845544815063), -(0.44957983493804932, 0.60000002384185791, 0.60000002384185791), -(0.45378151535987854, 0.60000002384185791, 0.60000002384185791), -(0.45798319578170776, 0.60392159223556519, 0.60392159223556519), -(0.46218487620353699, 0.60784316062927246, 0.60784316062927246), -(0.46638655662536621, 0.60784316062927246, 0.60784316062927246), -(0.47058823704719543, 0.61176472902297974, 0.61176472902297974), -(0.47478991746902466, 0.61176472902297974, 0.61176472902297974), -(0.47899159789085388, 0.61568629741668701, 0.61568629741668701), -(0.48319327831268311, 0.61960786581039429, 0.61960786581039429), -(0.48739495873451233, 0.61960786581039429, 0.61960786581039429), -(0.49159663915634155, 0.62352943420410156, 0.62352943420410156), -(0.49579831957817078, 0.62745100259780884, 0.62745100259780884), (0.5, -0.62745100259780884, 0.62745100259780884), (0.50420171022415161, -0.63137257099151611, 0.63137257099151611), (0.50840336084365845, -0.63137257099151611, 0.63137257099151611), (0.51260507106781006, -0.63529413938522339, 0.63529413938522339), (0.51680672168731689, -0.63921570777893066, 0.63921570777893066), (0.52100843191146851, -0.63921570777893066, 0.63921570777893066), (0.52521008253097534, -0.64313727617263794, 0.64313727617263794), (0.52941179275512695, -0.64705884456634521, 0.64705884456634521), (0.53361344337463379, -0.64705884456634521, 0.64705884456634521), (0.5378151535987854, -0.65098041296005249, 0.65098041296005249), (0.54201680421829224, -0.65098041296005249, 0.65098041296005249), (0.54621851444244385, -0.65490198135375977, 0.65490198135375977), (0.55042016506195068, -0.65882354974746704, 0.65882354974746704), (0.55462187528610229, -0.65882354974746704, 0.65882354974746704), (0.55882352590560913, -0.65882354974746704, 0.65882354974746704), (0.56302523612976074, -0.66274511814117432, 0.66274511814117432), (0.56722688674926758, -0.66274511814117432, 0.66274511814117432), (0.57142859697341919, -0.66666668653488159, 0.66666668653488159), (0.57563024759292603, -0.66666668653488159, 0.66666668653488159), (0.57983195781707764, -0.67058825492858887, 0.67058825492858887), (0.58403360843658447, -0.67058825492858887, 0.67058825492858887), (0.58823531866073608, -0.67450982332229614, 0.67450982332229614), (0.59243696928024292, -0.67450982332229614, 0.67450982332229614), (0.59663867950439453, -0.67450982332229614, 0.67450982332229614), (0.60084033012390137, -0.67843139171600342, 0.67843139171600342), (0.60504204034805298, -0.67843139171600342, 0.67843139171600342), (0.60924369096755981, -0.68235296010971069, 0.68235296010971069), (0.61344540119171143, -0.68235296010971069, 0.68235296010971069), (0.61764705181121826, -0.68627452850341797, 0.68627452850341797), (0.62184876203536987, -0.68627452850341797, 0.68627452850341797), (0.62605041265487671, -0.68627452850341797, 0.68627452850341797), (0.63025212287902832, -0.69019609689712524, 0.69019609689712524), (0.63445377349853516, -0.69019609689712524, 0.69019609689712524), (0.63865548372268677, -0.69411766529083252, 0.69411766529083252), (0.6428571343421936, -0.69411766529083252, 0.69411766529083252), (0.64705884456634521, -0.69803923368453979, 0.69803923368453979), (0.65126049518585205, -0.69803923368453979, 0.69803923368453979), (0.65546220541000366, -0.70196080207824707, 0.70196080207824707), (0.6596638560295105, -0.70196080207824707, 0.70196080207824707), (0.66386556625366211, -0.70196080207824707, 0.70196080207824707), (0.66806721687316895, -0.70588237047195435, 0.70588237047195435), (0.67226892709732056, -0.70588237047195435, 0.70588237047195435), (0.67647057771682739, -0.70980393886566162, 0.70980393886566162), (0.680672287940979, -0.70980393886566162, 0.70980393886566162), (0.68487393856048584, -0.7137255072593689, 0.7137255072593689), (0.68907564878463745, -0.7137255072593689, 0.7137255072593689), (0.69327729940414429, -0.71764707565307617, 0.71764707565307617), (0.6974790096282959, -0.71764707565307617, 0.71764707565307617), (0.70168066024780273, -0.7137255072593689, 0.7137255072593689), (0.70588237047195435, -0.70980393886566162, 0.70980393886566162), (0.71008402109146118, -0.70980393886566162, 0.70980393886566162), (0.71428573131561279, -0.70588237047195435, 0.70588237047195435), (0.71848738193511963, -0.70196080207824707, 0.70196080207824707), (0.72268909215927124, -0.69803923368453979, 0.69803923368453979), (0.72689074277877808, -0.69411766529083252, 0.69411766529083252), (0.73109245300292969, -0.69019609689712524, 0.69019609689712524), (0.73529410362243652, -0.68627452850341797, 0.68627452850341797), (0.73949581384658813, -0.68235296010971069, 0.68235296010971069), (0.74369746446609497, -0.67843139171600342, 0.67843139171600342), (0.74789917469024658, -0.67450982332229614, 0.67450982332229614), (0.75210082530975342, -0.67058825492858887, 0.67058825492858887), (0.75630253553390503, -0.66666668653488159, 0.66666668653488159), (0.76050418615341187, -0.66274511814117432, 0.66274511814117432), (0.76470589637756348, -0.65882354974746704, 0.65882354974746704), (0.76890754699707031, -0.65490198135375977, 0.65490198135375977), (0.77310925722122192, -0.65098041296005249, 0.65098041296005249), (0.77731090784072876, -0.64705884456634521, 0.64705884456634521), (0.78151261806488037, -0.64313727617263794, 0.64313727617263794), (0.78571426868438721, -0.63921570777893066, 0.63921570777893066), (0.78991597890853882, -0.63921570777893066, 0.63921570777893066), (0.79411762952804565, -0.64313727617263794, 0.64313727617263794), (0.79831933975219727, -0.64313727617263794, 0.64313727617263794), (0.8025209903717041, -0.64705884456634521, 0.64705884456634521), (0.80672270059585571, -0.64705884456634521, 0.64705884456634521), (0.81092435121536255, -0.65098041296005249, 0.65098041296005249), (0.81512606143951416, -0.65490198135375977, 0.65490198135375977), (0.819327712059021, -0.65490198135375977, 0.65490198135375977), (0.82352942228317261, -0.65882354974746704, 0.65882354974746704), (0.82773107290267944, -0.66274511814117432, 0.66274511814117432), (0.83193278312683105, -0.66666668653488159, 0.66666668653488159), (0.83613443374633789, -0.67058825492858887, 0.67058825492858887), (0.8403361439704895, -0.67450982332229614, 0.67450982332229614), (0.84453779458999634, -0.67843139171600342, 0.67843139171600342), (0.84873950481414795, -0.68235296010971069, 0.68235296010971069), (0.85294115543365479, -0.68627452850341797, 0.68627452850341797), (0.8571428656578064, -0.69019609689712524, 0.69019609689712524), (0.86134451627731323, -0.69411766529083252, 0.69411766529083252), (0.86554622650146484, -0.69803923368453979, 0.69803923368453979), (0.86974787712097168, -0.70196080207824707, 0.70196080207824707), (0.87394958734512329, -0.70980393886566162, 0.70980393886566162), (0.87815123796463013, -0.7137255072593689, 0.7137255072593689), (0.88235294818878174, -0.72156864404678345, 0.72156864404678345), (0.88655459880828857, -0.72549021244049072, 0.72549021244049072), (0.89075630903244019, -0.73333334922790527, 0.73333334922790527), (0.89495795965194702, -0.73725491762161255, 0.73725491762161255), (0.89915966987609863, -0.7450980544090271, 0.7450980544090271), (0.90336132049560547, -0.75294119119644165, 0.75294119119644165), (0.90756303071975708, -0.7607843279838562, 0.7607843279838562), (0.91176468133926392, -0.76862746477127075, 0.76862746477127075), (0.91596639156341553, -0.7764706015586853, 0.7764706015586853), (0.92016804218292236, -0.78431373834609985, 0.78431373834609985), (0.92436975240707397, -0.7921568751335144, 0.7921568751335144), (0.92857140302658081, -0.80000001192092896, 0.80000001192092896), (0.93277311325073242, -0.80784314870834351, 0.80784314870834351), (0.93697476387023926, -0.81568628549575806, 0.81568628549575806), (0.94117647409439087, -0.82745099067687988, 0.82745099067687988), (0.94537812471389771, -0.83529412746429443, 0.83529412746429443), (0.94957983493804932, -0.84313726425170898, 0.84313726425170898), (0.95378148555755615, -0.85490196943283081, 0.85490196943283081), (0.95798319578170776, -0.86666667461395264, 0.86666667461395264), (0.9621848464012146, -0.87450981140136719, 0.87450981140136719), (0.96638655662536621, -0.88627451658248901, 0.88627451658248901), (0.97058820724487305, -0.89803922176361084, 0.89803922176361084), (0.97478991746902466, -0.90980392694473267, 0.90980392694473267), (0.97899156808853149, -0.92156863212585449, 0.92156863212585449), (0.98319327831268311, -0.93333333730697632, 0.93333333730697632), (0.98739492893218994, -0.94509804248809814, 0.94509804248809814), (0.99159663915634155, -0.95686274766921997, 0.95686274766921997), (0.99579828977584839, -0.97254902124404907, 0.97254902124404907), (1.0, 0.9843137264251709, -0.9843137264251709)], 'red': [(0.0, 0.0, 0.0), (0.0042016808874905109, -0.0, 0.0), (0.0084033617749810219, 0.0, 0.0), (0.012605042196810246, 0.0, -0.0), (0.016806723549962044, 0.0, 0.0), (0.021008403971791267, 0.0, 0.0), -(0.025210084393620491, 0.0, 0.0), (0.029411764815449715, 0.0, 0.0), -(0.033613447099924088, 0.0, 0.0), (0.037815127521753311, -0.0039215688593685627, 0.0039215688593685627), (0.042016807943582535, -0.0078431377187371254, 0.0078431377187371254), (0.046218488365411758, -0.0078431377187371254, 0.0078431377187371254), (0.050420168787240982, -0.011764706112444401, 0.011764706112444401), (0.054621849209070206, -0.015686275437474251, 0.015686275437474251), (0.058823529630899429, -0.019607843831181526, 0.019607843831181526), (0.063025213778018951, -0.019607843831181526, 0.019607843831181526), (0.067226894199848175, -0.023529412224888802, 0.023529412224888802), (0.071428574621677399, -0.027450980618596077, 0.027450980618596077), (0.075630255043506622, -0.031372550874948502, 0.031372550874948502), (0.079831935465335846, -0.031372550874948502, 0.031372550874948502), (0.08403361588716507, -0.035294119268655777, 0.035294119268655777), (0.088235296308994293, -0.039215687662363052, 0.039215687662363052), (0.092436976730823517, -0.043137256056070328, 0.043137256056070328), (0.09663865715265274, -0.043137256056070328, 0.043137256056070328), (0.10084033757448196, -0.047058824449777603, 0.047058824449777603), (0.10504201799631119, -0.050980392843484879, 0.050980392843484879), (0.10924369841814041, -0.054901961237192154, 0.054901961237192154), (0.11344537883996964, -0.058823529630899429, 0.058823529630899429), (0.11764705926179886, -0.058823529630899429, 0.058823529630899429), (0.12184873968362808, -0.062745101749897003, 0.062745101749897003), (0.1260504275560379, -0.066666670143604279, 0.066666670143604279), (0.13025210797786713, -0.070588238537311554, 0.070588238537311554), (0.13445378839969635, -0.070588238537311554, 0.070588238537311554), (0.13865546882152557, -0.074509806931018829, 0.074509806931018829), (0.1428571492433548, -0.078431375324726105, 0.078431375324726105), (0.14705882966518402, -0.08235294371843338, 0.08235294371843338), (0.15126051008701324, -0.086274512112140656, 0.086274512112140656), (0.15546219050884247, -0.086274512112140656, 0.086274512112140656), (0.15966387093067169, -0.090196080505847931, 0.090196080505847931), (0.16386555135250092, -0.094117648899555206, 0.094117648899555206), (0.16806723177433014, -0.098039217293262482, 0.098039217293262482), (0.17226891219615936, -0.10196078568696976, 0.10196078568696976), (0.17647059261798859, -0.10196078568696976, 0.10196078568696976), (0.18067227303981781, -0.10588235408067703, 0.10588235408067703), (0.18487395346164703, -0.10980392247438431, 0.10980392247438431), (0.18907563388347626, -0.11372549086809158, 0.11372549086809158), (0.19327731430530548, -0.11764705926179886, 0.11764705926179886), (0.1974789947271347, -0.12156862765550613, 0.12156862765550613), (0.20168067514896393, -0.12156862765550613, 0.12156862765550613), (0.20588235557079315, -0.12549020349979401, 0.12549020349979401), (0.21008403599262238, -0.12941177189350128, 0.12941177189350128), (0.2142857164144516, -0.13333334028720856, 0.13333334028720856), (0.21848739683628082, -0.13725490868091583, 0.13725490868091583), (0.22268907725811005, -0.14117647707462311, 0.14117647707462311), (0.22689075767993927, -0.14117647707462311, 0.14117647707462311), (0.23109243810176849, -0.14509804546833038, 0.14509804546833038), (0.23529411852359772, -0.14901961386203766, 0.14901961386203766), (0.23949579894542694, -0.15294118225574493, 0.15294118225574493), (0.24369747936725616, -0.15686275064945221, 0.15686275064945221), (0.24789915978908539, -0.16078431904315948, 0.16078431904315948), (0.25210085511207581, -0.16078431904315948, 0.16078431904315948), (0.25630253553390503, -0.16470588743686676, 0.16470588743686676), (0.26050421595573425, -0.16862745583057404, 0.16862745583057404), (0.26470589637756348, -0.17254902422428131, 0.17254902422428131), (0.2689075767993927, -0.17647059261798859, 0.17647059261798859), (0.27310925722122192, -0.18039216101169586, 0.18039216101169586), (0.27731093764305115, -0.18431372940540314, 0.18431372940540314), (0.28151261806488037, -0.18823529779911041, 0.18823529779911041), (0.28571429848670959, -0.18823529779911041, 0.18823529779911041), (0.28991597890853882, -0.18823529779911041, 0.18823529779911041), (0.29411765933036804, -0.19215686619281769, 0.19215686619281769), (0.29831933975219727, -0.19215686619281769, 0.19215686619281769), (0.30252102017402649, -0.19607843458652496, 0.19607843458652496), (0.30672270059585571, -0.19607843458652496, 0.19607843458652496), (0.31092438101768494, -0.20000000298023224, 0.20000000298023224), (0.31512606143951416, -0.20000000298023224, 0.20000000298023224), (0.31932774186134338, -0.20392157137393951, 0.20392157137393951), (0.32352942228317261, -0.20392157137393951, 0.20392157137393951), (0.32773110270500183, -0.20784313976764679, 0.20784313976764679), (0.33193278312683105, -0.20784313976764679, 0.20784313976764679), (0.33613446354866028, -0.21176470816135406, 0.21176470816135406), (0.3403361439704895, -0.21176470816135406, 0.21176470816135406), (0.34453782439231873, -0.21568627655506134, 0.21568627655506134), (0.34873950481414795, -0.21568627655506134, 0.21568627655506134), (0.35294118523597717, -0.21960784494876862, 0.21960784494876862), (0.3571428656578064, -0.21960784494876862, 0.21960784494876862), (0.36134454607963562, -0.22352941334247589, 0.22352941334247589), (0.36554622650146484, -0.22352941334247589, 0.22352941334247589), (0.36974790692329407, -0.22745098173618317, 0.22745098173618317), (0.37394958734512329, -0.22745098173618317, 0.22745098173618317), (0.37815126776695251, -0.23137255012989044, 0.23137255012989044), (0.38235294818878174, -0.23137255012989044, 0.23137255012989044), (0.38655462861061096, -0.23529411852359772, 0.23529411852359772), (0.39075630903244019, -0.23921568691730499, 0.23921568691730499), (0.39495798945426941, -0.23921568691730499, 0.23921568691730499), (0.39915966987609863, -0.24313725531101227, 0.24313725531101227), (0.40336135029792786, -0.24313725531101227, 0.24313725531101227), (0.40756303071975708, -0.24705882370471954, 0.24705882370471954), (0.4117647111415863, -0.24705882370471954, 0.24705882370471954), (0.41596639156341553, -0.25098040699958801, 0.25098040699958801), (0.42016807198524475, -0.25098040699958801, 0.25098040699958801), (0.42436975240707397, -0.25490197539329529, 0.25490197539329529), (0.4285714328289032, -0.25490197539329529, 0.25490197539329529), (0.43277311325073242, -0.25882354378700256, 0.25882354378700256), (0.43697479367256165, -0.26274511218070984, 0.26274511218070984), (0.44117647409439087, -0.26274511218070984, 0.26274511218070984), (0.44537815451622009, -0.26666668057441711, 0.26666668057441711), (0.44957983493804932, -0.26666668057441711, 0.26666668057441711), (0.45378151535987854, -0.27058824896812439, 0.27058824896812439), (0.45798319578170776, -0.27058824896812439, 0.27058824896812439), (0.46218487620353699, -0.27450981736183167, 0.27450981736183167), (0.46638655662536621, -0.27843138575553894, 0.27843138575553894), (0.47058823704719543, -0.28627452254295349, 0.28627452254295349), (0.47478991746902466, -0.29803922772407532, 0.29803922772407532), (0.47899159789085388, -0.30588236451148987, 0.30588236451148987), (0.48319327831268311, -0.31764706969261169, 0.31764706969261169), (0.48739495873451233, -0.32549020648002625, 0.32549020648002625), (0.49159663915634155, -0.33725491166114807, 0.33725491166114807), (0.49579831957817078, -0.34509804844856262, 0.34509804844856262), (0.5, 0.35686275362968445, -0.35686275362968445), (0.50420171022415161, 0.36862745881080627, -0.36862745881080627), (0.50840336084365845, 0.37647059559822083, -0.37647059559822083), (0.51260507106781006, 0.38823530077934265, -0.38823530077934265), (0.51680672168731689, 0.3960784375667572, -0.3960784375667572), (0.52100843191146851, 0.40784314274787903, -0.40784314274787903), (0.52521008253097534, 0.41568627953529358, -0.41568627953529358), (0.52941179275512695, 0.42745098471641541, -0.42745098471641541), (0.53361344337463379, 0.43529412150382996, -0.43529412150382996), (0.5378151535987854, 0.44705882668495178, -0.44705882668495178), (0.54201680421829224, 0.45882353186607361, -0.45882353186607361), (0.54621851444244385, 0.46666666865348816, -0.46666666865348816), (0.55042016506195068, 0.47450980544090271, -0.47450980544090271), (0.55462187528610229, 0.47843137383460999, -0.47843137383460999), (0.55882352590560913, 0.48627451062202454, -0.48627451062202454), (0.56302523612976074, 0.49411764740943909, -0.49411764740943909), (0.56722688674926758, 0.50196081399917603, -0.50196081399917603), (0.57142859697341919, 0.5058823823928833, -0.5058823823928833), (0.57563024759292603, 0.51372551918029785, -0.51372551918029785), (0.57983195781707764, 0.5215686559677124, -0.5215686559677124), (0.58403360843658447, 0.52941179275512695, -0.52941179275512695), (0.58823531866073608, 0.53333336114883423, -0.53333336114883423), (0.59243696928024292, 0.54117649793624878, -0.54117649793624878), (0.59663867950439453, 0.54901963472366333, -0.54901963472366333), (0.60084033012390137, 0.55294120311737061, -0.55294120311737061), (0.60504204034805298, 0.56078433990478516, -0.56078433990478516), (0.60924369096755981, 0.56862747669219971, -0.56862747669219971), (0.61344540119171143, 0.57647061347961426, -0.57647061347961426), (0.61764705181121826, 0.58431375026702881, -0.58431375026702881), (0.62184876203536987, 0.58823531866073608, -0.58823531866073608), (0.62605041265487671, 0.59607845544815063, -0.59607845544815063), (0.63025212287902832, 0.60392159223556519, -0.60392159223556519), (0.63445377349853516, 0.61176472902297974, -0.61176472902297974), (0.63865548372268677, 0.61568629741668701, -0.61568629741668701), (0.6428571343421936, 0.62352943420410156, -0.62352943420410156), (0.64705884456634521, 0.63137257099151611, -0.63137257099151611), (0.65126049518585205, 0.63921570777893066, -0.63921570777893066), (0.65546220541000366, 0.64705884456634521, -0.64705884456634521), (0.6596638560295105, 0.65098041296005249, -0.65098041296005249), (0.66386556625366211, 0.65882354974746704, -0.65882354974746704), (0.66806721687316895, 0.66666668653488159, -0.66666668653488159), (0.67226892709732056, 0.67450982332229614, -0.67450982332229614), (0.67647057771682739, 0.68235296010971069, -0.68235296010971069), (0.680672287940979, 0.68627452850341797, -0.68627452850341797), (0.68487393856048584, 0.69411766529083252, -0.69411766529083252), (0.68907564878463745, 0.70196080207824707, -0.70196080207824707), (0.69327729940414429, 0.70980393886566162, -0.70980393886566162), (0.6974790096282959, 0.71764707565307617, -0.71764707565307617), (0.70168066024780273, 0.71764707565307617, -0.71764707565307617), (0.70588237047195435, 0.72156864404678345, -0.72156864404678345), (0.71008402109146118, 0.72156864404678345, -0.72156864404678345), (0.71428573131561279, 0.72549021244049072, -0.72549021244049072), (0.71848738193511963, 0.72549021244049072, -0.72549021244049072), (0.72268909215927124, 0.729411780834198, -0.729411780834198), (0.72689074277877808, 0.729411780834198, -0.729411780834198), (0.73109245300292969, 0.73333334922790527, -0.73333334922790527), (0.73529410362243652, 0.73333334922790527, -0.73333334922790527), (0.73949581384658813, 0.73333334922790527, -0.73333334922790527), (0.74369746446609497, 0.73725491762161255, -0.73725491762161255), (0.74789917469024658, 0.73725491762161255, -0.73725491762161255), (0.75210082530975342, 0.74117648601531982, -0.74117648601531982), (0.75630253553390503, 0.74117648601531982, -0.74117648601531982), (0.76050418615341187, 0.7450980544090271, -0.7450980544090271), (0.76470589637756348, 0.7450980544090271, -0.7450980544090271), (0.76890754699707031, 0.7450980544090271, -0.7450980544090271), (0.77310925722122192, 0.74901962280273438, -0.74901962280273438), (0.77731090784072876, 0.74901962280273438, -0.74901962280273438), (0.78151261806488037, 0.75294119119644165, -0.75294119119644165), (0.78571426868438721, 0.75294119119644165, -0.75294119119644165), (0.78991597890853882, 0.75686275959014893, -0.75686275959014893), (0.79411762952804565, 0.76470589637756348, -0.76470589637756348), (0.79831933975219727, 0.76862746477127075, -0.76862746477127075), (0.8025209903717041, 0.77254903316497803, -0.77254903316497803), (0.80672270059585571, 0.7764706015586853, -0.7764706015586853), (0.81092435121536255, 0.78039216995239258, -0.78039216995239258), (0.81512606143951416, 0.78823530673980713, -0.78823530673980713), (0.819327712059021, 0.7921568751335144, -0.7921568751335144), (0.82352942228317261, 0.79607844352722168, -0.79607844352722168), (0.82773107290267944, 0.80000001192092896, -0.80000001192092896), (0.83193278312683105, 0.80392158031463623, -0.80392158031463623), (0.83613443374633789, 0.81176471710205078, -0.81176471710205078), (0.8403361439704895, 0.81568628549575806, -0.81568628549575806), (0.84453779458999634, 0.81960785388946533, -0.81960785388946533), (0.84873950481414795, 0.82352942228317261, -0.82352942228317261), (0.85294115543365479, 0.82745099067687988, -0.82745099067687988), (0.8571428656578064, 0.83529412746429443, -0.83529412746429443), (0.86134451627731323, 0.83921569585800171, -0.83921569585800171), (0.86554622650146484, 0.84313726425170898, -0.84313726425170898), (0.86974787712097168, 0.84705883264541626, -0.84705883264541626), (0.87394958734512329, 0.85098040103912354, -0.85098040103912354), (0.87815123796463013, 0.85882353782653809, -0.85882353782653809), (0.88235294818878174, 0.86274510622024536, -0.86274510622024536), (0.88655459880828857, 0.86666667461395264, -0.86666667461395264), (0.89075630903244019, 0.87058824300765991, -0.87058824300765991), (0.89495795965194702, 0.87450981140136719, -0.87450981140136719), (0.89915966987609863, 0.88235294818878174, -0.88235294818878174), (0.90336132049560547, 0.88627451658248901, -0.88627451658248901), (0.90756303071975708, 0.89019608497619629, -0.89019608497619629), (0.91176468133926392, 0.89411765336990356, -0.89411765336990356), (0.91596639156341553, 0.89803922176361084, -0.89803922176361084), (0.92016804218292236, 0.90588235855102539, -0.90588235855102539), (0.92436975240707397, 0.90980392694473267, -0.90980392694473267), (0.92857140302658081, 0.91372549533843994, -0.91372549533843994), (0.93277311325073242, 0.91764706373214722, -0.91764706373214722), (0.93697476387023926, 0.92156863212585449, -0.92156863212585449), (0.94117647409439087, 0.92941176891326904, -0.92941176891326904), (0.94537812471389771, 0.93333333730697632, -0.93333333730697632), (0.94957983493804932, 0.93725490570068359, -0.93725490570068359), (0.95378148555755615, 0.94117647409439087, -0.94117647409439087), (0.95798319578170776, 0.94509804248809814, -0.94509804248809814), (0.9621848464012146, 0.9529411792755127, -0.9529411792755127), (0.96638655662536621, 0.95686274766921997, -0.95686274766921997), (0.97058820724487305, 0.96078431606292725, -0.96078431606292725), (0.97478991746902466, 0.96470588445663452, -0.96470588445663452), (0.97899156808853149, 0.9686274528503418, -0.9686274528503418), (0.98319327831268311, 0.97647058963775635, -0.97647058963775635), (0.98739492893218994, 0.98039215803146362, -0.98039215803146362), (0.99159663915634155, 0.9843137264251709, -0.9843137264251709), (0.99579828977584839, 0.98823529481887817, -0.98823529481887817), (1.0, 0.99215686321258545, 0.99215686321258545)]} -_gist_gray_data = {'blue': [(0.0, 0.0, 0.0), (0.0042016808874905109, -0.0039215688593685627, 0.0039215688593685627), (0.0084033617749810219, -0.0078431377187371254, 0.0078431377187371254), (0.012605042196810246, -0.011764706112444401, 0.011764706112444401), (0.016806723549962044, -0.015686275437474251, 0.015686275437474251), (0.021008403971791267, -0.019607843831181526, 0.019607843831181526), (0.025210084393620491, -0.023529412224888802, 0.023529412224888802), (0.029411764815449715, -0.027450980618596077, 0.027450980618596077), (0.033613447099924088, -0.035294119268655777, 0.035294119268655777), (0.037815127521753311, -0.039215687662363052, 0.039215687662363052), (0.042016807943582535, -0.043137256056070328, 0.043137256056070328), (0.046218488365411758, -0.047058824449777603, 0.047058824449777603), (0.050420168787240982, -0.050980392843484879, 0.050980392843484879), (0.054621849209070206, -0.054901961237192154, 0.054901961237192154), (0.058823529630899429, -0.058823529630899429, 0.058823529630899429), (0.063025213778018951, -0.062745101749897003, 0.062745101749897003), (0.067226894199848175, -0.066666670143604279, 0.066666670143604279), (0.071428574621677399, -0.070588238537311554, 0.070588238537311554), (0.075630255043506622, -0.074509806931018829, 0.074509806931018829), (0.079831935465335846, -0.078431375324726105, 0.078431375324726105), (0.08403361588716507, -0.08235294371843338, 0.08235294371843338), (0.088235296308994293, -0.086274512112140656, 0.086274512112140656), (0.092436976730823517, -0.090196080505847931, 0.090196080505847931), (0.09663865715265274, -0.098039217293262482, 0.098039217293262482), (0.10084033757448196, -0.10196078568696976, 0.10196078568696976), (0.10504201799631119, -0.10588235408067703, 0.10588235408067703), (0.10924369841814041, -0.10980392247438431, 0.10980392247438431), (0.11344537883996964, -0.11372549086809158, 0.11372549086809158), (0.11764705926179886, -0.11764705926179886, 0.11764705926179886), (0.12184873968362808, -0.12156862765550613, 0.12156862765550613), (0.1260504275560379, -0.12549020349979401, 0.12549020349979401), (0.13025210797786713, -0.12941177189350128, 0.12941177189350128), (0.13445378839969635, -0.13333334028720856, 0.13333334028720856), (0.13865546882152557, -0.13725490868091583, 0.13725490868091583), (0.1428571492433548, -0.14117647707462311, 0.14117647707462311), (0.14705882966518402, -0.14509804546833038, 0.14509804546833038), (0.15126051008701324, -0.14901961386203766, 0.14901961386203766), (0.15546219050884247, -0.15294118225574493, 0.15294118225574493), (0.15966387093067169, -0.16078431904315948, 0.16078431904315948), (0.16386555135250092, -0.16470588743686676, 0.16470588743686676), (0.16806723177433014, -0.16862745583057404, 0.16862745583057404), (0.17226891219615936, -0.17254902422428131, 0.17254902422428131), (0.17647059261798859, -0.17647059261798859, 0.17647059261798859), (0.18067227303981781, -0.18039216101169586, 0.18039216101169586), (0.18487395346164703, -0.18431372940540314, 0.18431372940540314), (0.18907563388347626, -0.18823529779911041, 0.18823529779911041), (0.19327731430530548, -0.19215686619281769, 0.19215686619281769), (0.1974789947271347, -0.19607843458652496, 0.19607843458652496), (0.20168067514896393, -0.20000000298023224, 0.20000000298023224), (0.20588235557079315, -0.20392157137393951, 0.20392157137393951), (0.21008403599262238, -0.20784313976764679, 0.20784313976764679), (0.2142857164144516, -0.21176470816135406, 0.21176470816135406), (0.21848739683628082, -0.21568627655506134, 0.21568627655506134), (0.22268907725811005, -0.22352941334247589, 0.22352941334247589), (0.22689075767993927, -0.22745098173618317, 0.22745098173618317), (0.23109243810176849, -0.23137255012989044, 0.23137255012989044), (0.23529411852359772, -0.23529411852359772, 0.23529411852359772), (0.23949579894542694, -0.23921568691730499, 0.23921568691730499), (0.24369747936725616, -0.24313725531101227, 0.24313725531101227), (0.24789915978908539, -0.24705882370471954, 0.24705882370471954), (0.25210085511207581, -0.25098040699958801, 0.25098040699958801), (0.25630253553390503, -0.25490197539329529, 0.25490197539329529), (0.26050421595573425, -0.25882354378700256, 0.25882354378700256), (0.26470589637756348, -0.26274511218070984, 0.26274511218070984), (0.2689075767993927, -0.26666668057441711, 0.26666668057441711), (0.27310925722122192, -0.27058824896812439, 0.27058824896812439), (0.27731093764305115, -0.27450981736183167, 0.27450981736183167), (0.28151261806488037, -0.27843138575553894, 0.27843138575553894), (0.28571429848670959, -0.28627452254295349, 0.28627452254295349), (0.28991597890853882, -0.29019609093666077, 0.29019609093666077), (0.29411765933036804, -0.29411765933036804, 0.29411765933036804), (0.29831933975219727, -0.29803922772407532, 0.29803922772407532), (0.30252102017402649, -0.30196079611778259, 0.30196079611778259), (0.30672270059585571, -0.30588236451148987, 0.30588236451148987), (0.31092438101768494, -0.30980393290519714, 0.30980393290519714), (0.31512606143951416, -0.31372550129890442, 0.31372550129890442), (0.31932774186134338, -0.31764706969261169, 0.31764706969261169), (0.32352942228317261, -0.32156863808631897, 0.32156863808631897), (0.32773110270500183, -0.32549020648002625, 0.32549020648002625), (0.33193278312683105, -0.32941177487373352, 0.32941177487373352), (0.33613446354866028, -0.3333333432674408, 0.3333333432674408), (0.3403361439704895, -0.33725491166114807, 0.33725491166114807), (0.34453782439231873, -0.34117648005485535, 0.34117648005485535), (0.34873950481414795, -0.3490196168422699, 0.3490196168422699), (0.35294118523597717, -0.35294118523597717, 0.35294118523597717), (0.3571428656578064, -0.35686275362968445, 0.35686275362968445), (0.36134454607963562, -0.36078432202339172, 0.36078432202339172), (0.36554622650146484, -0.364705890417099, 0.364705890417099), (0.36974790692329407, -0.36862745881080627, 0.36862745881080627), (0.37394958734512329, -0.37254902720451355, 0.37254902720451355), (0.37815126776695251, -0.37647059559822083, 0.37647059559822083), (0.38235294818878174, -0.3803921639919281, 0.3803921639919281), (0.38655462861061096, -0.38431373238563538, 0.38431373238563538), (0.39075630903244019, -0.38823530077934265, 0.38823530077934265), (0.39495798945426941, -0.39215686917304993, 0.39215686917304993), (0.39915966987609863, -0.3960784375667572, 0.3960784375667572), (0.40336135029792786, -0.40000000596046448, 0.40000000596046448), (0.40756303071975708, -0.40392157435417175, 0.40392157435417175), (0.4117647111415863, -0.4117647111415863, 0.4117647111415863), (0.41596639156341553, -0.41568627953529358, 0.41568627953529358), (0.42016807198524475, -0.41960784792900085, 0.41960784792900085), (0.42436975240707397, -0.42352941632270813, 0.42352941632270813), (0.4285714328289032, -0.42745098471641541, 0.42745098471641541), (0.43277311325073242, -0.43137255311012268, 0.43137255311012268), (0.43697479367256165, -0.43529412150382996, 0.43529412150382996), (0.44117647409439087, -0.43921568989753723, 0.43921568989753723), (0.44537815451622009, -0.44313725829124451, 0.44313725829124451), (0.44957983493804932, -0.44705882668495178, 0.44705882668495178), (0.45378151535987854, -0.45098039507865906, 0.45098039507865906), (0.45798319578170776, -0.45490196347236633, 0.45490196347236633), (0.46218487620353699, -0.45882353186607361, 0.45882353186607361), (0.46638655662536621, -0.46274510025978088, 0.46274510025978088), (0.47058823704719543, -0.46666666865348816, 0.46666666865348816), (0.47478991746902466, -0.47450980544090271, 0.47450980544090271), (0.47899159789085388, -0.47843137383460999, 0.47843137383460999), (0.48319327831268311, -0.48235294222831726, 0.48235294222831726), (0.48739495873451233, -0.48627451062202454, 0.48627451062202454), (0.49159663915634155, -0.49019607901573181, 0.49019607901573181), (0.49579831957817078, -0.49411764740943909, 0.49411764740943909), (0.5, 0.49803921580314636, -0.49803921580314636), (0.50420171022415161, 0.50196081399917603, -0.50196081399917603), (0.50840336084365845, 0.5058823823928833, -0.5058823823928833), (0.51260507106781006, 0.50980395078659058, -0.50980395078659058), (0.51680672168731689, 0.51372551918029785, -0.51372551918029785), (0.52100843191146851, 0.51764708757400513, -0.51764708757400513), (0.52521008253097534, 0.5215686559677124, -0.5215686559677124), (0.52941179275512695, 0.52549022436141968, -0.52549022436141968), (0.53361344337463379, 0.52941179275512695, -0.52941179275512695), (0.5378151535987854, 0.5372549295425415, -0.5372549295425415), (0.54201680421829224, 0.54117649793624878, -0.54117649793624878), (0.54621851444244385, 0.54509806632995605, -0.54509806632995605), (0.55042016506195068, 0.54901963472366333, -0.54901963472366333), (0.55462187528610229, 0.55294120311737061, -0.55294120311737061), (0.55882352590560913, 0.55686277151107788, -0.55686277151107788), (0.56302523612976074, 0.56078433990478516, -0.56078433990478516), (0.56722688674926758, 0.56470590829849243, -0.56470590829849243), (0.57142859697341919, 0.56862747669219971, -0.56862747669219971), (0.57563024759292603, 0.57254904508590698, -0.57254904508590698), (0.57983195781707764, 0.57647061347961426, -0.57647061347961426), (0.58403360843658447, 0.58039218187332153, -0.58039218187332153), (0.58823531866073608, 0.58431375026702881, -0.58431375026702881), (0.59243696928024292, 0.58823531866073608, -0.58823531866073608), (0.59663867950439453, 0.59215688705444336, -0.59215688705444336), (0.60084033012390137, 0.60000002384185791, -0.60000002384185791), (0.60504204034805298, 0.60392159223556519, -0.60392159223556519), (0.60924369096755981, 0.60784316062927246, -0.60784316062927246), (0.61344540119171143, 0.61176472902297974, -0.61176472902297974), (0.61764705181121826, 0.61568629741668701, -0.61568629741668701), (0.62184876203536987, 0.61960786581039429, -0.61960786581039429), (0.62605041265487671, 0.62352943420410156, -0.62352943420410156), (0.63025212287902832, 0.62745100259780884, -0.62745100259780884), (0.63445377349853516, 0.63137257099151611, -0.63137257099151611), (0.63865548372268677, 0.63529413938522339, -0.63529413938522339), (0.6428571343421936, 0.63921570777893066, -0.63921570777893066), (0.64705884456634521, 0.64313727617263794, -0.64313727617263794), (0.65126049518585205, 0.64705884456634521, -0.64705884456634521), (0.65546220541000366, 0.65098041296005249, -0.65098041296005249), (0.6596638560295105, 0.65490198135375977, -0.65490198135375977), (0.66386556625366211, 0.66274511814117432, -0.66274511814117432), (0.66806721687316895, 0.66666668653488159, -0.66666668653488159), (0.67226892709732056, 0.67058825492858887, -0.67058825492858887), (0.67647057771682739, 0.67450982332229614, -0.67450982332229614), (0.680672287940979, 0.67843139171600342, -0.67843139171600342), (0.68487393856048584, 0.68235296010971069, -0.68235296010971069), (0.68907564878463745, 0.68627452850341797, -0.68627452850341797), (0.69327729940414429, 0.69019609689712524, -0.69019609689712524), (0.6974790096282959, 0.69411766529083252, -0.69411766529083252), (0.70168066024780273, 0.69803923368453979, -0.69803923368453979), (0.70588237047195435, 0.70196080207824707, -0.70196080207824707), (0.71008402109146118, 0.70588237047195435, -0.70588237047195435), (0.71428573131561279, 0.70980393886566162, -0.70980393886566162), (0.71848738193511963, 0.7137255072593689, -0.7137255072593689), (0.72268909215927124, 0.71764707565307617, -0.71764707565307617), (0.72689074277877808, 0.72549021244049072, -0.72549021244049072), (0.73109245300292969, 0.729411780834198, -0.729411780834198), (0.73529410362243652, 0.73333334922790527, -0.73333334922790527), (0.73949581384658813, 0.73725491762161255, -0.73725491762161255), (0.74369746446609497, 0.74117648601531982, -0.74117648601531982), (0.74789917469024658, 0.7450980544090271, -0.7450980544090271), (0.75210082530975342, 0.74901962280273438, -0.74901962280273438), (0.75630253553390503, 0.75294119119644165, -0.75294119119644165), (0.76050418615341187, 0.75686275959014893, -0.75686275959014893), (0.76470589637756348, 0.7607843279838562, -0.7607843279838562), (0.76890754699707031, 0.76470589637756348, -0.76470589637756348), (0.77310925722122192, 0.76862746477127075, -0.76862746477127075), (0.77731090784072876, 0.77254903316497803, -0.77254903316497803), (0.78151261806488037, 0.7764706015586853, -0.7764706015586853), (0.78571426868438721, 0.78039216995239258, -0.78039216995239258), (0.78991597890853882, 0.78823530673980713, -0.78823530673980713), (0.79411762952804565, 0.7921568751335144, -0.7921568751335144), (0.79831933975219727, 0.79607844352722168, -0.79607844352722168), (0.8025209903717041, 0.80000001192092896, -0.80000001192092896), (0.80672270059585571, 0.80392158031463623, -0.80392158031463623), (0.81092435121536255, 0.80784314870834351, -0.80784314870834351), (0.81512606143951416, 0.81176471710205078, -0.81176471710205078), (0.819327712059021, 0.81568628549575806, -0.81568628549575806), (0.82352942228317261, 0.81960785388946533, -0.81960785388946533), (0.82773107290267944, 0.82352942228317261, -0.82352942228317261), (0.83193278312683105, 0.82745099067687988, -0.82745099067687988), (0.83613443374633789, 0.83137255907058716, -0.83137255907058716), (0.8403361439704895, 0.83529412746429443, -0.83529412746429443), (0.84453779458999634, 0.83921569585800171, -0.83921569585800171), (0.84873950481414795, 0.84313726425170898, -0.84313726425170898), (0.85294115543365479, 0.85098040103912354, -0.85098040103912354), (0.8571428656578064, 0.85490196943283081, -0.85490196943283081), (0.86134451627731323, 0.85882353782653809, -0.85882353782653809), (0.86554622650146484, 0.86274510622024536, -0.86274510622024536), (0.86974787712097168, 0.86666667461395264, -0.86666667461395264), (0.87394958734512329, 0.87058824300765991, -0.87058824300765991), (0.87815123796463013, 0.87450981140136719, -0.87450981140136719), (0.88235294818878174, 0.87843137979507446, -0.87843137979507446), (0.88655459880828857, 0.88235294818878174, -0.88235294818878174), (0.89075630903244019, 0.88627451658248901, -0.88627451658248901), (0.89495795965194702, 0.89019608497619629, -0.89019608497619629), (0.89915966987609863, 0.89411765336990356, -0.89411765336990356), (0.90336132049560547, 0.89803922176361084, -0.89803922176361084), (0.90756303071975708, 0.90196079015731812, -0.90196079015731812), (0.91176468133926392, 0.90588235855102539, -0.90588235855102539), (0.91596639156341553, 0.91372549533843994, -0.91372549533843994), (0.92016804218292236, 0.91764706373214722, -0.91764706373214722), (0.92436975240707397, 0.92156863212585449, -0.92156863212585449), (0.92857140302658081, 0.92549020051956177, -0.92549020051956177), (0.93277311325073242, 0.92941176891326904, -0.92941176891326904), (0.93697476387023926, 0.93333333730697632, -0.93333333730697632), (0.94117647409439087, 0.93725490570068359, -0.93725490570068359), (0.94537812471389771, 0.94117647409439087, -0.94117647409439087), (0.94957983493804932, 0.94509804248809814, -0.94509804248809814), (0.95378148555755615, 0.94901961088180542, -0.94901961088180542), (0.95798319578170776, 0.9529411792755127, -0.9529411792755127), (0.9621848464012146, 0.95686274766921997, -0.95686274766921997), (0.96638655662536621, 0.96078431606292725, -0.96078431606292725), (0.97058820724487305, 0.96470588445663452, -0.96470588445663452), (0.97478991746902466, 0.9686274528503418, -0.9686274528503418), (0.97899156808853149, 0.97647058963775635, -0.97647058963775635), (0.98319327831268311, 0.98039215803146362, -0.98039215803146362), (0.98739492893218994, 0.9843137264251709, -0.9843137264251709), (0.99159663915634155, 0.98823529481887817, -0.98823529481887817), (0.99579828977584839, 0.99215686321258545, -0.99215686321258545), (1.0, 0.99607843160629272, 0.99607843160629272)], -'green': [(0.0, 0.0, 0.0), (0.0042016808874905109, 0.0039215688593685627, -0.0039215688593685627), (0.0084033617749810219, 0.0078431377187371254, -0.0078431377187371254), (0.012605042196810246, 0.011764706112444401, -0.011764706112444401), (0.016806723549962044, 0.015686275437474251, -0.015686275437474251), (0.021008403971791267, 0.019607843831181526, -0.019607843831181526), (0.025210084393620491, 0.023529412224888802, -0.023529412224888802), (0.029411764815449715, 0.027450980618596077, -0.027450980618596077), (0.033613447099924088, 0.035294119268655777, -0.035294119268655777), (0.037815127521753311, 0.039215687662363052, -0.039215687662363052), (0.042016807943582535, 0.043137256056070328, -0.043137256056070328), (0.046218488365411758, 0.047058824449777603, -0.047058824449777603), (0.050420168787240982, 0.050980392843484879, -0.050980392843484879), (0.054621849209070206, 0.054901961237192154, -0.054901961237192154), (0.058823529630899429, 0.058823529630899429, -0.058823529630899429), (0.063025213778018951, 0.062745101749897003, -0.062745101749897003), (0.067226894199848175, 0.066666670143604279, -0.066666670143604279), (0.071428574621677399, 0.070588238537311554, -0.070588238537311554), (0.075630255043506622, 0.074509806931018829, -0.074509806931018829), (0.079831935465335846, 0.078431375324726105, -0.078431375324726105), (0.08403361588716507, 0.08235294371843338, -0.08235294371843338), (0.088235296308994293, 0.086274512112140656, -0.086274512112140656), (0.092436976730823517, 0.090196080505847931, -0.090196080505847931), (0.09663865715265274, 0.098039217293262482, -0.098039217293262482), (0.10084033757448196, 0.10196078568696976, -0.10196078568696976), (0.10504201799631119, 0.10588235408067703, -0.10588235408067703), (0.10924369841814041, 0.10980392247438431, -0.10980392247438431), (0.11344537883996964, 0.11372549086809158, -0.11372549086809158), (0.11764705926179886, 0.11764705926179886, -0.11764705926179886), (0.12184873968362808, 0.12156862765550613, -0.12156862765550613), (0.1260504275560379, 0.12549020349979401, -0.12549020349979401), (0.13025210797786713, 0.12941177189350128, -0.12941177189350128), (0.13445378839969635, 0.13333334028720856, -0.13333334028720856), (0.13865546882152557, 0.13725490868091583, -0.13725490868091583), (0.1428571492433548, 0.14117647707462311, -0.14117647707462311), (0.14705882966518402, 0.14509804546833038, -0.14509804546833038), (0.15126051008701324, 0.14901961386203766, -0.14901961386203766), (0.15546219050884247, 0.15294118225574493, -0.15294118225574493), (0.15966387093067169, 0.16078431904315948, -0.16078431904315948), (0.16386555135250092, 0.16470588743686676, -0.16470588743686676), (0.16806723177433014, 0.16862745583057404, -0.16862745583057404), (0.17226891219615936, 0.17254902422428131, -0.17254902422428131), (0.17647059261798859, 0.17647059261798859, -0.17647059261798859), (0.18067227303981781, 0.18039216101169586, -0.18039216101169586), (0.18487395346164703, 0.18431372940540314, -0.18431372940540314), (0.18907563388347626, 0.18823529779911041, -0.18823529779911041), (0.19327731430530548, 0.19215686619281769, -0.19215686619281769), (0.1974789947271347, 0.19607843458652496, -0.19607843458652496), (0.20168067514896393, 0.20000000298023224, -0.20000000298023224), (0.20588235557079315, 0.20392157137393951, -0.20392157137393951), (0.21008403599262238, 0.20784313976764679, -0.20784313976764679), (0.2142857164144516, 0.21176470816135406, -0.21176470816135406), (0.21848739683628082, 0.21568627655506134, -0.21568627655506134), (0.22268907725811005, 0.22352941334247589, -0.22352941334247589), (0.22689075767993927, 0.22745098173618317, -0.22745098173618317), (0.23109243810176849, 0.23137255012989044, -0.23137255012989044), (0.23529411852359772, 0.23529411852359772, -0.23529411852359772), (0.23949579894542694, 0.23921568691730499, -0.23921568691730499), (0.24369747936725616, 0.24313725531101227, -0.24313725531101227), (0.24789915978908539, 0.24705882370471954, -0.24705882370471954), (0.25210085511207581, 0.25098040699958801, -0.25098040699958801), (0.25630253553390503, 0.25490197539329529, -0.25490197539329529), (0.26050421595573425, 0.25882354378700256, -0.25882354378700256), (0.26470589637756348, 0.26274511218070984, -0.26274511218070984), (0.2689075767993927, 0.26666668057441711, -0.26666668057441711), (0.27310925722122192, 0.27058824896812439, -0.27058824896812439), (0.27731093764305115, 0.27450981736183167, -0.27450981736183167), (0.28151261806488037, 0.27843138575553894, -0.27843138575553894), (0.28571429848670959, 0.28627452254295349, -0.28627452254295349), (0.28991597890853882, 0.29019609093666077, -0.29019609093666077), (0.29411765933036804, 0.29411765933036804, -0.29411765933036804), (0.29831933975219727, 0.29803922772407532, -0.29803922772407532), (0.30252102017402649, 0.30196079611778259, -0.30196079611778259), (0.30672270059585571, 0.30588236451148987, -0.30588236451148987), (0.31092438101768494, 0.30980393290519714, -0.30980393290519714), (0.31512606143951416, 0.31372550129890442, -0.31372550129890442), (0.31932774186134338, 0.31764706969261169, -0.31764706969261169), (0.32352942228317261, 0.32156863808631897, -0.32156863808631897), (0.32773110270500183, 0.32549020648002625, -0.32549020648002625), (0.33193278312683105, 0.32941177487373352, -0.32941177487373352), (0.33613446354866028, 0.3333333432674408, -0.3333333432674408), (0.3403361439704895, 0.33725491166114807, -0.33725491166114807), (0.34453782439231873, 0.34117648005485535, -0.34117648005485535), (0.34873950481414795, 0.3490196168422699, -0.3490196168422699), (0.35294118523597717, 0.35294118523597717, -0.35294118523597717), (0.3571428656578064, 0.35686275362968445, -0.35686275362968445), (0.36134454607963562, 0.36078432202339172, -0.36078432202339172), (0.36554622650146484, 0.364705890417099, -0.364705890417099), (0.36974790692329407, 0.36862745881080627, -0.36862745881080627), (0.37394958734512329, 0.37254902720451355, -0.37254902720451355), (0.37815126776695251, 0.37647059559822083, -0.37647059559822083), (0.38235294818878174, 0.3803921639919281, -0.3803921639919281), (0.38655462861061096, 0.38431373238563538, -0.38431373238563538), (0.39075630903244019, 0.38823530077934265, -0.38823530077934265), (0.39495798945426941, 0.39215686917304993, -0.39215686917304993), (0.39915966987609863, 0.3960784375667572, -0.3960784375667572), (0.40336135029792786, 0.40000000596046448, -0.40000000596046448), (0.40756303071975708, 0.40392157435417175, -0.40392157435417175), (0.4117647111415863, 0.4117647111415863, -0.4117647111415863), (0.41596639156341553, 0.41568627953529358, -0.41568627953529358), (0.42016807198524475, 0.41960784792900085, -0.41960784792900085), (0.42436975240707397, 0.42352941632270813, -0.42352941632270813), (0.4285714328289032, 0.42745098471641541, -0.42745098471641541), (0.43277311325073242, 0.43137255311012268, -0.43137255311012268), (0.43697479367256165, 0.43529412150382996, -0.43529412150382996), (0.44117647409439087, 0.43921568989753723, -0.43921568989753723), (0.44537815451622009, 0.44313725829124451, -0.44313725829124451), (0.44957983493804932, 0.44705882668495178, -0.44705882668495178), (0.45378151535987854, 0.45098039507865906, -0.45098039507865906), (0.45798319578170776, 0.45490196347236633, -0.45490196347236633), (0.46218487620353699, 0.45882353186607361, -0.45882353186607361), (0.46638655662536621, 0.46274510025978088, -0.46274510025978088), (0.47058823704719543, 0.46666666865348816, -0.46666666865348816), (0.47478991746902466, 0.47450980544090271, -0.47450980544090271), (0.47899159789085388, 0.47843137383460999, -0.47843137383460999), (0.48319327831268311, 0.48235294222831726, -0.48235294222831726), (0.48739495873451233, 0.48627451062202454, -0.48627451062202454), (0.49159663915634155, 0.49019607901573181, -0.49019607901573181), (0.49579831957817078, 0.49411764740943909, -0.49411764740943909), (0.5, 0.49803921580314636, 0.49803921580314636), -(0.50420171022415161, 0.50196081399917603, 0.50196081399917603), -(0.50840336084365845, 0.5058823823928833, 0.5058823823928833), -(0.51260507106781006, 0.50980395078659058, 0.50980395078659058), -(0.51680672168731689, 0.51372551918029785, 0.51372551918029785), -(0.52100843191146851, 0.51764708757400513, 0.51764708757400513), -(0.52521008253097534, 0.5215686559677124, 0.5215686559677124), -(0.52941179275512695, 0.52549022436141968, 0.52549022436141968), -(0.53361344337463379, 0.52941179275512695, 0.52941179275512695), -(0.5378151535987854, 0.5372549295425415, 0.5372549295425415), -(0.54201680421829224, 0.54117649793624878, 0.54117649793624878), -(0.54621851444244385, 0.54509806632995605, 0.54509806632995605), -(0.55042016506195068, 0.54901963472366333, 0.54901963472366333), -(0.55462187528610229, 0.55294120311737061, 0.55294120311737061), -(0.55882352590560913, 0.55686277151107788, 0.55686277151107788), -(0.56302523612976074, 0.56078433990478516, 0.56078433990478516), -(0.56722688674926758, 0.56470590829849243, 0.56470590829849243), -(0.57142859697341919, 0.56862747669219971, 0.56862747669219971), -(0.57563024759292603, 0.57254904508590698, 0.57254904508590698), -(0.57983195781707764, 0.57647061347961426, 0.57647061347961426), -(0.58403360843658447, 0.58039218187332153, 0.58039218187332153), -(0.58823531866073608, 0.58431375026702881, 0.58431375026702881), -(0.59243696928024292, 0.58823531866073608, 0.58823531866073608), -(0.59663867950439453, 0.59215688705444336, 0.59215688705444336), -(0.60084033012390137, 0.60000002384185791, 0.60000002384185791), -(0.60504204034805298, 0.60392159223556519, 0.60392159223556519), -(0.60924369096755981, 0.60784316062927246, 0.60784316062927246), -(0.61344540119171143, 0.61176472902297974, 0.61176472902297974), -(0.61764705181121826, 0.61568629741668701, 0.61568629741668701), -(0.62184876203536987, 0.61960786581039429, 0.61960786581039429), -(0.62605041265487671, 0.62352943420410156, 0.62352943420410156), -(0.63025212287902832, 0.62745100259780884, 0.62745100259780884), -(0.63445377349853516, 0.63137257099151611, 0.63137257099151611), -(0.63865548372268677, 0.63529413938522339, 0.63529413938522339), -(0.6428571343421936, 0.63921570777893066, 0.63921570777893066), -(0.64705884456634521, 0.64313727617263794, 0.64313727617263794), -(0.65126049518585205, 0.64705884456634521, 0.64705884456634521), -(0.65546220541000366, 0.65098041296005249, 0.65098041296005249), -(0.6596638560295105, 0.65490198135375977, 0.65490198135375977), -(0.66386556625366211, 0.66274511814117432, 0.66274511814117432), -(0.66806721687316895, 0.66666668653488159, 0.66666668653488159), -(0.67226892709732056, 0.67058825492858887, 0.67058825492858887), -(0.67647057771682739, 0.67450982332229614, 0.67450982332229614), -(0.680672287940979, 0.67843139171600342, 0.67843139171600342), -(0.68487393856048584, 0.68235296010971069, 0.68235296010971069), -(0.68907564878463745, 0.68627452850341797, 0.68627452850341797), -(0.69327729940414429, 0.69019609689712524, 0.69019609689712524), -(0.6974790096282959, 0.69411766529083252, 0.69411766529083252), -(0.70168066024780273, 0.69803923368453979, 0.69803923368453979), -(0.70588237047195435, 0.70196080207824707, 0.70196080207824707), -(0.71008402109146118, 0.70588237047195435, 0.70588237047195435), -(0.71428573131561279, 0.70980393886566162, 0.70980393886566162), -(0.71848738193511963, 0.7137255072593689, 0.7137255072593689), -(0.72268909215927124, 0.71764707565307617, 0.71764707565307617), -(0.72689074277877808, 0.72549021244049072, 0.72549021244049072), -(0.73109245300292969, 0.729411780834198, 0.729411780834198), -(0.73529410362243652, 0.73333334922790527, 0.73333334922790527), -(0.73949581384658813, 0.73725491762161255, 0.73725491762161255), -(0.74369746446609497, 0.74117648601531982, 0.74117648601531982), -(0.74789917469024658, 0.7450980544090271, 0.7450980544090271), -(0.75210082530975342, 0.74901962280273438, 0.74901962280273438), -(0.75630253553390503, 0.75294119119644165, 0.75294119119644165), -(0.76050418615341187, 0.75686275959014893, 0.75686275959014893), -(0.76470589637756348, 0.7607843279838562, 0.7607843279838562), -(0.76890754699707031, 0.76470589637756348, 0.76470589637756348), -(0.77310925722122192, 0.76862746477127075, 0.76862746477127075), -(0.77731090784072876, 0.77254903316497803, 0.77254903316497803), -(0.78151261806488037, 0.7764706015586853, 0.7764706015586853), -(0.78571426868438721, 0.78039216995239258, 0.78039216995239258), -(0.78991597890853882, 0.78823530673980713, 0.78823530673980713), -(0.79411762952804565, 0.7921568751335144, 0.7921568751335144), -(0.79831933975219727, 0.79607844352722168, 0.79607844352722168), -(0.8025209903717041, 0.80000001192092896, 0.80000001192092896), -(0.80672270059585571, 0.80392158031463623, 0.80392158031463623), -(0.81092435121536255, 0.80784314870834351, 0.80784314870834351), -(0.81512606143951416, 0.81176471710205078, 0.81176471710205078), -(0.819327712059021, 0.81568628549575806, 0.81568628549575806), -(0.82352942228317261, 0.81960785388946533, 0.81960785388946533), -(0.82773107290267944, 0.82352942228317261, 0.82352942228317261), -(0.83193278312683105, 0.82745099067687988, 0.82745099067687988), -(0.83613443374633789, 0.83137255907058716, 0.83137255907058716), -(0.8403361439704895, 0.83529412746429443, 0.83529412746429443), -(0.84453779458999634, 0.83921569585800171, 0.83921569585800171), -(0.84873950481414795, 0.84313726425170898, 0.84313726425170898), -(0.85294115543365479, 0.85098040103912354, 0.85098040103912354), -(0.8571428656578064, 0.85490196943283081, 0.85490196943283081), -(0.86134451627731323, 0.85882353782653809, 0.85882353782653809), -(0.86554622650146484, 0.86274510622024536, 0.86274510622024536), -(0.86974787712097168, 0.86666667461395264, 0.86666667461395264), -(0.87394958734512329, 0.87058824300765991, 0.87058824300765991), -(0.87815123796463013, 0.87450981140136719, 0.87450981140136719), -(0.88235294818878174, 0.87843137979507446, 0.87843137979507446), -(0.88655459880828857, 0.88235294818878174, 0.88235294818878174), -(0.89075630903244019, 0.88627451658248901, 0.88627451658248901), -(0.89495795965194702, 0.89019608497619629, 0.89019608497619629), -(0.89915966987609863, 0.89411765336990356, 0.89411765336990356), -(0.90336132049560547, 0.89803922176361084, 0.89803922176361084), -(0.90756303071975708, 0.90196079015731812, 0.90196079015731812), -(0.91176468133926392, 0.90588235855102539, 0.90588235855102539), -(0.91596639156341553, 0.91372549533843994, 0.91372549533843994), -(0.92016804218292236, 0.91764706373214722, 0.91764706373214722), -(0.92436975240707397, 0.92156863212585449, 0.92156863212585449), -(0.92857140302658081, 0.92549020051956177, 0.92549020051956177), -(0.93277311325073242, 0.92941176891326904, 0.92941176891326904), -(0.93697476387023926, 0.93333333730697632, 0.93333333730697632), -(0.94117647409439087, 0.93725490570068359, 0.93725490570068359), -(0.94537812471389771, 0.94117647409439087, 0.94117647409439087), -(0.94957983493804932, 0.94509804248809814, 0.94509804248809814), -(0.95378148555755615, 0.94901961088180542, 0.94901961088180542), -(0.95798319578170776, 0.9529411792755127, 0.9529411792755127), -(0.9621848464012146, 0.95686274766921997, 0.95686274766921997), -(0.96638655662536621, 0.96078431606292725, 0.96078431606292725), -(0.97058820724487305, 0.96470588445663452, 0.96470588445663452), -(0.97478991746902466, 0.9686274528503418, 0.9686274528503418), -(0.97899156808853149, 0.97647058963775635, 0.97647058963775635), -(0.98319327831268311, 0.98039215803146362, 0.98039215803146362), -(0.98739492893218994, 0.9843137264251709, 0.9843137264251709), -(0.99159663915634155, 0.98823529481887817, 0.98823529481887817), -(0.99579828977584839, 0.99215686321258545, 0.99215686321258545), (1.0, -0.99607843160629272, 0.99607843160629272)], 'red': [(0.0, 0.0, 0.0), -(0.0042016808874905109, 0.0039215688593685627, 0.0039215688593685627), -(0.0084033617749810219, 0.0078431377187371254, 0.0078431377187371254), -(0.012605042196810246, 0.011764706112444401, 0.011764706112444401), -(0.016806723549962044, 0.015686275437474251, 0.015686275437474251), -(0.021008403971791267, 0.019607843831181526, 0.019607843831181526), -(0.025210084393620491, 0.023529412224888802, 0.023529412224888802), -(0.029411764815449715, 0.027450980618596077, 0.027450980618596077), -(0.033613447099924088, 0.035294119268655777, 0.035294119268655777), -(0.037815127521753311, 0.039215687662363052, 0.039215687662363052), -(0.042016807943582535, 0.043137256056070328, 0.043137256056070328), -(0.046218488365411758, 0.047058824449777603, 0.047058824449777603), -(0.050420168787240982, 0.050980392843484879, 0.050980392843484879), -(0.054621849209070206, 0.054901961237192154, 0.054901961237192154), -(0.058823529630899429, 0.058823529630899429, 0.058823529630899429), -(0.063025213778018951, 0.062745101749897003, 0.062745101749897003), -(0.067226894199848175, 0.066666670143604279, 0.066666670143604279), -(0.071428574621677399, 0.070588238537311554, 0.070588238537311554), -(0.075630255043506622, 0.074509806931018829, 0.074509806931018829), -(0.079831935465335846, 0.078431375324726105, 0.078431375324726105), -(0.08403361588716507, 0.08235294371843338, 0.08235294371843338), -(0.088235296308994293, 0.086274512112140656, 0.086274512112140656), -(0.092436976730823517, 0.090196080505847931, 0.090196080505847931), -(0.09663865715265274, 0.098039217293262482, 0.098039217293262482), -(0.10084033757448196, 0.10196078568696976, 0.10196078568696976), -(0.10504201799631119, 0.10588235408067703, 0.10588235408067703), -(0.10924369841814041, 0.10980392247438431, 0.10980392247438431), -(0.11344537883996964, 0.11372549086809158, 0.11372549086809158), -(0.11764705926179886, 0.11764705926179886, 0.11764705926179886), -(0.12184873968362808, 0.12156862765550613, 0.12156862765550613), -(0.1260504275560379, 0.12549020349979401, 0.12549020349979401), -(0.13025210797786713, 0.12941177189350128, 0.12941177189350128), -(0.13445378839969635, 0.13333334028720856, 0.13333334028720856), -(0.13865546882152557, 0.13725490868091583, 0.13725490868091583), -(0.1428571492433548, 0.14117647707462311, 0.14117647707462311), -(0.14705882966518402, 0.14509804546833038, 0.14509804546833038), -(0.15126051008701324, 0.14901961386203766, 0.14901961386203766), -(0.15546219050884247, 0.15294118225574493, 0.15294118225574493), -(0.15966387093067169, 0.16078431904315948, 0.16078431904315948), -(0.16386555135250092, 0.16470588743686676, 0.16470588743686676), -(0.16806723177433014, 0.16862745583057404, 0.16862745583057404), -(0.17226891219615936, 0.17254902422428131, 0.17254902422428131), -(0.17647059261798859, 0.17647059261798859, 0.17647059261798859), -(0.18067227303981781, 0.18039216101169586, 0.18039216101169586), -(0.18487395346164703, 0.18431372940540314, 0.18431372940540314), -(0.18907563388347626, 0.18823529779911041, 0.18823529779911041), -(0.19327731430530548, 0.19215686619281769, 0.19215686619281769), -(0.1974789947271347, 0.19607843458652496, 0.19607843458652496), -(0.20168067514896393, 0.20000000298023224, 0.20000000298023224), -(0.20588235557079315, 0.20392157137393951, 0.20392157137393951), -(0.21008403599262238, 0.20784313976764679, 0.20784313976764679), -(0.2142857164144516, 0.21176470816135406, 0.21176470816135406), -(0.21848739683628082, 0.21568627655506134, 0.21568627655506134), -(0.22268907725811005, 0.22352941334247589, 0.22352941334247589), -(0.22689075767993927, 0.22745098173618317, 0.22745098173618317), -(0.23109243810176849, 0.23137255012989044, 0.23137255012989044), -(0.23529411852359772, 0.23529411852359772, 0.23529411852359772), -(0.23949579894542694, 0.23921568691730499, 0.23921568691730499), -(0.24369747936725616, 0.24313725531101227, 0.24313725531101227), -(0.24789915978908539, 0.24705882370471954, 0.24705882370471954), -(0.25210085511207581, 0.25098040699958801, 0.25098040699958801), -(0.25630253553390503, 0.25490197539329529, 0.25490197539329529), -(0.26050421595573425, 0.25882354378700256, 0.25882354378700256), -(0.26470589637756348, 0.26274511218070984, 0.26274511218070984), -(0.2689075767993927, 0.26666668057441711, 0.26666668057441711), -(0.27310925722122192, 0.27058824896812439, 0.27058824896812439), -(0.27731093764305115, 0.27450981736183167, 0.27450981736183167), -(0.28151261806488037, 0.27843138575553894, 0.27843138575553894), -(0.28571429848670959, 0.28627452254295349, 0.28627452254295349), -(0.28991597890853882, 0.29019609093666077, 0.29019609093666077), -(0.29411765933036804, 0.29411765933036804, 0.29411765933036804), -(0.29831933975219727, 0.29803922772407532, 0.29803922772407532), -(0.30252102017402649, 0.30196079611778259, 0.30196079611778259), -(0.30672270059585571, 0.30588236451148987, 0.30588236451148987), -(0.31092438101768494, 0.30980393290519714, 0.30980393290519714), -(0.31512606143951416, 0.31372550129890442, 0.31372550129890442), -(0.31932774186134338, 0.31764706969261169, 0.31764706969261169), -(0.32352942228317261, 0.32156863808631897, 0.32156863808631897), -(0.32773110270500183, 0.32549020648002625, 0.32549020648002625), -(0.33193278312683105, 0.32941177487373352, 0.32941177487373352), -(0.33613446354866028, 0.3333333432674408, 0.3333333432674408), -(0.3403361439704895, 0.33725491166114807, 0.33725491166114807), -(0.34453782439231873, 0.34117648005485535, 0.34117648005485535), -(0.34873950481414795, 0.3490196168422699, 0.3490196168422699), -(0.35294118523597717, 0.35294118523597717, 0.35294118523597717), -(0.3571428656578064, 0.35686275362968445, 0.35686275362968445), -(0.36134454607963562, 0.36078432202339172, 0.36078432202339172), -(0.36554622650146484, 0.364705890417099, 0.364705890417099), -(0.36974790692329407, 0.36862745881080627, 0.36862745881080627), -(0.37394958734512329, 0.37254902720451355, 0.37254902720451355), -(0.37815126776695251, 0.37647059559822083, 0.37647059559822083), -(0.38235294818878174, 0.3803921639919281, 0.3803921639919281), -(0.38655462861061096, 0.38431373238563538, 0.38431373238563538), -(0.39075630903244019, 0.38823530077934265, 0.38823530077934265), -(0.39495798945426941, 0.39215686917304993, 0.39215686917304993), -(0.39915966987609863, 0.3960784375667572, 0.3960784375667572), -(0.40336135029792786, 0.40000000596046448, 0.40000000596046448), -(0.40756303071975708, 0.40392157435417175, 0.40392157435417175), -(0.4117647111415863, 0.4117647111415863, 0.4117647111415863), -(0.41596639156341553, 0.41568627953529358, 0.41568627953529358), -(0.42016807198524475, 0.41960784792900085, 0.41960784792900085), -(0.42436975240707397, 0.42352941632270813, 0.42352941632270813), -(0.4285714328289032, 0.42745098471641541, 0.42745098471641541), -(0.43277311325073242, 0.43137255311012268, 0.43137255311012268), -(0.43697479367256165, 0.43529412150382996, 0.43529412150382996), -(0.44117647409439087, 0.43921568989753723, 0.43921568989753723), -(0.44537815451622009, 0.44313725829124451, 0.44313725829124451), -(0.44957983493804932, 0.44705882668495178, 0.44705882668495178), -(0.45378151535987854, 0.45098039507865906, 0.45098039507865906), -(0.45798319578170776, 0.45490196347236633, 0.45490196347236633), -(0.46218487620353699, 0.45882353186607361, 0.45882353186607361), -(0.46638655662536621, 0.46274510025978088, 0.46274510025978088), -(0.47058823704719543, 0.46666666865348816, 0.46666666865348816), -(0.47478991746902466, 0.47450980544090271, 0.47450980544090271), -(0.47899159789085388, 0.47843137383460999, 0.47843137383460999), -(0.48319327831268311, 0.48235294222831726, 0.48235294222831726), -(0.48739495873451233, 0.48627451062202454, 0.48627451062202454), -(0.49159663915634155, 0.49019607901573181, 0.49019607901573181), -(0.49579831957817078, 0.49411764740943909, 0.49411764740943909), (0.5, -0.49803921580314636, 0.49803921580314636), (0.50420171022415161, -0.50196081399917603, 0.50196081399917603), (0.50840336084365845, -0.5058823823928833, 0.5058823823928833), (0.51260507106781006, -0.50980395078659058, 0.50980395078659058), (0.51680672168731689, -0.51372551918029785, 0.51372551918029785), (0.52100843191146851, -0.51764708757400513, 0.51764708757400513), (0.52521008253097534, -0.5215686559677124, 0.5215686559677124), (0.52941179275512695, -0.52549022436141968, 0.52549022436141968), (0.53361344337463379, -0.52941179275512695, 0.52941179275512695), (0.5378151535987854, -0.5372549295425415, 0.5372549295425415), (0.54201680421829224, -0.54117649793624878, 0.54117649793624878), (0.54621851444244385, -0.54509806632995605, 0.54509806632995605), (0.55042016506195068, -0.54901963472366333, 0.54901963472366333), (0.55462187528610229, -0.55294120311737061, 0.55294120311737061), (0.55882352590560913, -0.55686277151107788, 0.55686277151107788), (0.56302523612976074, -0.56078433990478516, 0.56078433990478516), (0.56722688674926758, -0.56470590829849243, 0.56470590829849243), (0.57142859697341919, -0.56862747669219971, 0.56862747669219971), (0.57563024759292603, -0.57254904508590698, 0.57254904508590698), (0.57983195781707764, -0.57647061347961426, 0.57647061347961426), (0.58403360843658447, -0.58039218187332153, 0.58039218187332153), (0.58823531866073608, -0.58431375026702881, 0.58431375026702881), (0.59243696928024292, -0.58823531866073608, 0.58823531866073608), (0.59663867950439453, -0.59215688705444336, 0.59215688705444336), (0.60084033012390137, -0.60000002384185791, 0.60000002384185791), (0.60504204034805298, -0.60392159223556519, 0.60392159223556519), (0.60924369096755981, -0.60784316062927246, 0.60784316062927246), (0.61344540119171143, -0.61176472902297974, 0.61176472902297974), (0.61764705181121826, -0.61568629741668701, 0.61568629741668701), (0.62184876203536987, -0.61960786581039429, 0.61960786581039429), (0.62605041265487671, -0.62352943420410156, 0.62352943420410156), (0.63025212287902832, -0.62745100259780884, 0.62745100259780884), (0.63445377349853516, -0.63137257099151611, 0.63137257099151611), (0.63865548372268677, -0.63529413938522339, 0.63529413938522339), (0.6428571343421936, -0.63921570777893066, 0.63921570777893066), (0.64705884456634521, -0.64313727617263794, 0.64313727617263794), (0.65126049518585205, -0.64705884456634521, 0.64705884456634521), (0.65546220541000366, -0.65098041296005249, 0.65098041296005249), (0.6596638560295105, -0.65490198135375977, 0.65490198135375977), (0.66386556625366211, -0.66274511814117432, 0.66274511814117432), (0.66806721687316895, -0.66666668653488159, 0.66666668653488159), (0.67226892709732056, -0.67058825492858887, 0.67058825492858887), (0.67647057771682739, -0.67450982332229614, 0.67450982332229614), (0.680672287940979, -0.67843139171600342, 0.67843139171600342), (0.68487393856048584, -0.68235296010971069, 0.68235296010971069), (0.68907564878463745, -0.68627452850341797, 0.68627452850341797), (0.69327729940414429, -0.69019609689712524, 0.69019609689712524), (0.6974790096282959, -0.69411766529083252, 0.69411766529083252), (0.70168066024780273, -0.69803923368453979, 0.69803923368453979), (0.70588237047195435, -0.70196080207824707, 0.70196080207824707), (0.71008402109146118, -0.70588237047195435, 0.70588237047195435), (0.71428573131561279, -0.70980393886566162, 0.70980393886566162), (0.71848738193511963, -0.7137255072593689, 0.7137255072593689), (0.72268909215927124, -0.71764707565307617, 0.71764707565307617), (0.72689074277877808, -0.72549021244049072, 0.72549021244049072), (0.73109245300292969, -0.729411780834198, 0.729411780834198), (0.73529410362243652, -0.73333334922790527, 0.73333334922790527), (0.73949581384658813, -0.73725491762161255, 0.73725491762161255), (0.74369746446609497, -0.74117648601531982, 0.74117648601531982), (0.74789917469024658, -0.7450980544090271, 0.7450980544090271), (0.75210082530975342, -0.74901962280273438, 0.74901962280273438), (0.75630253553390503, -0.75294119119644165, 0.75294119119644165), (0.76050418615341187, -0.75686275959014893, 0.75686275959014893), (0.76470589637756348, -0.7607843279838562, 0.7607843279838562), (0.76890754699707031, -0.76470589637756348, 0.76470589637756348), (0.77310925722122192, -0.76862746477127075, 0.76862746477127075), (0.77731090784072876, -0.77254903316497803, 0.77254903316497803), (0.78151261806488037, -0.7764706015586853, 0.7764706015586853), (0.78571426868438721, -0.78039216995239258, 0.78039216995239258), (0.78991597890853882, -0.78823530673980713, 0.78823530673980713), (0.79411762952804565, -0.7921568751335144, 0.7921568751335144), (0.79831933975219727, -0.79607844352722168, 0.79607844352722168), (0.8025209903717041, -0.80000001192092896, 0.80000001192092896), (0.80672270059585571, -0.80392158031463623, 0.80392158031463623), (0.81092435121536255, -0.80784314870834351, 0.80784314870834351), (0.81512606143951416, -0.81176471710205078, 0.81176471710205078), (0.819327712059021, -0.81568628549575806, 0.81568628549575806), (0.82352942228317261, -0.81960785388946533, 0.81960785388946533), (0.82773107290267944, -0.82352942228317261, 0.82352942228317261), (0.83193278312683105, -0.82745099067687988, 0.82745099067687988), (0.83613443374633789, -0.83137255907058716, 0.83137255907058716), (0.8403361439704895, -0.83529412746429443, 0.83529412746429443), (0.84453779458999634, -0.83921569585800171, 0.83921569585800171), (0.84873950481414795, -0.84313726425170898, 0.84313726425170898), (0.85294115543365479, -0.85098040103912354, 0.85098040103912354), (0.8571428656578064, -0.85490196943283081, 0.85490196943283081), (0.86134451627731323, -0.85882353782653809, 0.85882353782653809), (0.86554622650146484, -0.86274510622024536, 0.86274510622024536), (0.86974787712097168, -0.86666667461395264, 0.86666667461395264), (0.87394958734512329, -0.87058824300765991, 0.87058824300765991), (0.87815123796463013, -0.87450981140136719, 0.87450981140136719), (0.88235294818878174, -0.87843137979507446, 0.87843137979507446), (0.88655459880828857, -0.88235294818878174, 0.88235294818878174), (0.89075630903244019, -0.88627451658248901, 0.88627451658248901), (0.89495795965194702, -0.89019608497619629, 0.89019608497619629), (0.89915966987609863, -0.89411765336990356, 0.89411765336990356), (0.90336132049560547, -0.89803922176361084, 0.89803922176361084), (0.90756303071975708, -0.90196079015731812, 0.90196079015731812), (0.91176468133926392, -0.90588235855102539, 0.90588235855102539), (0.91596639156341553, -0.91372549533843994, 0.91372549533843994), (0.92016804218292236, -0.91764706373214722, 0.91764706373214722), (0.92436975240707397, -0.92156863212585449, 0.92156863212585449), (0.92857140302658081, -0.92549020051956177, 0.92549020051956177), (0.93277311325073242, -0.92941176891326904, 0.92941176891326904), (0.93697476387023926, -0.93333333730697632, 0.93333333730697632), (0.94117647409439087, -0.93725490570068359, 0.93725490570068359), (0.94537812471389771, -0.94117647409439087, 0.94117647409439087), (0.94957983493804932, -0.94509804248809814, 0.94509804248809814), (0.95378148555755615, -0.94901961088180542, 0.94901961088180542), (0.95798319578170776, -0.9529411792755127, 0.9529411792755127), (0.9621848464012146, -0.95686274766921997, 0.95686274766921997), (0.96638655662536621, -0.96078431606292725, 0.96078431606292725), (0.97058820724487305, -0.96470588445663452, 0.96470588445663452), (0.97478991746902466, -0.9686274528503418, 0.9686274528503418), (0.97899156808853149, -0.97647058963775635, 0.97647058963775635), (0.98319327831268311, -0.98039215803146362, 0.98039215803146362), (0.98739492893218994, -0.9843137264251709, 0.9843137264251709), (0.99159663915634155, -0.98823529481887817, 0.98823529481887817), (0.99579828977584839, -0.99215686321258545, 0.99215686321258545), (1.0, 0.99607843160629272, -0.99607843160629272)]} -_gist_heat_data = {'blue': [(0.0, 0.0, 0.0), -(0.0042016808874905109, 0.0, 0.0), (0.0084033617749810219, 0.0, 0.0), -(0.012605042196810246, 0.0, 0.0), (0.016806723549962044, 0.0, 0.0), -(0.021008403971791267, 0.0, 0.0), (0.025210084393620491, 0.0, 0.0), -(0.029411764815449715, 0.0, 0.0), (0.033613447099924088, 0.0, 0.0), -(0.037815127521753311, 0.0, 0.0), (0.042016807943582535, 0.0, 0.0), -(0.046218488365411758, 0.0, 0.0), (0.050420168787240982, 0.0, 0.0), -(0.054621849209070206, 0.0, 0.0), (0.058823529630899429, 0.0, 0.0), -(0.063025213778018951, 0.0, 0.0), (0.067226894199848175, 0.0, 0.0), -(0.071428574621677399, 0.0, 0.0), (0.075630255043506622, 0.0, 0.0), -(0.079831935465335846, 0.0, 0.0), (0.08403361588716507, 0.0, 0.0), -(0.088235296308994293, 0.0, 0.0), (0.092436976730823517, 0.0, 0.0), -(0.09663865715265274, 0.0, 0.0), (0.10084033757448196, 0.0, 0.0), -(0.10504201799631119, 0.0, 0.0), (0.10924369841814041, 0.0, 0.0), -(0.11344537883996964, 0.0, 0.0), (0.11764705926179886, 0.0, 0.0), -(0.12184873968362808, 0.0, 0.0), (0.1260504275560379, 0.0, 0.0), -(0.13025210797786713, 0.0, 0.0), (0.13445378839969635, 0.0, 0.0), -(0.13865546882152557, 0.0, 0.0), (0.1428571492433548, 0.0, 0.0), -(0.14705882966518402, 0.0, 0.0), (0.15126051008701324, 0.0, 0.0), -(0.15546219050884247, 0.0, 0.0), (0.15966387093067169, 0.0, 0.0), -(0.16386555135250092, 0.0, 0.0), (0.16806723177433014, 0.0, 0.0), -(0.17226891219615936, 0.0, 0.0), (0.17647059261798859, 0.0, 0.0), -(0.18067227303981781, 0.0, 0.0), (0.18487395346164703, 0.0, 0.0), -(0.18907563388347626, 0.0, 0.0), (0.19327731430530548, 0.0, 0.0), -(0.1974789947271347, 0.0, 0.0), (0.20168067514896393, 0.0, 0.0), -(0.20588235557079315, 0.0, 0.0), (0.21008403599262238, 0.0, 0.0), -(0.2142857164144516, 0.0, 0.0), (0.21848739683628082, 0.0, 0.0), -(0.22268907725811005, 0.0, 0.0), (0.22689075767993927, 0.0, 0.0), -(0.23109243810176849, 0.0, 0.0), (0.23529411852359772, 0.0, 0.0), -(0.23949579894542694, 0.0, 0.0), (0.24369747936725616, 0.0, 0.0), -(0.24789915978908539, 0.0, 0.0), (0.25210085511207581, 0.0, 0.0), -(0.25630253553390503, 0.0, 0.0), (0.26050421595573425, 0.0, 0.0), -(0.26470589637756348, 0.0, 0.0), (0.2689075767993927, 0.0, 0.0), -(0.27310925722122192, 0.0, 0.0), (0.27731093764305115, 0.0, 0.0), -(0.28151261806488037, 0.0, 0.0), (0.28571429848670959, 0.0, 0.0), -(0.28991597890853882, 0.0, 0.0), (0.29411765933036804, 0.0, 0.0), -(0.29831933975219727, 0.0, 0.0), (0.30252102017402649, 0.0, 0.0), -(0.30672270059585571, 0.0, 0.0), (0.31092438101768494, 0.0, 0.0), -(0.31512606143951416, 0.0, 0.0), (0.31932774186134338, 0.0, 0.0), -(0.32352942228317261, 0.0, 0.0), (0.32773110270500183, 0.0, 0.0), -(0.33193278312683105, 0.0, 0.0), (0.33613446354866028, 0.0, 0.0), -(0.3403361439704895, 0.0, 0.0), (0.34453782439231873, 0.0, 0.0), -(0.34873950481414795, 0.0, 0.0), (0.35294118523597717, 0.0, 0.0), -(0.3571428656578064, 0.0, 0.0), (0.36134454607963562, 0.0, 0.0), -(0.36554622650146484, 0.0, 0.0), (0.36974790692329407, 0.0, 0.0), -(0.37394958734512329, 0.0, 0.0), (0.37815126776695251, 0.0, 0.0), -(0.38235294818878174, 0.0, 0.0), (0.38655462861061096, 0.0, 0.0), -(0.39075630903244019, 0.0, 0.0), (0.39495798945426941, 0.0, 0.0), -(0.39915966987609863, 0.0, 0.0), (0.40336135029792786, 0.0, 0.0), -(0.40756303071975708, 0.0, 0.0), (0.4117647111415863, 0.0, 0.0), -(0.41596639156341553, 0.0, 0.0), (0.42016807198524475, 0.0, 0.0), -(0.42436975240707397, 0.0, 0.0), (0.4285714328289032, 0.0, 0.0), -(0.43277311325073242, 0.0, 0.0), (0.43697479367256165, 0.0, 0.0), -(0.44117647409439087, 0.0, 0.0), (0.44537815451622009, 0.0, 0.0), -(0.44957983493804932, 0.0, 0.0), (0.45378151535987854, 0.0, 0.0), -(0.45798319578170776, 0.0, 0.0), (0.46218487620353699, 0.0, 0.0), -(0.46638655662536621, 0.0, 0.0), (0.47058823704719543, 0.0, 0.0), -(0.47478991746902466, 0.0, 0.0), (0.47899159789085388, 0.0, 0.0), -(0.48319327831268311, 0.0, 0.0), (0.48739495873451233, 0.0, 0.0), -(0.49159663915634155, 0.0, 0.0), (0.49579831957817078, 0.0, 0.0), (0.5, -0.0, 0.0), (0.50420171022415161, 0.0, 0.0), (0.50840336084365845, 0.0, -0.0), (0.51260507106781006, 0.0, 0.0), (0.51680672168731689, 0.0, 0.0), -(0.52100843191146851, 0.0, 0.0), (0.52521008253097534, 0.0, 0.0), -(0.52941179275512695, 0.0, 0.0), (0.53361344337463379, 0.0, 0.0), -(0.5378151535987854, 0.0, 0.0), (0.54201680421829224, 0.0, 0.0), -(0.54621851444244385, 0.0, 0.0), (0.55042016506195068, 0.0, 0.0), -(0.55462187528610229, 0.0, 0.0), (0.55882352590560913, 0.0, 0.0), -(0.56302523612976074, 0.0, 0.0), (0.56722688674926758, 0.0, 0.0), -(0.57142859697341919, 0.0, 0.0), (0.57563024759292603, 0.0, 0.0), -(0.57983195781707764, 0.0, 0.0), (0.58403360843658447, 0.0, 0.0), -(0.58823531866073608, 0.0, 0.0), (0.59243696928024292, 0.0, 0.0), -(0.59663867950439453, 0.0, 0.0), (0.60084033012390137, 0.0, 0.0), -(0.60504204034805298, 0.0, 0.0), (0.60924369096755981, 0.0, 0.0), -(0.61344540119171143, 0.0, 0.0), (0.61764705181121826, 0.0, 0.0), -(0.62184876203536987, 0.0, 0.0), (0.62605041265487671, 0.0, 0.0), -(0.63025212287902832, 0.0, 0.0), (0.63445377349853516, 0.0, 0.0), -(0.63865548372268677, 0.0, 0.0), (0.6428571343421936, 0.0, 0.0), -(0.64705884456634521, 0.0, 0.0), (0.65126049518585205, 0.0, 0.0), -(0.65546220541000366, 0.0, 0.0), (0.6596638560295105, 0.0, 0.0), -(0.66386556625366211, 0.0, 0.0), (0.66806721687316895, 0.0, 0.0), -(0.67226892709732056, 0.0, 0.0), (0.67647057771682739, 0.0, 0.0), -(0.680672287940979, 0.0, 0.0), (0.68487393856048584, 0.0, 0.0), -(0.68907564878463745, 0.0, 0.0), (0.69327729940414429, 0.0, 0.0), -(0.6974790096282959, 0.0, 0.0), (0.70168066024780273, 0.0, 0.0), -(0.70588237047195435, 0.0, 0.0), (0.71008402109146118, 0.0, 0.0), -(0.71428573131561279, 0.0, 0.0), (0.71848738193511963, 0.0, 0.0), -(0.72268909215927124, 0.0, 0.0), (0.72689074277877808, 0.0, 0.0), -(0.73109245300292969, 0.0, 0.0), (0.73529410362243652, 0.0, 0.0), -(0.73949581384658813, 0.0, 0.0), (0.74369746446609497, 0.0, 0.0), -(0.74789917469024658, 0.0, 0.0), (0.75210082530975342, 0.0, 0.0), -(0.75630253553390503, 0.027450980618596077, 0.027450980618596077), -(0.76050418615341187, 0.043137256056070328, 0.043137256056070328), -(0.76470589637756348, 0.058823529630899429, 0.058823529630899429), -(0.76890754699707031, 0.074509806931018829, 0.074509806931018829), -(0.77310925722122192, 0.090196080505847931, 0.090196080505847931), -(0.77731090784072876, 0.10588235408067703, 0.10588235408067703), -(0.78151261806488037, 0.12156862765550613, 0.12156862765550613), -(0.78571426868438721, 0.13725490868091583, 0.13725490868091583), -(0.78991597890853882, 0.15294118225574493, 0.15294118225574493), -(0.79411762952804565, 0.16862745583057404, 0.16862745583057404), -(0.79831933975219727, 0.20000000298023224, 0.20000000298023224), -(0.8025209903717041, 0.21176470816135406, 0.21176470816135406), -(0.80672270059585571, 0.22745098173618317, 0.22745098173618317), -(0.81092435121536255, 0.24313725531101227, 0.24313725531101227), -(0.81512606143951416, 0.25882354378700256, 0.25882354378700256), -(0.819327712059021, 0.27450981736183167, 0.27450981736183167), -(0.82352942228317261, 0.29019609093666077, 0.29019609093666077), -(0.82773107290267944, 0.30588236451148987, 0.30588236451148987), -(0.83193278312683105, 0.32156863808631897, 0.32156863808631897), -(0.83613443374633789, 0.33725491166114807, 0.33725491166114807), -(0.8403361439704895, 0.35294118523597717, 0.35294118523597717), -(0.84453779458999634, 0.36862745881080627, 0.36862745881080627), -(0.84873950481414795, 0.38431373238563538, 0.38431373238563538), -(0.85294115543365479, 0.40000000596046448, 0.40000000596046448), -(0.8571428656578064, 0.4117647111415863, 0.4117647111415863), -(0.86134451627731323, 0.42745098471641541, 0.42745098471641541), -(0.86554622650146484, 0.44313725829124451, 0.44313725829124451), -(0.86974787712097168, 0.45882353186607361, 0.45882353186607361), -(0.87394958734512329, 0.47450980544090271, 0.47450980544090271), -(0.87815123796463013, 0.49019607901573181, 0.49019607901573181), -(0.88235294818878174, 0.5215686559677124, 0.5215686559677124), -(0.88655459880828857, 0.5372549295425415, 0.5372549295425415), -(0.89075630903244019, 0.55294120311737061, 0.55294120311737061), -(0.89495795965194702, 0.56862747669219971, 0.56862747669219971), -(0.89915966987609863, 0.58431375026702881, 0.58431375026702881), -(0.90336132049560547, 0.60000002384185791, 0.60000002384185791), -(0.90756303071975708, 0.61176472902297974, 0.61176472902297974), -(0.91176468133926392, 0.62745100259780884, 0.62745100259780884), -(0.91596639156341553, 0.64313727617263794, 0.64313727617263794), -(0.92016804218292236, 0.65882354974746704, 0.65882354974746704), -(0.92436975240707397, 0.67450982332229614, 0.67450982332229614), -(0.92857140302658081, 0.69019609689712524, 0.69019609689712524), -(0.93277311325073242, 0.70588237047195435, 0.70588237047195435), -(0.93697476387023926, 0.72156864404678345, 0.72156864404678345), -(0.94117647409439087, 0.73725491762161255, 0.73725491762161255), -(0.94537812471389771, 0.75294119119644165, 0.75294119119644165), -(0.94957983493804932, 0.76862746477127075, 0.76862746477127075), -(0.95378148555755615, 0.78431373834609985, 0.78431373834609985), -(0.95798319578170776, 0.80000001192092896, 0.80000001192092896), -(0.9621848464012146, 0.81176471710205078, 0.81176471710205078), -(0.96638655662536621, 0.84313726425170898, 0.84313726425170898), -(0.97058820724487305, 0.85882353782653809, 0.85882353782653809), -(0.97478991746902466, 0.87450981140136719, 0.87450981140136719), -(0.97899156808853149, 0.89019608497619629, 0.89019608497619629), -(0.98319327831268311, 0.90588235855102539, 0.90588235855102539), -(0.98739492893218994, 0.92156863212585449, 0.92156863212585449), -(0.99159663915634155, 0.93725490570068359, 0.93725490570068359), -(0.99579828977584839, 0.9529411792755127, 0.9529411792755127), (1.0, -0.9686274528503418, 0.9686274528503418)], 'green': [(0.0, 0.0, 0.0), -(0.0042016808874905109, 0.0, 0.0), (0.0084033617749810219, 0.0, 0.0), -(0.012605042196810246, 0.0, 0.0), (0.016806723549962044, 0.0, 0.0), -(0.021008403971791267, 0.0, 0.0), (0.025210084393620491, 0.0, 0.0), -(0.029411764815449715, 0.0, 0.0), (0.033613447099924088, 0.0, 0.0), -(0.037815127521753311, 0.0, 0.0), (0.042016807943582535, 0.0, 0.0), -(0.046218488365411758, 0.0, 0.0), (0.050420168787240982, 0.0, 0.0), -(0.054621849209070206, 0.0, 0.0), (0.058823529630899429, 0.0, 0.0), -(0.063025213778018951, 0.0, 0.0), (0.067226894199848175, 0.0, 0.0), -(0.071428574621677399, 0.0, 0.0), (0.075630255043506622, 0.0, 0.0), -(0.079831935465335846, 0.0, 0.0), (0.08403361588716507, 0.0, 0.0), -(0.088235296308994293, 0.0, 0.0), (0.092436976730823517, 0.0, 0.0), -(0.09663865715265274, 0.0, 0.0), (0.10084033757448196, 0.0, 0.0), -(0.10504201799631119, 0.0, 0.0), (0.10924369841814041, 0.0, 0.0), -(0.11344537883996964, 0.0, 0.0), (0.11764705926179886, 0.0, 0.0), -(0.12184873968362808, 0.0, 0.0), (0.1260504275560379, 0.0, 0.0), -(0.13025210797786713, 0.0, 0.0), (0.13445378839969635, 0.0, 0.0), -(0.13865546882152557, 0.0, 0.0), (0.1428571492433548, 0.0, 0.0), -(0.14705882966518402, 0.0, 0.0), (0.15126051008701324, 0.0, 0.0), -(0.15546219050884247, 0.0, 0.0), (0.15966387093067169, 0.0, 0.0), -(0.16386555135250092, 0.0, 0.0), (0.16806723177433014, 0.0, 0.0), -(0.17226891219615936, 0.0, 0.0), (0.17647059261798859, 0.0, 0.0), -(0.18067227303981781, 0.0, 0.0), (0.18487395346164703, 0.0, 0.0), -(0.18907563388347626, 0.0, 0.0), (0.19327731430530548, 0.0, 0.0), -(0.1974789947271347, 0.0, 0.0), (0.20168067514896393, 0.0, 0.0), -(0.20588235557079315, 0.0, 0.0), (0.21008403599262238, 0.0, 0.0), -(0.2142857164144516, 0.0, 0.0), (0.21848739683628082, 0.0, 0.0), -(0.22268907725811005, 0.0, 0.0), (0.22689075767993927, 0.0, 0.0), -(0.23109243810176849, 0.0, 0.0), (0.23529411852359772, 0.0, 0.0), -(0.23949579894542694, 0.0, 0.0), (0.24369747936725616, 0.0, 0.0), -(0.24789915978908539, 0.0, 0.0), (0.25210085511207581, 0.0, 0.0), -(0.25630253553390503, 0.0, 0.0), (0.26050421595573425, 0.0, 0.0), -(0.26470589637756348, 0.0, 0.0), (0.2689075767993927, 0.0, 0.0), -(0.27310925722122192, 0.0, 0.0), (0.27731093764305115, 0.0, 0.0), -(0.28151261806488037, 0.0, 0.0), (0.28571429848670959, 0.0, 0.0), -(0.28991597890853882, 0.0, 0.0), (0.29411765933036804, 0.0, 0.0), -(0.29831933975219727, 0.0, 0.0), (0.30252102017402649, 0.0, 0.0), -(0.30672270059585571, 0.0, 0.0), (0.31092438101768494, 0.0, 0.0), -(0.31512606143951416, 0.0, 0.0), (0.31932774186134338, 0.0, 0.0), -(0.32352942228317261, 0.0, 0.0), (0.32773110270500183, 0.0, 0.0), -(0.33193278312683105, 0.0, 0.0), (0.33613446354866028, 0.0, 0.0), -(0.3403361439704895, 0.0, 0.0), (0.34453782439231873, 0.0, 0.0), -(0.34873950481414795, 0.0, 0.0), (0.35294118523597717, 0.0, 0.0), -(0.3571428656578064, 0.0, 0.0), (0.36134454607963562, 0.0, 0.0), -(0.36554622650146484, 0.0, 0.0), (0.36974790692329407, 0.0, 0.0), -(0.37394958734512329, 0.0, 0.0), (0.37815126776695251, 0.0, 0.0), -(0.38235294818878174, 0.0, 0.0), (0.38655462861061096, 0.0, 0.0), -(0.39075630903244019, 0.0, 0.0), (0.39495798945426941, 0.0, 0.0), -(0.39915966987609863, 0.0, 0.0), (0.40336135029792786, 0.0, 0.0), -(0.40756303071975708, 0.0, 0.0), (0.4117647111415863, 0.0, 0.0), -(0.41596639156341553, 0.0, 0.0), (0.42016807198524475, 0.0, 0.0), -(0.42436975240707397, 0.0, 0.0), (0.4285714328289032, 0.0, 0.0), -(0.43277311325073242, 0.0, 0.0), (0.43697479367256165, 0.0, 0.0), -(0.44117647409439087, 0.0, 0.0), (0.44537815451622009, 0.0, 0.0), -(0.44957983493804932, 0.0, 0.0), (0.45378151535987854, 0.0, 0.0), -(0.45798319578170776, 0.0, 0.0), (0.46218487620353699, 0.0, 0.0), -(0.46638655662536621, 0.0, 0.0), (0.47058823704719543, 0.0, 0.0), -(0.47478991746902466, 0.0, 0.0), (0.47899159789085388, -0.0039215688593685627, 0.0039215688593685627), (0.48319327831268311, -0.011764706112444401, 0.011764706112444401), (0.48739495873451233, -0.019607843831181526, 0.019607843831181526), (0.49159663915634155, -0.027450980618596077, 0.027450980618596077), (0.49579831957817078, -0.035294119268655777, 0.035294119268655777), (0.5, 0.043137256056070328, -0.043137256056070328), (0.50420171022415161, 0.058823529630899429, -0.058823529630899429), (0.50840336084365845, 0.066666670143604279, -0.066666670143604279), (0.51260507106781006, 0.070588238537311554, -0.070588238537311554), (0.51680672168731689, 0.078431375324726105, -0.078431375324726105), (0.52100843191146851, 0.086274512112140656, -0.086274512112140656), (0.52521008253097534, 0.094117648899555206, -0.094117648899555206), (0.52941179275512695, 0.10196078568696976, -0.10196078568696976), (0.53361344337463379, 0.10980392247438431, -0.10980392247438431), (0.5378151535987854, 0.11764705926179886, -0.11764705926179886), (0.54201680421829224, 0.12549020349979401, -0.12549020349979401), (0.54621851444244385, 0.13725490868091583, -0.13725490868091583), (0.55042016506195068, 0.14509804546833038, -0.14509804546833038), (0.55462187528610229, 0.15294118225574493, -0.15294118225574493), (0.55882352590560913, 0.16078431904315948, -0.16078431904315948), (0.56302523612976074, 0.16862745583057404, -0.16862745583057404), (0.56722688674926758, 0.17647059261798859, -0.17647059261798859), (0.57142859697341919, 0.18431372940540314, -0.18431372940540314), (0.57563024759292603, 0.19215686619281769, -0.19215686619281769), (0.57983195781707764, 0.20000000298023224, -0.20000000298023224), (0.58403360843658447, 0.20392157137393951, -0.20392157137393951), (0.58823531866073608, 0.21176470816135406, -0.21176470816135406), (0.59243696928024292, 0.21960784494876862, -0.21960784494876862), (0.59663867950439453, 0.22745098173618317, -0.22745098173618317), (0.60084033012390137, 0.23529411852359772, -0.23529411852359772), (0.60504204034805298, 0.24313725531101227, -0.24313725531101227), (0.60924369096755981, 0.25098040699958801, -0.25098040699958801), (0.61344540119171143, 0.25882354378700256, -0.25882354378700256), (0.61764705181121826, 0.26666668057441711, -0.26666668057441711), (0.62184876203536987, 0.27058824896812439, -0.27058824896812439), (0.62605041265487671, 0.27843138575553894, -0.27843138575553894), (0.63025212287902832, 0.29411765933036804, -0.29411765933036804), (0.63445377349853516, 0.30196079611778259, -0.30196079611778259), (0.63865548372268677, 0.30980393290519714, -0.30980393290519714), (0.6428571343421936, 0.31764706969261169, -0.31764706969261169), (0.64705884456634521, 0.32549020648002625, -0.32549020648002625), (0.65126049518585205, 0.3333333432674408, -0.3333333432674408), (0.65546220541000366, 0.33725491166114807, -0.33725491166114807), (0.6596638560295105, 0.34509804844856262, -0.34509804844856262), (0.66386556625366211, 0.35294118523597717, -0.35294118523597717), (0.66806721687316895, 0.36078432202339172, -0.36078432202339172), (0.67226892709732056, 0.36862745881080627, -0.36862745881080627), (0.67647057771682739, 0.37647059559822083, -0.37647059559822083), (0.680672287940979, 0.38431373238563538, -0.38431373238563538), (0.68487393856048584, 0.39215686917304993, -0.39215686917304993), (0.68907564878463745, 0.40000000596046448, -0.40000000596046448), (0.69327729940414429, 0.40392157435417175, -0.40392157435417175), (0.6974790096282959, 0.4117647111415863, -0.4117647111415863), (0.70168066024780273, 0.41960784792900085, -0.41960784792900085), (0.70588237047195435, 0.42745098471641541, -0.42745098471641541), (0.71008402109146118, 0.43529412150382996, -0.43529412150382996), (0.71428573131561279, 0.45098039507865906, -0.45098039507865906), (0.71848738193511963, 0.45882353186607361, -0.45882353186607361), (0.72268909215927124, 0.46666666865348816, -0.46666666865348816), (0.72689074277877808, 0.47058823704719543, -0.47058823704719543), (0.73109245300292969, 0.47843137383460999, -0.47843137383460999), (0.73529410362243652, 0.48627451062202454, -0.48627451062202454), (0.73949581384658813, 0.49411764740943909, -0.49411764740943909), (0.74369746446609497, 0.50196081399917603, -0.50196081399917603), (0.74789917469024658, 0.50980395078659058, -0.50980395078659058), (0.75210082530975342, 0.51764708757400513, -0.51764708757400513), (0.75630253553390503, 0.53333336114883423, -0.53333336114883423), (0.76050418615341187, 0.5372549295425415, -0.5372549295425415), (0.76470589637756348, 0.54509806632995605, -0.54509806632995605), (0.76890754699707031, 0.55294120311737061, -0.55294120311737061), (0.77310925722122192, 0.56078433990478516, -0.56078433990478516), (0.77731090784072876, 0.56862747669219971, -0.56862747669219971), (0.78151261806488037, 0.57647061347961426, -0.57647061347961426), (0.78571426868438721, 0.58431375026702881, -0.58431375026702881), (0.78991597890853882, 0.59215688705444336, -0.59215688705444336), (0.79411762952804565, 0.60000002384185791, -0.60000002384185791), (0.79831933975219727, 0.61176472902297974, -0.61176472902297974), (0.8025209903717041, 0.61960786581039429, -0.61960786581039429), (0.80672270059585571, 0.62745100259780884, -0.62745100259780884), (0.81092435121536255, 0.63529413938522339, -0.63529413938522339), (0.81512606143951416, 0.64313727617263794, -0.64313727617263794), (0.819327712059021, 0.65098041296005249, -0.65098041296005249), (0.82352942228317261, 0.65882354974746704, -0.65882354974746704), (0.82773107290267944, 0.66666668653488159, -0.66666668653488159), (0.83193278312683105, 0.67058825492858887, -0.67058825492858887), (0.83613443374633789, 0.67843139171600342, -0.67843139171600342), (0.8403361439704895, 0.68627452850341797, -0.68627452850341797), (0.84453779458999634, 0.69411766529083252, -0.69411766529083252), (0.84873950481414795, 0.70196080207824707, -0.70196080207824707), (0.85294115543365479, 0.70980393886566162, -0.70980393886566162), (0.8571428656578064, 0.71764707565307617, -0.71764707565307617), (0.86134451627731323, 0.72549021244049072, -0.72549021244049072), (0.86554622650146484, 0.73333334922790527, -0.73333334922790527), (0.86974787712097168, 0.73725491762161255, -0.73725491762161255), (0.87394958734512329, 0.7450980544090271, -0.7450980544090271), (0.87815123796463013, 0.75294119119644165, -0.75294119119644165), (0.88235294818878174, 0.76862746477127075, -0.76862746477127075), (0.88655459880828857, 0.7764706015586853, -0.7764706015586853), (0.89075630903244019, 0.78431373834609985, -0.78431373834609985), (0.89495795965194702, 0.7921568751335144, -0.7921568751335144), (0.89915966987609863, 0.80000001192092896, -0.80000001192092896), (0.90336132049560547, 0.80392158031463623, -0.80392158031463623), (0.90756303071975708, 0.81176471710205078, -0.81176471710205078), (0.91176468133926392, 0.81960785388946533, -0.81960785388946533), (0.91596639156341553, 0.82745099067687988, -0.82745099067687988), (0.92016804218292236, 0.83529412746429443, -0.83529412746429443), (0.92436975240707397, 0.84313726425170898, -0.84313726425170898), (0.92857140302658081, 0.85098040103912354, -0.85098040103912354), (0.93277311325073242, 0.85882353782653809, -0.85882353782653809), (0.93697476387023926, 0.86666667461395264, -0.86666667461395264), (0.94117647409439087, 0.87058824300765991, -0.87058824300765991), (0.94537812471389771, 0.87843137979507446, -0.87843137979507446), (0.94957983493804932, 0.88627451658248901, -0.88627451658248901), (0.95378148555755615, 0.89411765336990356, -0.89411765336990356), (0.95798319578170776, 0.90196079015731812, -0.90196079015731812), (0.9621848464012146, 0.90980392694473267, -0.90980392694473267), (0.96638655662536621, 0.92549020051956177, -0.92549020051956177), (0.97058820724487305, 0.93333333730697632, -0.93333333730697632), (0.97478991746902466, 0.93725490570068359, -0.93725490570068359), (0.97899156808853149, 0.94509804248809814, -0.94509804248809814), (0.98319327831268311, 0.9529411792755127, -0.9529411792755127), (0.98739492893218994, 0.96078431606292725, -0.96078431606292725), (0.99159663915634155, 0.9686274528503418, -0.9686274528503418), (0.99579828977584839, 0.97647058963775635, -0.97647058963775635), (1.0, 0.9843137264251709, 0.9843137264251709)], -'red': [(0.0, 0.0, 0.0), (0.0042016808874905109, 0.0039215688593685627, -0.0039215688593685627), (0.0084033617749810219, 0.0078431377187371254, -0.0078431377187371254), (0.012605042196810246, 0.015686275437474251, -0.015686275437474251), (0.016806723549962044, 0.019607843831181526, -0.019607843831181526), (0.021008403971791267, 0.027450980618596077, -0.027450980618596077), (0.025210084393620491, 0.031372550874948502, -0.031372550874948502), (0.029411764815449715, 0.039215687662363052, -0.039215687662363052), (0.033613447099924088, 0.043137256056070328, -0.043137256056070328), (0.037815127521753311, 0.050980392843484879, -0.050980392843484879), (0.042016807943582535, 0.058823529630899429, -0.058823529630899429), (0.046218488365411758, 0.066666670143604279, -0.066666670143604279), (0.050420168787240982, 0.070588238537311554, -0.070588238537311554), (0.054621849209070206, 0.078431375324726105, -0.078431375324726105), (0.058823529630899429, 0.08235294371843338, -0.08235294371843338), (0.063025213778018951, 0.090196080505847931, -0.090196080505847931), (0.067226894199848175, 0.094117648899555206, -0.094117648899555206), (0.071428574621677399, 0.10196078568696976, -0.10196078568696976), (0.075630255043506622, 0.10588235408067703, -0.10588235408067703), (0.079831935465335846, 0.10980392247438431, -0.10980392247438431), (0.08403361588716507, 0.11764705926179886, -0.11764705926179886), (0.088235296308994293, 0.12156862765550613, -0.12156862765550613), (0.092436976730823517, 0.12941177189350128, -0.12941177189350128), (0.09663865715265274, 0.13333334028720856, -0.13333334028720856), (0.10084033757448196, 0.14117647707462311, -0.14117647707462311), (0.10504201799631119, 0.14509804546833038, -0.14509804546833038), (0.10924369841814041, 0.15294118225574493, -0.15294118225574493), (0.11344537883996964, 0.15686275064945221, -0.15686275064945221), (0.11764705926179886, 0.16470588743686676, -0.16470588743686676), (0.12184873968362808, 0.16862745583057404, -0.16862745583057404), (0.1260504275560379, 0.18039216101169586, -0.18039216101169586), (0.13025210797786713, 0.18431372940540314, -0.18431372940540314), (0.13445378839969635, 0.19215686619281769, -0.19215686619281769), (0.13865546882152557, 0.19607843458652496, -0.19607843458652496), (0.1428571492433548, 0.20392157137393951, -0.20392157137393951), (0.14705882966518402, 0.20784313976764679, -0.20784313976764679), (0.15126051008701324, 0.21568627655506134, -0.21568627655506134), (0.15546219050884247, 0.21960784494876862, -0.21960784494876862), (0.15966387093067169, 0.22352941334247589, -0.22352941334247589), (0.16386555135250092, 0.23137255012989044, -0.23137255012989044), (0.16806723177433014, 0.23529411852359772, -0.23529411852359772), (0.17226891219615936, 0.24313725531101227, -0.24313725531101227), (0.17647059261798859, 0.24705882370471954, -0.24705882370471954), (0.18067227303981781, 0.25490197539329529, -0.25490197539329529), (0.18487395346164703, 0.25882354378700256, -0.25882354378700256), (0.18907563388347626, 0.26666668057441711, -0.26666668057441711), (0.19327731430530548, 0.27058824896812439, -0.27058824896812439), (0.1974789947271347, 0.27450981736183167, -0.27450981736183167), (0.20168067514896393, 0.28235295414924622, -0.28235295414924622), (0.20588235557079315, 0.28627452254295349, -0.28627452254295349), (0.21008403599262238, 0.29803922772407532, -0.29803922772407532), (0.2142857164144516, 0.30588236451148987, -0.30588236451148987), (0.21848739683628082, 0.30980393290519714, -0.30980393290519714), (0.22268907725811005, 0.31764706969261169, -0.31764706969261169), (0.22689075767993927, 0.32156863808631897, -0.32156863808631897), (0.23109243810176849, 0.32941177487373352, -0.32941177487373352), (0.23529411852359772, 0.3333333432674408, -0.3333333432674408), (0.23949579894542694, 0.33725491166114807, -0.33725491166114807), (0.24369747936725616, 0.34509804844856262, -0.34509804844856262), (0.24789915978908539, 0.3490196168422699, -0.3490196168422699), (0.25210085511207581, 0.36078432202339172, -0.36078432202339172), (0.25630253553390503, 0.36862745881080627, -0.36862745881080627), (0.26050421595573425, 0.37254902720451355, -0.37254902720451355), (0.26470589637756348, 0.3803921639919281, -0.3803921639919281), (0.2689075767993927, 0.38431373238563538, -0.38431373238563538), (0.27310925722122192, 0.38823530077934265, -0.38823530077934265), (0.27731093764305115, 0.3960784375667572, -0.3960784375667572), (0.28151261806488037, 0.40000000596046448, -0.40000000596046448), (0.28571429848670959, 0.40784314274787903, -0.40784314274787903), (0.28991597890853882, 0.4117647111415863, -0.4117647111415863), (0.29411765933036804, 0.42352941632270813, -0.42352941632270813), (0.29831933975219727, 0.43137255311012268, -0.43137255311012268), (0.30252102017402649, 0.43529412150382996, -0.43529412150382996), (0.30672270059585571, 0.44313725829124451, -0.44313725829124451), (0.31092438101768494, 0.44705882668495178, -0.44705882668495178), (0.31512606143951416, 0.45098039507865906, -0.45098039507865906), (0.31932774186134338, 0.45882353186607361, -0.45882353186607361), (0.32352942228317261, 0.46274510025978088, -0.46274510025978088), (0.32773110270500183, 0.47058823704719543, -0.47058823704719543), (0.33193278312683105, 0.47450980544090271, -0.47450980544090271), (0.33613446354866028, 0.48235294222831726, -0.48235294222831726), (0.3403361439704895, 0.48627451062202454, -0.48627451062202454), (0.34453782439231873, 0.49411764740943909, -0.49411764740943909), (0.34873950481414795, 0.49803921580314636, -0.49803921580314636), (0.35294118523597717, 0.50196081399917603, -0.50196081399917603), (0.3571428656578064, 0.50980395078659058, -0.50980395078659058), (0.36134454607963562, 0.51372551918029785, -0.51372551918029785), (0.36554622650146484, 0.5215686559677124, -0.5215686559677124), (0.36974790692329407, 0.52549022436141968, -0.52549022436141968), (0.37394958734512329, 0.53333336114883423, -0.53333336114883423), (0.37815126776695251, 0.54509806632995605, -0.54509806632995605), (0.38235294818878174, 0.54901963472366333, -0.54901963472366333), (0.38655462861061096, 0.55294120311737061, -0.55294120311737061), (0.39075630903244019, 0.56078433990478516, -0.56078433990478516), (0.39495798945426941, 0.56470590829849243, -0.56470590829849243), (0.39915966987609863, 0.57254904508590698, -0.57254904508590698), (0.40336135029792786, 0.57647061347961426, -0.57647061347961426), (0.40756303071975708, 0.58431375026702881, -0.58431375026702881), (0.4117647111415863, 0.58823531866073608, -0.58823531866073608), (0.41596639156341553, 0.59607845544815063, -0.59607845544815063), (0.42016807198524475, 0.60000002384185791, -0.60000002384185791), (0.42436975240707397, 0.60784316062927246, -0.60784316062927246), (0.4285714328289032, 0.61176472902297974, -0.61176472902297974), (0.43277311325073242, 0.61568629741668701, -0.61568629741668701), (0.43697479367256165, 0.62352943420410156, -0.62352943420410156), (0.44117647409439087, 0.62745100259780884, -0.62745100259780884), (0.44537815451622009, 0.63529413938522339, -0.63529413938522339), (0.44957983493804932, 0.63921570777893066, -0.63921570777893066), (0.45378151535987854, 0.64705884456634521, -0.64705884456634521), (0.45798319578170776, 0.65098041296005249, -0.65098041296005249), (0.46218487620353699, 0.66274511814117432, -0.66274511814117432), (0.46638655662536621, 0.66666668653488159, -0.66666668653488159), (0.47058823704719543, 0.67450982332229614, -0.67450982332229614), (0.47478991746902466, 0.67843139171600342, -0.67843139171600342), (0.47899159789085388, 0.68627452850341797, -0.68627452850341797), (0.48319327831268311, 0.69019609689712524, -0.69019609689712524), (0.48739495873451233, 0.69803923368453979, -0.69803923368453979), (0.49159663915634155, 0.70196080207824707, -0.70196080207824707), (0.49579831957817078, 0.70980393886566162, -0.70980393886566162), (0.5, 0.7137255072593689, 0.7137255072593689), -(0.50420171022415161, 0.72549021244049072, 0.72549021244049072), -(0.50840336084365845, 0.729411780834198, 0.729411780834198), -(0.51260507106781006, 0.73725491762161255, 0.73725491762161255), -(0.51680672168731689, 0.74117648601531982, 0.74117648601531982), -(0.52100843191146851, 0.74901962280273438, 0.74901962280273438), -(0.52521008253097534, 0.75294119119644165, 0.75294119119644165), -(0.52941179275512695, 0.7607843279838562, 0.7607843279838562), -(0.53361344337463379, 0.76470589637756348, 0.76470589637756348), -(0.5378151535987854, 0.77254903316497803, 0.77254903316497803), -(0.54201680421829224, 0.7764706015586853, 0.7764706015586853), -(0.54621851444244385, 0.78823530673980713, 0.78823530673980713), -(0.55042016506195068, 0.7921568751335144, 0.7921568751335144), -(0.55462187528610229, 0.80000001192092896, 0.80000001192092896), -(0.55882352590560913, 0.80392158031463623, 0.80392158031463623), -(0.56302523612976074, 0.81176471710205078, 0.81176471710205078), -(0.56722688674926758, 0.81568628549575806, 0.81568628549575806), -(0.57142859697341919, 0.82352942228317261, 0.82352942228317261), -(0.57563024759292603, 0.82745099067687988, 0.82745099067687988), -(0.57983195781707764, 0.83137255907058716, 0.83137255907058716), -(0.58403360843658447, 0.83921569585800171, 0.83921569585800171), -(0.58823531866073608, 0.84313726425170898, 0.84313726425170898), -(0.59243696928024292, 0.85098040103912354, 0.85098040103912354), -(0.59663867950439453, 0.85490196943283081, 0.85490196943283081), -(0.60084033012390137, 0.86274510622024536, 0.86274510622024536), -(0.60504204034805298, 0.86666667461395264, 0.86666667461395264), -(0.60924369096755981, 0.87450981140136719, 0.87450981140136719), -(0.61344540119171143, 0.87843137979507446, 0.87843137979507446), -(0.61764705181121826, 0.88627451658248901, 0.88627451658248901), -(0.62184876203536987, 0.89019608497619629, 0.89019608497619629), -(0.62605041265487671, 0.89411765336990356, 0.89411765336990356), -(0.63025212287902832, 0.90588235855102539, 0.90588235855102539), -(0.63445377349853516, 0.91372549533843994, 0.91372549533843994), -(0.63865548372268677, 0.91764706373214722, 0.91764706373214722), -(0.6428571343421936, 0.92549020051956177, 0.92549020051956177), -(0.64705884456634521, 0.92941176891326904, 0.92941176891326904), -(0.65126049518585205, 0.93725490570068359, 0.93725490570068359), -(0.65546220541000366, 0.94117647409439087, 0.94117647409439087), -(0.6596638560295105, 0.94509804248809814, 0.94509804248809814), -(0.66386556625366211, 0.9529411792755127, 0.9529411792755127), -(0.66806721687316895, 0.95686274766921997, 0.95686274766921997), -(0.67226892709732056, 0.96470588445663452, 0.96470588445663452), -(0.67647057771682739, 0.9686274528503418, 0.9686274528503418), -(0.680672287940979, 0.97647058963775635, 0.97647058963775635), -(0.68487393856048584, 0.98039215803146362, 0.98039215803146362), -(0.68907564878463745, 0.98823529481887817, 0.98823529481887817), -(0.69327729940414429, 0.99215686321258545, 0.99215686321258545), -(0.6974790096282959, 1.0, 1.0), (0.70168066024780273, 1.0, 1.0), -(0.70588237047195435, 1.0, 1.0), (0.71008402109146118, 1.0, 1.0), -(0.71428573131561279, 1.0, 1.0), (0.71848738193511963, 1.0, 1.0), -(0.72268909215927124, 1.0, 1.0), (0.72689074277877808, 1.0, 1.0), -(0.73109245300292969, 1.0, 1.0), (0.73529410362243652, 1.0, 1.0), -(0.73949581384658813, 1.0, 1.0), (0.74369746446609497, 1.0, 1.0), -(0.74789917469024658, 1.0, 1.0), (0.75210082530975342, 1.0, 1.0), -(0.75630253553390503, 1.0, 1.0), (0.76050418615341187, 1.0, 1.0), -(0.76470589637756348, 1.0, 1.0), (0.76890754699707031, 1.0, 1.0), -(0.77310925722122192, 1.0, 1.0), (0.77731090784072876, 1.0, 1.0), -(0.78151261806488037, 1.0, 1.0), (0.78571426868438721, 1.0, 1.0), -(0.78991597890853882, 1.0, 1.0), (0.79411762952804565, 1.0, 1.0), -(0.79831933975219727, 1.0, 1.0), (0.8025209903717041, 1.0, 1.0), -(0.80672270059585571, 1.0, 1.0), (0.81092435121536255, 1.0, 1.0), -(0.81512606143951416, 1.0, 1.0), (0.819327712059021, 1.0, 1.0), -(0.82352942228317261, 1.0, 1.0), (0.82773107290267944, 1.0, 1.0), -(0.83193278312683105, 1.0, 1.0), (0.83613443374633789, 1.0, 1.0), -(0.8403361439704895, 1.0, 1.0), (0.84453779458999634, 1.0, 1.0), -(0.84873950481414795, 1.0, 1.0), (0.85294115543365479, 1.0, 1.0), -(0.8571428656578064, 1.0, 1.0), (0.86134451627731323, 1.0, 1.0), -(0.86554622650146484, 1.0, 1.0), (0.86974787712097168, 1.0, 1.0), -(0.87394958734512329, 1.0, 1.0), (0.87815123796463013, 1.0, 1.0), -(0.88235294818878174, 1.0, 1.0), (0.88655459880828857, 1.0, 1.0), -(0.89075630903244019, 1.0, 1.0), (0.89495795965194702, 1.0, 1.0), -(0.89915966987609863, 1.0, 1.0), (0.90336132049560547, 1.0, 1.0), -(0.90756303071975708, 1.0, 1.0), (0.91176468133926392, 1.0, 1.0), -(0.91596639156341553, 1.0, 1.0), (0.92016804218292236, 1.0, 1.0), -(0.92436975240707397, 1.0, 1.0), (0.92857140302658081, 1.0, 1.0), -(0.93277311325073242, 1.0, 1.0), (0.93697476387023926, 1.0, 1.0), -(0.94117647409439087, 1.0, 1.0), (0.94537812471389771, 1.0, 1.0), -(0.94957983493804932, 1.0, 1.0), (0.95378148555755615, 1.0, 1.0), -(0.95798319578170776, 1.0, 1.0), (0.9621848464012146, 1.0, 1.0), -(0.96638655662536621, 1.0, 1.0), (0.97058820724487305, 1.0, 1.0), -(0.97478991746902466, 1.0, 1.0), (0.97899156808853149, 1.0, 1.0), -(0.98319327831268311, 1.0, 1.0), (0.98739492893218994, 1.0, 1.0), -(0.99159663915634155, 1.0, 1.0), (0.99579828977584839, 1.0, 1.0), (1.0, -1.0, 1.0)]} -_gist_ncar_data = {'blue': [(0.0, 0.50196081399917603, -0.50196081399917603), (0.0050505050458014011, 0.45098039507865906, -0.45098039507865906), (0.010101010091602802, 0.40392157435417175, -0.40392157435417175), (0.015151515603065491, 0.35686275362968445, -0.35686275362968445), (0.020202020183205605, 0.30980393290519714, -0.30980393290519714), (0.025252524763345718, 0.25882354378700256, -0.25882354378700256), (0.030303031206130981, 0.21176470816135406, -0.21176470816135406), (0.035353533923625946, 0.16470588743686676, -0.16470588743686676), (0.040404040366411209, 0.11764705926179886, -0.11764705926179886), (0.045454546809196472, 0.070588238537311554, -0.070588238537311554), (0.050505049526691437, 0.019607843831181526, -0.019607843831181526), (0.0555555559694767, 0.047058824449777603, -0.047058824449777603), (0.060606062412261963, 0.14509804546833038, -0.14509804546833038), (0.065656565129756927, 0.23921568691730499, -0.23921568691730499), (0.070707067847251892, 0.3333333432674408, -0.3333333432674408), (0.075757578015327454, 0.43137255311012268, -0.43137255311012268), (0.080808080732822418, 0.52549022436141968, -0.52549022436141968), (0.085858583450317383, 0.61960786581039429, -0.61960786581039429), (0.090909093618392944, 0.71764707565307617, -0.71764707565307617), (0.095959596335887909, 0.81176471710205078, -0.81176471710205078), (0.10101009905338287, 0.90588235855102539, -0.90588235855102539), (0.10606060922145844, 1.0, 1.0), -(0.1111111119389534, 1.0, 1.0), (0.11616161465644836, 1.0, 1.0), -(0.12121212482452393, 1.0, 1.0), (0.12626262009143829, 1.0, 1.0), -(0.13131313025951385, 1.0, 1.0), (0.13636364042758942, 1.0, 1.0), -(0.14141413569450378, 1.0, 1.0), (0.14646464586257935, 1.0, 1.0), -(0.15151515603065491, 1.0, 1.0), (0.15656565129756927, 1.0, 1.0), -(0.16161616146564484, 1.0, 1.0), (0.1666666716337204, 1.0, 1.0), -(0.17171716690063477, 1.0, 1.0), (0.17676767706871033, 1.0, 1.0), -(0.18181818723678589, 1.0, 1.0), (0.18686868250370026, 1.0, 1.0), -(0.19191919267177582, 1.0, 1.0), (0.19696970283985138, 1.0, 1.0), -(0.20202019810676575, 1.0, 1.0), (0.20707070827484131, 1.0, 1.0), -(0.21212121844291687, 0.99215686321258545, 0.99215686321258545), -(0.21717171370983124, 0.95686274766921997, 0.95686274766921997), -(0.2222222238779068, 0.91764706373214722, 0.91764706373214722), -(0.22727273404598236, 0.88235294818878174, 0.88235294818878174), -(0.23232322931289673, 0.84313726425170898, 0.84313726425170898), -(0.23737373948097229, 0.80392158031463623, 0.80392158031463623), -(0.24242424964904785, 0.76862746477127075, 0.76862746477127075), -(0.24747474491596222, 0.729411780834198, 0.729411780834198), -(0.25252524018287659, 0.69019609689712524, 0.69019609689712524), -(0.25757575035095215, 0.65490198135375977, 0.65490198135375977), -(0.26262626051902771, 0.61568629741668701, 0.61568629741668701), -(0.26767677068710327, 0.56470590829849243, 0.56470590829849243), -(0.27272728085517883, 0.50980395078659058, 0.50980395078659058), -(0.27777779102325439, 0.45098039507865906, 0.45098039507865906), -(0.28282827138900757, 0.39215686917304993, 0.39215686917304993), -(0.28787878155708313, 0.3333333432674408, 0.3333333432674408), -(0.29292929172515869, 0.27843138575553894, 0.27843138575553894), -(0.29797980189323425, 0.21960784494876862, 0.21960784494876862), -(0.30303031206130981, 0.16078431904315948, 0.16078431904315948), -(0.30808082222938538, 0.10588235408067703, 0.10588235408067703), -(0.31313130259513855, 0.047058824449777603, 0.047058824449777603), -(0.31818181276321411, 0.0, 0.0), (0.32323232293128967, 0.0, 0.0), -(0.32828283309936523, 0.0, 0.0), (0.3333333432674408, 0.0, 0.0), -(0.33838382363319397, 0.0, 0.0), (0.34343433380126953, 0.0, 0.0), -(0.34848484396934509, 0.0, 0.0), (0.35353535413742065, 0.0, 0.0), -(0.35858586430549622, 0.0, 0.0), (0.36363637447357178, 0.0, 0.0), -(0.36868685483932495, 0.0, 0.0), (0.37373736500740051, 0.0, 0.0), -(0.37878787517547607, 0.0, 0.0), (0.38383838534355164, 0.0, 0.0), -(0.3888888955116272, 0.0, 0.0), (0.39393940567970276, 0.0, 0.0), -(0.39898988604545593, 0.0, 0.0), (0.40404039621353149, 0.0, 0.0), -(0.40909090638160706, 0.0, 0.0), (0.41414141654968262, 0.0, 0.0), -(0.41919192671775818, 0.0, 0.0), (0.42424243688583374, -0.0039215688593685627, 0.0039215688593685627), (0.42929291725158691, -0.027450980618596077, 0.027450980618596077), (0.43434342741966248, -0.050980392843484879, 0.050980392843484879), (0.43939393758773804, -0.074509806931018829, 0.074509806931018829), (0.4444444477558136, -0.094117648899555206, 0.094117648899555206), (0.44949495792388916, -0.11764705926179886, 0.11764705926179886), (0.45454546809196472, -0.14117647707462311, 0.14117647707462311), (0.4595959484577179, -0.16470588743686676, 0.16470588743686676), (0.46464645862579346, -0.18823529779911041, 0.18823529779911041), (0.46969696879386902, -0.21176470816135406, 0.21176470816135406), (0.47474747896194458, -0.23529411852359772, 0.23529411852359772), (0.47979798913002014, -0.22352941334247589, 0.22352941334247589), (0.4848484992980957, -0.20000000298023224, 0.20000000298023224), (0.48989897966384888, -0.17647059261798859, 0.17647059261798859), (0.49494948983192444, -0.15294118225574493, 0.15294118225574493), (0.5, 0.12941177189350128, -0.12941177189350128), (0.50505048036575317, 0.10980392247438431, -0.10980392247438431), (0.51010102033615112, 0.086274512112140656, -0.086274512112140656), (0.5151515007019043, 0.062745101749897003, -0.062745101749897003), (0.52020204067230225, 0.039215687662363052, -0.039215687662363052), (0.52525252103805542, 0.015686275437474251, -0.015686275437474251), (0.53030300140380859, 0.0, 0.0), -(0.53535354137420654, 0.0, 0.0), (0.54040402173995972, 0.0, 0.0), -(0.54545456171035767, 0.0, 0.0), (0.55050504207611084, 0.0, 0.0), -(0.55555558204650879, 0.0, 0.0), (0.56060606241226196, 0.0, 0.0), -(0.56565654277801514, 0.0, 0.0), (0.57070708274841309, 0.0, 0.0), -(0.57575756311416626, 0.0, 0.0), (0.58080810308456421, 0.0, 0.0), -(0.58585858345031738, 0.0039215688593685627, 0.0039215688593685627), -(0.59090906381607056, 0.0078431377187371254, 0.0078431377187371254), -(0.59595960378646851, 0.011764706112444401, 0.011764706112444401), -(0.60101008415222168, 0.019607843831181526, 0.019607843831181526), -(0.60606062412261963, 0.023529412224888802, 0.023529412224888802), -(0.6111111044883728, 0.031372550874948502, 0.031372550874948502), -(0.61616164445877075, 0.035294119268655777, 0.035294119268655777), -(0.62121212482452393, 0.043137256056070328, 0.043137256056070328), -(0.6262626051902771, 0.047058824449777603, 0.047058824449777603), -(0.63131314516067505, 0.054901961237192154, 0.054901961237192154), -(0.63636362552642822, 0.054901961237192154, 0.054901961237192154), -(0.64141416549682617, 0.050980392843484879, 0.050980392843484879), -(0.64646464586257935, 0.043137256056070328, 0.043137256056070328), -(0.65151512622833252, 0.039215687662363052, 0.039215687662363052), -(0.65656566619873047, 0.031372550874948502, 0.031372550874948502), -(0.66161614656448364, 0.027450980618596077, 0.027450980618596077), -(0.66666668653488159, 0.019607843831181526, 0.019607843831181526), -(0.67171716690063477, 0.015686275437474251, 0.015686275437474251), -(0.67676764726638794, 0.011764706112444401, 0.011764706112444401), -(0.68181818723678589, 0.0039215688593685627, 0.0039215688593685627), -(0.68686866760253906, 0.0, 0.0), (0.69191920757293701, 0.0, 0.0), -(0.69696968793869019, 0.0, 0.0), (0.70202022790908813, 0.0, 0.0), -(0.70707070827484131, 0.0, 0.0), (0.71212118864059448, 0.0, 0.0), -(0.71717172861099243, 0.0, 0.0), (0.72222220897674561, 0.0, 0.0), -(0.72727274894714355, 0.0, 0.0), (0.73232322931289673, 0.0, 0.0), -(0.7373737096786499, 0.0, 0.0), (0.74242424964904785, -0.031372550874948502, 0.031372550874948502), (0.74747473001480103, -0.12941177189350128, 0.12941177189350128), (0.75252526998519897, -0.22352941334247589, 0.22352941334247589), (0.75757575035095215, -0.32156863808631897, 0.32156863808631897), (0.7626262903213501, -0.41568627953529358, 0.41568627953529358), (0.76767677068710327, -0.50980395078659058, 0.50980395078659058), (0.77272725105285645, -0.60784316062927246, 0.60784316062927246), (0.77777779102325439, -0.70196080207824707, 0.70196080207824707), (0.78282827138900757, -0.79607844352722168, 0.79607844352722168), (0.78787881135940552, -0.89411765336990356, 0.89411765336990356), (0.79292929172515869, -0.98823529481887817, 0.98823529481887817), (0.79797977209091187, 1.0, -1.0), (0.80303031206130981, 1.0, 1.0), (0.80808079242706299, 1.0, 1.0), -(0.81313133239746094, 1.0, 1.0), (0.81818181276321411, 1.0, 1.0), -(0.82323235273361206, 1.0, 1.0), (0.82828283309936523, 1.0, 1.0), -(0.83333331346511841, 1.0, 1.0), (0.83838385343551636, 1.0, 1.0), -(0.84343433380126953, 1.0, 1.0), (0.84848487377166748, -0.99607843160629272, 0.99607843160629272), (0.85353535413742065, -0.98823529481887817, 0.98823529481887817), (0.85858583450317383, -0.9843137264251709, 0.9843137264251709), (0.86363637447357178, -0.97647058963775635, 0.97647058963775635), (0.86868685483932495, -0.9686274528503418, 0.9686274528503418), (0.8737373948097229, -0.96470588445663452, 0.96470588445663452), (0.87878787517547607, -0.95686274766921997, 0.95686274766921997), (0.88383835554122925, -0.94901961088180542, 0.94901961088180542), (0.8888888955116272, -0.94509804248809814, 0.94509804248809814), (0.89393937587738037, -0.93725490570068359, 0.93725490570068359), (0.89898991584777832, -0.93333333730697632, 0.93333333730697632), (0.90404039621353149, -0.93333333730697632, 0.93333333730697632), (0.90909093618392944, -0.93725490570068359, 0.93725490570068359), (0.91414141654968262, -0.93725490570068359, 0.93725490570068359), (0.91919189691543579, -0.94117647409439087, 0.94117647409439087), (0.92424243688583374, -0.94509804248809814, 0.94509804248809814), (0.92929291725158691, -0.94509804248809814, 0.94509804248809814), (0.93434345722198486, -0.94901961088180542, 0.94901961088180542), (0.93939393758773804, -0.9529411792755127, 0.9529411792755127), (0.94444441795349121, -0.9529411792755127, 0.9529411792755127), (0.94949495792388916, -0.95686274766921997, 0.95686274766921997), (0.95454543828964233, -0.96078431606292725, 0.96078431606292725), (0.95959597826004028, -0.96470588445663452, 0.96470588445663452), (0.96464645862579346, -0.9686274528503418, 0.9686274528503418), (0.96969699859619141, -0.97254902124404907, 0.97254902124404907), (0.97474747896194458, -0.97647058963775635, 0.97647058963775635), (0.97979795932769775, -0.98039215803146362, 0.98039215803146362), (0.9848484992980957, -0.9843137264251709, 0.9843137264251709), (0.98989897966384888, -0.98823529481887817, 0.98823529481887817), (0.99494951963424683, -0.99215686321258545, 0.99215686321258545), (1.0, 0.99607843160629272, -0.99607843160629272)], 'green': [(0.0, 0.0, 0.0), (0.0050505050458014011, -0.035294119268655777, 0.035294119268655777), (0.010101010091602802, -0.074509806931018829, 0.074509806931018829), (0.015151515603065491, -0.10980392247438431, 0.10980392247438431), (0.020202020183205605, -0.14901961386203766, 0.14901961386203766), (0.025252524763345718, -0.18431372940540314, 0.18431372940540314), (0.030303031206130981, -0.22352941334247589, 0.22352941334247589), (0.035353533923625946, -0.25882354378700256, 0.25882354378700256), (0.040404040366411209, -0.29803922772407532, 0.29803922772407532), (0.045454546809196472, -0.3333333432674408, 0.3333333432674408), (0.050505049526691437, -0.37254902720451355, 0.37254902720451355), (0.0555555559694767, -0.36862745881080627, 0.36862745881080627), (0.060606062412261963, -0.3333333432674408, 0.3333333432674408), (0.065656565129756927, -0.29411765933036804, 0.29411765933036804), (0.070707067847251892, -0.25882354378700256, 0.25882354378700256), (0.075757578015327454, -0.21960784494876862, 0.21960784494876862), (0.080808080732822418, -0.18431372940540314, 0.18431372940540314), (0.085858583450317383, -0.14509804546833038, 0.14509804546833038), (0.090909093618392944, -0.10980392247438431, 0.10980392247438431), (0.095959596335887909, -0.070588238537311554, 0.070588238537311554), (0.10101009905338287, -0.035294119268655777, 0.035294119268655777), (0.10606060922145844, 0.0, -0.0), (0.1111111119389534, 0.074509806931018829, 0.074509806931018829), -(0.11616161465644836, 0.14509804546833038, 0.14509804546833038), -(0.12121212482452393, 0.21568627655506134, 0.21568627655506134), -(0.12626262009143829, 0.28627452254295349, 0.28627452254295349), -(0.13131313025951385, 0.36078432202339172, 0.36078432202339172), -(0.13636364042758942, 0.43137255311012268, 0.43137255311012268), -(0.14141413569450378, 0.50196081399917603, 0.50196081399917603), -(0.14646464586257935, 0.57254904508590698, 0.57254904508590698), -(0.15151515603065491, 0.64705884456634521, 0.64705884456634521), -(0.15656565129756927, 0.71764707565307617, 0.71764707565307617), -(0.16161616146564484, 0.7607843279838562, 0.7607843279838562), -(0.1666666716337204, 0.78431373834609985, 0.78431373834609985), -(0.17171716690063477, 0.80784314870834351, 0.80784314870834351), -(0.17676767706871033, 0.83137255907058716, 0.83137255907058716), -(0.18181818723678589, 0.85490196943283081, 0.85490196943283081), -(0.18686868250370026, 0.88235294818878174, 0.88235294818878174), -(0.19191919267177582, 0.90588235855102539, 0.90588235855102539), -(0.19696970283985138, 0.92941176891326904, 0.92941176891326904), -(0.20202019810676575, 0.9529411792755127, 0.9529411792755127), -(0.20707070827484131, 0.97647058963775635, 0.97647058963775635), -(0.21212121844291687, 0.99607843160629272, 0.99607843160629272), -(0.21717171370983124, 0.99607843160629272, 0.99607843160629272), -(0.2222222238779068, 0.99215686321258545, 0.99215686321258545), -(0.22727273404598236, 0.99215686321258545, 0.99215686321258545), -(0.23232322931289673, 0.99215686321258545, 0.99215686321258545), -(0.23737373948097229, 0.98823529481887817, 0.98823529481887817), -(0.24242424964904785, 0.98823529481887817, 0.98823529481887817), -(0.24747474491596222, 0.9843137264251709, 0.9843137264251709), -(0.25252524018287659, 0.9843137264251709, 0.9843137264251709), -(0.25757575035095215, 0.98039215803146362, 0.98039215803146362), -(0.26262626051902771, 0.98039215803146362, 0.98039215803146362), -(0.26767677068710327, 0.98039215803146362, 0.98039215803146362), -(0.27272728085517883, 0.98039215803146362, 0.98039215803146362), -(0.27777779102325439, 0.9843137264251709, 0.9843137264251709), -(0.28282827138900757, 0.9843137264251709, 0.9843137264251709), -(0.28787878155708313, 0.98823529481887817, 0.98823529481887817), -(0.29292929172515869, 0.98823529481887817, 0.98823529481887817), -(0.29797980189323425, 0.99215686321258545, 0.99215686321258545), -(0.30303031206130981, 0.99215686321258545, 0.99215686321258545), -(0.30808082222938538, 0.99607843160629272, 0.99607843160629272), -(0.31313130259513855, 0.99607843160629272, 0.99607843160629272), -(0.31818181276321411, 0.99607843160629272, 0.99607843160629272), -(0.32323232293128967, 0.97647058963775635, 0.97647058963775635), -(0.32828283309936523, 0.95686274766921997, 0.95686274766921997), -(0.3333333432674408, 0.93725490570068359, 0.93725490570068359), -(0.33838382363319397, 0.92156863212585449, 0.92156863212585449), -(0.34343433380126953, 0.90196079015731812, 0.90196079015731812), -(0.34848484396934509, 0.88235294818878174, 0.88235294818878174), -(0.35353535413742065, 0.86274510622024536, 0.86274510622024536), -(0.35858586430549622, 0.84705883264541626, 0.84705883264541626), -(0.36363637447357178, 0.82745099067687988, 0.82745099067687988), -(0.36868685483932495, 0.80784314870834351, 0.80784314870834351), -(0.37373736500740051, 0.81568628549575806, 0.81568628549575806), -(0.37878787517547607, 0.83529412746429443, 0.83529412746429443), -(0.38383838534355164, 0.85098040103912354, 0.85098040103912354), -(0.3888888955116272, 0.87058824300765991, 0.87058824300765991), -(0.39393940567970276, 0.89019608497619629, 0.89019608497619629), -(0.39898988604545593, 0.90980392694473267, 0.90980392694473267), -(0.40404039621353149, 0.92549020051956177, 0.92549020051956177), -(0.40909090638160706, 0.94509804248809814, 0.94509804248809814), -(0.41414141654968262, 0.96470588445663452, 0.96470588445663452), -(0.41919192671775818, 0.9843137264251709, 0.9843137264251709), -(0.42424243688583374, 1.0, 1.0), (0.42929291725158691, 1.0, 1.0), -(0.43434342741966248, 1.0, 1.0), (0.43939393758773804, 1.0, 1.0), -(0.4444444477558136, 1.0, 1.0), (0.44949495792388916, 1.0, 1.0), -(0.45454546809196472, 1.0, 1.0), (0.4595959484577179, 1.0, 1.0), -(0.46464645862579346, 1.0, 1.0), (0.46969696879386902, 1.0, 1.0), -(0.47474747896194458, 1.0, 1.0), (0.47979798913002014, 1.0, 1.0), -(0.4848484992980957, 1.0, 1.0), (0.48989897966384888, 1.0, 1.0), -(0.49494948983192444, 1.0, 1.0), (0.5, 1.0, 1.0), (0.50505048036575317, -1.0, 1.0), (0.51010102033615112, 1.0, 1.0), (0.5151515007019043, 1.0, -1.0), (0.52020204067230225, 1.0, 1.0), (0.52525252103805542, 1.0, 1.0), -(0.53030300140380859, 0.99215686321258545, 0.99215686321258545), -(0.53535354137420654, 0.98039215803146362, 0.98039215803146362), -(0.54040402173995972, 0.96470588445663452, 0.96470588445663452), -(0.54545456171035767, 0.94901961088180542, 0.94901961088180542), -(0.55050504207611084, 0.93333333730697632, 0.93333333730697632), -(0.55555558204650879, 0.91764706373214722, 0.91764706373214722), -(0.56060606241226196, 0.90588235855102539, 0.90588235855102539), -(0.56565654277801514, 0.89019608497619629, 0.89019608497619629), -(0.57070708274841309, 0.87450981140136719, 0.87450981140136719), -(0.57575756311416626, 0.85882353782653809, 0.85882353782653809), -(0.58080810308456421, 0.84313726425170898, 0.84313726425170898), -(0.58585858345031738, 0.83137255907058716, 0.83137255907058716), -(0.59090906381607056, 0.81960785388946533, 0.81960785388946533), -(0.59595960378646851, 0.81176471710205078, 0.81176471710205078), -(0.60101008415222168, 0.80000001192092896, 0.80000001192092896), -(0.60606062412261963, 0.78823530673980713, 0.78823530673980713), -(0.6111111044883728, 0.7764706015586853, 0.7764706015586853), -(0.61616164445877075, 0.76470589637756348, 0.76470589637756348), -(0.62121212482452393, 0.75294119119644165, 0.75294119119644165), -(0.6262626051902771, 0.74117648601531982, 0.74117648601531982), -(0.63131314516067505, 0.729411780834198, 0.729411780834198), -(0.63636362552642822, 0.70980393886566162, 0.70980393886566162), -(0.64141416549682617, 0.66666668653488159, 0.66666668653488159), -(0.64646464586257935, 0.62352943420410156, 0.62352943420410156), -(0.65151512622833252, 0.58039218187332153, 0.58039218187332153), -(0.65656566619873047, 0.5372549295425415, 0.5372549295425415), -(0.66161614656448364, 0.49411764740943909, 0.49411764740943909), -(0.66666668653488159, 0.45098039507865906, 0.45098039507865906), -(0.67171716690063477, 0.40392157435417175, 0.40392157435417175), -(0.67676764726638794, 0.36078432202339172, 0.36078432202339172), -(0.68181818723678589, 0.31764706969261169, 0.31764706969261169), -(0.68686866760253906, 0.27450981736183167, 0.27450981736183167), -(0.69191920757293701, 0.24705882370471954, 0.24705882370471954), -(0.69696968793869019, 0.21960784494876862, 0.21960784494876862), -(0.70202022790908813, 0.19607843458652496, 0.19607843458652496), -(0.70707070827484131, 0.16862745583057404, 0.16862745583057404), -(0.71212118864059448, 0.14509804546833038, 0.14509804546833038), -(0.71717172861099243, 0.11764705926179886, 0.11764705926179886), -(0.72222220897674561, 0.090196080505847931, 0.090196080505847931), -(0.72727274894714355, 0.066666670143604279, 0.066666670143604279), -(0.73232322931289673, 0.039215687662363052, 0.039215687662363052), -(0.7373737096786499, 0.015686275437474251, 0.015686275437474251), -(0.74242424964904785, 0.0, 0.0), (0.74747473001480103, 0.0, 0.0), -(0.75252526998519897, 0.0, 0.0), (0.75757575035095215, 0.0, 0.0), -(0.7626262903213501, 0.0, 0.0), (0.76767677068710327, 0.0, 0.0), -(0.77272725105285645, 0.0, 0.0), (0.77777779102325439, 0.0, 0.0), -(0.78282827138900757, 0.0, 0.0), (0.78787881135940552, 0.0, 0.0), -(0.79292929172515869, 0.0, 0.0), (0.79797977209091187, -0.015686275437474251, 0.015686275437474251), (0.80303031206130981, -0.031372550874948502, 0.031372550874948502), (0.80808079242706299, -0.050980392843484879, 0.050980392843484879), (0.81313133239746094, -0.066666670143604279, 0.066666670143604279), (0.81818181276321411, -0.086274512112140656, 0.086274512112140656), (0.82323235273361206, -0.10588235408067703, 0.10588235408067703), (0.82828283309936523, -0.12156862765550613, 0.12156862765550613), (0.83333331346511841, -0.14117647707462311, 0.14117647707462311), (0.83838385343551636, -0.15686275064945221, 0.15686275064945221), (0.84343433380126953, -0.17647059261798859, 0.17647059261798859), (0.84848487377166748, -0.20000000298023224, 0.20000000298023224), (0.85353535413742065, -0.23137255012989044, 0.23137255012989044), (0.85858583450317383, -0.25882354378700256, 0.25882354378700256), (0.86363637447357178, -0.29019609093666077, 0.29019609093666077), (0.86868685483932495, -0.32156863808631897, 0.32156863808631897), (0.8737373948097229, -0.35294118523597717, 0.35294118523597717), (0.87878787517547607, -0.38431373238563538, 0.38431373238563538), (0.88383835554122925, -0.41568627953529358, 0.41568627953529358), (0.8888888955116272, -0.44313725829124451, 0.44313725829124451), (0.89393937587738037, -0.47450980544090271, 0.47450980544090271), (0.89898991584777832, -0.5058823823928833, 0.5058823823928833), (0.90404039621353149, -0.52941179275512695, 0.52941179275512695), (0.90909093618392944, -0.55294120311737061, 0.55294120311737061), (0.91414141654968262, -0.57254904508590698, 0.57254904508590698), (0.91919189691543579, -0.59607845544815063, 0.59607845544815063), (0.92424243688583374, -0.61960786581039429, 0.61960786581039429), (0.92929291725158691, -0.64313727617263794, 0.64313727617263794), (0.93434345722198486, -0.66274511814117432, 0.66274511814117432), (0.93939393758773804, -0.68627452850341797, 0.68627452850341797), (0.94444441795349121, -0.70980393886566162, 0.70980393886566162), (0.94949495792388916, -0.729411780834198, 0.729411780834198), (0.95454543828964233, -0.75294119119644165, 0.75294119119644165), (0.95959597826004028, -0.78039216995239258, 0.78039216995239258), (0.96464645862579346, -0.80392158031463623, 0.80392158031463623), (0.96969699859619141, -0.82745099067687988, 0.82745099067687988), (0.97474747896194458, -0.85098040103912354, 0.85098040103912354), (0.97979795932769775, -0.87450981140136719, 0.87450981140136719), (0.9848484992980957, -0.90196079015731812, 0.90196079015731812), (0.98989897966384888, -0.92549020051956177, 0.92549020051956177), (0.99494951963424683, -0.94901961088180542, 0.94901961088180542), (1.0, 0.97254902124404907, -0.97254902124404907)], 'red': [(0.0, 0.0, 0.0), (0.0050505050458014011, -0.0, 0.0), (0.010101010091602802, 0.0, 0.0), (0.015151515603065491, 0.0, -0.0), (0.020202020183205605, 0.0, 0.0), (0.025252524763345718, 0.0, 0.0), -(0.030303031206130981, 0.0, 0.0), (0.035353533923625946, 0.0, 0.0), -(0.040404040366411209, 0.0, 0.0), (0.045454546809196472, 0.0, 0.0), -(0.050505049526691437, 0.0, 0.0), (0.0555555559694767, 0.0, 0.0), -(0.060606062412261963, 0.0, 0.0), (0.065656565129756927, 0.0, 0.0), -(0.070707067847251892, 0.0, 0.0), (0.075757578015327454, 0.0, 0.0), -(0.080808080732822418, 0.0, 0.0), (0.085858583450317383, 0.0, 0.0), -(0.090909093618392944, 0.0, 0.0), (0.095959596335887909, 0.0, 0.0), -(0.10101009905338287, 0.0, 0.0), (0.10606060922145844, 0.0, 0.0), -(0.1111111119389534, 0.0, 0.0), (0.11616161465644836, 0.0, 0.0), -(0.12121212482452393, 0.0, 0.0), (0.12626262009143829, 0.0, 0.0), -(0.13131313025951385, 0.0, 0.0), (0.13636364042758942, 0.0, 0.0), -(0.14141413569450378, 0.0, 0.0), (0.14646464586257935, 0.0, 0.0), -(0.15151515603065491, 0.0, 0.0), (0.15656565129756927, 0.0, 0.0), -(0.16161616146564484, 0.0, 0.0), (0.1666666716337204, 0.0, 0.0), -(0.17171716690063477, 0.0, 0.0), (0.17676767706871033, 0.0, 0.0), -(0.18181818723678589, 0.0, 0.0), (0.18686868250370026, 0.0, 0.0), -(0.19191919267177582, 0.0, 0.0), (0.19696970283985138, 0.0, 0.0), -(0.20202019810676575, 0.0, 0.0), (0.20707070827484131, 0.0, 0.0), -(0.21212121844291687, 0.0, 0.0), (0.21717171370983124, 0.0, 0.0), -(0.2222222238779068, 0.0, 0.0), (0.22727273404598236, 0.0, 0.0), -(0.23232322931289673, 0.0, 0.0), (0.23737373948097229, 0.0, 0.0), -(0.24242424964904785, 0.0, 0.0), (0.24747474491596222, 0.0, 0.0), -(0.25252524018287659, 0.0, 0.0), (0.25757575035095215, 0.0, 0.0), -(0.26262626051902771, 0.0, 0.0), (0.26767677068710327, 0.0, 0.0), -(0.27272728085517883, 0.0, 0.0), (0.27777779102325439, 0.0, 0.0), -(0.28282827138900757, 0.0, 0.0), (0.28787878155708313, 0.0, 0.0), -(0.29292929172515869, 0.0, 0.0), (0.29797980189323425, 0.0, 0.0), -(0.30303031206130981, 0.0, 0.0), (0.30808082222938538, 0.0, 0.0), -(0.31313130259513855, 0.0, 0.0), (0.31818181276321411, -0.0039215688593685627, 0.0039215688593685627), (0.32323232293128967, -0.043137256056070328, 0.043137256056070328), (0.32828283309936523, -0.08235294371843338, 0.08235294371843338), (0.3333333432674408, -0.11764705926179886, 0.11764705926179886), (0.33838382363319397, -0.15686275064945221, 0.15686275064945221), (0.34343433380126953, -0.19607843458652496, 0.19607843458652496), (0.34848484396934509, -0.23137255012989044, 0.23137255012989044), (0.35353535413742065, -0.27058824896812439, 0.27058824896812439), (0.35858586430549622, -0.30980393290519714, 0.30980393290519714), (0.36363637447357178, -0.3490196168422699, 0.3490196168422699), (0.36868685483932495, -0.38431373238563538, 0.38431373238563538), (0.37373736500740051, -0.40392157435417175, 0.40392157435417175), (0.37878787517547607, -0.41568627953529358, 0.41568627953529358), (0.38383838534355164, -0.42352941632270813, 0.42352941632270813), (0.3888888955116272, -0.43137255311012268, 0.43137255311012268), (0.39393940567970276, -0.44313725829124451, 0.44313725829124451), (0.39898988604545593, -0.45098039507865906, 0.45098039507865906), (0.40404039621353149, -0.45882353186607361, 0.45882353186607361), (0.40909090638160706, -0.47058823704719543, 0.47058823704719543), (0.41414141654968262, -0.47843137383460999, 0.47843137383460999), (0.41919192671775818, -0.49019607901573181, 0.49019607901573181), (0.42424243688583374, -0.50196081399917603, 0.50196081399917603), (0.42929291725158691, -0.52549022436141968, 0.52549022436141968), (0.43434342741966248, -0.54901963472366333, 0.54901963472366333), (0.43939393758773804, -0.57254904508590698, 0.57254904508590698), (0.4444444477558136, -0.60000002384185791, 0.60000002384185791), (0.44949495792388916, -0.62352943420410156, 0.62352943420410156), (0.45454546809196472, -0.64705884456634521, 0.64705884456634521), (0.4595959484577179, -0.67058825492858887, 0.67058825492858887), (0.46464645862579346, -0.69411766529083252, 0.69411766529083252), (0.46969696879386902, -0.72156864404678345, 0.72156864404678345), (0.47474747896194458, -0.7450980544090271, 0.7450980544090271), (0.47979798913002014, -0.76862746477127075, 0.76862746477127075), (0.4848484992980957, -0.7921568751335144, 0.7921568751335144), (0.48989897966384888, -0.81568628549575806, 0.81568628549575806), (0.49494948983192444, -0.83921569585800171, 0.83921569585800171), (0.5, 0.86274510622024536, -0.86274510622024536), (0.50505048036575317, 0.88627451658248901, -0.88627451658248901), (0.51010102033615112, 0.90980392694473267, -0.90980392694473267), (0.5151515007019043, 0.93333333730697632, -0.93333333730697632), (0.52020204067230225, 0.95686274766921997, -0.95686274766921997), (0.52525252103805542, 0.98039215803146362, -0.98039215803146362), (0.53030300140380859, 1.0, 1.0), -(0.53535354137420654, 1.0, 1.0), (0.54040402173995972, 1.0, 1.0), -(0.54545456171035767, 1.0, 1.0), (0.55050504207611084, 1.0, 1.0), -(0.55555558204650879, 1.0, 1.0), (0.56060606241226196, 1.0, 1.0), -(0.56565654277801514, 1.0, 1.0), (0.57070708274841309, 1.0, 1.0), -(0.57575756311416626, 1.0, 1.0), (0.58080810308456421, 1.0, 1.0), -(0.58585858345031738, 1.0, 1.0), (0.59090906381607056, 1.0, 1.0), -(0.59595960378646851, 1.0, 1.0), (0.60101008415222168, 1.0, 1.0), -(0.60606062412261963, 1.0, 1.0), (0.6111111044883728, 1.0, 1.0), -(0.61616164445877075, 1.0, 1.0), (0.62121212482452393, 1.0, 1.0), -(0.6262626051902771, 1.0, 1.0), (0.63131314516067505, 1.0, 1.0), -(0.63636362552642822, 1.0, 1.0), (0.64141416549682617, 1.0, 1.0), -(0.64646464586257935, 1.0, 1.0), (0.65151512622833252, 1.0, 1.0), -(0.65656566619873047, 1.0, 1.0), (0.66161614656448364, 1.0, 1.0), -(0.66666668653488159, 1.0, 1.0), (0.67171716690063477, 1.0, 1.0), -(0.67676764726638794, 1.0, 1.0), (0.68181818723678589, 1.0, 1.0), -(0.68686866760253906, 1.0, 1.0), (0.69191920757293701, 1.0, 1.0), -(0.69696968793869019, 1.0, 1.0), (0.70202022790908813, 1.0, 1.0), -(0.70707070827484131, 1.0, 1.0), (0.71212118864059448, 1.0, 1.0), -(0.71717172861099243, 1.0, 1.0), (0.72222220897674561, 1.0, 1.0), -(0.72727274894714355, 1.0, 1.0), (0.73232322931289673, 1.0, 1.0), -(0.7373737096786499, 1.0, 1.0), (0.74242424964904785, 1.0, 1.0), -(0.74747473001480103, 1.0, 1.0), (0.75252526998519897, 1.0, 1.0), -(0.75757575035095215, 1.0, 1.0), (0.7626262903213501, 1.0, 1.0), -(0.76767677068710327, 1.0, 1.0), (0.77272725105285645, 1.0, 1.0), -(0.77777779102325439, 1.0, 1.0), (0.78282827138900757, 1.0, 1.0), -(0.78787881135940552, 1.0, 1.0), (0.79292929172515869, 1.0, 1.0), -(0.79797977209091187, 0.96470588445663452, 0.96470588445663452), -(0.80303031206130981, 0.92549020051956177, 0.92549020051956177), -(0.80808079242706299, 0.89019608497619629, 0.89019608497619629), -(0.81313133239746094, 0.85098040103912354, 0.85098040103912354), -(0.81818181276321411, 0.81568628549575806, 0.81568628549575806), -(0.82323235273361206, 0.7764706015586853, 0.7764706015586853), -(0.82828283309936523, 0.74117648601531982, 0.74117648601531982), -(0.83333331346511841, 0.70196080207824707, 0.70196080207824707), -(0.83838385343551636, 0.66666668653488159, 0.66666668653488159), -(0.84343433380126953, 0.62745100259780884, 0.62745100259780884), -(0.84848487377166748, 0.61960786581039429, 0.61960786581039429), -(0.85353535413742065, 0.65098041296005249, 0.65098041296005249), -(0.85858583450317383, 0.68235296010971069, 0.68235296010971069), -(0.86363637447357178, 0.7137255072593689, 0.7137255072593689), -(0.86868685483932495, 0.7450980544090271, 0.7450980544090271), -(0.8737373948097229, 0.77254903316497803, 0.77254903316497803), -(0.87878787517547607, 0.80392158031463623, 0.80392158031463623), -(0.88383835554122925, 0.83529412746429443, 0.83529412746429443), -(0.8888888955116272, 0.86666667461395264, 0.86666667461395264), -(0.89393937587738037, 0.89803922176361084, 0.89803922176361084), -(0.89898991584777832, 0.92941176891326904, 0.92941176891326904), -(0.90404039621353149, 0.93333333730697632, 0.93333333730697632), -(0.90909093618392944, 0.93725490570068359, 0.93725490570068359), -(0.91414141654968262, 0.93725490570068359, 0.93725490570068359), -(0.91919189691543579, 0.94117647409439087, 0.94117647409439087), -(0.92424243688583374, 0.94509804248809814, 0.94509804248809814), -(0.92929291725158691, 0.94509804248809814, 0.94509804248809814), -(0.93434345722198486, 0.94901961088180542, 0.94901961088180542), -(0.93939393758773804, 0.9529411792755127, 0.9529411792755127), -(0.94444441795349121, 0.9529411792755127, 0.9529411792755127), -(0.94949495792388916, 0.95686274766921997, 0.95686274766921997), -(0.95454543828964233, 0.96078431606292725, 0.96078431606292725), -(0.95959597826004028, 0.96470588445663452, 0.96470588445663452), -(0.96464645862579346, 0.9686274528503418, 0.9686274528503418), -(0.96969699859619141, 0.97254902124404907, 0.97254902124404907), -(0.97474747896194458, 0.97647058963775635, 0.97647058963775635), -(0.97979795932769775, 0.98039215803146362, 0.98039215803146362), -(0.9848484992980957, 0.9843137264251709, 0.9843137264251709), -(0.98989897966384888, 0.98823529481887817, 0.98823529481887817), -(0.99494951963424683, 0.99215686321258545, 0.99215686321258545), (1.0, -0.99607843160629272, 0.99607843160629272)]} -_gist_rainbow_data = {'blue': -[(0.0, 0.16470588743686676, 0.16470588743686676), (0.0042016808874905109, -0.14117647707462311, 0.14117647707462311), (0.0084033617749810219, -0.12156862765550613, 0.12156862765550613), (0.012605042196810246, -0.10196078568696976, 0.10196078568696976), (0.016806723549962044, -0.078431375324726105, 0.078431375324726105), (0.021008403971791267, -0.058823529630899429, 0.058823529630899429), (0.025210084393620491, -0.039215687662363052, 0.039215687662363052), (0.029411764815449715, -0.015686275437474251, 0.015686275437474251), (0.033613447099924088, 0.0, -0.0), (0.037815127521753311, 0.0, 0.0), (0.042016807943582535, 0.0, 0.0), -(0.046218488365411758, 0.0, 0.0), (0.050420168787240982, 0.0, 0.0), -(0.054621849209070206, 0.0, 0.0), (0.058823529630899429, 0.0, 0.0), -(0.063025213778018951, 0.0, 0.0), (0.067226894199848175, 0.0, 0.0), -(0.071428574621677399, 0.0, 0.0), (0.075630255043506622, 0.0, 0.0), -(0.079831935465335846, 0.0, 0.0), (0.08403361588716507, 0.0, 0.0), -(0.088235296308994293, 0.0, 0.0), (0.092436976730823517, 0.0, 0.0), -(0.09663865715265274, 0.0, 0.0), (0.10084033757448196, 0.0, 0.0), -(0.10504201799631119, 0.0, 0.0), (0.10924369841814041, 0.0, 0.0), -(0.11344537883996964, 0.0, 0.0), (0.11764705926179886, 0.0, 0.0), -(0.12184873968362808, 0.0, 0.0), (0.1260504275560379, 0.0, 0.0), -(0.13025210797786713, 0.0, 0.0), (0.13445378839969635, 0.0, 0.0), -(0.13865546882152557, 0.0, 0.0), (0.1428571492433548, 0.0, 0.0), -(0.14705882966518402, 0.0, 0.0), (0.15126051008701324, 0.0, 0.0), -(0.15546219050884247, 0.0, 0.0), (0.15966387093067169, 0.0, 0.0), -(0.16386555135250092, 0.0, 0.0), (0.16806723177433014, 0.0, 0.0), -(0.17226891219615936, 0.0, 0.0), (0.17647059261798859, 0.0, 0.0), -(0.18067227303981781, 0.0, 0.0), (0.18487395346164703, 0.0, 0.0), -(0.18907563388347626, 0.0, 0.0), (0.19327731430530548, 0.0, 0.0), -(0.1974789947271347, 0.0, 0.0), (0.20168067514896393, 0.0, 0.0), -(0.20588235557079315, 0.0, 0.0), (0.21008403599262238, 0.0, 0.0), -(0.2142857164144516, 0.0, 0.0), (0.21848739683628082, 0.0, 0.0), -(0.22268907725811005, 0.0, 0.0), (0.22689075767993927, 0.0, 0.0), -(0.23109243810176849, 0.0, 0.0), (0.23529411852359772, 0.0, 0.0), -(0.23949579894542694, 0.0, 0.0), (0.24369747936725616, 0.0, 0.0), -(0.24789915978908539, 0.0, 0.0), (0.25210085511207581, 0.0, 0.0), -(0.25630253553390503, 0.0, 0.0), (0.26050421595573425, 0.0, 0.0), -(0.26470589637756348, 0.0, 0.0), (0.2689075767993927, 0.0, 0.0), -(0.27310925722122192, 0.0, 0.0), (0.27731093764305115, 0.0, 0.0), -(0.28151261806488037, 0.0, 0.0), (0.28571429848670959, 0.0, 0.0), -(0.28991597890853882, 0.0, 0.0), (0.29411765933036804, 0.0, 0.0), -(0.29831933975219727, 0.0, 0.0), (0.30252102017402649, 0.0, 0.0), -(0.30672270059585571, 0.0, 0.0), (0.31092438101768494, 0.0, 0.0), -(0.31512606143951416, 0.0, 0.0), (0.31932774186134338, 0.0, 0.0), -(0.32352942228317261, 0.0, 0.0), (0.32773110270500183, 0.0, 0.0), -(0.33193278312683105, 0.0, 0.0), (0.33613446354866028, 0.0, 0.0), -(0.3403361439704895, 0.0, 0.0), (0.34453782439231873, 0.0, 0.0), -(0.34873950481414795, 0.0, 0.0), (0.35294118523597717, 0.0, 0.0), -(0.3571428656578064, 0.0, 0.0), (0.36134454607963562, 0.0, 0.0), -(0.36554622650146484, 0.0, 0.0), (0.36974790692329407, 0.0, 0.0), -(0.37394958734512329, 0.0, 0.0), (0.37815126776695251, 0.0, 0.0), -(0.38235294818878174, 0.0, 0.0), (0.38655462861061096, 0.0, 0.0), -(0.39075630903244019, 0.0, 0.0), (0.39495798945426941, 0.0, 0.0), -(0.39915966987609863, 0.0, 0.0), (0.40336135029792786, 0.0, 0.0), -(0.40756303071975708, 0.0039215688593685627, 0.0039215688593685627), -(0.4117647111415863, 0.047058824449777603, 0.047058824449777603), -(0.41596639156341553, 0.066666670143604279, 0.066666670143604279), -(0.42016807198524475, 0.090196080505847931, 0.090196080505847931), -(0.42436975240707397, 0.10980392247438431, 0.10980392247438431), -(0.4285714328289032, 0.12941177189350128, 0.12941177189350128), -(0.43277311325073242, 0.15294118225574493, 0.15294118225574493), -(0.43697479367256165, 0.17254902422428131, 0.17254902422428131), -(0.44117647409439087, 0.19215686619281769, 0.19215686619281769), -(0.44537815451622009, 0.21568627655506134, 0.21568627655506134), -(0.44957983493804932, 0.23529411852359772, 0.23529411852359772), -(0.45378151535987854, 0.25882354378700256, 0.25882354378700256), -(0.45798319578170776, 0.27843138575553894, 0.27843138575553894), -(0.46218487620353699, 0.29803922772407532, 0.29803922772407532), -(0.46638655662536621, 0.32156863808631897, 0.32156863808631897), -(0.47058823704719543, 0.34117648005485535, 0.34117648005485535), -(0.47478991746902466, 0.38431373238563538, 0.38431373238563538), -(0.47899159789085388, 0.40392157435417175, 0.40392157435417175), -(0.48319327831268311, 0.42745098471641541, 0.42745098471641541), -(0.48739495873451233, 0.44705882668495178, 0.44705882668495178), -(0.49159663915634155, 0.46666666865348816, 0.46666666865348816), -(0.49579831957817078, 0.49019607901573181, 0.49019607901573181), (0.5, -0.50980395078659058, 0.50980395078659058), (0.50420171022415161, -0.52941179275512695, 0.52941179275512695), (0.50840336084365845, -0.55294120311737061, 0.55294120311737061), (0.51260507106781006, -0.57254904508590698, 0.57254904508590698), (0.51680672168731689, -0.59607845544815063, 0.59607845544815063), (0.52100843191146851, -0.61568629741668701, 0.61568629741668701), (0.52521008253097534, -0.63529413938522339, 0.63529413938522339), (0.52941179275512695, -0.65882354974746704, 0.65882354974746704), (0.53361344337463379, -0.67843139171600342, 0.67843139171600342), (0.5378151535987854, -0.72156864404678345, 0.72156864404678345), (0.54201680421829224, -0.74117648601531982, 0.74117648601531982), (0.54621851444244385, -0.76470589637756348, 0.76470589637756348), (0.55042016506195068, -0.78431373834609985, 0.78431373834609985), (0.55462187528610229, -0.80392158031463623, 0.80392158031463623), (0.55882352590560913, -0.82745099067687988, 0.82745099067687988), (0.56302523612976074, -0.84705883264541626, 0.84705883264541626), (0.56722688674926758, -0.87058824300765991, 0.87058824300765991), (0.57142859697341919, -0.89019608497619629, 0.89019608497619629), (0.57563024759292603, -0.90980392694473267, 0.90980392694473267), (0.57983195781707764, -0.93333333730697632, 0.93333333730697632), (0.58403360843658447, -0.9529411792755127, 0.9529411792755127), (0.58823531866073608, -0.97254902124404907, 0.97254902124404907), (0.59243696928024292, -0.99607843160629272, 0.99607843160629272), (0.59663867950439453, 1.0, -1.0), (0.60084033012390137, 1.0, 1.0), (0.60504204034805298, 1.0, 1.0), -(0.60924369096755981, 1.0, 1.0), (0.61344540119171143, 1.0, 1.0), -(0.61764705181121826, 1.0, 1.0), (0.62184876203536987, 1.0, 1.0), -(0.62605041265487671, 1.0, 1.0), (0.63025212287902832, 1.0, 1.0), -(0.63445377349853516, 1.0, 1.0), (0.63865548372268677, 1.0, 1.0), -(0.6428571343421936, 1.0, 1.0), (0.64705884456634521, 1.0, 1.0), -(0.65126049518585205, 1.0, 1.0), (0.65546220541000366, 1.0, 1.0), -(0.6596638560295105, 1.0, 1.0), (0.66386556625366211, 1.0, 1.0), -(0.66806721687316895, 1.0, 1.0), (0.67226892709732056, 1.0, 1.0), -(0.67647057771682739, 1.0, 1.0), (0.680672287940979, 1.0, 1.0), -(0.68487393856048584, 1.0, 1.0), (0.68907564878463745, 1.0, 1.0), -(0.69327729940414429, 1.0, 1.0), (0.6974790096282959, 1.0, 1.0), -(0.70168066024780273, 1.0, 1.0), (0.70588237047195435, 1.0, 1.0), -(0.71008402109146118, 1.0, 1.0), (0.71428573131561279, 1.0, 1.0), -(0.71848738193511963, 1.0, 1.0), (0.72268909215927124, 1.0, 1.0), -(0.72689074277877808, 1.0, 1.0), (0.73109245300292969, 1.0, 1.0), -(0.73529410362243652, 1.0, 1.0), (0.73949581384658813, 1.0, 1.0), -(0.74369746446609497, 1.0, 1.0), (0.74789917469024658, 1.0, 1.0), -(0.75210082530975342, 1.0, 1.0), (0.75630253553390503, 1.0, 1.0), -(0.76050418615341187, 1.0, 1.0), (0.76470589637756348, 1.0, 1.0), -(0.76890754699707031, 1.0, 1.0), (0.77310925722122192, 1.0, 1.0), -(0.77731090784072876, 1.0, 1.0), (0.78151261806488037, 1.0, 1.0), -(0.78571426868438721, 1.0, 1.0), (0.78991597890853882, 1.0, 1.0), -(0.79411762952804565, 1.0, 1.0), (0.79831933975219727, 1.0, 1.0), -(0.8025209903717041, 1.0, 1.0), (0.80672270059585571, 1.0, 1.0), -(0.81092435121536255, 1.0, 1.0), (0.81512606143951416, 1.0, 1.0), -(0.819327712059021, 1.0, 1.0), (0.82352942228317261, 1.0, 1.0), -(0.82773107290267944, 1.0, 1.0), (0.83193278312683105, 1.0, 1.0), -(0.83613443374633789, 1.0, 1.0), (0.8403361439704895, 1.0, 1.0), -(0.84453779458999634, 1.0, 1.0), (0.84873950481414795, 1.0, 1.0), -(0.85294115543365479, 1.0, 1.0), (0.8571428656578064, 1.0, 1.0), -(0.86134451627731323, 1.0, 1.0), (0.86554622650146484, 1.0, 1.0), -(0.86974787712097168, 1.0, 1.0), (0.87394958734512329, 1.0, 1.0), -(0.87815123796463013, 1.0, 1.0), (0.88235294818878174, 1.0, 1.0), -(0.88655459880828857, 1.0, 1.0), (0.89075630903244019, 1.0, 1.0), -(0.89495795965194702, 1.0, 1.0), (0.89915966987609863, 1.0, 1.0), -(0.90336132049560547, 1.0, 1.0), (0.90756303071975708, 1.0, 1.0), -(0.91176468133926392, 1.0, 1.0), (0.91596639156341553, 1.0, 1.0), -(0.92016804218292236, 1.0, 1.0), (0.92436975240707397, 1.0, 1.0), -(0.92857140302658081, 1.0, 1.0), (0.93277311325073242, 1.0, 1.0), -(0.93697476387023926, 1.0, 1.0), (0.94117647409439087, 1.0, 1.0), -(0.94537812471389771, 1.0, 1.0), (0.94957983493804932, 1.0, 1.0), -(0.95378148555755615, 1.0, 1.0), (0.95798319578170776, 1.0, 1.0), -(0.9621848464012146, 1.0, 1.0), (0.96638655662536621, 0.99607843160629272, -0.99607843160629272), (0.97058820724487305, 0.97647058963775635, -0.97647058963775635), (0.97478991746902466, 0.9529411792755127, -0.9529411792755127), (0.97899156808853149, 0.91372549533843994, -0.91372549533843994), (0.98319327831268311, 0.89019608497619629, -0.89019608497619629), (0.98739492893218994, 0.87058824300765991, -0.87058824300765991), (0.99159663915634155, 0.85098040103912354, -0.85098040103912354), (0.99579828977584839, 0.82745099067687988, -0.82745099067687988), (1.0, 0.80784314870834351, 0.80784314870834351)], -'green': [(0.0, 0.0, 0.0), (0.0042016808874905109, 0.0, 0.0), -(0.0084033617749810219, 0.0, 0.0), (0.012605042196810246, 0.0, 0.0), -(0.016806723549962044, 0.0, 0.0), (0.021008403971791267, 0.0, 0.0), -(0.025210084393620491, 0.0, 0.0), (0.029411764815449715, 0.0, 0.0), -(0.033613447099924088, 0.019607843831181526, 0.019607843831181526), -(0.037815127521753311, 0.043137256056070328, 0.043137256056070328), -(0.042016807943582535, 0.062745101749897003, 0.062745101749897003), -(0.046218488365411758, 0.086274512112140656, 0.086274512112140656), -(0.050420168787240982, 0.10588235408067703, 0.10588235408067703), -(0.054621849209070206, 0.12549020349979401, 0.12549020349979401), -(0.058823529630899429, 0.14901961386203766, 0.14901961386203766), -(0.063025213778018951, 0.16862745583057404, 0.16862745583057404), -(0.067226894199848175, 0.18823529779911041, 0.18823529779911041), -(0.071428574621677399, 0.21176470816135406, 0.21176470816135406), -(0.075630255043506622, 0.23137255012989044, 0.23137255012989044), -(0.079831935465335846, 0.25490197539329529, 0.25490197539329529), -(0.08403361588716507, 0.27450981736183167, 0.27450981736183167), -(0.088235296308994293, 0.29411765933036804, 0.29411765933036804), -(0.092436976730823517, 0.31764706969261169, 0.31764706969261169), -(0.09663865715265274, 0.35686275362968445, 0.35686275362968445), -(0.10084033757448196, 0.3803921639919281, 0.3803921639919281), -(0.10504201799631119, 0.40000000596046448, 0.40000000596046448), -(0.10924369841814041, 0.42352941632270813, 0.42352941632270813), -(0.11344537883996964, 0.44313725829124451, 0.44313725829124451), -(0.11764705926179886, 0.46274510025978088, 0.46274510025978088), -(0.12184873968362808, 0.48627451062202454, 0.48627451062202454), -(0.1260504275560379, 0.5058823823928833, 0.5058823823928833), -(0.13025210797786713, 0.52941179275512695, 0.52941179275512695), -(0.13445378839969635, 0.54901963472366333, 0.54901963472366333), -(0.13865546882152557, 0.56862747669219971, 0.56862747669219971), -(0.1428571492433548, 0.59215688705444336, 0.59215688705444336), -(0.14705882966518402, 0.61176472902297974, 0.61176472902297974), -(0.15126051008701324, 0.63137257099151611, 0.63137257099151611), -(0.15546219050884247, 0.65490198135375977, 0.65490198135375977), -(0.15966387093067169, 0.69803923368453979, 0.69803923368453979), -(0.16386555135250092, 0.71764707565307617, 0.71764707565307617), -(0.16806723177433014, 0.73725491762161255, 0.73725491762161255), -(0.17226891219615936, 0.7607843279838562, 0.7607843279838562), -(0.17647059261798859, 0.78039216995239258, 0.78039216995239258), -(0.18067227303981781, 0.80000001192092896, 0.80000001192092896), -(0.18487395346164703, 0.82352942228317261, 0.82352942228317261), -(0.18907563388347626, 0.84313726425170898, 0.84313726425170898), -(0.19327731430530548, 0.86666667461395264, 0.86666667461395264), -(0.1974789947271347, 0.88627451658248901, 0.88627451658248901), -(0.20168067514896393, 0.90588235855102539, 0.90588235855102539), -(0.20588235557079315, 0.92941176891326904, 0.92941176891326904), -(0.21008403599262238, 0.94901961088180542, 0.94901961088180542), -(0.2142857164144516, 0.9686274528503418, 0.9686274528503418), -(0.21848739683628082, 0.99215686321258545, 0.99215686321258545), -(0.22268907725811005, 1.0, 1.0), (0.22689075767993927, 1.0, 1.0), -(0.23109243810176849, 1.0, 1.0), (0.23529411852359772, 1.0, 1.0), -(0.23949579894542694, 1.0, 1.0), (0.24369747936725616, 1.0, 1.0), -(0.24789915978908539, 1.0, 1.0), (0.25210085511207581, 1.0, 1.0), -(0.25630253553390503, 1.0, 1.0), (0.26050421595573425, 1.0, 1.0), -(0.26470589637756348, 1.0, 1.0), (0.2689075767993927, 1.0, 1.0), -(0.27310925722122192, 1.0, 1.0), (0.27731093764305115, 1.0, 1.0), -(0.28151261806488037, 1.0, 1.0), (0.28571429848670959, 1.0, 1.0), -(0.28991597890853882, 1.0, 1.0), (0.29411765933036804, 1.0, 1.0), -(0.29831933975219727, 1.0, 1.0), (0.30252102017402649, 1.0, 1.0), -(0.30672270059585571, 1.0, 1.0), (0.31092438101768494, 1.0, 1.0), -(0.31512606143951416, 1.0, 1.0), (0.31932774186134338, 1.0, 1.0), -(0.32352942228317261, 1.0, 1.0), (0.32773110270500183, 1.0, 1.0), -(0.33193278312683105, 1.0, 1.0), (0.33613446354866028, 1.0, 1.0), -(0.3403361439704895, 1.0, 1.0), (0.34453782439231873, 1.0, 1.0), -(0.34873950481414795, 1.0, 1.0), (0.35294118523597717, 1.0, 1.0), -(0.3571428656578064, 1.0, 1.0), (0.36134454607963562, 1.0, 1.0), -(0.36554622650146484, 1.0, 1.0), (0.36974790692329407, 1.0, 1.0), -(0.37394958734512329, 1.0, 1.0), (0.37815126776695251, 1.0, 1.0), -(0.38235294818878174, 1.0, 1.0), (0.38655462861061096, 1.0, 1.0), -(0.39075630903244019, 1.0, 1.0), (0.39495798945426941, 1.0, 1.0), -(0.39915966987609863, 1.0, 1.0), (0.40336135029792786, 1.0, 1.0), -(0.40756303071975708, 1.0, 1.0), (0.4117647111415863, 1.0, 1.0), -(0.41596639156341553, 1.0, 1.0), (0.42016807198524475, 1.0, 1.0), -(0.42436975240707397, 1.0, 1.0), (0.4285714328289032, 1.0, 1.0), -(0.43277311325073242, 1.0, 1.0), (0.43697479367256165, 1.0, 1.0), -(0.44117647409439087, 1.0, 1.0), (0.44537815451622009, 1.0, 1.0), -(0.44957983493804932, 1.0, 1.0), (0.45378151535987854, 1.0, 1.0), -(0.45798319578170776, 1.0, 1.0), (0.46218487620353699, 1.0, 1.0), -(0.46638655662536621, 1.0, 1.0), (0.47058823704719543, 1.0, 1.0), -(0.47478991746902466, 1.0, 1.0), (0.47899159789085388, 1.0, 1.0), -(0.48319327831268311, 1.0, 1.0), (0.48739495873451233, 1.0, 1.0), -(0.49159663915634155, 1.0, 1.0), (0.49579831957817078, 1.0, 1.0), (0.5, -1.0, 1.0), (0.50420171022415161, 1.0, 1.0), (0.50840336084365845, 1.0, -1.0), (0.51260507106781006, 1.0, 1.0), (0.51680672168731689, 1.0, 1.0), -(0.52100843191146851, 1.0, 1.0), (0.52521008253097534, 1.0, 1.0), -(0.52941179275512695, 1.0, 1.0), (0.53361344337463379, 1.0, 1.0), -(0.5378151535987854, 1.0, 1.0), (0.54201680421829224, 1.0, 1.0), -(0.54621851444244385, 1.0, 1.0), (0.55042016506195068, 1.0, 1.0), -(0.55462187528610229, 1.0, 1.0), (0.55882352590560913, 1.0, 1.0), -(0.56302523612976074, 1.0, 1.0), (0.56722688674926758, 1.0, 1.0), -(0.57142859697341919, 1.0, 1.0), (0.57563024759292603, 1.0, 1.0), -(0.57983195781707764, 1.0, 1.0), (0.58403360843658447, 1.0, 1.0), -(0.58823531866073608, 1.0, 1.0), (0.59243696928024292, 1.0, 1.0), -(0.59663867950439453, 0.98039215803146362, 0.98039215803146362), -(0.60084033012390137, 0.93725490570068359, 0.93725490570068359), -(0.60504204034805298, 0.91764706373214722, 0.91764706373214722), -(0.60924369096755981, 0.89411765336990356, 0.89411765336990356), -(0.61344540119171143, 0.87450981140136719, 0.87450981140136719), -(0.61764705181121826, 0.85490196943283081, 0.85490196943283081), -(0.62184876203536987, 0.83137255907058716, 0.83137255907058716), -(0.62605041265487671, 0.81176471710205078, 0.81176471710205078), -(0.63025212287902832, 0.78823530673980713, 0.78823530673980713), -(0.63445377349853516, 0.76862746477127075, 0.76862746477127075), -(0.63865548372268677, 0.74901962280273438, 0.74901962280273438), -(0.6428571343421936, 0.72549021244049072, 0.72549021244049072), -(0.64705884456634521, 0.70588237047195435, 0.70588237047195435), -(0.65126049518585205, 0.68235296010971069, 0.68235296010971069), -(0.65546220541000366, 0.66274511814117432, 0.66274511814117432), -(0.6596638560295105, 0.64313727617263794, 0.64313727617263794), -(0.66386556625366211, 0.60000002384185791, 0.60000002384185791), -(0.66806721687316895, 0.58039218187332153, 0.58039218187332153), -(0.67226892709732056, 0.55686277151107788, 0.55686277151107788), -(0.67647057771682739, 0.5372549295425415, 0.5372549295425415), -(0.680672287940979, 0.51372551918029785, 0.51372551918029785), -(0.68487393856048584, 0.49411764740943909, 0.49411764740943909), -(0.68907564878463745, 0.47450980544090271, 0.47450980544090271), -(0.69327729940414429, 0.45098039507865906, 0.45098039507865906), -(0.6974790096282959, 0.43137255311012268, 0.43137255311012268), -(0.70168066024780273, 0.4117647111415863, 0.4117647111415863), -(0.70588237047195435, 0.38823530077934265, 0.38823530077934265), -(0.71008402109146118, 0.36862745881080627, 0.36862745881080627), -(0.71428573131561279, 0.34509804844856262, 0.34509804844856262), -(0.71848738193511963, 0.32549020648002625, 0.32549020648002625), -(0.72268909215927124, 0.30588236451148987, 0.30588236451148987), -(0.72689074277877808, 0.26274511218070984, 0.26274511218070984), -(0.73109245300292969, 0.24313725531101227, 0.24313725531101227), -(0.73529410362243652, 0.21960784494876862, 0.21960784494876862), -(0.73949581384658813, 0.20000000298023224, 0.20000000298023224), -(0.74369746446609497, 0.17647059261798859, 0.17647059261798859), -(0.74789917469024658, 0.15686275064945221, 0.15686275064945221), -(0.75210082530975342, 0.13725490868091583, 0.13725490868091583), -(0.75630253553390503, 0.11372549086809158, 0.11372549086809158), -(0.76050418615341187, 0.094117648899555206, 0.094117648899555206), -(0.76470589637756348, 0.070588238537311554, 0.070588238537311554), -(0.76890754699707031, 0.050980392843484879, 0.050980392843484879), -(0.77310925722122192, 0.031372550874948502, 0.031372550874948502), -(0.77731090784072876, 0.0078431377187371254, 0.0078431377187371254), -(0.78151261806488037, 0.0, 0.0), (0.78571426868438721, 0.0, 0.0), -(0.78991597890853882, 0.0, 0.0), (0.79411762952804565, 0.0, 0.0), -(0.79831933975219727, 0.0, 0.0), (0.8025209903717041, 0.0, 0.0), -(0.80672270059585571, 0.0, 0.0), (0.81092435121536255, 0.0, 0.0), -(0.81512606143951416, 0.0, 0.0), (0.819327712059021, 0.0, 0.0), -(0.82352942228317261, 0.0, 0.0), (0.82773107290267944, 0.0, 0.0), -(0.83193278312683105, 0.0, 0.0), (0.83613443374633789, 0.0, 0.0), -(0.8403361439704895, 0.0, 0.0), (0.84453779458999634, 0.0, 0.0), -(0.84873950481414795, 0.0, 0.0), (0.85294115543365479, 0.0, 0.0), -(0.8571428656578064, 0.0, 0.0), (0.86134451627731323, 0.0, 0.0), -(0.86554622650146484, 0.0, 0.0), (0.86974787712097168, 0.0, 0.0), -(0.87394958734512329, 0.0, 0.0), (0.87815123796463013, 0.0, 0.0), -(0.88235294818878174, 0.0, 0.0), (0.88655459880828857, 0.0, 0.0), -(0.89075630903244019, 0.0, 0.0), (0.89495795965194702, 0.0, 0.0), -(0.89915966987609863, 0.0, 0.0), (0.90336132049560547, 0.0, 0.0), -(0.90756303071975708, 0.0, 0.0), (0.91176468133926392, 0.0, 0.0), -(0.91596639156341553, 0.0, 0.0), (0.92016804218292236, 0.0, 0.0), -(0.92436975240707397, 0.0, 0.0), (0.92857140302658081, 0.0, 0.0), -(0.93277311325073242, 0.0, 0.0), (0.93697476387023926, 0.0, 0.0), -(0.94117647409439087, 0.0, 0.0), (0.94537812471389771, 0.0, 0.0), -(0.94957983493804932, 0.0, 0.0), (0.95378148555755615, 0.0, 0.0), -(0.95798319578170776, 0.0, 0.0), (0.9621848464012146, 0.0, 0.0), -(0.96638655662536621, 0.0, 0.0), (0.97058820724487305, 0.0, 0.0), -(0.97478991746902466, 0.0, 0.0), (0.97899156808853149, 0.0, 0.0), -(0.98319327831268311, 0.0, 0.0), (0.98739492893218994, 0.0, 0.0), -(0.99159663915634155, 0.0, 0.0), (0.99579828977584839, 0.0, 0.0), (1.0, -0.0, 0.0)], 'red': [(0.0, 1.0, 1.0), (0.0042016808874905109, 1.0, 1.0), -(0.0084033617749810219, 1.0, 1.0), (0.012605042196810246, 1.0, 1.0), -(0.016806723549962044, 1.0, 1.0), (0.021008403971791267, 1.0, 1.0), -(0.025210084393620491, 1.0, 1.0), (0.029411764815449715, 1.0, 1.0), -(0.033613447099924088, 1.0, 1.0), (0.037815127521753311, 1.0, 1.0), -(0.042016807943582535, 1.0, 1.0), (0.046218488365411758, 1.0, 1.0), -(0.050420168787240982, 1.0, 1.0), (0.054621849209070206, 1.0, 1.0), -(0.058823529630899429, 1.0, 1.0), (0.063025213778018951, 1.0, 1.0), -(0.067226894199848175, 1.0, 1.0), (0.071428574621677399, 1.0, 1.0), -(0.075630255043506622, 1.0, 1.0), (0.079831935465335846, 1.0, 1.0), -(0.08403361588716507, 1.0, 1.0), (0.088235296308994293, 1.0, 1.0), -(0.092436976730823517, 1.0, 1.0), (0.09663865715265274, 1.0, 1.0), -(0.10084033757448196, 1.0, 1.0), (0.10504201799631119, 1.0, 1.0), -(0.10924369841814041, 1.0, 1.0), (0.11344537883996964, 1.0, 1.0), -(0.11764705926179886, 1.0, 1.0), (0.12184873968362808, 1.0, 1.0), -(0.1260504275560379, 1.0, 1.0), (0.13025210797786713, 1.0, 1.0), -(0.13445378839969635, 1.0, 1.0), (0.13865546882152557, 1.0, 1.0), -(0.1428571492433548, 1.0, 1.0), (0.14705882966518402, 1.0, 1.0), -(0.15126051008701324, 1.0, 1.0), (0.15546219050884247, 1.0, 1.0), -(0.15966387093067169, 1.0, 1.0), (0.16386555135250092, 1.0, 1.0), -(0.16806723177433014, 1.0, 1.0), (0.17226891219615936, 1.0, 1.0), -(0.17647059261798859, 1.0, 1.0), (0.18067227303981781, 1.0, 1.0), -(0.18487395346164703, 1.0, 1.0), (0.18907563388347626, 1.0, 1.0), -(0.19327731430530548, 1.0, 1.0), (0.1974789947271347, 1.0, 1.0), -(0.20168067514896393, 1.0, 1.0), (0.20588235557079315, 1.0, 1.0), -(0.21008403599262238, 1.0, 1.0), (0.2142857164144516, 1.0, 1.0), -(0.21848739683628082, 1.0, 1.0), (0.22268907725811005, -0.96078431606292725, 0.96078431606292725), (0.22689075767993927, -0.94117647409439087, 0.94117647409439087), (0.23109243810176849, -0.92156863212585449, 0.92156863212585449), (0.23529411852359772, -0.89803922176361084, 0.89803922176361084), (0.23949579894542694, -0.87843137979507446, 0.87843137979507446), (0.24369747936725616, -0.85882353782653809, 0.85882353782653809), (0.24789915978908539, -0.83529412746429443, 0.83529412746429443), (0.25210085511207581, -0.81568628549575806, 0.81568628549575806), (0.25630253553390503, -0.7921568751335144, 0.7921568751335144), (0.26050421595573425, -0.77254903316497803, 0.77254903316497803), (0.26470589637756348, -0.75294119119644165, 0.75294119119644165), (0.2689075767993927, -0.729411780834198, 0.729411780834198), (0.27310925722122192, -0.70980393886566162, 0.70980393886566162), (0.27731093764305115, -0.68627452850341797, 0.68627452850341797), (0.28151261806488037, -0.66666668653488159, 0.66666668653488159), (0.28571429848670959, -0.62352943420410156, 0.62352943420410156), (0.28991597890853882, -0.60392159223556519, 0.60392159223556519), (0.29411765933036804, -0.58431375026702881, 0.58431375026702881), (0.29831933975219727, -0.56078433990478516, 0.56078433990478516), (0.30252102017402649, -0.54117649793624878, 0.54117649793624878), (0.30672270059585571, -0.51764708757400513, 0.51764708757400513), (0.31092438101768494, -0.49803921580314636, 0.49803921580314636), (0.31512606143951416, -0.47843137383460999, 0.47843137383460999), (0.31932774186134338, -0.45490196347236633, 0.45490196347236633), (0.32352942228317261, -0.43529412150382996, 0.43529412150382996), (0.32773110270500183, -0.41568627953529358, 0.41568627953529358), (0.33193278312683105, -0.39215686917304993, 0.39215686917304993), (0.33613446354866028, -0.37254902720451355, 0.37254902720451355), (0.3403361439704895, -0.3490196168422699, 0.3490196168422699), (0.34453782439231873, -0.32941177487373352, 0.32941177487373352), (0.34873950481414795, -0.28627452254295349, 0.28627452254295349), (0.35294118523597717, -0.26666668057441711, 0.26666668057441711), (0.3571428656578064, -0.24705882370471954, 0.24705882370471954), (0.36134454607963562, -0.22352941334247589, 0.22352941334247589), (0.36554622650146484, -0.20392157137393951, 0.20392157137393951), (0.36974790692329407, -0.18039216101169586, 0.18039216101169586), (0.37394958734512329, -0.16078431904315948, 0.16078431904315948), (0.37815126776695251, -0.14117647707462311, 0.14117647707462311), (0.38235294818878174, -0.11764705926179886, 0.11764705926179886), (0.38655462861061096, -0.098039217293262482, 0.098039217293262482), (0.39075630903244019, -0.074509806931018829, 0.074509806931018829), (0.39495798945426941, -0.054901961237192154, 0.054901961237192154), (0.39915966987609863, -0.035294119268655777, 0.035294119268655777), (0.40336135029792786, -0.011764706112444401, 0.011764706112444401), (0.40756303071975708, 0.0, -0.0), (0.4117647111415863, 0.0, 0.0), (0.41596639156341553, 0.0, 0.0), -(0.42016807198524475, 0.0, 0.0), (0.42436975240707397, 0.0, 0.0), -(0.4285714328289032, 0.0, 0.0), (0.43277311325073242, 0.0, 0.0), -(0.43697479367256165, 0.0, 0.0), (0.44117647409439087, 0.0, 0.0), -(0.44537815451622009, 0.0, 0.0), (0.44957983493804932, 0.0, 0.0), -(0.45378151535987854, 0.0, 0.0), (0.45798319578170776, 0.0, 0.0), -(0.46218487620353699, 0.0, 0.0), (0.46638655662536621, 0.0, 0.0), -(0.47058823704719543, 0.0, 0.0), (0.47478991746902466, 0.0, 0.0), -(0.47899159789085388, 0.0, 0.0), (0.48319327831268311, 0.0, 0.0), -(0.48739495873451233, 0.0, 0.0), (0.49159663915634155, 0.0, 0.0), -(0.49579831957817078, 0.0, 0.0), (0.5, 0.0, 0.0), (0.50420171022415161, -0.0, 0.0), (0.50840336084365845, 0.0, 0.0), (0.51260507106781006, 0.0, -0.0), (0.51680672168731689, 0.0, 0.0), (0.52100843191146851, 0.0, 0.0), -(0.52521008253097534, 0.0, 0.0), (0.52941179275512695, 0.0, 0.0), -(0.53361344337463379, 0.0, 0.0), (0.5378151535987854, 0.0, 0.0), -(0.54201680421829224, 0.0, 0.0), (0.54621851444244385, 0.0, 0.0), -(0.55042016506195068, 0.0, 0.0), (0.55462187528610229, 0.0, 0.0), -(0.55882352590560913, 0.0, 0.0), (0.56302523612976074, 0.0, 0.0), -(0.56722688674926758, 0.0, 0.0), (0.57142859697341919, 0.0, 0.0), -(0.57563024759292603, 0.0, 0.0), (0.57983195781707764, 0.0, 0.0), -(0.58403360843658447, 0.0, 0.0), (0.58823531866073608, 0.0, 0.0), -(0.59243696928024292, 0.0, 0.0), (0.59663867950439453, 0.0, 0.0), -(0.60084033012390137, 0.0, 0.0), (0.60504204034805298, 0.0, 0.0), -(0.60924369096755981, 0.0, 0.0), (0.61344540119171143, 0.0, 0.0), -(0.61764705181121826, 0.0, 0.0), (0.62184876203536987, 0.0, 0.0), -(0.62605041265487671, 0.0, 0.0), (0.63025212287902832, 0.0, 0.0), -(0.63445377349853516, 0.0, 0.0), (0.63865548372268677, 0.0, 0.0), -(0.6428571343421936, 0.0, 0.0), (0.64705884456634521, 0.0, 0.0), -(0.65126049518585205, 0.0, 0.0), (0.65546220541000366, 0.0, 0.0), -(0.6596638560295105, 0.0, 0.0), (0.66386556625366211, 0.0, 0.0), -(0.66806721687316895, 0.0, 0.0), (0.67226892709732056, 0.0, 0.0), -(0.67647057771682739, 0.0, 0.0), (0.680672287940979, 0.0, 0.0), -(0.68487393856048584, 0.0, 0.0), (0.68907564878463745, 0.0, 0.0), -(0.69327729940414429, 0.0, 0.0), (0.6974790096282959, 0.0, 0.0), -(0.70168066024780273, 0.0, 0.0), (0.70588237047195435, 0.0, 0.0), -(0.71008402109146118, 0.0, 0.0), (0.71428573131561279, 0.0, 0.0), -(0.71848738193511963, 0.0, 0.0), (0.72268909215927124, 0.0, 0.0), -(0.72689074277877808, 0.0, 0.0), (0.73109245300292969, 0.0, 0.0), -(0.73529410362243652, 0.0, 0.0), (0.73949581384658813, 0.0, 0.0), -(0.74369746446609497, 0.0, 0.0), (0.74789917469024658, 0.0, 0.0), -(0.75210082530975342, 0.0, 0.0), (0.75630253553390503, 0.0, 0.0), -(0.76050418615341187, 0.0, 0.0), (0.76470589637756348, 0.0, 0.0), -(0.76890754699707031, 0.0, 0.0), (0.77310925722122192, 0.0, 0.0), -(0.77731090784072876, 0.0, 0.0), (0.78151261806488037, -0.0078431377187371254, 0.0078431377187371254), (0.78571426868438721, -0.027450980618596077, 0.027450980618596077), (0.78991597890853882, -0.070588238537311554, 0.070588238537311554), (0.79411762952804565, -0.094117648899555206, 0.094117648899555206), (0.79831933975219727, -0.11372549086809158, 0.11372549086809158), (0.8025209903717041, -0.13333334028720856, 0.13333334028720856), (0.80672270059585571, -0.15686275064945221, 0.15686275064945221), (0.81092435121536255, -0.17647059261798859, 0.17647059261798859), (0.81512606143951416, -0.19607843458652496, 0.19607843458652496), (0.819327712059021, -0.21960784494876862, 0.21960784494876862), (0.82352942228317261, -0.23921568691730499, 0.23921568691730499), (0.82773107290267944, -0.26274511218070984, 0.26274511218070984), (0.83193278312683105, -0.28235295414924622, 0.28235295414924622), (0.83613443374633789, -0.30196079611778259, 0.30196079611778259), (0.8403361439704895, -0.32549020648002625, 0.32549020648002625), (0.84453779458999634, -0.34509804844856262, 0.34509804844856262), (0.84873950481414795, -0.364705890417099, 0.364705890417099), (0.85294115543365479, -0.40784314274787903, 0.40784314274787903), (0.8571428656578064, -0.43137255311012268, 0.43137255311012268), (0.86134451627731323, -0.45098039507865906, 0.45098039507865906), (0.86554622650146484, -0.47058823704719543, 0.47058823704719543), (0.86974787712097168, -0.49411764740943909, 0.49411764740943909), (0.87394958734512329, -0.51372551918029785, 0.51372551918029785), (0.87815123796463013, -0.53333336114883423, 0.53333336114883423), (0.88235294818878174, -0.55686277151107788, 0.55686277151107788), (0.88655459880828857, -0.57647061347961426, 0.57647061347961426), (0.89075630903244019, -0.60000002384185791, 0.60000002384185791), (0.89495795965194702, -0.61960786581039429, 0.61960786581039429), (0.89915966987609863, -0.63921570777893066, 0.63921570777893066), (0.90336132049560547, -0.66274511814117432, 0.66274511814117432), (0.90756303071975708, -0.68235296010971069, 0.68235296010971069), (0.91176468133926392, -0.70588237047195435, 0.70588237047195435), (0.91596639156341553, -0.7450980544090271, 0.7450980544090271), (0.92016804218292236, -0.76862746477127075, 0.76862746477127075), (0.92436975240707397, -0.78823530673980713, 0.78823530673980713), (0.92857140302658081, -0.80784314870834351, 0.80784314870834351), (0.93277311325073242, -0.83137255907058716, 0.83137255907058716), (0.93697476387023926, -0.85098040103912354, 0.85098040103912354), (0.94117647409439087, -0.87450981140136719, 0.87450981140136719), (0.94537812471389771, -0.89411765336990356, 0.89411765336990356), (0.94957983493804932, -0.91372549533843994, 0.91372549533843994), (0.95378148555755615, -0.93725490570068359, 0.93725490570068359), (0.95798319578170776, -0.95686274766921997, 0.95686274766921997), (0.9621848464012146, -0.97647058963775635, 0.97647058963775635), (0.96638655662536621, 1.0, -1.0), (0.97058820724487305, 1.0, 1.0), (0.97478991746902466, 1.0, 1.0), -(0.97899156808853149, 1.0, 1.0), (0.98319327831268311, 1.0, 1.0), -(0.98739492893218994, 1.0, 1.0), (0.99159663915634155, 1.0, 1.0), -(0.99579828977584839, 1.0, 1.0), (1.0, 1.0, 1.0)]} -_gist_stern_data = {'blue': [(0.0, 0.0, 0.0), -(0.0042016808874905109, 0.0039215688593685627, -0.0039215688593685627), (0.0084033617749810219, 0.011764706112444401, -0.011764706112444401), (0.012605042196810246, 0.019607843831181526, -0.019607843831181526), (0.016806723549962044, 0.027450980618596077, -0.027450980618596077), (0.021008403971791267, 0.035294119268655777, -0.035294119268655777), (0.025210084393620491, 0.043137256056070328, -0.043137256056070328), (0.029411764815449715, 0.050980392843484879, -0.050980392843484879), (0.033613447099924088, 0.058823529630899429, -0.058823529630899429), (0.037815127521753311, 0.066666670143604279, -0.066666670143604279), (0.042016807943582535, 0.08235294371843338, -0.08235294371843338), (0.046218488365411758, 0.090196080505847931, -0.090196080505847931), (0.050420168787240982, 0.098039217293262482, -0.098039217293262482), (0.054621849209070206, 0.10588235408067703, -0.10588235408067703), (0.058823529630899429, 0.11372549086809158, -0.11372549086809158), (0.063025213778018951, 0.12156862765550613, -0.12156862765550613), (0.067226894199848175, 0.12941177189350128, -0.12941177189350128), (0.071428574621677399, 0.13725490868091583, -0.13725490868091583), (0.075630255043506622, 0.14509804546833038, -0.14509804546833038), (0.079831935465335846, 0.15294118225574493, -0.15294118225574493), (0.08403361588716507, 0.16078431904315948, -0.16078431904315948), (0.088235296308994293, 0.16862745583057404, -0.16862745583057404), (0.092436976730823517, 0.17647059261798859, -0.17647059261798859), (0.09663865715265274, 0.18431372940540314, -0.18431372940540314), (0.10084033757448196, 0.19215686619281769, -0.19215686619281769), (0.10504201799631119, 0.20000000298023224, -0.20000000298023224), (0.10924369841814041, 0.20784313976764679, -0.20784313976764679), (0.11344537883996964, 0.21568627655506134, -0.21568627655506134), (0.11764705926179886, 0.22352941334247589, -0.22352941334247589), (0.12184873968362808, 0.23137255012989044, -0.23137255012989044), (0.1260504275560379, 0.24705882370471954, -0.24705882370471954), (0.13025210797786713, 0.25490197539329529, -0.25490197539329529), (0.13445378839969635, 0.26274511218070984, -0.26274511218070984), (0.13865546882152557, 0.27058824896812439, -0.27058824896812439), (0.1428571492433548, 0.27843138575553894, -0.27843138575553894), (0.14705882966518402, 0.28627452254295349, -0.28627452254295349), (0.15126051008701324, 0.29411765933036804, -0.29411765933036804), (0.15546219050884247, 0.30196079611778259, -0.30196079611778259), (0.15966387093067169, 0.30980393290519714, -0.30980393290519714), (0.16386555135250092, 0.31764706969261169, -0.31764706969261169), (0.16806723177433014, 0.32549020648002625, -0.32549020648002625), (0.17226891219615936, 0.3333333432674408, -0.3333333432674408), (0.17647059261798859, 0.34117648005485535, -0.34117648005485535), (0.18067227303981781, 0.3490196168422699, -0.3490196168422699), (0.18487395346164703, 0.35686275362968445, -0.35686275362968445), (0.18907563388347626, 0.364705890417099, -0.364705890417099), (0.19327731430530548, 0.37254902720451355, -0.37254902720451355), (0.1974789947271347, 0.3803921639919281, -0.3803921639919281), (0.20168067514896393, 0.38823530077934265, -0.38823530077934265), (0.20588235557079315, 0.3960784375667572, -0.3960784375667572), (0.21008403599262238, 0.4117647111415863, -0.4117647111415863), (0.2142857164144516, 0.41960784792900085, -0.41960784792900085), (0.21848739683628082, 0.42745098471641541, -0.42745098471641541), (0.22268907725811005, 0.43529412150382996, -0.43529412150382996), (0.22689075767993927, 0.44313725829124451, -0.44313725829124451), (0.23109243810176849, 0.45098039507865906, -0.45098039507865906), (0.23529411852359772, 0.45882353186607361, -0.45882353186607361), (0.23949579894542694, 0.46666666865348816, -0.46666666865348816), (0.24369747936725616, 0.47450980544090271, -0.47450980544090271), (0.24789915978908539, 0.48235294222831726, -0.48235294222831726), (0.25210085511207581, 0.49803921580314636, -0.49803921580314636), (0.25630253553390503, 0.5058823823928833, -0.5058823823928833), (0.26050421595573425, 0.51372551918029785, -0.51372551918029785), (0.26470589637756348, 0.5215686559677124, -0.5215686559677124), (0.2689075767993927, 0.52941179275512695, -0.52941179275512695), (0.27310925722122192, 0.5372549295425415, -0.5372549295425415), (0.27731093764305115, 0.54509806632995605, -0.54509806632995605), (0.28151261806488037, 0.55294120311737061, -0.55294120311737061), (0.28571429848670959, 0.56078433990478516, -0.56078433990478516), (0.28991597890853882, 0.56862747669219971, -0.56862747669219971), (0.29411765933036804, 0.58431375026702881, -0.58431375026702881), (0.29831933975219727, 0.59215688705444336, -0.59215688705444336), (0.30252102017402649, 0.60000002384185791, -0.60000002384185791), (0.30672270059585571, 0.60784316062927246, -0.60784316062927246), (0.31092438101768494, 0.61568629741668701, -0.61568629741668701), (0.31512606143951416, 0.62352943420410156, -0.62352943420410156), (0.31932774186134338, 0.63137257099151611, -0.63137257099151611), (0.32352942228317261, 0.63921570777893066, -0.63921570777893066), (0.32773110270500183, 0.64705884456634521, -0.64705884456634521), (0.33193278312683105, 0.65490198135375977, -0.65490198135375977), (0.33613446354866028, 0.66274511814117432, -0.66274511814117432), (0.3403361439704895, 0.67058825492858887, -0.67058825492858887), (0.34453782439231873, 0.67843139171600342, -0.67843139171600342), (0.34873950481414795, 0.68627452850341797, -0.68627452850341797), (0.35294118523597717, 0.69411766529083252, -0.69411766529083252), (0.3571428656578064, 0.70196080207824707, -0.70196080207824707), (0.36134454607963562, 0.70980393886566162, -0.70980393886566162), (0.36554622650146484, 0.71764707565307617, -0.71764707565307617), (0.36974790692329407, 0.72549021244049072, -0.72549021244049072), (0.37394958734512329, 0.73333334922790527, -0.73333334922790527), (0.37815126776695251, 0.74901962280273438, -0.74901962280273438), (0.38235294818878174, 0.75686275959014893, -0.75686275959014893), (0.38655462861061096, 0.76470589637756348, -0.76470589637756348), (0.39075630903244019, 0.77254903316497803, -0.77254903316497803), (0.39495798945426941, 0.78039216995239258, -0.78039216995239258), (0.39915966987609863, 0.78823530673980713, -0.78823530673980713), (0.40336135029792786, 0.79607844352722168, -0.79607844352722168), (0.40756303071975708, 0.80392158031463623, -0.80392158031463623), (0.4117647111415863, 0.81176471710205078, -0.81176471710205078), (0.41596639156341553, 0.81960785388946533, -0.81960785388946533), (0.42016807198524475, 0.82745099067687988, -0.82745099067687988), (0.42436975240707397, 0.83529412746429443, -0.83529412746429443), (0.4285714328289032, 0.84313726425170898, -0.84313726425170898), (0.43277311325073242, 0.85098040103912354, -0.85098040103912354), (0.43697479367256165, 0.85882353782653809, -0.85882353782653809), (0.44117647409439087, 0.86666667461395264, -0.86666667461395264), (0.44537815451622009, 0.87450981140136719, -0.87450981140136719), (0.44957983493804932, 0.88235294818878174, -0.88235294818878174), (0.45378151535987854, 0.89019608497619629, -0.89019608497619629), (0.45798319578170776, 0.89803922176361084, -0.89803922176361084), (0.46218487620353699, 0.91372549533843994, -0.91372549533843994), (0.46638655662536621, 0.92156863212585449, -0.92156863212585449), (0.47058823704719543, 0.92941176891326904, -0.92941176891326904), (0.47478991746902466, 0.93725490570068359, -0.93725490570068359), (0.47899159789085388, 0.94509804248809814, -0.94509804248809814), (0.48319327831268311, 0.9529411792755127, -0.9529411792755127), (0.48739495873451233, 0.96078431606292725, -0.96078431606292725), (0.49159663915634155, 0.9686274528503418, -0.9686274528503418), (0.49579831957817078, 0.97647058963775635, -0.97647058963775635), (0.5, 0.9843137264251709, 0.9843137264251709), -(0.50420171022415161, 1.0, 1.0), (0.50840336084365845, 0.9843137264251709, -0.9843137264251709), (0.51260507106781006, 0.9686274528503418, -0.9686274528503418), (0.51680672168731689, 0.9529411792755127, -0.9529411792755127), (0.52100843191146851, 0.93333333730697632, -0.93333333730697632), (0.52521008253097534, 0.91764706373214722, -0.91764706373214722), (0.52941179275512695, 0.90196079015731812, -0.90196079015731812), (0.53361344337463379, 0.88627451658248901, -0.88627451658248901), (0.5378151535987854, 0.86666667461395264, -0.86666667461395264), (0.54201680421829224, 0.85098040103912354, -0.85098040103912354), (0.54621851444244385, 0.81960785388946533, -0.81960785388946533), (0.55042016506195068, 0.80000001192092896, -0.80000001192092896), (0.55462187528610229, 0.78431373834609985, -0.78431373834609985), (0.55882352590560913, 0.76862746477127075, -0.76862746477127075), (0.56302523612976074, 0.75294119119644165, -0.75294119119644165), (0.56722688674926758, 0.73333334922790527, -0.73333334922790527), (0.57142859697341919, 0.71764707565307617, -0.71764707565307617), (0.57563024759292603, 0.70196080207824707, -0.70196080207824707), (0.57983195781707764, 0.68627452850341797, -0.68627452850341797), (0.58403360843658447, 0.66666668653488159, -0.66666668653488159), (0.58823531866073608, 0.65098041296005249, -0.65098041296005249), (0.59243696928024292, 0.63529413938522339, -0.63529413938522339), (0.59663867950439453, 0.61960786581039429, -0.61960786581039429), (0.60084033012390137, 0.60000002384185791, -0.60000002384185791), (0.60504204034805298, 0.58431375026702881, -0.58431375026702881), (0.60924369096755981, 0.56862747669219971, -0.56862747669219971), (0.61344540119171143, 0.55294120311737061, -0.55294120311737061), (0.61764705181121826, 0.53333336114883423, -0.53333336114883423), (0.62184876203536987, 0.51764708757400513, -0.51764708757400513), (0.62605041265487671, 0.50196081399917603, -0.50196081399917603), (0.63025212287902832, 0.46666666865348816, -0.46666666865348816), (0.63445377349853516, 0.45098039507865906, -0.45098039507865906), (0.63865548372268677, 0.43529412150382996, -0.43529412150382996), (0.6428571343421936, 0.41960784792900085, -0.41960784792900085), (0.64705884456634521, 0.40000000596046448, -0.40000000596046448), (0.65126049518585205, 0.38431373238563538, -0.38431373238563538), (0.65546220541000366, 0.36862745881080627, -0.36862745881080627), (0.6596638560295105, 0.35294118523597717, -0.35294118523597717), (0.66386556625366211, 0.3333333432674408, -0.3333333432674408), (0.66806721687316895, 0.31764706969261169, -0.31764706969261169), (0.67226892709732056, 0.30196079611778259, -0.30196079611778259), (0.67647057771682739, 0.28627452254295349, -0.28627452254295349), (0.680672287940979, 0.26666668057441711, -0.26666668057441711), (0.68487393856048584, 0.25098040699958801, -0.25098040699958801), (0.68907564878463745, 0.23529411852359772, -0.23529411852359772), (0.69327729940414429, 0.21960784494876862, -0.21960784494876862), (0.6974790096282959, 0.20000000298023224, -0.20000000298023224), (0.70168066024780273, 0.18431372940540314, -0.18431372940540314), (0.70588237047195435, 0.16862745583057404, -0.16862745583057404), (0.71008402109146118, 0.15294118225574493, -0.15294118225574493), (0.71428573131561279, 0.11764705926179886, -0.11764705926179886), (0.71848738193511963, 0.10196078568696976, -0.10196078568696976), (0.72268909215927124, 0.086274512112140656, -0.086274512112140656), (0.72689074277877808, 0.066666670143604279, -0.066666670143604279), (0.73109245300292969, 0.050980392843484879, -0.050980392843484879), (0.73529410362243652, 0.035294119268655777, -0.035294119268655777), (0.73949581384658813, 0.019607843831181526, -0.019607843831181526), (0.74369746446609497, 0.0, 0.0), -(0.74789917469024658, 0.011764706112444401, 0.011764706112444401), -(0.75210082530975342, 0.027450980618596077, 0.027450980618596077), -(0.75630253553390503, 0.058823529630899429, 0.058823529630899429), -(0.76050418615341187, 0.074509806931018829, 0.074509806931018829), -(0.76470589637756348, 0.086274512112140656, 0.086274512112140656), -(0.76890754699707031, 0.10196078568696976, 0.10196078568696976), -(0.77310925722122192, 0.11764705926179886, 0.11764705926179886), -(0.77731090784072876, 0.13333334028720856, 0.13333334028720856), -(0.78151261806488037, 0.14901961386203766, 0.14901961386203766), -(0.78571426868438721, 0.16078431904315948, 0.16078431904315948), -(0.78991597890853882, 0.17647059261798859, 0.17647059261798859), -(0.79411762952804565, 0.19215686619281769, 0.19215686619281769), -(0.79831933975219727, 0.22352941334247589, 0.22352941334247589), -(0.8025209903717041, 0.23529411852359772, 0.23529411852359772), -(0.80672270059585571, 0.25098040699958801, 0.25098040699958801), -(0.81092435121536255, 0.26666668057441711, 0.26666668057441711), -(0.81512606143951416, 0.28235295414924622, 0.28235295414924622), -(0.819327712059021, 0.29803922772407532, 0.29803922772407532), -(0.82352942228317261, 0.30980393290519714, 0.30980393290519714), -(0.82773107290267944, 0.32549020648002625, 0.32549020648002625), -(0.83193278312683105, 0.34117648005485535, 0.34117648005485535), -(0.83613443374633789, 0.35686275362968445, 0.35686275362968445), -(0.8403361439704895, 0.37254902720451355, 0.37254902720451355), -(0.84453779458999634, 0.38431373238563538, 0.38431373238563538), -(0.84873950481414795, 0.40000000596046448, 0.40000000596046448), -(0.85294115543365479, 0.41568627953529358, 0.41568627953529358), -(0.8571428656578064, 0.43137255311012268, 0.43137255311012268), -(0.86134451627731323, 0.44705882668495178, 0.44705882668495178), -(0.86554622650146484, 0.45882353186607361, 0.45882353186607361), -(0.86974787712097168, 0.47450980544090271, 0.47450980544090271), -(0.87394958734512329, 0.49019607901573181, 0.49019607901573181), -(0.87815123796463013, 0.5058823823928833, 0.5058823823928833), -(0.88235294818878174, 0.5372549295425415, 0.5372549295425415), -(0.88655459880828857, 0.54901963472366333, 0.54901963472366333), -(0.89075630903244019, 0.56470590829849243, 0.56470590829849243), -(0.89495795965194702, 0.58039218187332153, 0.58039218187332153), -(0.89915966987609863, 0.59607845544815063, 0.59607845544815063), -(0.90336132049560547, 0.61176472902297974, 0.61176472902297974), -(0.90756303071975708, 0.62352943420410156, 0.62352943420410156), -(0.91176468133926392, 0.63921570777893066, 0.63921570777893066), -(0.91596639156341553, 0.65490198135375977, 0.65490198135375977), -(0.92016804218292236, 0.67058825492858887, 0.67058825492858887), -(0.92436975240707397, 0.68627452850341797, 0.68627452850341797), -(0.92857140302658081, 0.69803923368453979, 0.69803923368453979), -(0.93277311325073242, 0.7137255072593689, 0.7137255072593689), -(0.93697476387023926, 0.729411780834198, 0.729411780834198), -(0.94117647409439087, 0.7450980544090271, 0.7450980544090271), -(0.94537812471389771, 0.7607843279838562, 0.7607843279838562), -(0.94957983493804932, 0.77254903316497803, 0.77254903316497803), -(0.95378148555755615, 0.78823530673980713, 0.78823530673980713), -(0.95798319578170776, 0.80392158031463623, 0.80392158031463623), -(0.9621848464012146, 0.81960785388946533, 0.81960785388946533), -(0.96638655662536621, 0.84705883264541626, 0.84705883264541626), -(0.97058820724487305, 0.86274510622024536, 0.86274510622024536), -(0.97478991746902466, 0.87843137979507446, 0.87843137979507446), -(0.97899156808853149, 0.89411765336990356, 0.89411765336990356), -(0.98319327831268311, 0.90980392694473267, 0.90980392694473267), -(0.98739492893218994, 0.92156863212585449, 0.92156863212585449), -(0.99159663915634155, 0.93725490570068359, 0.93725490570068359), -(0.99579828977584839, 0.9529411792755127, 0.9529411792755127), (1.0, -0.9686274528503418, 0.9686274528503418)], 'green': [(0.0, 0.0, 0.0), -(0.0042016808874905109, 0.0039215688593685627, 0.0039215688593685627), -(0.0084033617749810219, 0.0078431377187371254, 0.0078431377187371254), -(0.012605042196810246, 0.011764706112444401, 0.011764706112444401), -(0.016806723549962044, 0.015686275437474251, 0.015686275437474251), -(0.021008403971791267, 0.019607843831181526, 0.019607843831181526), -(0.025210084393620491, 0.023529412224888802, 0.023529412224888802), -(0.029411764815449715, 0.027450980618596077, 0.027450980618596077), -(0.033613447099924088, 0.031372550874948502, 0.031372550874948502), -(0.037815127521753311, 0.035294119268655777, 0.035294119268655777), -(0.042016807943582535, 0.043137256056070328, 0.043137256056070328), -(0.046218488365411758, 0.047058824449777603, 0.047058824449777603), -(0.050420168787240982, 0.050980392843484879, 0.050980392843484879), -(0.054621849209070206, 0.054901961237192154, 0.054901961237192154), -(0.058823529630899429, 0.058823529630899429, 0.058823529630899429), -(0.063025213778018951, 0.062745101749897003, 0.062745101749897003), -(0.067226894199848175, 0.066666670143604279, 0.066666670143604279), -(0.071428574621677399, 0.070588238537311554, 0.070588238537311554), -(0.075630255043506622, 0.074509806931018829, 0.074509806931018829), -(0.079831935465335846, 0.078431375324726105, 0.078431375324726105), -(0.08403361588716507, 0.08235294371843338, 0.08235294371843338), -(0.088235296308994293, 0.086274512112140656, 0.086274512112140656), -(0.092436976730823517, 0.090196080505847931, 0.090196080505847931), -(0.09663865715265274, 0.094117648899555206, 0.094117648899555206), -(0.10084033757448196, 0.098039217293262482, 0.098039217293262482), -(0.10504201799631119, 0.10196078568696976, 0.10196078568696976), -(0.10924369841814041, 0.10588235408067703, 0.10588235408067703), -(0.11344537883996964, 0.10980392247438431, 0.10980392247438431), -(0.11764705926179886, 0.11372549086809158, 0.11372549086809158), -(0.12184873968362808, 0.11764705926179886, 0.11764705926179886), -(0.1260504275560379, 0.12549020349979401, 0.12549020349979401), -(0.13025210797786713, 0.12941177189350128, 0.12941177189350128), -(0.13445378839969635, 0.13333334028720856, 0.13333334028720856), -(0.13865546882152557, 0.13725490868091583, 0.13725490868091583), -(0.1428571492433548, 0.14117647707462311, 0.14117647707462311), -(0.14705882966518402, 0.14509804546833038, 0.14509804546833038), -(0.15126051008701324, 0.14901961386203766, 0.14901961386203766), -(0.15546219050884247, 0.15294118225574493, 0.15294118225574493), -(0.15966387093067169, 0.15686275064945221, 0.15686275064945221), -(0.16386555135250092, 0.16078431904315948, 0.16078431904315948), -(0.16806723177433014, 0.16470588743686676, 0.16470588743686676), -(0.17226891219615936, 0.16862745583057404, 0.16862745583057404), -(0.17647059261798859, 0.17254902422428131, 0.17254902422428131), -(0.18067227303981781, 0.17647059261798859, 0.17647059261798859), -(0.18487395346164703, 0.18039216101169586, 0.18039216101169586), -(0.18907563388347626, 0.18431372940540314, 0.18431372940540314), -(0.19327731430530548, 0.18823529779911041, 0.18823529779911041), -(0.1974789947271347, 0.19215686619281769, 0.19215686619281769), -(0.20168067514896393, 0.19607843458652496, 0.19607843458652496), -(0.20588235557079315, 0.20000000298023224, 0.20000000298023224), -(0.21008403599262238, 0.20784313976764679, 0.20784313976764679), -(0.2142857164144516, 0.21176470816135406, 0.21176470816135406), -(0.21848739683628082, 0.21568627655506134, 0.21568627655506134), -(0.22268907725811005, 0.21960784494876862, 0.21960784494876862), -(0.22689075767993927, 0.22352941334247589, 0.22352941334247589), -(0.23109243810176849, 0.22745098173618317, 0.22745098173618317), -(0.23529411852359772, 0.23137255012989044, 0.23137255012989044), -(0.23949579894542694, 0.23529411852359772, 0.23529411852359772), -(0.24369747936725616, 0.23921568691730499, 0.23921568691730499), -(0.24789915978908539, 0.24313725531101227, 0.24313725531101227), -(0.25210085511207581, 0.25098040699958801, 0.25098040699958801), -(0.25630253553390503, 0.25490197539329529, 0.25490197539329529), -(0.26050421595573425, 0.25882354378700256, 0.25882354378700256), -(0.26470589637756348, 0.26274511218070984, 0.26274511218070984), -(0.2689075767993927, 0.26666668057441711, 0.26666668057441711), -(0.27310925722122192, 0.27058824896812439, 0.27058824896812439), -(0.27731093764305115, 0.27450981736183167, 0.27450981736183167), -(0.28151261806488037, 0.27843138575553894, 0.27843138575553894), -(0.28571429848670959, 0.28235295414924622, 0.28235295414924622), -(0.28991597890853882, 0.28627452254295349, 0.28627452254295349), -(0.29411765933036804, 0.29411765933036804, 0.29411765933036804), -(0.29831933975219727, 0.29803922772407532, 0.29803922772407532), -(0.30252102017402649, 0.30196079611778259, 0.30196079611778259), -(0.30672270059585571, 0.30588236451148987, 0.30588236451148987), -(0.31092438101768494, 0.30980393290519714, 0.30980393290519714), -(0.31512606143951416, 0.31372550129890442, 0.31372550129890442), -(0.31932774186134338, 0.31764706969261169, 0.31764706969261169), -(0.32352942228317261, 0.32156863808631897, 0.32156863808631897), -(0.32773110270500183, 0.32549020648002625, 0.32549020648002625), -(0.33193278312683105, 0.32941177487373352, 0.32941177487373352), -(0.33613446354866028, 0.3333333432674408, 0.3333333432674408), -(0.3403361439704895, 0.33725491166114807, 0.33725491166114807), -(0.34453782439231873, 0.34117648005485535, 0.34117648005485535), -(0.34873950481414795, 0.34509804844856262, 0.34509804844856262), -(0.35294118523597717, 0.3490196168422699, 0.3490196168422699), -(0.3571428656578064, 0.35294118523597717, 0.35294118523597717), -(0.36134454607963562, 0.35686275362968445, 0.35686275362968445), -(0.36554622650146484, 0.36078432202339172, 0.36078432202339172), -(0.36974790692329407, 0.364705890417099, 0.364705890417099), -(0.37394958734512329, 0.36862745881080627, 0.36862745881080627), -(0.37815126776695251, 0.37647059559822083, 0.37647059559822083), -(0.38235294818878174, 0.3803921639919281, 0.3803921639919281), -(0.38655462861061096, 0.38431373238563538, 0.38431373238563538), -(0.39075630903244019, 0.38823530077934265, 0.38823530077934265), -(0.39495798945426941, 0.39215686917304993, 0.39215686917304993), -(0.39915966987609863, 0.3960784375667572, 0.3960784375667572), -(0.40336135029792786, 0.40000000596046448, 0.40000000596046448), -(0.40756303071975708, 0.40392157435417175, 0.40392157435417175), -(0.4117647111415863, 0.40784314274787903, 0.40784314274787903), -(0.41596639156341553, 0.4117647111415863, 0.4117647111415863), -(0.42016807198524475, 0.41568627953529358, 0.41568627953529358), -(0.42436975240707397, 0.41960784792900085, 0.41960784792900085), -(0.4285714328289032, 0.42352941632270813, 0.42352941632270813), -(0.43277311325073242, 0.42745098471641541, 0.42745098471641541), -(0.43697479367256165, 0.43137255311012268, 0.43137255311012268), -(0.44117647409439087, 0.43529412150382996, 0.43529412150382996), -(0.44537815451622009, 0.43921568989753723, 0.43921568989753723), -(0.44957983493804932, 0.44313725829124451, 0.44313725829124451), -(0.45378151535987854, 0.44705882668495178, 0.44705882668495178), -(0.45798319578170776, 0.45098039507865906, 0.45098039507865906), -(0.46218487620353699, 0.45882353186607361, 0.45882353186607361), -(0.46638655662536621, 0.46274510025978088, 0.46274510025978088), -(0.47058823704719543, 0.46666666865348816, 0.46666666865348816), -(0.47478991746902466, 0.47058823704719543, 0.47058823704719543), -(0.47899159789085388, 0.47450980544090271, 0.47450980544090271), -(0.48319327831268311, 0.47843137383460999, 0.47843137383460999), -(0.48739495873451233, 0.48235294222831726, 0.48235294222831726), -(0.49159663915634155, 0.48627451062202454, 0.48627451062202454), -(0.49579831957817078, 0.49019607901573181, 0.49019607901573181), (0.5, -0.49411764740943909, 0.49411764740943909), (0.50420171022415161, -0.50196081399917603, 0.50196081399917603), (0.50840336084365845, -0.5058823823928833, 0.5058823823928833), (0.51260507106781006, -0.50980395078659058, 0.50980395078659058), (0.51680672168731689, -0.51372551918029785, 0.51372551918029785), (0.52100843191146851, -0.51764708757400513, 0.51764708757400513), (0.52521008253097534, -0.5215686559677124, 0.5215686559677124), (0.52941179275512695, -0.52549022436141968, 0.52549022436141968), (0.53361344337463379, -0.52941179275512695, 0.52941179275512695), (0.5378151535987854, -0.53333336114883423, 0.53333336114883423), (0.54201680421829224, -0.5372549295425415, 0.5372549295425415), (0.54621851444244385, -0.54509806632995605, 0.54509806632995605), (0.55042016506195068, -0.54901963472366333, 0.54901963472366333), (0.55462187528610229, -0.55294120311737061, 0.55294120311737061), (0.55882352590560913, -0.55686277151107788, 0.55686277151107788), (0.56302523612976074, -0.56078433990478516, 0.56078433990478516), (0.56722688674926758, -0.56470590829849243, 0.56470590829849243), (0.57142859697341919, -0.56862747669219971, 0.56862747669219971), (0.57563024759292603, -0.57254904508590698, 0.57254904508590698), (0.57983195781707764, -0.57647061347961426, 0.57647061347961426), (0.58403360843658447, -0.58039218187332153, 0.58039218187332153), (0.58823531866073608, -0.58431375026702881, 0.58431375026702881), (0.59243696928024292, -0.58823531866073608, 0.58823531866073608), (0.59663867950439453, -0.59215688705444336, 0.59215688705444336), (0.60084033012390137, -0.59607845544815063, 0.59607845544815063), (0.60504204034805298, -0.60000002384185791, 0.60000002384185791), (0.60924369096755981, -0.60392159223556519, 0.60392159223556519), (0.61344540119171143, -0.60784316062927246, 0.60784316062927246), (0.61764705181121826, -0.61176472902297974, 0.61176472902297974), (0.62184876203536987, -0.61568629741668701, 0.61568629741668701), (0.62605041265487671, -0.61960786581039429, 0.61960786581039429), (0.63025212287902832, -0.62745100259780884, 0.62745100259780884), (0.63445377349853516, -0.63137257099151611, 0.63137257099151611), (0.63865548372268677, -0.63529413938522339, 0.63529413938522339), (0.6428571343421936, -0.63921570777893066, 0.63921570777893066), (0.64705884456634521, -0.64313727617263794, 0.64313727617263794), (0.65126049518585205, -0.64705884456634521, 0.64705884456634521), (0.65546220541000366, -0.65098041296005249, 0.65098041296005249), (0.6596638560295105, -0.65490198135375977, 0.65490198135375977), (0.66386556625366211, -0.65882354974746704, 0.65882354974746704), (0.66806721687316895, -0.66274511814117432, 0.66274511814117432), (0.67226892709732056, -0.66666668653488159, 0.66666668653488159), (0.67647057771682739, -0.67058825492858887, 0.67058825492858887), (0.680672287940979, -0.67450982332229614, 0.67450982332229614), (0.68487393856048584, -0.67843139171600342, 0.67843139171600342), (0.68907564878463745, -0.68235296010971069, 0.68235296010971069), (0.69327729940414429, -0.68627452850341797, 0.68627452850341797), (0.6974790096282959, -0.69019609689712524, 0.69019609689712524), (0.70168066024780273, -0.69411766529083252, 0.69411766529083252), (0.70588237047195435, -0.69803923368453979, 0.69803923368453979), (0.71008402109146118, -0.70196080207824707, 0.70196080207824707), (0.71428573131561279, -0.70980393886566162, 0.70980393886566162), (0.71848738193511963, -0.7137255072593689, 0.7137255072593689), (0.72268909215927124, -0.71764707565307617, 0.71764707565307617), (0.72689074277877808, -0.72156864404678345, 0.72156864404678345), (0.73109245300292969, -0.72549021244049072, 0.72549021244049072), (0.73529410362243652, -0.729411780834198, 0.729411780834198), (0.73949581384658813, -0.73333334922790527, 0.73333334922790527), (0.74369746446609497, -0.73725491762161255, 0.73725491762161255), (0.74789917469024658, -0.74117648601531982, 0.74117648601531982), (0.75210082530975342, -0.7450980544090271, 0.7450980544090271), (0.75630253553390503, -0.75294119119644165, 0.75294119119644165), (0.76050418615341187, -0.75686275959014893, 0.75686275959014893), (0.76470589637756348, -0.7607843279838562, 0.7607843279838562), (0.76890754699707031, -0.76470589637756348, 0.76470589637756348), (0.77310925722122192, -0.76862746477127075, 0.76862746477127075), (0.77731090784072876, -0.77254903316497803, 0.77254903316497803), (0.78151261806488037, -0.7764706015586853, 0.7764706015586853), (0.78571426868438721, -0.78039216995239258, 0.78039216995239258), (0.78991597890853882, -0.78431373834609985, 0.78431373834609985), (0.79411762952804565, -0.78823530673980713, 0.78823530673980713), (0.79831933975219727, -0.79607844352722168, 0.79607844352722168), (0.8025209903717041, -0.80000001192092896, 0.80000001192092896), (0.80672270059585571, -0.80392158031463623, 0.80392158031463623), (0.81092435121536255, -0.80784314870834351, 0.80784314870834351), (0.81512606143951416, -0.81176471710205078, 0.81176471710205078), (0.819327712059021, -0.81568628549575806, 0.81568628549575806), (0.82352942228317261, -0.81960785388946533, 0.81960785388946533), (0.82773107290267944, -0.82352942228317261, 0.82352942228317261), (0.83193278312683105, -0.82745099067687988, 0.82745099067687988), (0.83613443374633789, -0.83137255907058716, 0.83137255907058716), (0.8403361439704895, -0.83529412746429443, 0.83529412746429443), (0.84453779458999634, -0.83921569585800171, 0.83921569585800171), (0.84873950481414795, -0.84313726425170898, 0.84313726425170898), (0.85294115543365479, -0.84705883264541626, 0.84705883264541626), (0.8571428656578064, -0.85098040103912354, 0.85098040103912354), (0.86134451627731323, -0.85490196943283081, 0.85490196943283081), (0.86554622650146484, -0.85882353782653809, 0.85882353782653809), (0.86974787712097168, -0.86274510622024536, 0.86274510622024536), (0.87394958734512329, -0.86666667461395264, 0.86666667461395264), (0.87815123796463013, -0.87058824300765991, 0.87058824300765991), (0.88235294818878174, -0.87843137979507446, 0.87843137979507446), (0.88655459880828857, -0.88235294818878174, 0.88235294818878174), (0.89075630903244019, -0.88627451658248901, 0.88627451658248901), (0.89495795965194702, -0.89019608497619629, 0.89019608497619629), (0.89915966987609863, -0.89411765336990356, 0.89411765336990356), (0.90336132049560547, -0.89803922176361084, 0.89803922176361084), (0.90756303071975708, -0.90196079015731812, 0.90196079015731812), (0.91176468133926392, -0.90588235855102539, 0.90588235855102539), (0.91596639156341553, -0.90980392694473267, 0.90980392694473267), (0.92016804218292236, -0.91372549533843994, 0.91372549533843994), (0.92436975240707397, -0.91764706373214722, 0.91764706373214722), (0.92857140302658081, -0.92156863212585449, 0.92156863212585449), (0.93277311325073242, -0.92549020051956177, 0.92549020051956177), (0.93697476387023926, -0.92941176891326904, 0.92941176891326904), (0.94117647409439087, -0.93333333730697632, 0.93333333730697632), (0.94537812471389771, -0.93725490570068359, 0.93725490570068359), (0.94957983493804932, -0.94117647409439087, 0.94117647409439087), (0.95378148555755615, -0.94509804248809814, 0.94509804248809814), (0.95798319578170776, -0.94901961088180542, 0.94901961088180542), (0.9621848464012146, -0.9529411792755127, 0.9529411792755127), (0.96638655662536621, -0.96078431606292725, 0.96078431606292725), (0.97058820724487305, -0.96470588445663452, 0.96470588445663452), (0.97478991746902466, -0.9686274528503418, 0.9686274528503418), (0.97899156808853149, -0.97254902124404907, 0.97254902124404907), (0.98319327831268311, -0.97647058963775635, 0.97647058963775635), (0.98739492893218994, -0.98039215803146362, 0.98039215803146362), (0.99159663915634155, -0.9843137264251709, 0.9843137264251709), (0.99579828977584839, -0.98823529481887817, 0.98823529481887817), (1.0, 0.99215686321258545, -0.99215686321258545)], 'red': [(0.0, 0.0, 0.0), (0.0042016808874905109, -0.070588238537311554, 0.070588238537311554), (0.0084033617749810219, -0.14117647707462311, 0.14117647707462311), (0.012605042196810246, -0.21176470816135406, 0.21176470816135406), (0.016806723549962044, -0.28235295414924622, 0.28235295414924622), (0.021008403971791267, -0.35294118523597717, 0.35294118523597717), (0.025210084393620491, -0.42352941632270813, 0.42352941632270813), (0.029411764815449715, -0.49803921580314636, 0.49803921580314636), (0.033613447099924088, -0.56862747669219971, 0.56862747669219971), (0.037815127521753311, -0.63921570777893066, 0.63921570777893066), (0.042016807943582535, -0.78039216995239258, 0.78039216995239258), (0.046218488365411758, -0.85098040103912354, 0.85098040103912354), (0.050420168787240982, -0.92156863212585449, 0.92156863212585449), (0.054621849209070206, -0.99607843160629272, 0.99607843160629272), (0.058823529630899429, -0.97647058963775635, 0.97647058963775635), (0.063025213778018951, -0.95686274766921997, 0.95686274766921997), (0.067226894199848175, -0.93725490570068359, 0.93725490570068359), (0.071428574621677399, -0.91764706373214722, 0.91764706373214722), (0.075630255043506622, -0.89803922176361084, 0.89803922176361084), (0.079831935465335846, -0.87450981140136719, 0.87450981140136719), (0.08403361588716507, -0.85490196943283081, 0.85490196943283081), (0.088235296308994293, -0.83529412746429443, 0.83529412746429443), (0.092436976730823517, -0.81568628549575806, 0.81568628549575806), (0.09663865715265274, -0.79607844352722168, 0.79607844352722168), (0.10084033757448196, -0.77254903316497803, 0.77254903316497803), (0.10504201799631119, -0.75294119119644165, 0.75294119119644165), (0.10924369841814041, -0.73333334922790527, 0.73333334922790527), (0.11344537883996964, -0.7137255072593689, 0.7137255072593689), (0.11764705926179886, -0.69411766529083252, 0.69411766529083252), (0.12184873968362808, -0.67450982332229614, 0.67450982332229614), (0.1260504275560379, -0.63137257099151611, 0.63137257099151611), (0.13025210797786713, -0.61176472902297974, 0.61176472902297974), (0.13445378839969635, -0.59215688705444336, 0.59215688705444336), (0.13865546882152557, -0.57254904508590698, 0.57254904508590698), (0.1428571492433548, -0.54901963472366333, 0.54901963472366333), (0.14705882966518402, -0.52941179275512695, 0.52941179275512695), (0.15126051008701324, -0.50980395078659058, 0.50980395078659058), (0.15546219050884247, -0.49019607901573181, 0.49019607901573181), (0.15966387093067169, -0.47058823704719543, 0.47058823704719543), (0.16386555135250092, -0.45098039507865906, 0.45098039507865906), (0.16806723177433014, -0.42745098471641541, 0.42745098471641541), (0.17226891219615936, -0.40784314274787903, 0.40784314274787903), (0.17647059261798859, -0.38823530077934265, 0.38823530077934265), (0.18067227303981781, -0.36862745881080627, 0.36862745881080627), (0.18487395346164703, -0.3490196168422699, 0.3490196168422699), (0.18907563388347626, -0.32549020648002625, 0.32549020648002625), (0.19327731430530548, -0.30588236451148987, 0.30588236451148987), (0.1974789947271347, -0.28627452254295349, 0.28627452254295349), (0.20168067514896393, -0.26666668057441711, 0.26666668057441711), (0.20588235557079315, -0.24705882370471954, 0.24705882370471954), (0.21008403599262238, -0.20392157137393951, 0.20392157137393951), (0.2142857164144516, -0.18431372940540314, 0.18431372940540314), (0.21848739683628082, -0.16470588743686676, 0.16470588743686676), (0.22268907725811005, -0.14509804546833038, 0.14509804546833038), (0.22689075767993927, -0.12549020349979401, 0.12549020349979401), (0.23109243810176849, -0.10196078568696976, 0.10196078568696976), (0.23529411852359772, -0.08235294371843338, 0.08235294371843338), (0.23949579894542694, -0.062745101749897003, 0.062745101749897003), (0.24369747936725616, -0.043137256056070328, 0.043137256056070328), (0.24789915978908539, -0.023529412224888802, 0.023529412224888802), (0.25210085511207581, -0.25098040699958801, 0.25098040699958801), (0.25630253553390503, -0.25490197539329529, 0.25490197539329529), (0.26050421595573425, -0.25882354378700256, 0.25882354378700256), (0.26470589637756348, -0.26274511218070984, 0.26274511218070984), (0.2689075767993927, -0.26666668057441711, 0.26666668057441711), (0.27310925722122192, -0.27058824896812439, 0.27058824896812439), (0.27731093764305115, -0.27450981736183167, 0.27450981736183167), (0.28151261806488037, -0.27843138575553894, 0.27843138575553894), (0.28571429848670959, -0.28235295414924622, 0.28235295414924622), (0.28991597890853882, -0.28627452254295349, 0.28627452254295349), (0.29411765933036804, -0.29411765933036804, 0.29411765933036804), (0.29831933975219727, -0.29803922772407532, 0.29803922772407532), (0.30252102017402649, -0.30196079611778259, 0.30196079611778259), (0.30672270059585571, -0.30588236451148987, 0.30588236451148987), (0.31092438101768494, -0.30980393290519714, 0.30980393290519714), (0.31512606143951416, -0.31372550129890442, 0.31372550129890442), (0.31932774186134338, -0.31764706969261169, 0.31764706969261169), (0.32352942228317261, -0.32156863808631897, 0.32156863808631897), (0.32773110270500183, -0.32549020648002625, 0.32549020648002625), (0.33193278312683105, -0.32941177487373352, 0.32941177487373352), (0.33613446354866028, -0.3333333432674408, 0.3333333432674408), (0.3403361439704895, -0.33725491166114807, 0.33725491166114807), (0.34453782439231873, -0.34117648005485535, 0.34117648005485535), (0.34873950481414795, -0.34509804844856262, 0.34509804844856262), (0.35294118523597717, -0.3490196168422699, 0.3490196168422699), (0.3571428656578064, -0.35294118523597717, 0.35294118523597717), (0.36134454607963562, -0.35686275362968445, 0.35686275362968445), (0.36554622650146484, -0.36078432202339172, 0.36078432202339172), (0.36974790692329407, -0.364705890417099, 0.364705890417099), (0.37394958734512329, -0.36862745881080627, 0.36862745881080627), (0.37815126776695251, -0.37647059559822083, 0.37647059559822083), (0.38235294818878174, -0.3803921639919281, 0.3803921639919281), (0.38655462861061096, -0.38431373238563538, 0.38431373238563538), (0.39075630903244019, -0.38823530077934265, 0.38823530077934265), (0.39495798945426941, -0.39215686917304993, 0.39215686917304993), (0.39915966987609863, -0.3960784375667572, 0.3960784375667572), (0.40336135029792786, -0.40000000596046448, 0.40000000596046448), (0.40756303071975708, -0.40392157435417175, 0.40392157435417175), (0.4117647111415863, -0.40784314274787903, 0.40784314274787903), (0.41596639156341553, -0.4117647111415863, 0.4117647111415863), (0.42016807198524475, -0.41568627953529358, 0.41568627953529358), (0.42436975240707397, -0.41960784792900085, 0.41960784792900085), (0.4285714328289032, -0.42352941632270813, 0.42352941632270813), (0.43277311325073242, -0.42745098471641541, 0.42745098471641541), (0.43697479367256165, -0.43137255311012268, 0.43137255311012268), (0.44117647409439087, -0.43529412150382996, 0.43529412150382996), (0.44537815451622009, -0.43921568989753723, 0.43921568989753723), (0.44957983493804932, -0.44313725829124451, 0.44313725829124451), (0.45378151535987854, -0.44705882668495178, 0.44705882668495178), (0.45798319578170776, -0.45098039507865906, 0.45098039507865906), (0.46218487620353699, -0.45882353186607361, 0.45882353186607361), (0.46638655662536621, -0.46274510025978088, 0.46274510025978088), (0.47058823704719543, -0.46666666865348816, 0.46666666865348816), (0.47478991746902466, -0.47058823704719543, 0.47058823704719543), (0.47899159789085388, -0.47450980544090271, 0.47450980544090271), (0.48319327831268311, -0.47843137383460999, 0.47843137383460999), (0.48739495873451233, -0.48235294222831726, 0.48235294222831726), (0.49159663915634155, -0.48627451062202454, 0.48627451062202454), (0.49579831957817078, -0.49019607901573181, 0.49019607901573181), (0.5, 0.49411764740943909, -0.49411764740943909), (0.50420171022415161, 0.50196081399917603, -0.50196081399917603), (0.50840336084365845, 0.5058823823928833, -0.5058823823928833), (0.51260507106781006, 0.50980395078659058, -0.50980395078659058), (0.51680672168731689, 0.51372551918029785, -0.51372551918029785), (0.52100843191146851, 0.51764708757400513, -0.51764708757400513), (0.52521008253097534, 0.5215686559677124, -0.5215686559677124), (0.52941179275512695, 0.52549022436141968, -0.52549022436141968), (0.53361344337463379, 0.52941179275512695, -0.52941179275512695), (0.5378151535987854, 0.53333336114883423, -0.53333336114883423), (0.54201680421829224, 0.5372549295425415, -0.5372549295425415), (0.54621851444244385, 0.54509806632995605, -0.54509806632995605), (0.55042016506195068, 0.54901963472366333, -0.54901963472366333), (0.55462187528610229, 0.55294120311737061, -0.55294120311737061), (0.55882352590560913, 0.55686277151107788, -0.55686277151107788), (0.56302523612976074, 0.56078433990478516, -0.56078433990478516), (0.56722688674926758, 0.56470590829849243, -0.56470590829849243), (0.57142859697341919, 0.56862747669219971, -0.56862747669219971), (0.57563024759292603, 0.57254904508590698, -0.57254904508590698), (0.57983195781707764, 0.57647061347961426, -0.57647061347961426), (0.58403360843658447, 0.58039218187332153, -0.58039218187332153), (0.58823531866073608, 0.58431375026702881, -0.58431375026702881), (0.59243696928024292, 0.58823531866073608, -0.58823531866073608), (0.59663867950439453, 0.59215688705444336, -0.59215688705444336), (0.60084033012390137, 0.59607845544815063, -0.59607845544815063), (0.60504204034805298, 0.60000002384185791, -0.60000002384185791), (0.60924369096755981, 0.60392159223556519, -0.60392159223556519), (0.61344540119171143, 0.60784316062927246, -0.60784316062927246), (0.61764705181121826, 0.61176472902297974, -0.61176472902297974), (0.62184876203536987, 0.61568629741668701, -0.61568629741668701), (0.62605041265487671, 0.61960786581039429, -0.61960786581039429), (0.63025212287902832, 0.62745100259780884, -0.62745100259780884), (0.63445377349853516, 0.63137257099151611, -0.63137257099151611), (0.63865548372268677, 0.63529413938522339, -0.63529413938522339), (0.6428571343421936, 0.63921570777893066, -0.63921570777893066), (0.64705884456634521, 0.64313727617263794, -0.64313727617263794), (0.65126049518585205, 0.64705884456634521, -0.64705884456634521), (0.65546220541000366, 0.65098041296005249, -0.65098041296005249), (0.6596638560295105, 0.65490198135375977, -0.65490198135375977), (0.66386556625366211, 0.65882354974746704, -0.65882354974746704), (0.66806721687316895, 0.66274511814117432, -0.66274511814117432), (0.67226892709732056, 0.66666668653488159, -0.66666668653488159), (0.67647057771682739, 0.67058825492858887, -0.67058825492858887), (0.680672287940979, 0.67450982332229614, -0.67450982332229614), (0.68487393856048584, 0.67843139171600342, -0.67843139171600342), (0.68907564878463745, 0.68235296010971069, -0.68235296010971069), (0.69327729940414429, 0.68627452850341797, -0.68627452850341797), (0.6974790096282959, 0.69019609689712524, -0.69019609689712524), (0.70168066024780273, 0.69411766529083252, -0.69411766529083252), (0.70588237047195435, 0.69803923368453979, -0.69803923368453979), (0.71008402109146118, 0.70196080207824707, -0.70196080207824707), (0.71428573131561279, 0.70980393886566162, -0.70980393886566162), (0.71848738193511963, 0.7137255072593689, -0.7137255072593689), (0.72268909215927124, 0.71764707565307617, -0.71764707565307617), (0.72689074277877808, 0.72156864404678345, -0.72156864404678345), (0.73109245300292969, 0.72549021244049072, -0.72549021244049072), (0.73529410362243652, 0.729411780834198, -0.729411780834198), (0.73949581384658813, 0.73333334922790527, -0.73333334922790527), (0.74369746446609497, 0.73725491762161255, -0.73725491762161255), (0.74789917469024658, 0.74117648601531982, -0.74117648601531982), (0.75210082530975342, 0.7450980544090271, -0.7450980544090271), (0.75630253553390503, 0.75294119119644165, -0.75294119119644165), (0.76050418615341187, 0.75686275959014893, -0.75686275959014893), (0.76470589637756348, 0.7607843279838562, -0.7607843279838562), (0.76890754699707031, 0.76470589637756348, -0.76470589637756348), (0.77310925722122192, 0.76862746477127075, -0.76862746477127075), (0.77731090784072876, 0.77254903316497803, -0.77254903316497803), (0.78151261806488037, 0.7764706015586853, -0.7764706015586853), (0.78571426868438721, 0.78039216995239258, -0.78039216995239258), (0.78991597890853882, 0.78431373834609985, -0.78431373834609985), (0.79411762952804565, 0.78823530673980713, -0.78823530673980713), (0.79831933975219727, 0.79607844352722168, -0.79607844352722168), (0.8025209903717041, 0.80000001192092896, -0.80000001192092896), (0.80672270059585571, 0.80392158031463623, -0.80392158031463623), (0.81092435121536255, 0.80784314870834351, -0.80784314870834351), (0.81512606143951416, 0.81176471710205078, -0.81176471710205078), (0.819327712059021, 0.81568628549575806, -0.81568628549575806), (0.82352942228317261, 0.81960785388946533, -0.81960785388946533), (0.82773107290267944, 0.82352942228317261, -0.82352942228317261), (0.83193278312683105, 0.82745099067687988, -0.82745099067687988), (0.83613443374633789, 0.83137255907058716, -0.83137255907058716), (0.8403361439704895, 0.83529412746429443, -0.83529412746429443), (0.84453779458999634, 0.83921569585800171, -0.83921569585800171), (0.84873950481414795, 0.84313726425170898, -0.84313726425170898), (0.85294115543365479, 0.84705883264541626, -0.84705883264541626), (0.8571428656578064, 0.85098040103912354, -0.85098040103912354), (0.86134451627731323, 0.85490196943283081, -0.85490196943283081), (0.86554622650146484, 0.85882353782653809, -0.85882353782653809), (0.86974787712097168, 0.86274510622024536, -0.86274510622024536), (0.87394958734512329, 0.86666667461395264, -0.86666667461395264), (0.87815123796463013, 0.87058824300765991, -0.87058824300765991), (0.88235294818878174, 0.87843137979507446, -0.87843137979507446), (0.88655459880828857, 0.88235294818878174, -0.88235294818878174), (0.89075630903244019, 0.88627451658248901, -0.88627451658248901), (0.89495795965194702, 0.89019608497619629, -0.89019608497619629), (0.89915966987609863, 0.89411765336990356, -0.89411765336990356), (0.90336132049560547, 0.89803922176361084, -0.89803922176361084), (0.90756303071975708, 0.90196079015731812, -0.90196079015731812), (0.91176468133926392, 0.90588235855102539, -0.90588235855102539), (0.91596639156341553, 0.90980392694473267, -0.90980392694473267), (0.92016804218292236, 0.91372549533843994, -0.91372549533843994), (0.92436975240707397, 0.91764706373214722, -0.91764706373214722), (0.92857140302658081, 0.92156863212585449, -0.92156863212585449), (0.93277311325073242, 0.92549020051956177, -0.92549020051956177), (0.93697476387023926, 0.92941176891326904, -0.92941176891326904), (0.94117647409439087, 0.93333333730697632, -0.93333333730697632), (0.94537812471389771, 0.93725490570068359, -0.93725490570068359), (0.94957983493804932, 0.94117647409439087, -0.94117647409439087), (0.95378148555755615, 0.94509804248809814, -0.94509804248809814), (0.95798319578170776, 0.94901961088180542, -0.94901961088180542), (0.9621848464012146, 0.9529411792755127, -0.9529411792755127), (0.96638655662536621, 0.96078431606292725, -0.96078431606292725), (0.97058820724487305, 0.96470588445663452, -0.96470588445663452), (0.97478991746902466, 0.9686274528503418, -0.9686274528503418), (0.97899156808853149, 0.97254902124404907, -0.97254902124404907), (0.98319327831268311, 0.97647058963775635, -0.97647058963775635), (0.98739492893218994, 0.98039215803146362, -0.98039215803146362), (0.99159663915634155, 0.9843137264251709, -0.9843137264251709), (0.99579828977584839, 0.98823529481887817, -0.98823529481887817), (1.0, 0.99215686321258545, 0.99215686321258545)]} -_gist_yarg_data = {'blue': [(0.0, 1.0, 1.0), (0.0042016808874905109, -0.99607843160629272, 0.99607843160629272), (0.0084033617749810219, -0.99215686321258545, 0.99215686321258545), (0.012605042196810246, -0.98823529481887817, 0.98823529481887817), (0.016806723549962044, -0.9843137264251709, 0.9843137264251709), (0.021008403971791267, -0.98039215803146362, 0.98039215803146362), (0.025210084393620491, -0.97647058963775635, 0.97647058963775635), (0.029411764815449715, -0.97254902124404907, 0.97254902124404907), (0.033613447099924088, -0.96470588445663452, 0.96470588445663452), (0.037815127521753311, -0.96078431606292725, 0.96078431606292725), (0.042016807943582535, -0.95686274766921997, 0.95686274766921997), (0.046218488365411758, -0.9529411792755127, 0.9529411792755127), (0.050420168787240982, -0.94901961088180542, 0.94901961088180542), (0.054621849209070206, -0.94509804248809814, 0.94509804248809814), (0.058823529630899429, -0.94117647409439087, 0.94117647409439087), (0.063025213778018951, -0.93725490570068359, 0.93725490570068359), (0.067226894199848175, -0.93333333730697632, 0.93333333730697632), (0.071428574621677399, -0.92941176891326904, 0.92941176891326904), (0.075630255043506622, -0.92549020051956177, 0.92549020051956177), (0.079831935465335846, -0.92156863212585449, 0.92156863212585449), (0.08403361588716507, -0.91764706373214722, 0.91764706373214722), (0.088235296308994293, -0.91372549533843994, 0.91372549533843994), (0.092436976730823517, -0.90980392694473267, 0.90980392694473267), (0.09663865715265274, -0.90196079015731812, 0.90196079015731812), (0.10084033757448196, -0.89803922176361084, 0.89803922176361084), (0.10504201799631119, -0.89411765336990356, 0.89411765336990356), (0.10924369841814041, -0.89019608497619629, 0.89019608497619629), (0.11344537883996964, -0.88627451658248901, 0.88627451658248901), (0.11764705926179886, -0.88235294818878174, 0.88235294818878174), (0.12184873968362808, -0.87843137979507446, 0.87843137979507446), (0.1260504275560379, -0.87450981140136719, 0.87450981140136719), (0.13025210797786713, -0.87058824300765991, 0.87058824300765991), (0.13445378839969635, -0.86666667461395264, 0.86666667461395264), (0.13865546882152557, -0.86274510622024536, 0.86274510622024536), (0.1428571492433548, -0.85882353782653809, 0.85882353782653809), (0.14705882966518402, -0.85490196943283081, 0.85490196943283081), (0.15126051008701324, -0.85098040103912354, 0.85098040103912354), (0.15546219050884247, -0.84705883264541626, 0.84705883264541626), (0.15966387093067169, -0.83921569585800171, 0.83921569585800171), (0.16386555135250092, -0.83529412746429443, 0.83529412746429443), (0.16806723177433014, -0.83137255907058716, 0.83137255907058716), (0.17226891219615936, -0.82745099067687988, 0.82745099067687988), (0.17647059261798859, -0.82352942228317261, 0.82352942228317261), (0.18067227303981781, -0.81960785388946533, 0.81960785388946533), (0.18487395346164703, -0.81568628549575806, 0.81568628549575806), (0.18907563388347626, -0.81176471710205078, 0.81176471710205078), (0.19327731430530548, -0.80784314870834351, 0.80784314870834351), (0.1974789947271347, -0.80392158031463623, 0.80392158031463623), (0.20168067514896393, -0.80000001192092896, 0.80000001192092896), (0.20588235557079315, -0.79607844352722168, 0.79607844352722168), (0.21008403599262238, -0.7921568751335144, 0.7921568751335144), (0.2142857164144516, -0.78823530673980713, 0.78823530673980713), (0.21848739683628082, -0.78431373834609985, 0.78431373834609985), (0.22268907725811005, -0.7764706015586853, 0.7764706015586853), (0.22689075767993927, -0.77254903316497803, 0.77254903316497803), (0.23109243810176849, -0.76862746477127075, 0.76862746477127075), (0.23529411852359772, -0.76470589637756348, 0.76470589637756348), (0.23949579894542694, -0.7607843279838562, 0.7607843279838562), (0.24369747936725616, -0.75686275959014893, 0.75686275959014893), (0.24789915978908539, -0.75294119119644165, 0.75294119119644165), (0.25210085511207581, -0.74901962280273438, 0.74901962280273438), (0.25630253553390503, -0.7450980544090271, 0.7450980544090271), (0.26050421595573425, -0.74117648601531982, 0.74117648601531982), (0.26470589637756348, -0.73725491762161255, 0.73725491762161255), (0.2689075767993927, -0.73333334922790527, 0.73333334922790527), (0.27310925722122192, -0.729411780834198, 0.729411780834198), (0.27731093764305115, -0.72549021244049072, 0.72549021244049072), (0.28151261806488037, -0.72156864404678345, 0.72156864404678345), (0.28571429848670959, -0.7137255072593689, 0.7137255072593689), (0.28991597890853882, -0.70980393886566162, 0.70980393886566162), (0.29411765933036804, -0.70588237047195435, 0.70588237047195435), (0.29831933975219727, -0.70196080207824707, 0.70196080207824707), (0.30252102017402649, -0.69803923368453979, 0.69803923368453979), (0.30672270059585571, -0.69411766529083252, 0.69411766529083252), (0.31092438101768494, -0.69019609689712524, 0.69019609689712524), (0.31512606143951416, -0.68627452850341797, 0.68627452850341797), (0.31932774186134338, -0.68235296010971069, 0.68235296010971069), (0.32352942228317261, -0.67843139171600342, 0.67843139171600342), (0.32773110270500183, -0.67450982332229614, 0.67450982332229614), (0.33193278312683105, -0.67058825492858887, 0.67058825492858887), (0.33613446354866028, -0.66666668653488159, 0.66666668653488159), (0.3403361439704895, -0.66274511814117432, 0.66274511814117432), (0.34453782439231873, -0.65882354974746704, 0.65882354974746704), (0.34873950481414795, -0.65098041296005249, 0.65098041296005249), (0.35294118523597717, -0.64705884456634521, 0.64705884456634521), (0.3571428656578064, -0.64313727617263794, 0.64313727617263794), (0.36134454607963562, -0.63921570777893066, 0.63921570777893066), (0.36554622650146484, -0.63529413938522339, 0.63529413938522339), (0.36974790692329407, -0.63137257099151611, 0.63137257099151611), (0.37394958734512329, -0.62745100259780884, 0.62745100259780884), (0.37815126776695251, -0.62352943420410156, 0.62352943420410156), (0.38235294818878174, -0.61960786581039429, 0.61960786581039429), (0.38655462861061096, -0.61568629741668701, 0.61568629741668701), (0.39075630903244019, -0.61176472902297974, 0.61176472902297974), (0.39495798945426941, -0.60784316062927246, 0.60784316062927246), (0.39915966987609863, -0.60392159223556519, 0.60392159223556519), (0.40336135029792786, -0.60000002384185791, 0.60000002384185791), (0.40756303071975708, -0.59607845544815063, 0.59607845544815063), (0.4117647111415863, -0.58823531866073608, 0.58823531866073608), (0.41596639156341553, -0.58431375026702881, 0.58431375026702881), (0.42016807198524475, -0.58039218187332153, 0.58039218187332153), (0.42436975240707397, -0.57647061347961426, 0.57647061347961426), (0.4285714328289032, -0.57254904508590698, 0.57254904508590698), (0.43277311325073242, -0.56862747669219971, 0.56862747669219971), (0.43697479367256165, -0.56470590829849243, 0.56470590829849243), (0.44117647409439087, -0.56078433990478516, 0.56078433990478516), (0.44537815451622009, -0.55686277151107788, 0.55686277151107788), (0.44957983493804932, -0.55294120311737061, 0.55294120311737061), (0.45378151535987854, -0.54901963472366333, 0.54901963472366333), (0.45798319578170776, -0.54509806632995605, 0.54509806632995605), (0.46218487620353699, -0.54117649793624878, 0.54117649793624878), (0.46638655662536621, -0.5372549295425415, 0.5372549295425415), (0.47058823704719543, -0.53333336114883423, 0.53333336114883423), (0.47478991746902466, -0.52549022436141968, 0.52549022436141968), (0.47899159789085388, -0.5215686559677124, 0.5215686559677124), (0.48319327831268311, -0.51764708757400513, 0.51764708757400513), (0.48739495873451233, -0.51372551918029785, 0.51372551918029785), (0.49159663915634155, -0.50980395078659058, 0.50980395078659058), (0.49579831957817078, -0.5058823823928833, 0.5058823823928833), (0.5, 0.50196081399917603, -0.50196081399917603), (0.50420171022415161, 0.49803921580314636, -0.49803921580314636), (0.50840336084365845, 0.49411764740943909, -0.49411764740943909), (0.51260507106781006, 0.49019607901573181, -0.49019607901573181), (0.51680672168731689, 0.48627451062202454, -0.48627451062202454), (0.52100843191146851, 0.48235294222831726, -0.48235294222831726), (0.52521008253097534, 0.47843137383460999, -0.47843137383460999), (0.52941179275512695, 0.47450980544090271, -0.47450980544090271), (0.53361344337463379, 0.47058823704719543, -0.47058823704719543), (0.5378151535987854, 0.46274510025978088, -0.46274510025978088), (0.54201680421829224, 0.45882353186607361, -0.45882353186607361), (0.54621851444244385, 0.45490196347236633, -0.45490196347236633), (0.55042016506195068, 0.45098039507865906, -0.45098039507865906), (0.55462187528610229, 0.44705882668495178, -0.44705882668495178), (0.55882352590560913, 0.44313725829124451, -0.44313725829124451), (0.56302523612976074, 0.43921568989753723, -0.43921568989753723), (0.56722688674926758, 0.43529412150382996, -0.43529412150382996), (0.57142859697341919, 0.43137255311012268, -0.43137255311012268), (0.57563024759292603, 0.42745098471641541, -0.42745098471641541), (0.57983195781707764, 0.42352941632270813, -0.42352941632270813), (0.58403360843658447, 0.41960784792900085, -0.41960784792900085), (0.58823531866073608, 0.41568627953529358, -0.41568627953529358), (0.59243696928024292, 0.4117647111415863, -0.4117647111415863), (0.59663867950439453, 0.40784314274787903, -0.40784314274787903), (0.60084033012390137, 0.40000000596046448, -0.40000000596046448), (0.60504204034805298, 0.3960784375667572, -0.3960784375667572), (0.60924369096755981, 0.39215686917304993, -0.39215686917304993), (0.61344540119171143, 0.38823530077934265, -0.38823530077934265), (0.61764705181121826, 0.38431373238563538, -0.38431373238563538), (0.62184876203536987, 0.3803921639919281, -0.3803921639919281), (0.62605041265487671, 0.37647059559822083, -0.37647059559822083), (0.63025212287902832, 0.37254902720451355, -0.37254902720451355), (0.63445377349853516, 0.36862745881080627, -0.36862745881080627), (0.63865548372268677, 0.364705890417099, -0.364705890417099), (0.6428571343421936, 0.36078432202339172, -0.36078432202339172), (0.64705884456634521, 0.35686275362968445, -0.35686275362968445), (0.65126049518585205, 0.35294118523597717, -0.35294118523597717), (0.65546220541000366, 0.3490196168422699, -0.3490196168422699), (0.6596638560295105, 0.34509804844856262, -0.34509804844856262), (0.66386556625366211, 0.33725491166114807, -0.33725491166114807), (0.66806721687316895, 0.3333333432674408, -0.3333333432674408), (0.67226892709732056, 0.32941177487373352, -0.32941177487373352), (0.67647057771682739, 0.32549020648002625, -0.32549020648002625), (0.680672287940979, 0.32156863808631897, -0.32156863808631897), (0.68487393856048584, 0.31764706969261169, -0.31764706969261169), (0.68907564878463745, 0.31372550129890442, -0.31372550129890442), (0.69327729940414429, 0.30980393290519714, -0.30980393290519714), (0.6974790096282959, 0.30588236451148987, -0.30588236451148987), (0.70168066024780273, 0.30196079611778259, -0.30196079611778259), (0.70588237047195435, 0.29803922772407532, -0.29803922772407532), (0.71008402109146118, 0.29411765933036804, -0.29411765933036804), (0.71428573131561279, 0.29019609093666077, -0.29019609093666077), (0.71848738193511963, 0.28627452254295349, -0.28627452254295349), (0.72268909215927124, 0.28235295414924622, -0.28235295414924622), (0.72689074277877808, 0.27450981736183167, -0.27450981736183167), (0.73109245300292969, 0.27058824896812439, -0.27058824896812439), (0.73529410362243652, 0.26666668057441711, -0.26666668057441711), (0.73949581384658813, 0.26274511218070984, -0.26274511218070984), (0.74369746446609497, 0.25882354378700256, -0.25882354378700256), (0.74789917469024658, 0.25490197539329529, -0.25490197539329529), (0.75210082530975342, 0.25098040699958801, -0.25098040699958801), (0.75630253553390503, 0.24705882370471954, -0.24705882370471954), (0.76050418615341187, 0.24313725531101227, -0.24313725531101227), (0.76470589637756348, 0.23921568691730499, -0.23921568691730499), (0.76890754699707031, 0.23529411852359772, -0.23529411852359772), (0.77310925722122192, 0.23137255012989044, -0.23137255012989044), (0.77731090784072876, 0.22745098173618317, -0.22745098173618317), (0.78151261806488037, 0.22352941334247589, -0.22352941334247589), (0.78571426868438721, 0.21960784494876862, -0.21960784494876862), (0.78991597890853882, 0.21176470816135406, -0.21176470816135406), (0.79411762952804565, 0.20784313976764679, -0.20784313976764679), (0.79831933975219727, 0.20392157137393951, -0.20392157137393951), (0.8025209903717041, 0.20000000298023224, -0.20000000298023224), (0.80672270059585571, 0.19607843458652496, -0.19607843458652496), (0.81092435121536255, 0.19215686619281769, -0.19215686619281769), (0.81512606143951416, 0.18823529779911041, -0.18823529779911041), (0.819327712059021, 0.18431372940540314, -0.18431372940540314), (0.82352942228317261, 0.18039216101169586, -0.18039216101169586), (0.82773107290267944, 0.17647059261798859, -0.17647059261798859), (0.83193278312683105, 0.17254902422428131, -0.17254902422428131), (0.83613443374633789, 0.16862745583057404, -0.16862745583057404), (0.8403361439704895, 0.16470588743686676, -0.16470588743686676), (0.84453779458999634, 0.16078431904315948, -0.16078431904315948), (0.84873950481414795, 0.15686275064945221, -0.15686275064945221), (0.85294115543365479, 0.14901961386203766, -0.14901961386203766), (0.8571428656578064, 0.14509804546833038, -0.14509804546833038), (0.86134451627731323, 0.14117647707462311, -0.14117647707462311), (0.86554622650146484, 0.13725490868091583, -0.13725490868091583), (0.86974787712097168, 0.13333334028720856, -0.13333334028720856), (0.87394958734512329, 0.12941177189350128, -0.12941177189350128), (0.87815123796463013, 0.12549020349979401, -0.12549020349979401), (0.88235294818878174, 0.12156862765550613, -0.12156862765550613), (0.88655459880828857, 0.11764705926179886, -0.11764705926179886), (0.89075630903244019, 0.11372549086809158, -0.11372549086809158), (0.89495795965194702, 0.10980392247438431, -0.10980392247438431), (0.89915966987609863, 0.10588235408067703, -0.10588235408067703), (0.90336132049560547, 0.10196078568696976, -0.10196078568696976), (0.90756303071975708, 0.098039217293262482, -0.098039217293262482), (0.91176468133926392, 0.094117648899555206, -0.094117648899555206), (0.91596639156341553, 0.086274512112140656, -0.086274512112140656), (0.92016804218292236, 0.08235294371843338, -0.08235294371843338), (0.92436975240707397, 0.078431375324726105, -0.078431375324726105), (0.92857140302658081, 0.074509806931018829, -0.074509806931018829), (0.93277311325073242, 0.070588238537311554, -0.070588238537311554), (0.93697476387023926, 0.066666670143604279, -0.066666670143604279), (0.94117647409439087, 0.062745101749897003, -0.062745101749897003), (0.94537812471389771, 0.058823529630899429, -0.058823529630899429), (0.94957983493804932, 0.054901961237192154, -0.054901961237192154), (0.95378148555755615, 0.050980392843484879, -0.050980392843484879), (0.95798319578170776, 0.047058824449777603, -0.047058824449777603), (0.9621848464012146, 0.043137256056070328, -0.043137256056070328), (0.96638655662536621, 0.039215687662363052, -0.039215687662363052), (0.97058820724487305, 0.035294119268655777, -0.035294119268655777), (0.97478991746902466, 0.031372550874948502, -0.031372550874948502), (0.97899156808853149, 0.023529412224888802, -0.023529412224888802), (0.98319327831268311, 0.019607843831181526, -0.019607843831181526), (0.98739492893218994, 0.015686275437474251, -0.015686275437474251), (0.99159663915634155, 0.011764706112444401, -0.011764706112444401), (0.99579828977584839, 0.0078431377187371254, -0.0078431377187371254), (1.0, 0.0039215688593685627, -0.0039215688593685627)], 'green': [(0.0, 1.0, 1.0), -(0.0042016808874905109, 0.99607843160629272, 0.99607843160629272), -(0.0084033617749810219, 0.99215686321258545, 0.99215686321258545), -(0.012605042196810246, 0.98823529481887817, 0.98823529481887817), -(0.016806723549962044, 0.9843137264251709, 0.9843137264251709), -(0.021008403971791267, 0.98039215803146362, 0.98039215803146362), -(0.025210084393620491, 0.97647058963775635, 0.97647058963775635), -(0.029411764815449715, 0.97254902124404907, 0.97254902124404907), -(0.033613447099924088, 0.96470588445663452, 0.96470588445663452), -(0.037815127521753311, 0.96078431606292725, 0.96078431606292725), -(0.042016807943582535, 0.95686274766921997, 0.95686274766921997), -(0.046218488365411758, 0.9529411792755127, 0.9529411792755127), -(0.050420168787240982, 0.94901961088180542, 0.94901961088180542), -(0.054621849209070206, 0.94509804248809814, 0.94509804248809814), -(0.058823529630899429, 0.94117647409439087, 0.94117647409439087), -(0.063025213778018951, 0.93725490570068359, 0.93725490570068359), -(0.067226894199848175, 0.93333333730697632, 0.93333333730697632), -(0.071428574621677399, 0.92941176891326904, 0.92941176891326904), -(0.075630255043506622, 0.92549020051956177, 0.92549020051956177), -(0.079831935465335846, 0.92156863212585449, 0.92156863212585449), -(0.08403361588716507, 0.91764706373214722, 0.91764706373214722), -(0.088235296308994293, 0.91372549533843994, 0.91372549533843994), -(0.092436976730823517, 0.90980392694473267, 0.90980392694473267), -(0.09663865715265274, 0.90196079015731812, 0.90196079015731812), -(0.10084033757448196, 0.89803922176361084, 0.89803922176361084), -(0.10504201799631119, 0.89411765336990356, 0.89411765336990356), -(0.10924369841814041, 0.89019608497619629, 0.89019608497619629), -(0.11344537883996964, 0.88627451658248901, 0.88627451658248901), -(0.11764705926179886, 0.88235294818878174, 0.88235294818878174), -(0.12184873968362808, 0.87843137979507446, 0.87843137979507446), -(0.1260504275560379, 0.87450981140136719, 0.87450981140136719), -(0.13025210797786713, 0.87058824300765991, 0.87058824300765991), -(0.13445378839969635, 0.86666667461395264, 0.86666667461395264), -(0.13865546882152557, 0.86274510622024536, 0.86274510622024536), -(0.1428571492433548, 0.85882353782653809, 0.85882353782653809), -(0.14705882966518402, 0.85490196943283081, 0.85490196943283081), -(0.15126051008701324, 0.85098040103912354, 0.85098040103912354), -(0.15546219050884247, 0.84705883264541626, 0.84705883264541626), -(0.15966387093067169, 0.83921569585800171, 0.83921569585800171), -(0.16386555135250092, 0.83529412746429443, 0.83529412746429443), -(0.16806723177433014, 0.83137255907058716, 0.83137255907058716), -(0.17226891219615936, 0.82745099067687988, 0.82745099067687988), -(0.17647059261798859, 0.82352942228317261, 0.82352942228317261), -(0.18067227303981781, 0.81960785388946533, 0.81960785388946533), -(0.18487395346164703, 0.81568628549575806, 0.81568628549575806), -(0.18907563388347626, 0.81176471710205078, 0.81176471710205078), -(0.19327731430530548, 0.80784314870834351, 0.80784314870834351), -(0.1974789947271347, 0.80392158031463623, 0.80392158031463623), -(0.20168067514896393, 0.80000001192092896, 0.80000001192092896), -(0.20588235557079315, 0.79607844352722168, 0.79607844352722168), -(0.21008403599262238, 0.7921568751335144, 0.7921568751335144), -(0.2142857164144516, 0.78823530673980713, 0.78823530673980713), -(0.21848739683628082, 0.78431373834609985, 0.78431373834609985), -(0.22268907725811005, 0.7764706015586853, 0.7764706015586853), -(0.22689075767993927, 0.77254903316497803, 0.77254903316497803), -(0.23109243810176849, 0.76862746477127075, 0.76862746477127075), -(0.23529411852359772, 0.76470589637756348, 0.76470589637756348), -(0.23949579894542694, 0.7607843279838562, 0.7607843279838562), -(0.24369747936725616, 0.75686275959014893, 0.75686275959014893), -(0.24789915978908539, 0.75294119119644165, 0.75294119119644165), -(0.25210085511207581, 0.74901962280273438, 0.74901962280273438), -(0.25630253553390503, 0.7450980544090271, 0.7450980544090271), -(0.26050421595573425, 0.74117648601531982, 0.74117648601531982), -(0.26470589637756348, 0.73725491762161255, 0.73725491762161255), -(0.2689075767993927, 0.73333334922790527, 0.73333334922790527), -(0.27310925722122192, 0.729411780834198, 0.729411780834198), -(0.27731093764305115, 0.72549021244049072, 0.72549021244049072), -(0.28151261806488037, 0.72156864404678345, 0.72156864404678345), -(0.28571429848670959, 0.7137255072593689, 0.7137255072593689), -(0.28991597890853882, 0.70980393886566162, 0.70980393886566162), -(0.29411765933036804, 0.70588237047195435, 0.70588237047195435), -(0.29831933975219727, 0.70196080207824707, 0.70196080207824707), -(0.30252102017402649, 0.69803923368453979, 0.69803923368453979), -(0.30672270059585571, 0.69411766529083252, 0.69411766529083252), -(0.31092438101768494, 0.69019609689712524, 0.69019609689712524), -(0.31512606143951416, 0.68627452850341797, 0.68627452850341797), -(0.31932774186134338, 0.68235296010971069, 0.68235296010971069), -(0.32352942228317261, 0.67843139171600342, 0.67843139171600342), -(0.32773110270500183, 0.67450982332229614, 0.67450982332229614), -(0.33193278312683105, 0.67058825492858887, 0.67058825492858887), -(0.33613446354866028, 0.66666668653488159, 0.66666668653488159), -(0.3403361439704895, 0.66274511814117432, 0.66274511814117432), -(0.34453782439231873, 0.65882354974746704, 0.65882354974746704), -(0.34873950481414795, 0.65098041296005249, 0.65098041296005249), -(0.35294118523597717, 0.64705884456634521, 0.64705884456634521), -(0.3571428656578064, 0.64313727617263794, 0.64313727617263794), -(0.36134454607963562, 0.63921570777893066, 0.63921570777893066), -(0.36554622650146484, 0.63529413938522339, 0.63529413938522339), -(0.36974790692329407, 0.63137257099151611, 0.63137257099151611), -(0.37394958734512329, 0.62745100259780884, 0.62745100259780884), -(0.37815126776695251, 0.62352943420410156, 0.62352943420410156), -(0.38235294818878174, 0.61960786581039429, 0.61960786581039429), -(0.38655462861061096, 0.61568629741668701, 0.61568629741668701), -(0.39075630903244019, 0.61176472902297974, 0.61176472902297974), -(0.39495798945426941, 0.60784316062927246, 0.60784316062927246), -(0.39915966987609863, 0.60392159223556519, 0.60392159223556519), -(0.40336135029792786, 0.60000002384185791, 0.60000002384185791), -(0.40756303071975708, 0.59607845544815063, 0.59607845544815063), -(0.4117647111415863, 0.58823531866073608, 0.58823531866073608), -(0.41596639156341553, 0.58431375026702881, 0.58431375026702881), -(0.42016807198524475, 0.58039218187332153, 0.58039218187332153), -(0.42436975240707397, 0.57647061347961426, 0.57647061347961426), -(0.4285714328289032, 0.57254904508590698, 0.57254904508590698), -(0.43277311325073242, 0.56862747669219971, 0.56862747669219971), -(0.43697479367256165, 0.56470590829849243, 0.56470590829849243), -(0.44117647409439087, 0.56078433990478516, 0.56078433990478516), -(0.44537815451622009, 0.55686277151107788, 0.55686277151107788), -(0.44957983493804932, 0.55294120311737061, 0.55294120311737061), -(0.45378151535987854, 0.54901963472366333, 0.54901963472366333), -(0.45798319578170776, 0.54509806632995605, 0.54509806632995605), -(0.46218487620353699, 0.54117649793624878, 0.54117649793624878), -(0.46638655662536621, 0.5372549295425415, 0.5372549295425415), -(0.47058823704719543, 0.53333336114883423, 0.53333336114883423), -(0.47478991746902466, 0.52549022436141968, 0.52549022436141968), -(0.47899159789085388, 0.5215686559677124, 0.5215686559677124), -(0.48319327831268311, 0.51764708757400513, 0.51764708757400513), -(0.48739495873451233, 0.51372551918029785, 0.51372551918029785), -(0.49159663915634155, 0.50980395078659058, 0.50980395078659058), -(0.49579831957817078, 0.5058823823928833, 0.5058823823928833), (0.5, -0.50196081399917603, 0.50196081399917603), (0.50420171022415161, -0.49803921580314636, 0.49803921580314636), (0.50840336084365845, -0.49411764740943909, 0.49411764740943909), (0.51260507106781006, -0.49019607901573181, 0.49019607901573181), (0.51680672168731689, -0.48627451062202454, 0.48627451062202454), (0.52100843191146851, -0.48235294222831726, 0.48235294222831726), (0.52521008253097534, -0.47843137383460999, 0.47843137383460999), (0.52941179275512695, -0.47450980544090271, 0.47450980544090271), (0.53361344337463379, -0.47058823704719543, 0.47058823704719543), (0.5378151535987854, -0.46274510025978088, 0.46274510025978088), (0.54201680421829224, -0.45882353186607361, 0.45882353186607361), (0.54621851444244385, -0.45490196347236633, 0.45490196347236633), (0.55042016506195068, -0.45098039507865906, 0.45098039507865906), (0.55462187528610229, -0.44705882668495178, 0.44705882668495178), (0.55882352590560913, -0.44313725829124451, 0.44313725829124451), (0.56302523612976074, -0.43921568989753723, 0.43921568989753723), (0.56722688674926758, -0.43529412150382996, 0.43529412150382996), (0.57142859697341919, -0.43137255311012268, 0.43137255311012268), (0.57563024759292603, -0.42745098471641541, 0.42745098471641541), (0.57983195781707764, -0.42352941632270813, 0.42352941632270813), (0.58403360843658447, -0.41960784792900085, 0.41960784792900085), (0.58823531866073608, -0.41568627953529358, 0.41568627953529358), (0.59243696928024292, -0.4117647111415863, 0.4117647111415863), (0.59663867950439453, -0.40784314274787903, 0.40784314274787903), (0.60084033012390137, -0.40000000596046448, 0.40000000596046448), (0.60504204034805298, -0.3960784375667572, 0.3960784375667572), (0.60924369096755981, -0.39215686917304993, 0.39215686917304993), (0.61344540119171143, -0.38823530077934265, 0.38823530077934265), (0.61764705181121826, -0.38431373238563538, 0.38431373238563538), (0.62184876203536987, -0.3803921639919281, 0.3803921639919281), (0.62605041265487671, -0.37647059559822083, 0.37647059559822083), (0.63025212287902832, -0.37254902720451355, 0.37254902720451355), (0.63445377349853516, -0.36862745881080627, 0.36862745881080627), (0.63865548372268677, -0.364705890417099, 0.364705890417099), (0.6428571343421936, -0.36078432202339172, 0.36078432202339172), (0.64705884456634521, -0.35686275362968445, 0.35686275362968445), (0.65126049518585205, -0.35294118523597717, 0.35294118523597717), (0.65546220541000366, -0.3490196168422699, 0.3490196168422699), (0.6596638560295105, -0.34509804844856262, 0.34509804844856262), (0.66386556625366211, -0.33725491166114807, 0.33725491166114807), (0.66806721687316895, -0.3333333432674408, 0.3333333432674408), (0.67226892709732056, -0.32941177487373352, 0.32941177487373352), (0.67647057771682739, -0.32549020648002625, 0.32549020648002625), (0.680672287940979, -0.32156863808631897, 0.32156863808631897), (0.68487393856048584, -0.31764706969261169, 0.31764706969261169), (0.68907564878463745, -0.31372550129890442, 0.31372550129890442), (0.69327729940414429, -0.30980393290519714, 0.30980393290519714), (0.6974790096282959, -0.30588236451148987, 0.30588236451148987), (0.70168066024780273, -0.30196079611778259, 0.30196079611778259), (0.70588237047195435, -0.29803922772407532, 0.29803922772407532), (0.71008402109146118, -0.29411765933036804, 0.29411765933036804), (0.71428573131561279, -0.29019609093666077, 0.29019609093666077), (0.71848738193511963, -0.28627452254295349, 0.28627452254295349), (0.72268909215927124, -0.28235295414924622, 0.28235295414924622), (0.72689074277877808, -0.27450981736183167, 0.27450981736183167), (0.73109245300292969, -0.27058824896812439, 0.27058824896812439), (0.73529410362243652, -0.26666668057441711, 0.26666668057441711), (0.73949581384658813, -0.26274511218070984, 0.26274511218070984), (0.74369746446609497, -0.25882354378700256, 0.25882354378700256), (0.74789917469024658, -0.25490197539329529, 0.25490197539329529), (0.75210082530975342, -0.25098040699958801, 0.25098040699958801), (0.75630253553390503, -0.24705882370471954, 0.24705882370471954), (0.76050418615341187, -0.24313725531101227, 0.24313725531101227), (0.76470589637756348, -0.23921568691730499, 0.23921568691730499), (0.76890754699707031, -0.23529411852359772, 0.23529411852359772), (0.77310925722122192, -0.23137255012989044, 0.23137255012989044), (0.77731090784072876, -0.22745098173618317, 0.22745098173618317), (0.78151261806488037, -0.22352941334247589, 0.22352941334247589), (0.78571426868438721, -0.21960784494876862, 0.21960784494876862), (0.78991597890853882, -0.21176470816135406, 0.21176470816135406), (0.79411762952804565, -0.20784313976764679, 0.20784313976764679), (0.79831933975219727, -0.20392157137393951, 0.20392157137393951), (0.8025209903717041, -0.20000000298023224, 0.20000000298023224), (0.80672270059585571, -0.19607843458652496, 0.19607843458652496), (0.81092435121536255, -0.19215686619281769, 0.19215686619281769), (0.81512606143951416, -0.18823529779911041, 0.18823529779911041), (0.819327712059021, -0.18431372940540314, 0.18431372940540314), (0.82352942228317261, -0.18039216101169586, 0.18039216101169586), (0.82773107290267944, -0.17647059261798859, 0.17647059261798859), (0.83193278312683105, -0.17254902422428131, 0.17254902422428131), (0.83613443374633789, -0.16862745583057404, 0.16862745583057404), (0.8403361439704895, -0.16470588743686676, 0.16470588743686676), (0.84453779458999634, -0.16078431904315948, 0.16078431904315948), (0.84873950481414795, -0.15686275064945221, 0.15686275064945221), (0.85294115543365479, -0.14901961386203766, 0.14901961386203766), (0.8571428656578064, -0.14509804546833038, 0.14509804546833038), (0.86134451627731323, -0.14117647707462311, 0.14117647707462311), (0.86554622650146484, -0.13725490868091583, 0.13725490868091583), (0.86974787712097168, -0.13333334028720856, 0.13333334028720856), (0.87394958734512329, -0.12941177189350128, 0.12941177189350128), (0.87815123796463013, -0.12549020349979401, 0.12549020349979401), (0.88235294818878174, -0.12156862765550613, 0.12156862765550613), (0.88655459880828857, -0.11764705926179886, 0.11764705926179886), (0.89075630903244019, -0.11372549086809158, 0.11372549086809158), (0.89495795965194702, -0.10980392247438431, 0.10980392247438431), (0.89915966987609863, -0.10588235408067703, 0.10588235408067703), (0.90336132049560547, -0.10196078568696976, 0.10196078568696976), (0.90756303071975708, -0.098039217293262482, 0.098039217293262482), (0.91176468133926392, -0.094117648899555206, 0.094117648899555206), (0.91596639156341553, -0.086274512112140656, 0.086274512112140656), (0.92016804218292236, -0.08235294371843338, 0.08235294371843338), (0.92436975240707397, -0.078431375324726105, 0.078431375324726105), (0.92857140302658081, -0.074509806931018829, 0.074509806931018829), (0.93277311325073242, -0.070588238537311554, 0.070588238537311554), (0.93697476387023926, -0.066666670143604279, 0.066666670143604279), (0.94117647409439087, -0.062745101749897003, 0.062745101749897003), (0.94537812471389771, -0.058823529630899429, 0.058823529630899429), (0.94957983493804932, -0.054901961237192154, 0.054901961237192154), (0.95378148555755615, -0.050980392843484879, 0.050980392843484879), (0.95798319578170776, -0.047058824449777603, 0.047058824449777603), (0.9621848464012146, -0.043137256056070328, 0.043137256056070328), (0.96638655662536621, -0.039215687662363052, 0.039215687662363052), (0.97058820724487305, -0.035294119268655777, 0.035294119268655777), (0.97478991746902466, -0.031372550874948502, 0.031372550874948502), (0.97899156808853149, -0.023529412224888802, 0.023529412224888802), (0.98319327831268311, -0.019607843831181526, 0.019607843831181526), (0.98739492893218994, -0.015686275437474251, 0.015686275437474251), (0.99159663915634155, -0.011764706112444401, 0.011764706112444401), (0.99579828977584839, -0.0078431377187371254, 0.0078431377187371254), (1.0, -0.0039215688593685627, 0.0039215688593685627)], 'red': [(0.0, 1.0, 1.0), -(0.0042016808874905109, 0.99607843160629272, 0.99607843160629272), -(0.0084033617749810219, 0.99215686321258545, 0.99215686321258545), -(0.012605042196810246, 0.98823529481887817, 0.98823529481887817), -(0.016806723549962044, 0.9843137264251709, 0.9843137264251709), -(0.021008403971791267, 0.98039215803146362, 0.98039215803146362), -(0.025210084393620491, 0.97647058963775635, 0.97647058963775635), -(0.029411764815449715, 0.97254902124404907, 0.97254902124404907), -(0.033613447099924088, 0.96470588445663452, 0.96470588445663452), -(0.037815127521753311, 0.96078431606292725, 0.96078431606292725), -(0.042016807943582535, 0.95686274766921997, 0.95686274766921997), -(0.046218488365411758, 0.9529411792755127, 0.9529411792755127), -(0.050420168787240982, 0.94901961088180542, 0.94901961088180542), -(0.054621849209070206, 0.94509804248809814, 0.94509804248809814), -(0.058823529630899429, 0.94117647409439087, 0.94117647409439087), -(0.063025213778018951, 0.93725490570068359, 0.93725490570068359), -(0.067226894199848175, 0.93333333730697632, 0.93333333730697632), -(0.071428574621677399, 0.92941176891326904, 0.92941176891326904), -(0.075630255043506622, 0.92549020051956177, 0.92549020051956177), -(0.079831935465335846, 0.92156863212585449, 0.92156863212585449), -(0.08403361588716507, 0.91764706373214722, 0.91764706373214722), -(0.088235296308994293, 0.91372549533843994, 0.91372549533843994), -(0.092436976730823517, 0.90980392694473267, 0.90980392694473267), -(0.09663865715265274, 0.90196079015731812, 0.90196079015731812), -(0.10084033757448196, 0.89803922176361084, 0.89803922176361084), -(0.10504201799631119, 0.89411765336990356, 0.89411765336990356), -(0.10924369841814041, 0.89019608497619629, 0.89019608497619629), -(0.11344537883996964, 0.88627451658248901, 0.88627451658248901), -(0.11764705926179886, 0.88235294818878174, 0.88235294818878174), -(0.12184873968362808, 0.87843137979507446, 0.87843137979507446), -(0.1260504275560379, 0.87450981140136719, 0.87450981140136719), -(0.13025210797786713, 0.87058824300765991, 0.87058824300765991), -(0.13445378839969635, 0.86666667461395264, 0.86666667461395264), -(0.13865546882152557, 0.86274510622024536, 0.86274510622024536), -(0.1428571492433548, 0.85882353782653809, 0.85882353782653809), -(0.14705882966518402, 0.85490196943283081, 0.85490196943283081), -(0.15126051008701324, 0.85098040103912354, 0.85098040103912354), -(0.15546219050884247, 0.84705883264541626, 0.84705883264541626), -(0.15966387093067169, 0.83921569585800171, 0.83921569585800171), -(0.16386555135250092, 0.83529412746429443, 0.83529412746429443), -(0.16806723177433014, 0.83137255907058716, 0.83137255907058716), -(0.17226891219615936, 0.82745099067687988, 0.82745099067687988), -(0.17647059261798859, 0.82352942228317261, 0.82352942228317261), -(0.18067227303981781, 0.81960785388946533, 0.81960785388946533), -(0.18487395346164703, 0.81568628549575806, 0.81568628549575806), -(0.18907563388347626, 0.81176471710205078, 0.81176471710205078), -(0.19327731430530548, 0.80784314870834351, 0.80784314870834351), -(0.1974789947271347, 0.80392158031463623, 0.80392158031463623), -(0.20168067514896393, 0.80000001192092896, 0.80000001192092896), -(0.20588235557079315, 0.79607844352722168, 0.79607844352722168), -(0.21008403599262238, 0.7921568751335144, 0.7921568751335144), -(0.2142857164144516, 0.78823530673980713, 0.78823530673980713), -(0.21848739683628082, 0.78431373834609985, 0.78431373834609985), -(0.22268907725811005, 0.7764706015586853, 0.7764706015586853), -(0.22689075767993927, 0.77254903316497803, 0.77254903316497803), -(0.23109243810176849, 0.76862746477127075, 0.76862746477127075), -(0.23529411852359772, 0.76470589637756348, 0.76470589637756348), -(0.23949579894542694, 0.7607843279838562, 0.7607843279838562), -(0.24369747936725616, 0.75686275959014893, 0.75686275959014893), -(0.24789915978908539, 0.75294119119644165, 0.75294119119644165), -(0.25210085511207581, 0.74901962280273438, 0.74901962280273438), -(0.25630253553390503, 0.7450980544090271, 0.7450980544090271), -(0.26050421595573425, 0.74117648601531982, 0.74117648601531982), -(0.26470589637756348, 0.73725491762161255, 0.73725491762161255), -(0.2689075767993927, 0.73333334922790527, 0.73333334922790527), -(0.27310925722122192, 0.729411780834198, 0.729411780834198), -(0.27731093764305115, 0.72549021244049072, 0.72549021244049072), -(0.28151261806488037, 0.72156864404678345, 0.72156864404678345), -(0.28571429848670959, 0.7137255072593689, 0.7137255072593689), -(0.28991597890853882, 0.70980393886566162, 0.70980393886566162), -(0.29411765933036804, 0.70588237047195435, 0.70588237047195435), -(0.29831933975219727, 0.70196080207824707, 0.70196080207824707), -(0.30252102017402649, 0.69803923368453979, 0.69803923368453979), -(0.30672270059585571, 0.69411766529083252, 0.69411766529083252), -(0.31092438101768494, 0.69019609689712524, 0.69019609689712524), -(0.31512606143951416, 0.68627452850341797, 0.68627452850341797), -(0.31932774186134338, 0.68235296010971069, 0.68235296010971069), -(0.32352942228317261, 0.67843139171600342, 0.67843139171600342), -(0.32773110270500183, 0.67450982332229614, 0.67450982332229614), -(0.33193278312683105, 0.67058825492858887, 0.67058825492858887), -(0.33613446354866028, 0.66666668653488159, 0.66666668653488159), -(0.3403361439704895, 0.66274511814117432, 0.66274511814117432), -(0.34453782439231873, 0.65882354974746704, 0.65882354974746704), -(0.34873950481414795, 0.65098041296005249, 0.65098041296005249), -(0.35294118523597717, 0.64705884456634521, 0.64705884456634521), -(0.3571428656578064, 0.64313727617263794, 0.64313727617263794), -(0.36134454607963562, 0.63921570777893066, 0.63921570777893066), -(0.36554622650146484, 0.63529413938522339, 0.63529413938522339), -(0.36974790692329407, 0.63137257099151611, 0.63137257099151611), -(0.37394958734512329, 0.62745100259780884, 0.62745100259780884), -(0.37815126776695251, 0.62352943420410156, 0.62352943420410156), -(0.38235294818878174, 0.61960786581039429, 0.61960786581039429), -(0.38655462861061096, 0.61568629741668701, 0.61568629741668701), -(0.39075630903244019, 0.61176472902297974, 0.61176472902297974), -(0.39495798945426941, 0.60784316062927246, 0.60784316062927246), -(0.39915966987609863, 0.60392159223556519, 0.60392159223556519), -(0.40336135029792786, 0.60000002384185791, 0.60000002384185791), -(0.40756303071975708, 0.59607845544815063, 0.59607845544815063), -(0.4117647111415863, 0.58823531866073608, 0.58823531866073608), -(0.41596639156341553, 0.58431375026702881, 0.58431375026702881), -(0.42016807198524475, 0.58039218187332153, 0.58039218187332153), -(0.42436975240707397, 0.57647061347961426, 0.57647061347961426), -(0.4285714328289032, 0.57254904508590698, 0.57254904508590698), -(0.43277311325073242, 0.56862747669219971, 0.56862747669219971), -(0.43697479367256165, 0.56470590829849243, 0.56470590829849243), -(0.44117647409439087, 0.56078433990478516, 0.56078433990478516), -(0.44537815451622009, 0.55686277151107788, 0.55686277151107788), -(0.44957983493804932, 0.55294120311737061, 0.55294120311737061), -(0.45378151535987854, 0.54901963472366333, 0.54901963472366333), -(0.45798319578170776, 0.54509806632995605, 0.54509806632995605), -(0.46218487620353699, 0.54117649793624878, 0.54117649793624878), -(0.46638655662536621, 0.5372549295425415, 0.5372549295425415), -(0.47058823704719543, 0.53333336114883423, 0.53333336114883423), -(0.47478991746902466, 0.52549022436141968, 0.52549022436141968), -(0.47899159789085388, 0.5215686559677124, 0.5215686559677124), -(0.48319327831268311, 0.51764708757400513, 0.51764708757400513), -(0.48739495873451233, 0.51372551918029785, 0.51372551918029785), -(0.49159663915634155, 0.50980395078659058, 0.50980395078659058), -(0.49579831957817078, 0.5058823823928833, 0.5058823823928833), (0.5, -0.50196081399917603, 0.50196081399917603), (0.50420171022415161, -0.49803921580314636, 0.49803921580314636), (0.50840336084365845, -0.49411764740943909, 0.49411764740943909), (0.51260507106781006, -0.49019607901573181, 0.49019607901573181), (0.51680672168731689, -0.48627451062202454, 0.48627451062202454), (0.52100843191146851, -0.48235294222831726, 0.48235294222831726), (0.52521008253097534, -0.47843137383460999, 0.47843137383460999), (0.52941179275512695, -0.47450980544090271, 0.47450980544090271), (0.53361344337463379, -0.47058823704719543, 0.47058823704719543), (0.5378151535987854, -0.46274510025978088, 0.46274510025978088), (0.54201680421829224, -0.45882353186607361, 0.45882353186607361), (0.54621851444244385, -0.45490196347236633, 0.45490196347236633), (0.55042016506195068, -0.45098039507865906, 0.45098039507865906), (0.55462187528610229, -0.44705882668495178, 0.44705882668495178), (0.55882352590560913, -0.44313725829124451, 0.44313725829124451), (0.56302523612976074, -0.43921568989753723, 0.43921568989753723), (0.56722688674926758, -0.43529412150382996, 0.43529412150382996), (0.57142859697341919, -0.43137255311012268, 0.43137255311012268), (0.57563024759292603, -0.42745098471641541, 0.42745098471641541), (0.57983195781707764, -0.42352941632270813, 0.42352941632270813), (0.58403360843658447, -0.41960784792900085, 0.41960784792900085), (0.58823531866073608, -0.41568627953529358, 0.41568627953529358), (0.59243696928024292, -0.4117647111415863, 0.4117647111415863), (0.59663867950439453, -0.40784314274787903, 0.40784314274787903), (0.60084033012390137, -0.40000000596046448, 0.40000000596046448), (0.60504204034805298, -0.3960784375667572, 0.3960784375667572), (0.60924369096755981, -0.39215686917304993, 0.39215686917304993), (0.61344540119171143, -0.38823530077934265, 0.38823530077934265), (0.61764705181121826, -0.38431373238563538, 0.38431373238563538), (0.62184876203536987, -0.3803921639919281, 0.3803921639919281), (0.62605041265487671, -0.37647059559822083, 0.37647059559822083), (0.63025212287902832, -0.37254902720451355, 0.37254902720451355), (0.63445377349853516, -0.36862745881080627, 0.36862745881080627), (0.63865548372268677, -0.364705890417099, 0.364705890417099), (0.6428571343421936, -0.36078432202339172, 0.36078432202339172), (0.64705884456634521, -0.35686275362968445, 0.35686275362968445), (0.65126049518585205, -0.35294118523597717, 0.35294118523597717), (0.65546220541000366, -0.3490196168422699, 0.3490196168422699), (0.6596638560295105, -0.34509804844856262, 0.34509804844856262), (0.66386556625366211, -0.33725491166114807, 0.33725491166114807), (0.66806721687316895, -0.3333333432674408, 0.3333333432674408), (0.67226892709732056, -0.32941177487373352, 0.32941177487373352), (0.67647057771682739, -0.32549020648002625, 0.32549020648002625), (0.680672287940979, -0.32156863808631897, 0.32156863808631897), (0.68487393856048584, -0.31764706969261169, 0.31764706969261169), (0.68907564878463745, -0.31372550129890442, 0.31372550129890442), (0.69327729940414429, -0.30980393290519714, 0.30980393290519714), (0.6974790096282959, -0.30588236451148987, 0.30588236451148987), (0.70168066024780273, -0.30196079611778259, 0.30196079611778259), (0.70588237047195435, -0.29803922772407532, 0.29803922772407532), (0.71008402109146118, -0.29411765933036804, 0.29411765933036804), (0.71428573131561279, -0.29019609093666077, 0.29019609093666077), (0.71848738193511963, -0.28627452254295349, 0.28627452254295349), (0.72268909215927124, -0.28235295414924622, 0.28235295414924622), (0.72689074277877808, -0.27450981736183167, 0.27450981736183167), (0.73109245300292969, -0.27058824896812439, 0.27058824896812439), (0.73529410362243652, -0.26666668057441711, 0.26666668057441711), (0.73949581384658813, -0.26274511218070984, 0.26274511218070984), (0.74369746446609497, -0.25882354378700256, 0.25882354378700256), (0.74789917469024658, -0.25490197539329529, 0.25490197539329529), (0.75210082530975342, -0.25098040699958801, 0.25098040699958801), (0.75630253553390503, -0.24705882370471954, 0.24705882370471954), (0.76050418615341187, -0.24313725531101227, 0.24313725531101227), (0.76470589637756348, -0.23921568691730499, 0.23921568691730499), (0.76890754699707031, -0.23529411852359772, 0.23529411852359772), (0.77310925722122192, -0.23137255012989044, 0.23137255012989044), (0.77731090784072876, -0.22745098173618317, 0.22745098173618317), (0.78151261806488037, -0.22352941334247589, 0.22352941334247589), (0.78571426868438721, -0.21960784494876862, 0.21960784494876862), (0.78991597890853882, -0.21176470816135406, 0.21176470816135406), (0.79411762952804565, -0.20784313976764679, 0.20784313976764679), (0.79831933975219727, -0.20392157137393951, 0.20392157137393951), (0.8025209903717041, -0.20000000298023224, 0.20000000298023224), (0.80672270059585571, -0.19607843458652496, 0.19607843458652496), (0.81092435121536255, -0.19215686619281769, 0.19215686619281769), (0.81512606143951416, -0.18823529779911041, 0.18823529779911041), (0.819327712059021, -0.18431372940540314, 0.18431372940540314), (0.82352942228317261, -0.18039216101169586, 0.18039216101169586), (0.82773107290267944, -0.17647059261798859, 0.17647059261798859), (0.83193278312683105, -0.17254902422428131, 0.17254902422428131), (0.83613443374633789, -0.16862745583057404, 0.16862745583057404), (0.8403361439704895, -0.16470588743686676, 0.16470588743686676), (0.84453779458999634, -0.16078431904315948, 0.16078431904315948), (0.84873950481414795, -0.15686275064945221, 0.15686275064945221), (0.85294115543365479, -0.14901961386203766, 0.14901961386203766), (0.8571428656578064, -0.14509804546833038, 0.14509804546833038), (0.86134451627731323, -0.14117647707462311, 0.14117647707462311), (0.86554622650146484, -0.13725490868091583, 0.13725490868091583), (0.86974787712097168, -0.13333334028720856, 0.13333334028720856), (0.87394958734512329, -0.12941177189350128, 0.12941177189350128), (0.87815123796463013, -0.12549020349979401, 0.12549020349979401), (0.88235294818878174, -0.12156862765550613, 0.12156862765550613), (0.88655459880828857, -0.11764705926179886, 0.11764705926179886), (0.89075630903244019, -0.11372549086809158, 0.11372549086809158), (0.89495795965194702, -0.10980392247438431, 0.10980392247438431), (0.89915966987609863, -0.10588235408067703, 0.10588235408067703), (0.90336132049560547, -0.10196078568696976, 0.10196078568696976), (0.90756303071975708, -0.098039217293262482, 0.098039217293262482), (0.91176468133926392, -0.094117648899555206, 0.094117648899555206), (0.91596639156341553, -0.086274512112140656, 0.086274512112140656), (0.92016804218292236, -0.08235294371843338, 0.08235294371843338), (0.92436975240707397, -0.078431375324726105, 0.078431375324726105), (0.92857140302658081, -0.074509806931018829, 0.074509806931018829), (0.93277311325073242, -0.070588238537311554, 0.070588238537311554), (0.93697476387023926, -0.066666670143604279, 0.066666670143604279), (0.94117647409439087, -0.062745101749897003, 0.062745101749897003), (0.94537812471389771, -0.058823529630899429, 0.058823529630899429), (0.94957983493804932, -0.054901961237192154, 0.054901961237192154), (0.95378148555755615, -0.050980392843484879, 0.050980392843484879), (0.95798319578170776, -0.047058824449777603, 0.047058824449777603), (0.9621848464012146, -0.043137256056070328, 0.043137256056070328), (0.96638655662536621, -0.039215687662363052, 0.039215687662363052), (0.97058820724487305, -0.035294119268655777, 0.035294119268655777), (0.97478991746902466, -0.031372550874948502, 0.031372550874948502), (0.97899156808853149, -0.023529412224888802, 0.023529412224888802), (0.98319327831268311, -0.019607843831181526, 0.019607843831181526), (0.98739492893218994, -0.015686275437474251, 0.015686275437474251), (0.99159663915634155, -0.011764706112444401, 0.011764706112444401), (0.99579828977584839, -0.0078431377187371254, 0.0078431377187371254), (1.0, -0.0039215688593685627, 0.0039215688593685627)]} +# +# Most palette functions have been reduced to simple function descriptions +# by Reinier Heeres, since the rgb components were mostly straight lines. +# gist_earth_data and gist_ncar_data were simplified by a script and some +# manual effort. + +_gist_earth_data = \ +{'red': ( +(0.0, 0.0, 0.0000), +(0.2824, 0.1882, 0.1882), +(0.4588, 0.2714, 0.2714), +(0.5490, 0.4719, 0.4719), +(0.6980, 0.7176, 0.7176), +(0.7882, 0.7553, 0.7553), +(1.0000, 0.9922, 0), +), 'green': ( +(0.0, 0.0, 0.0000), +(0.0275, 0.0000, 0.0000), +(0.1098, 0.1893, 0.1893), +(0.1647, 0.3035, 0.3035), +(0.2078, 0.3841, 0.3841), +(0.2824, 0.5020, 0.5020), +(0.5216, 0.6397, 0.6397), +(0.6980, 0.7171, 0.7171), +(0.7882, 0.6392, 0.6392), +(0.7922, 0.6413, 0.6413), +(0.8000, 0.6447, 0.6447), +(0.8078, 0.6481, 0.6481), +(0.8157, 0.6549, 0.6549), +(0.8667, 0.6991, 0.6991), +(0.8745, 0.7103, 0.7103), +(0.8824, 0.7216, 0.7216), +(0.8902, 0.7323, 0.7323), +(0.8980, 0.7430, 0.7430), +(0.9412, 0.8275, 0.8275), +(0.9569, 0.8635, 0.8635), +(0.9647, 0.8816, 0.8816), +(0.9961, 0.9733, 0.9733), +(1.0000, 0.9843, 0), +), 'blue': ( +(0.0, 0.0, 0.0000), +(0.0039, 0.1684, 0.1684), +(0.0078, 0.2212, 0.2212), +(0.0275, 0.4329, 0.4329), +(0.0314, 0.4549, 0.4549), +(0.2824, 0.5004, 0.5004), +(0.4667, 0.2748, 0.2748), +(0.5451, 0.3205, 0.3205), +(0.7843, 0.3961, 0.3961), +(0.8941, 0.6651, 0.6651), +(1.0000, 0.9843, 0), +)} + +_gist_gray_data = { + 'red': gfunc[3], + 'green': gfunc[3], + 'blue': gfunc[3], +} + +_gist_heat_data = { + 'red': lambda x: 1.5 * x, + 'green': lambda x: 2 * x - 1, + 'blue': lambda x: 4 * x - 3, +} + +_gist_ncar_data = \ +{'red': ( +(0.0, 0.0, 0.0000), +(0.3098, 0.0000, 0.0000), +(0.3725, 0.3993, 0.3993), +(0.4235, 0.5003, 0.5003), +(0.5333, 1.0000, 1.0000), +(0.7922, 1.0000, 1.0000), +(0.8471, 0.6218, 0.6218), +(0.8980, 0.9235, 0.9235), +(1.0000, 0.9961, 0), +), 'green': ( +(0.0, 0.0, 0.0000), +(0.0510, 0.3722, 0.3722), +(0.1059, 0.0000, 0.0000), +(0.1569, 0.7202, 0.7202), +(0.1608, 0.7537, 0.7537), +(0.1647, 0.7752, 0.7752), +(0.2157, 1.0000, 1.0000), +(0.2588, 0.9804, 0.9804), +(0.2706, 0.9804, 0.9804), +(0.3176, 1.0000, 1.0000), +(0.3686, 0.8081, 0.8081), +(0.4275, 1.0000, 1.0000), +(0.5216, 1.0000, 1.0000), +(0.6314, 0.7292, 0.7292), +(0.6863, 0.2796, 0.2796), +(0.7451, 0.0000, 0.0000), +(0.7922, 0.0000, 0.0000), +(0.8431, 0.1753, 0.1753), +(0.8980, 0.5000, 0.5000), +(1.0000, 0.9725, 0), +), 'blue': ( +(0.0, 0.0, 0.5020), +(0.0510, 0.0222, 0.0222), +(0.1098, 1.0000, 1.0000), +(0.2039, 1.0000, 1.0000), +(0.2627, 0.6145, 0.6145), +(0.3216, 0.0000, 0.0000), +(0.4157, 0.0000, 0.0000), +(0.4745, 0.2342, 0.2342), +(0.5333, 0.0000, 0.0000), +(0.5804, 0.0000, 0.0000), +(0.6314, 0.0549, 0.0549), +(0.6902, 0.0000, 0.0000), +(0.7373, 0.0000, 0.0000), +(0.7922, 0.9738, 0.9738), +(0.8000, 1.0000, 1.0000), +(0.8431, 1.0000, 1.0000), +(0.8980, 0.9341, 0.9341), +(1.0000, 0.9961, 0), +)} + +_gist_rainbow_data = ( + (0.000, (1.00, 0.00, 0.16)), + (0.030, (1.00, 0.00, 0.00)), + (0.215, (1.00, 1.00, 0.00)), + (0.400, (0.00, 1.00, 0.00)), + (0.586, (0.00, 1.00, 1.00)), + (0.770, (0.00, 0.00, 1.00)), + (0.954, (1.00, 0.00, 1.00)), + (1.000, (1.00, 0.00, 0.75)) +) + +_gist_stern_data = { + 'red': ( + (0.000, 0.000, 0.000), (0.0547, 1.000, 1.000), + (0.250, 0.027, 0.027), (0.2500, 0.250, 0.250), + (1.000, 1.000, 1.000)), + 'green': ((0, 0, 0), (1, 1, 0)), + 'blue': ( + (0.000, 0.000, 0.000), (0.500, 1.000, 1.000), + (0.735, 0.000, 0.000), (1.000, 1.000, 1.000)) +} + +_gist_yarg_data = { + 'red': lambda x: 1 - x, + 'green': lambda x: 1 - x, + 'blue': lambda x: 1 - x, +} datad = { + 'afmhot': _afmhot_data, 'autumn': _autumn_data, 'bone': _bone_data, - 'binary': _binary_data, + 'binary': _binary_data, + 'bwr': _bwr_data, + 'brg': _brg_data, 'cool': _cool_data, 'copper': _copper_data, 'flag': _flag_data, + 'gnuplot': _gnuplot_data, + 'gnuplot2': _gnuplot2_data, 'gray' : _gray_data, 'hot': _hot_data, 'hsv': _hsv_data, 'jet' : _jet_data, + 'ocean': _ocean_data, 'pink': _pink_data, 'prism': _prism_data, + 'rainbow': _rainbow_data, + 'seismic': _seismic_data, 'spring': _spring_data, 'summer': _summer_data, + 'terrain': _terrain_data, 'winter': _winter_data, 'spectral': _spectral_data } @@ -5874,7 +1638,3 @@ datad['gist_stern']=_gist_stern_data datad['gist_yarg']=_gist_yarg_data - - - - diff --git a/lib/matplotlib/cm.py b/lib/matplotlib/cm.py index bc7d6c6d2ad4..45b2c45e4cc7 100644 --- a/lib/matplotlib/cm.py +++ b/lib/matplotlib/cm.py @@ -14,7 +14,6 @@ import matplotlib.cbook as cbook from matplotlib._cm import datad - cmap_d = dict() # reverse all the colormaps. @@ -23,7 +22,10 @@ def revcmap(data): data_r = {} for key, val in data.iteritems(): - valnew = [(1.0-a, b, c) for a, b, c in reversed(val)] + if callable(val): + valnew = lambda x: 1 - val(x) + else: + valnew = [(1.0 - a, b, c) for a, b, c in reversed(val)] data_r[key] = valnew return data_r @@ -33,12 +35,21 @@ def revcmap(data): for cmapname in _cmapnames: cmapname_r = cmapname+'_r' - cmapdat_r = revcmap(datad[cmapname]) - datad[cmapname_r] = cmapdat_r - cmap_d[cmapname] = colors.LinearSegmentedColormap( - cmapname, datad[cmapname], LUTSIZE) - cmap_d[cmapname_r] = colors.LinearSegmentedColormap( - cmapname_r, cmapdat_r, LUTSIZE) + cmapspec = datad[cmapname] + if 'red' in cmapspec: + datad[cmapname_r] = revcmap(cmapspec) + cmap_d[cmapname] = colors.LinearSegmentedColormap( + cmapname, cmapspec, LUTSIZE) + cmap_d[cmapname_r] = colors.LinearSegmentedColormap( + cmapname_r, datad[cmapname_r], LUTSIZE) + else: + datad[cmapname] = list(cmapspec) + datad[cmapname_r] = list(datad[cmapname]) + datad[cmapname_r].reverse() + cmap_d[cmapname] = colors.LinearSegmentedColormap.from_list( + cmapname, datad[cmapname], LUTSIZE) + cmap_d[cmapname_r] = colors.LinearSegmentedColormap.from_list( + cmapname_r, datad[cmapname_r], LUTSIZE) locals().update(cmap_d) diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index 24ea21c7ae1d..cf0ae0585529 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -394,7 +394,7 @@ def to_rgba_array(self, c, alpha=None): colorConverter = ColorConverter() -def makeMappingArray(N, data): +def makeMappingArray(N, data, gamma=1.0): """Create an *N* -element 1-d lookup table *data* represented by a list of x,y0,y1 mapping correspondences. @@ -408,9 +408,18 @@ def makeMappingArray(N, data): all values of x must be in increasing order. Values between the given mapping points are determined by simple linear interpolation. + Alternatively, data can be a function mapping values between 0 - 1 + to 0 - 1. + The function returns an array "result" where ``result[x*(N-1)]`` gives the closest value for values of x between 0 and 1. """ + + if callable(data): + xind = np.linspace(0, 1, N)**gamma + lut = np.clip(np.array(data(xind), dtype=np.float), 0, 1) + return lut + try: adata = np.array(data) except: @@ -432,7 +441,7 @@ def makeMappingArray(N, data): # begin generation of lookup table x = x * (N-1) lut = np.zeros((N,), np.float) - xind = np.arange(float(N)) + xind = (N - 1) * np.linspace(0, 1, N)**gamma ind = np.searchsorted(x, xind)[1:-1] lut[1:-1] = ( ((xind[1:-1] - x[ind-1]) / (x[ind] - x[ind-1])) @@ -581,7 +590,7 @@ class LinearSegmentedColormap(Colormap): primary color, with the 0-1 domain divided into any number of segments. """ - def __init__(self, name, segmentdata, N=256): + def __init__(self, name, segmentdata, N=256, gamma=1.0): """Create color map from linear mapping segments segmentdata argument is a dictionary with a red, green and blue @@ -628,26 +637,46 @@ def __init__(self, name, segmentdata, N=256): # needed for contouring. Colormap.__init__(self, name, N) self._segmentdata = segmentdata + self._gamma = gamma def _init(self): self._lut = np.ones((self.N + 3, 4), np.float) - self._lut[:-3, 0] = makeMappingArray(self.N, self._segmentdata['red']) - self._lut[:-3, 1] = makeMappingArray(self.N, self._segmentdata['green']) - self._lut[:-3, 2] = makeMappingArray(self.N, self._segmentdata['blue']) + self._lut[:-3, 0] = makeMappingArray(self.N, + self._segmentdata['red'], self._gamma) + self._lut[:-3, 1] = makeMappingArray(self.N, + self._segmentdata['green'], self._gamma) + self._lut[:-3, 2] = makeMappingArray(self.N, + self._segmentdata['blue'], self._gamma) self._isinit = True self._set_extremes() + def set_gamma(self, gamma): + """ + Set a new gamma value and regenerate color map. + """ + self._gamma = gamma + self._init() + @staticmethod - def from_list(name, colors, N=256): + def from_list(name, colors, N=256, gamma=1.0): """ Make a linear segmented colormap with *name* from a sequence of *colors* which evenly transitions from colors[0] at val=1 to colors[-1] at val=1. N is the number of rgb quantization levels. + Alternatively, a list of (value, color) tuples can be given + to divide the range unevenly. """ - ncolors = len(colors) - vals = np.linspace(0., 1., ncolors) + if not cbook.iterable(colors): + raise ValueError('colors must be iterable') + + if cbook.iterable(colors[0]) and len(colors[0]) == 2 and \ + not cbook.is_string_like(colors[0]): + # List of value, color pairs + vals, colors = zip(*colors) + else: + vals = np.linspace(0., 1., len(colors)) cdict = dict(red=[], green=[], blue=[]) for val, color in zip(vals, colors): @@ -656,7 +685,7 @@ def from_list(name, colors, N=256): cdict['green'].append((val, g, g)) cdict['blue'].append((val, b, b)) - return LinearSegmentedColormap(name, cdict, N) + return LinearSegmentedColormap(name, cdict, N, gamma) class ListedColormap(Colormap): """Colormap object generated from a list of colors. From f96e11d4aa0d06f7f4a97d3094db346b9819893b Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 31 Aug 2009 20:10:35 +0000 Subject: [PATCH 0134/1000] Add "draw_gouraud_triangles" (note the 's') backend method. Add initial support in Pdf backend (working in xpdf and evince, but not in acroread, strangely). svn path=/trunk/matplotlib/; revision=7621 --- lib/matplotlib/backend_bases.py | 27 ++++- lib/matplotlib/backends/backend_agg.py | 1 + lib/matplotlib/backends/backend_mixed.py | 3 +- lib/matplotlib/backends/backend_pdf.py | 57 +++++++++- lib/matplotlib/collections.py | 3 +- src/_backend_agg.cpp | 127 ++++++++++++++++------- src/_backend_agg.h | 6 ++ 7 files changed, 182 insertions(+), 42 deletions(-) diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 103131f00618..8c8de06509ff 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -170,10 +170,31 @@ def draw_gouraud_triangle(self, gc, points, colors, transform): """ Draw a Gouraud-shaded triangle. - EXPERIMENTAL + *points* is a 3x2 array of (x, y) points for the triangle. + + *colors* is a 3x4 array of RGBA colors for each point of the + triangle. + + *transform* is an affine transform to apply to the points. """ raise NotImplementedError + def draw_gouraud_triangles(self, gc, triangles_array, colors_array, + transform): + """ + Draws a series of Gouraud triangles. + + *points* is a Nx3x2 array of (x, y) points for the trianglex. + + *colors* is a Nx3x4 array of RGBA colors for each point of the + triangles. + + *transform* is an affine transform to apply to the points. + """ + transform = transform.frozen() + for tri, col in zip(triangles_array, colors_array): + self.draw_gouraud_triangle(gc, tri, col, transform) + def _iter_collection_raw_paths(self, master_transform, paths, all_transforms): """ @@ -410,7 +431,7 @@ def strip_math(self, s): def start_rasterizing(self): """ - Used in MixedModeRenderer. Switch to the raster renderer. + Used in MixedModeRenderer. Switch to the raster renderer. """ pass @@ -425,7 +446,7 @@ def stop_rasterizing(self): def start_filter(self): """ Used in AggRenderer. Switch to a temporary renderer for image - filtering effects. + filtering effects. """ pass diff --git a/lib/matplotlib/backends/backend_agg.py b/lib/matplotlib/backends/backend_agg.py index 809763932e80..6b1f1c172aa8 100644 --- a/lib/matplotlib/backends/backend_agg.py +++ b/lib/matplotlib/backends/backend_agg.py @@ -80,6 +80,7 @@ def _update_methods(self): self.draw_path_collection = self._renderer.draw_path_collection self.draw_quad_mesh = self._renderer.draw_quad_mesh self.draw_gouraud_triangle = self._renderer.draw_gouraud_triangle + self.draw_gouraud_triangles = self._renderer.draw_gouraud_triangles self.draw_image = self._renderer.draw_image self.copy_from_bbox = self._renderer.copy_from_bbox self.tostring_rgba_minimized = self._renderer.tostring_rgba_minimized diff --git a/lib/matplotlib/backends/backend_mixed.py b/lib/matplotlib/backends/backend_mixed.py index b7f7c8a782b6..37e58410eab2 100644 --- a/lib/matplotlib/backends/backend_mixed.py +++ b/lib/matplotlib/backends/backend_mixed.py @@ -58,7 +58,8 @@ def __init__(self, figure, width, height, dpi, vector_renderer, finalize flipy get_canvas_width_height get_image_magnification get_texmanager get_text_width_height_descent new_gc open_group option_image_nocomposite points_to_pixels strip_math - start_filter stop_filter + start_filter stop_filter draw_gouraud_triangle + draw_gouraud_triangles """.split() def _set_current_renderer(self, renderer): self._renderer = renderer diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index 7179bffdda86..cc4b675e80a6 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -17,6 +17,7 @@ from cStringIO import StringIO from datetime import datetime from math import ceil, cos, floor, pi, sin +import struct try: set except NameError: @@ -268,7 +269,7 @@ def pdfRepr(self): gsave='q', grestore='Q', textpos='Td', selectfont='Tf', textmatrix='Tm', show='Tj', showkern='TJ', - setlinewidth='w', clip='W') + setlinewidth='w', clip='W', shading='sh') Op = Bunch(**dict([(name, Operator(value)) for name, value in _pdfops.items()])) @@ -377,6 +378,7 @@ def __init__(self, filename): self.fontObject = self.reserveObject('fonts') self.alphaStateObject = self.reserveObject('extended graphics states') self.hatchObject = self.reserveObject('tiling patterns') + self.gouraudObject = self.reserveObject('Gouraud triangles') self.XObjectObject = self.reserveObject('external objects') self.resourceObject = self.reserveObject('resources') @@ -403,6 +405,7 @@ def __init__(self, filename): self.nextAlphaState = 1 self.hatchPatterns = {} self.nextHatch = 1 + self.gouraudTriangles = [] self.images = {} self.nextImage = 1 @@ -421,6 +424,7 @@ def __init__(self, filename): 'XObject': self.XObjectObject, 'ExtGState': self.alphaStateObject, 'Pattern': self.hatchObject, + 'Shading': self.gouraudObject, 'ProcSet': procsets } self.writeObject(self.resourceObject, resources) @@ -452,6 +456,7 @@ def close(self): dict([(val[0], val[1]) for val in self.alphaStates.values()])) self.writeHatches() + self.writeGouraudTriangles() xobjects = dict(self.images.values()) for tup in self.markers.values(): xobjects[tup[0]] = tup[1] @@ -1050,6 +1055,44 @@ def writeHatches(self): self.endStream() self.writeObject(self.hatchObject, hatchDict) + def addGouraudTriangles(self, points, colors): + name = Name('GT%d' % len(self.gouraudTriangles)) + self.gouraudTriangles.append((name, points, colors)) + return name + + def writeGouraudTriangles(self): + gouraudDict = dict() + for name, points, colors in self.gouraudTriangles: + ob = self.reserveObject('Gouraud triangle') + gouraudDict[name] = ob + shape = points.shape + flat_points = points.reshape((shape[0] * shape[1], 2)) + points_min = npy.min(flat_points, axis=0) - (1 << 8) + points_max = npy.max(flat_points, axis=0) + (1 << 8) + factor = float(0xffffffff) / (points_max - points_min) + adjpoints = npy.array((points - points_min) * factor, dtype=npy.uint32) + adjcolors = npy.array(colors * 255.0, dtype=npy.uint8) + + self.beginStream( + ob.id, None, + { 'ShadingType': 4, + 'BitsPerCoordinate': 32, + 'BitsPerComponent': 8, + 'BitsPerFlag': 8, + 'ColorSpace': Name('DeviceRGB'), + 'AntiAlias': 1, + 'Decode': [points_min[0], points_max[0], + points_min[1], points_max[1], + 0, 1, 0, 1, 0, 1] + }) + + for tpoints, tcolors in zip(adjpoints, adjcolors): + for p, c in zip(tpoints, tcolors): + values = [int(x) for x in [0] + list(p) + list(c[:3])] + self.write(struct.pack('>BLLBBB', *values)) + self.endStream() + self.writeObject(self.gouraudObject, gouraudDict) + def imageObject(self, image): """Return name of an image XObject representing the given image.""" @@ -1326,6 +1369,18 @@ def draw_markers(self, gc, marker_path, marker_trans, path, trans, rgbFace=None) lastx, lasty = x, y output(Op.grestore) + def draw_gouraud_triangle(self, gc, points, colors, trans): + self.draw_gouraud_triangles(gc, points.reshape((1, 3, 2)), + colors.reshape((1, 3, 4)), trans) + + def draw_gouraud_triangles(self, gc, points, colors, trans): + shape = points.shape + points = points.reshape((shape[0] * shape[1], 2)) + tpoints = trans.transform(points) + tpoints = tpoints.reshape(shape) + name = self.file.addGouraudTriangles(tpoints, colors) + self.file.output(name, Op.shading) + def _setup_textpos(self, x, y, descent, angle, oldx=0, oldy=0, olddescent=0, oldangle=0): if angle == oldangle == 0: self.file.output(x - oldx, (y + descent) - (oldy + olddescent), Op.textpos) diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index 2503470b7f7b..e6a72c014bc7 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -1217,8 +1217,7 @@ def draw(self, renderer): triangles, colors = self.convert_mesh_to_triangles( self._meshWidth, self._meshHeight, coordinates) check = {} - for tri, col in zip(triangles, colors): - renderer.draw_gouraud_triangle(gc, tri, col, transform.frozen()) + renderer.draw_gouraud_triangles(gc, triangles, colors, transform.frozen()) else: renderer.draw_quad_mesh( gc, transform.frozen(), self._meshWidth, self._meshHeight, diff --git a/src/_backend_agg.cpp b/src/_backend_agg.cpp index b8c956d163cb..bf2c9609e555 100644 --- a/src/_backend_agg.cpp +++ b/src/_backend_agg.cpp @@ -1455,21 +1455,14 @@ RendererAgg::draw_quad_mesh(const Py::Tuple& args) { return Py::Object(); } -Py::Object -RendererAgg::draw_gouraud_triangle(const Py::Tuple& args) { - _VERBOSE("RendererAgg::draw_quad_mesh"); - args.verify_length(4); +void +RendererAgg::_draw_gouraud_triangle(const GCAgg& gc, + const double* points, const double* colors, agg::trans_affine trans) { typedef agg::rgba8 color_t; typedef agg::span_gouraud_rgba span_gen_t; typedef agg::span_allocator span_alloc_t; - //segments, trans, clipbox, colors, linewidths, antialiaseds - GCAgg gc(args[0], dpi); - Py::Object points_obj = args[1]; - Py::Object colors_obj = args[2]; - agg::trans_affine trans = py_to_agg_transformation_matrix(args[3].ptr()); - theRasterizer.reset_clipping(); rendererBase.reset_clipping(true); set_clipbox(gc.cliprect, theRasterizer); @@ -1477,6 +1470,43 @@ RendererAgg::draw_gouraud_triangle(const Py::Tuple& args) { trans *= agg::trans_affine_scaling(1.0, -1.0); trans *= agg::trans_affine_translation(0.0, (double)height); + double tpoints[6]; + + for (int i = 0; i < 6; i += 2) { + tpoints[i] = points[i]; + tpoints[i+1] = points[i+1]; + trans.transform(&tpoints[i], &tpoints[i+1]); + } + + span_alloc_t span_alloc; + span_gen_t span_gen; + + span_gen.colors( + agg::rgba(colors[0], colors[1], colors[2], colors[3]), + agg::rgba(colors[4], colors[5], colors[6], colors[7]), + agg::rgba(colors[8], colors[9], colors[10], colors[11])); + span_gen.triangle( + tpoints[0], tpoints[1], + tpoints[2], tpoints[3], + tpoints[4], tpoints[5], + 0.5); + + theRasterizer.add_path(span_gen); + agg::render_scanlines_aa( + theRasterizer, slineP8, rendererBase, span_alloc, span_gen); +} + +Py::Object +RendererAgg::draw_gouraud_triangle(const Py::Tuple& args) { + _VERBOSE("RendererAgg::draw_gouraud_triangle"); + args.verify_length(4); + + //segments, trans, clipbox, colors, linewidths, antialiaseds + GCAgg gc(args[0], dpi); + Py::Object points_obj = args[1]; + Py::Object colors_obj = args[2]; + agg::trans_affine trans = py_to_agg_transformation_matrix(args[3].ptr()); + PyArrayObject* points = (PyArrayObject*)PyArray_ContiguousFromAny (points_obj.ptr(), PyArray_DOUBLE, 2, 2); if (!points || @@ -1490,32 +1520,57 @@ RendererAgg::draw_gouraud_triangle(const Py::Tuple& args) { throw Py::ValueError("colors must be a 3x4 numpy array"); try { - double* opoints = (double*)PyArray_DATA(points); - double* c = (double*)PyArray_DATA(colors); - double tpoints[6]; - - for (int i = 0; i < 6; i += 2) { - tpoints[i] = opoints[i]; - tpoints[i+1] = opoints[i+1]; - trans.transform(&tpoints[i], &tpoints[i+1]); - } + _draw_gouraud_triangle( + gc, (double*)PyArray_DATA(points), (double*)PyArray_DATA(colors), trans); + } catch (...) { + Py_DECREF(points); + Py_DECREF(colors); + + throw; + } + + Py_DECREF(points); + Py_DECREF(colors); + + return Py::Object(); +} - span_alloc_t span_alloc; - span_gen_t span_gen; - - span_gen.colors( - agg::rgba(c[0], c[1], c[2], c[3]), - agg::rgba(c[4], c[5], c[6], c[7]), - agg::rgba(c[8], c[9], c[10], c[11])); - span_gen.triangle( - tpoints[0], tpoints[1], - tpoints[2], tpoints[3], - tpoints[4], tpoints[5], - 0.5); - - theRasterizer.add_path(span_gen); - agg::render_scanlines_aa( - theRasterizer, slineP8, rendererBase, span_alloc, span_gen); +Py::Object +RendererAgg::draw_gouraud_triangles(const Py::Tuple& args) { + _VERBOSE("RendererAgg::draw_gouraud_triangles"); + args.verify_length(4); + + typedef agg::rgba8 color_t; + typedef agg::span_gouraud_rgba span_gen_t; + typedef agg::span_allocator span_alloc_t; + + //segments, trans, clipbox, colors, linewidths, antialiaseds + GCAgg gc(args[0], dpi); + Py::Object points_obj = args[1]; + Py::Object colors_obj = args[2]; + agg::trans_affine trans = py_to_agg_transformation_matrix(args[3].ptr()); + + PyArrayObject* points = (PyArrayObject*)PyArray_ContiguousFromAny + (points_obj.ptr(), PyArray_DOUBLE, 3, 3); + if (!points || + PyArray_DIM(points, 1) != 3 || PyArray_DIM(points, 2) != 2) + throw Py::ValueError("points must be a Nx3x2 numpy array"); + + PyArrayObject* colors = (PyArrayObject*)PyArray_ContiguousFromAny + (colors_obj.ptr(), PyArray_DOUBLE, 3, 3); + if (!colors || + PyArray_DIM(colors, 1) != 3 || PyArray_DIM(colors, 2) != 4) + throw Py::ValueError("colors must be a Nx3x4 numpy array"); + + if (PyArray_DIM(points, 0) != PyArray_DIM(colors, 0)) { + throw Py::ValueError("points and colors arrays must be the same length"); + } + + try { + for (int i = 0; i < PyArray_DIM(points, 0); ++i) { + _draw_gouraud_triangle( + gc, (double*)PyArray_GETPTR1(points, i), (double*)PyArray_GETPTR1(colors, i), trans); + } } catch (...) { Py_DECREF(points); Py_DECREF(colors); @@ -1870,6 +1925,8 @@ void RendererAgg::init_type() "draw_quad_mesh(gc, master_transform, meshWidth, meshHeight, coordinates, offsets, offsetTrans, facecolors, antialiaseds, showedges)\n"); add_varargs_method("draw_gouraud_triangle", &RendererAgg::draw_gouraud_triangle, "draw_gouraud_triangle(gc, points, colors, master_transform)\n"); + add_varargs_method("draw_gouraud_triangles", &RendererAgg::draw_gouraud_triangles, + "draw_gouraud_triangles(gc, points, colors, master_transform)\n"); add_varargs_method("draw_markers", &RendererAgg::draw_markers, "draw_markers(gc, marker_path, marker_trans, path, rgbFace)\n"); add_varargs_method("draw_text_image", &RendererAgg::draw_text_image, diff --git a/src/_backend_agg.h b/src/_backend_agg.h index ced59ca1760a..294e6b9645f6 100644 --- a/src/_backend_agg.h +++ b/src/_backend_agg.h @@ -165,6 +165,7 @@ class RendererAgg: public Py::PythonExtension { Py::Object draw_path_collection(const Py::Tuple & args); Py::Object draw_quad_mesh(const Py::Tuple& args); Py::Object draw_gouraud_triangle(const Py::Tuple& args); + Py::Object draw_gouraud_triangles(const Py::Tuple& args); Py::Object write_rgba(const Py::Tuple & args); Py::Object tostring_rgb(const Py::Tuple & args); @@ -241,6 +242,11 @@ class RendererAgg: public Py::PythonExtension { const Py::SeqBase& linestyles_obj, const Py::SeqBase& antialiaseds); + void + _draw_gouraud_triangle( + const GCAgg& gc, + const double* points, const double* colors, agg::trans_affine trans); + private: void create_alpha_buffers(); }; From 68bebd3f54b0cc93d882ab8cee7e58723b7a53dc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Tue, 1 Sep 2009 05:24:38 +0000 Subject: [PATCH 0135/1000] Small fix to Gouraud triangles in pdf svn path=/trunk/matplotlib/; revision=7622 --- lib/matplotlib/backends/backend_pdf.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index cc4b675e80a6..383d0dc991a8 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -141,6 +141,11 @@ def pdfRepr(obj): r = "%.10f" % obj return r.rstrip('0').rstrip('.') + # Booleans. Needs to be tested before integers since + # isinstance(True, int) is true. + elif isinstance(obj, bool): + return ['false', 'true'][obj] + # Integers are written as such. elif isinstance(obj, (int, long)): return "%d" % obj @@ -170,10 +175,6 @@ def pdfRepr(obj): r.append("]") return fill(r) - # Booleans. - elif isinstance(obj, bool): - return ['false', 'true'][obj] - # The null keyword. elif obj is None: return 'null' @@ -1080,7 +1081,7 @@ def writeGouraudTriangles(self): 'BitsPerComponent': 8, 'BitsPerFlag': 8, 'ColorSpace': Name('DeviceRGB'), - 'AntiAlias': 1, + 'AntiAlias': True, 'Decode': [points_min[0], points_max[0], points_min[1], points_max[1], 0, 1, 0, 1, 0, 1] From ea8c3131347e7619ff2d8da28b2f903076153f19 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 1 Sep 2009 12:13:12 +0000 Subject: [PATCH 0136/1000] Add CHANGELOG entry about Gouraud shading svn path=/trunk/matplotlib/; revision=7623 --- CHANGELOG | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index e14d3ce126b0..a10ab412af84 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2009-09-01 Added support for Gouraud interpolated triangles. + pcolormesh now accepts shading='gouraud' as an option. - MGD + 2009-08-29 Added matplotlib.testing package, which contains a Nose plugin and a decorator that lets tests be marked as KnownFailures - ADS From d365785805e55e028d65f6721728ea738b78f23a Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 1 Sep 2009 13:03:20 +0000 Subject: [PATCH 0137/1000] Use numpy to generate the PDF shading triangles stream, which should be faster and more portable than using struct. svn path=/trunk/matplotlib/; revision=7624 --- lib/matplotlib/backends/backend_pdf.py | 27 +++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index 383d0dc991a8..81bde3e5b8c4 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -17,7 +17,6 @@ from cStringIO import StringIO from datetime import datetime from math import ceil, cos, floor, pi, sin -import struct try: set except NameError: @@ -1068,11 +1067,10 @@ def writeGouraudTriangles(self): gouraudDict[name] = ob shape = points.shape flat_points = points.reshape((shape[0] * shape[1], 2)) + flat_colors = colors.reshape((shape[0] * shape[1], 4)) points_min = npy.min(flat_points, axis=0) - (1 << 8) points_max = npy.max(flat_points, axis=0) + (1 << 8) factor = float(0xffffffff) / (points_max - points_min) - adjpoints = npy.array((points - points_min) * factor, dtype=npy.uint32) - adjcolors = npy.array(colors * 255.0, dtype=npy.uint8) self.beginStream( ob.id, None, @@ -1087,10 +1085,16 @@ def writeGouraudTriangles(self): 0, 1, 0, 1, 0, 1] }) - for tpoints, tcolors in zip(adjpoints, adjcolors): - for p, c in zip(tpoints, tcolors): - values = [int(x) for x in [0] + list(p) + list(c[:3])] - self.write(struct.pack('>BLLBBB', *values)) + streamarr = npy.empty( + (shape[0] * shape[1],), + dtype=[('flags', 'u1'), + ('points', '>u4', (2,)), + ('colors', 'u1', (3,))]) + streamarr['flags'] = 0 + streamarr['points'] = (flat_points - points_min) * factor + streamarr['colors'] = flat_colors[:, :3] * 255.0 + + self.write(streamarr.tostring()) self.endStream() self.writeObject(self.gouraudObject, gouraudDict) @@ -1375,11 +1379,20 @@ def draw_gouraud_triangle(self, gc, points, colors, trans): colors.reshape((1, 3, 4)), trans) def draw_gouraud_triangles(self, gc, points, colors, trans): + assert len(points) == len(colors) + assert points.ndim == 3 + assert points.shape[1] == 3 + assert points.shape[2] == 2 + assert colors.ndim == 3 + assert colors.shape[1] == 3 + assert colors.shape[2] == 4 + shape = points.shape points = points.reshape((shape[0] * shape[1], 2)) tpoints = trans.transform(points) tpoints = tpoints.reshape(shape) name = self.file.addGouraudTriangles(tpoints, colors) + self.check_gc(gc) self.file.output(name, Op.shading) def _setup_textpos(self, x, y, descent, angle, oldx=0, oldy=0, olddescent=0, oldangle=0): From fe4c4c900cd36dd2820a4289baf94093e0570cdf Mon Sep 17 00:00:00 2001 From: Michiel de Hoon Date: Tue, 1 Sep 2009 14:06:35 +0000 Subject: [PATCH 0138/1000] Adding calls to gc.restore() whenever new_gc is called. This is necessary for the Mac OS X and the Cairo backend to work correctly. Also, updating the Mac OS X backend to be consistent with recent changes in SVN. See issue 2844845 on sourceforge. svn path=/trunk/matplotlib/; revision=7625 --- lib/matplotlib/axes.py | 1 + lib/matplotlib/backends/backend_macosx.py | 53 +++++++++++++++-------- lib/matplotlib/collections.py | 3 ++ lib/matplotlib/figure.py | 1 + lib/matplotlib/image.py | 4 ++ 5 files changed, 45 insertions(+), 17 deletions(-) diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index adad7765d270..639c1635478c 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -1749,6 +1749,7 @@ def draw(self, renderer=None, inframe=False): self.patch.get_transform())) renderer.draw_image(gc, round(l), round(b), im) + gc.restore() if dsu_rasterized: for zorder, i, a in dsu_rasterized: diff --git a/lib/matplotlib/backends/backend_macosx.py b/lib/matplotlib/backends/backend_macosx.py index 89b443ed3873..11423304e618 100644 --- a/lib/matplotlib/backends/backend_macosx.py +++ b/lib/matplotlib/backends/backend_macosx.py @@ -58,21 +58,42 @@ def draw_markers(self, gc, marker_path, marker_trans, path, trans, rgbFace=None) rgbFace = tuple(rgbFace) gc.draw_markers(marker_path, marker_trans, path, trans, rgbFace) - def draw_path_collection(self, *args): - # TODO: We should change this in the C code eventually, but this - # re-ordering of arguments should work for now - gc = args[0] - args = tuple([gc, args[1], gc.get_clip_rectangle()] + \ - list(gc.get_clip_path()) + list(args[2:])) - gc.draw_path_collection(*args) - - def draw_quad_mesh(self, *args): - # TODO: We should change this in the C code eventually, but this - # re-ordering of arguments should work for now - gc = args[0] - args = [gc, args[1], gc.get_clip_rectangle()] + \ - list(gc.get_clip_path()) + list(args[2:]) - gc.draw_quad_mesh(*args) + def draw_path_collection(self, gc, master_transform, paths, all_transforms, + offsets, offsetTrans, facecolors, edgecolors, + linewidths, linestyles, antialiaseds, urls): + cliprect = gc.get_clip_rectangle() + clippath, clippath_transform = gc.get_clip_path() + gc.draw_path_collection(master_transform, + cliprect, + clippath, + clippath_transform, + paths, + all_transforms, + offsets, + offsetTrans, + facecolors, + edgecolors, + linewidths, + linestyles, + antialiaseds) + + def draw_quad_mesh(self, gc, master_transform, meshWidth, meshHeight, + coordinates, offsets, offsetTrans, facecolors, + antialiased, showedges): + cliprect = gc.get_clip_rectangle() + clippath, clippath_transform = gc.get_clip_path() + gc.draw_quad_mesh(master_transform, + cliprect, + clippath, + clippath_transform, + meshWidth, + meshHeight, + coordinates, + offsets, + offsetTrans, + facecolors, + antialiased, + showedges) def new_gc(self): self.gc.save() @@ -80,8 +101,6 @@ def new_gc(self): return self.gc def draw_image(self, gc, x, y, im): - # TODO: We should change this in the C code eventually, but this - # re-ordering of arguments should work for now im.flipud_out() nrows, ncols, data = im.as_rgba_str() gc.draw_image(x, y, nrows, ncols, data, gc.get_clip_rectangle(), diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index e6a72c014bc7..2ded57a9aace 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -214,6 +214,8 @@ def draw(self, renderer): gc, transform.frozen(), paths, self.get_transforms(), offsets, transOffset, self.get_facecolor(), self.get_edgecolor(), self._linewidths, self._linestyles, self._antialiaseds, self._urls) + + gc.restore() renderer.close_group(self.__class__.__name__) def contains(self, mouseevent): @@ -1223,6 +1225,7 @@ def draw(self, renderer): gc, transform.frozen(), self._meshWidth, self._meshHeight, coordinates, offsets, transOffset, self.get_facecolor(), self._antialiased, self._showedges) + gc.restore() renderer.close_group(self.__class__.__name__) diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index 2f7bf4cf3c15..4c10d47b9cb7 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -766,6 +766,7 @@ def draw(self, renderer): gc.set_clip_rectangle(self.bbox) gc.set_clip_path(self.get_clip_path()) renderer.draw_image(gc, l, b, im) + gc.restore() # render the axes for a in self.axes: a.draw(renderer) diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index 6769e408554f..8477f646fb42 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -142,6 +142,7 @@ def draw(self, renderer, *args, **kwargs): gc.set_clip_rectangle(self.axes.bbox.frozen()) gc.set_clip_path(self.get_clip_path()) renderer.draw_image(gc, l, b, im) + gc.restore() def contains(self, mouseevent): """ @@ -637,6 +638,7 @@ def draw(self, renderer, *args, **kwargs): round(self.axes.bbox.xmin), round(self.axes.bbox.ymin), im) + gc.restore() def set_data(self, x, y, A): @@ -790,6 +792,7 @@ def draw(self, renderer, *args, **kwargs): gc.set_clip_rectangle(self.figure.bbox) gc.set_clip_path(self.get_clip_path()) renderer.draw_image(gc, round(self.ox), round(self.oy), im) + gc.restore() def write_png(self, fname): """Write the image to png file with fname""" @@ -931,6 +934,7 @@ def draw(self, renderer, *args, **kwargs): self._set_gc_clip(gc) #gc.set_clip_path(self.get_clip_path()) renderer.draw_image(gc, round(l), round(b), im) + gc.restore() From 42886d7db8aa9bb103c837578b4ff9b9bfe15c2e Mon Sep 17 00:00:00 2001 From: Michiel de Hoon Date: Wed, 2 Sep 2009 00:44:16 +0000 Subject: [PATCH 0139/1000] Allowing mouse dragging with three-button mice. svn path=/trunk/matplotlib/; revision=7627 --- src/_macosx.m | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/_macosx.m b/src/_macosx.m index dc4190139090..ee0c02d5a99e 100644 --- a/src/_macosx.m +++ b/src/_macosx.m @@ -349,8 +349,10 @@ - (void)mouseDragged:(NSEvent*)event; - (void)mouseMoved:(NSEvent*)event; - (void)rightMouseDown:(NSEvent*)event; - (void)rightMouseUp:(NSEvent*)event; +- (void)rightMouseDragged:(NSEvent*)event; - (void)otherMouseDown:(NSEvent*)event; - (void)otherMouseUp:(NSEvent*)event; +- (void)otherMouseDragged:(NSEvent*)event; - (void)setRubberband:(NSRect)rect; - (void)removeRubberband; - (const char*)convertKeyEvent:(NSEvent*)event; @@ -4744,6 +4746,23 @@ - (void)rightMouseUp:(NSEvent *)event PyGILState_Release(gstate); } +- (void)rightMouseDragged:(NSEvent *)event +{ + int x, y; + NSPoint location = [event locationInWindow]; + location = [self convertPoint: location fromView: nil]; + x = location.x; + y = location.y; + PyGILState_STATE gstate = PyGILState_Ensure(); + PyObject* result = PyObject_CallMethod(canvas, "motion_notify_event", "ii", x, y); + if(result) + Py_DECREF(result); + else + PyErr_Print(); + + PyGILState_Release(gstate); +} + - (void)otherMouseDown:(NSEvent *)event { int x, y; @@ -4784,6 +4803,23 @@ - (void)otherMouseUp:(NSEvent *)event PyGILState_Release(gstate); } +- (void)otherMouseDragged:(NSEvent *)event +{ + int x, y; + NSPoint location = [event locationInWindow]; + location = [self convertPoint: location fromView: nil]; + x = location.x; + y = location.y; + PyGILState_STATE gstate = PyGILState_Ensure(); + PyObject* result = PyObject_CallMethod(canvas, "motion_notify_event", "ii", x, y); + if(result) + Py_DECREF(result); + else + PyErr_Print(); + + PyGILState_Release(gstate); +} + - (void)setRubberband:(NSRect)rect { if (!NSIsEmptyRect(rubberband)) [self setNeedsDisplayInRect: rubberband]; From 0735149b5b76cd90469a1e2cdf4873dccd21d062 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 2 Sep 2009 19:30:30 +0000 Subject: [PATCH 0140/1000] Improve memory management and error handling in draw_gouraud_triangle(s) in the Agg backend. svn path=/trunk/matplotlib/; revision=7628 --- src/_backend_agg.cpp | 96 ++++++++++++++++++++++++-------------------- 1 file changed, 52 insertions(+), 44 deletions(-) diff --git a/src/_backend_agg.cpp b/src/_backend_agg.cpp index bf2c9609e555..a9afed565559 100644 --- a/src/_backend_agg.cpp +++ b/src/_backend_agg.cpp @@ -1094,14 +1094,14 @@ RendererAgg::_draw_path_collection_generic throw Py::ValueError("Offsets array must be Nx2"); } - PyArrayObject* facecolors = (PyArrayObject*)PyArray_FromObject + facecolors = (PyArrayObject*)PyArray_FromObject (facecolors_obj.ptr(), PyArray_DOUBLE, 1, 2); if (!facecolors || (PyArray_NDIM(facecolors) == 1 && PyArray_DIM(facecolors, 0) != 0) || (PyArray_NDIM(facecolors) == 2 && PyArray_DIM(facecolors, 1) != 4)) throw Py::ValueError("Facecolors must be a Nx4 numpy array or empty"); - PyArrayObject* edgecolors = (PyArrayObject*)PyArray_FromObject + edgecolors = (PyArrayObject*)PyArray_FromObject (edgecolors_obj.ptr(), PyArray_DOUBLE, 1, 2); if (!edgecolors || (PyArray_NDIM(edgecolors) == 1 && PyArray_DIM(edgecolors, 0) != 0) || @@ -1459,13 +1459,14 @@ void RendererAgg::_draw_gouraud_triangle(const GCAgg& gc, const double* points, const double* colors, agg::trans_affine trans) { - typedef agg::rgba8 color_t; - typedef agg::span_gouraud_rgba span_gen_t; - typedef agg::span_allocator span_alloc_t; + typedef agg::rgba8 color_t; + typedef agg::span_gouraud_rgba span_gen_t; + typedef agg::span_allocator span_alloc_t; theRasterizer.reset_clipping(); rendererBase.reset_clipping(true); set_clipbox(gc.cliprect, theRasterizer); + /* TODO: Support clip paths */ trans *= agg::trans_affine_scaling(1.0, -1.0); trans *= agg::trans_affine_translation(0.0, (double)height); @@ -1492,8 +1493,8 @@ RendererAgg::_draw_gouraud_triangle(const GCAgg& gc, 0.5); theRasterizer.add_path(span_gen); - agg::render_scanlines_aa( - theRasterizer, slineP8, rendererBase, span_alloc, span_gen); + + agg::render_scanlines_aa(theRasterizer, slineP8, rendererBase, span_alloc, span_gen); } Py::Object @@ -1501,36 +1502,40 @@ RendererAgg::draw_gouraud_triangle(const Py::Tuple& args) { _VERBOSE("RendererAgg::draw_gouraud_triangle"); args.verify_length(4); - //segments, trans, clipbox, colors, linewidths, antialiaseds GCAgg gc(args[0], dpi); Py::Object points_obj = args[1]; Py::Object colors_obj = args[2]; agg::trans_affine trans = py_to_agg_transformation_matrix(args[3].ptr()); - PyArrayObject* points = (PyArrayObject*)PyArray_ContiguousFromAny - (points_obj.ptr(), PyArray_DOUBLE, 2, 2); - if (!points || - PyArray_DIM(points, 0) != 3 || PyArray_DIM(points, 1) != 2) - throw Py::ValueError("points must be a 3x2 numpy array"); - - PyArrayObject* colors = (PyArrayObject*)PyArray_ContiguousFromAny - (colors_obj.ptr(), PyArray_DOUBLE, 2, 2); - if (!colors || - PyArray_DIM(colors, 0) != 3 || PyArray_DIM(colors, 1) != 4) - throw Py::ValueError("colors must be a 3x4 numpy array"); + PyArrayObject* points = NULL; + PyArrayObject* colors = NULL; try { + points = (PyArrayObject*)PyArray_ContiguousFromAny + (points_obj.ptr(), PyArray_DOUBLE, 2, 2); + if (!points || + PyArray_DIM(points, 0) != 3 || PyArray_DIM(points, 1) != 2) { + throw Py::ValueError("points must be a 3x2 numpy array"); + } + + colors = (PyArrayObject*)PyArray_ContiguousFromAny + (colors_obj.ptr(), PyArray_DOUBLE, 2, 2); + if (!colors || + PyArray_DIM(colors, 0) != 3 || PyArray_DIM(colors, 1) != 4) { + throw Py::ValueError("colors must be a 3x4 numpy array"); + } + _draw_gouraud_triangle( gc, (double*)PyArray_DATA(points), (double*)PyArray_DATA(colors), trans); } catch (...) { - Py_DECREF(points); - Py_DECREF(colors); + Py_XDECREF(points); + Py_XDECREF(colors); throw; } - Py_DECREF(points); - Py_DECREF(colors); + Py_XDECREF(points); + Py_XDECREF(colors); return Py::Object(); } @@ -1544,42 +1549,45 @@ RendererAgg::draw_gouraud_triangles(const Py::Tuple& args) { typedef agg::span_gouraud_rgba span_gen_t; typedef agg::span_allocator span_alloc_t; - //segments, trans, clipbox, colors, linewidths, antialiaseds GCAgg gc(args[0], dpi); Py::Object points_obj = args[1]; Py::Object colors_obj = args[2]; agg::trans_affine trans = py_to_agg_transformation_matrix(args[3].ptr()); - PyArrayObject* points = (PyArrayObject*)PyArray_ContiguousFromAny - (points_obj.ptr(), PyArray_DOUBLE, 3, 3); - if (!points || - PyArray_DIM(points, 1) != 3 || PyArray_DIM(points, 2) != 2) - throw Py::ValueError("points must be a Nx3x2 numpy array"); + PyArrayObject* points = NULL; + PyArrayObject* colors = NULL; - PyArrayObject* colors = (PyArrayObject*)PyArray_ContiguousFromAny - (colors_obj.ptr(), PyArray_DOUBLE, 3, 3); - if (!colors || - PyArray_DIM(colors, 1) != 3 || PyArray_DIM(colors, 2) != 4) - throw Py::ValueError("colors must be a Nx3x4 numpy array"); + try { + points = (PyArrayObject*)PyArray_ContiguousFromAny + (points_obj.ptr(), PyArray_DOUBLE, 3, 3); + if (!points || + PyArray_DIM(points, 1) != 3 || PyArray_DIM(points, 2) != 2) { + throw Py::ValueError("points must be a Nx3x2 numpy array"); + } - if (PyArray_DIM(points, 0) != PyArray_DIM(colors, 0)) { - throw Py::ValueError("points and colors arrays must be the same length"); - } + colors = (PyArrayObject*)PyArray_ContiguousFromAny + (colors_obj.ptr(), PyArray_DOUBLE, 3, 3); + if (!colors || + PyArray_DIM(colors, 1) != 3 || PyArray_DIM(colors, 2) != 4) { + throw Py::ValueError("colors must be a Nx3x4 numpy array"); + } + + if (PyArray_DIM(points, 0) != PyArray_DIM(colors, 0)) { + throw Py::ValueError("points and colors arrays must be the same length"); + } - try { for (int i = 0; i < PyArray_DIM(points, 0); ++i) { - _draw_gouraud_triangle( - gc, (double*)PyArray_GETPTR1(points, i), (double*)PyArray_GETPTR1(colors, i), trans); + _draw_gouraud_triangle(gc, (double*)PyArray_GETPTR1(points, i), (double*)PyArray_GETPTR1(colors, i), trans); } } catch (...) { - Py_DECREF(points); - Py_DECREF(colors); + Py_XDECREF(points); + Py_XDECREF(colors); throw; } - Py_DECREF(points); - Py_DECREF(colors); + Py_XDECREF(points); + Py_XDECREF(colors); return Py::Object(); } From 89c1c266d8e3f2b0f98bbe8bcfdf2bf48900f4fb Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 2 Sep 2009 19:31:32 +0000 Subject: [PATCH 0141/1000] Add Gouraud triangle support (of a fashion) to SVG backend. svn path=/trunk/matplotlib/; revision=7629 --- lib/matplotlib/backends/backend_svg.py | 63 +++++++++++++++++++++++++- 1 file changed, 62 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/backends/backend_svg.py b/lib/matplotlib/backends/backend_svg.py index 97040f925c7b..5bf9c0bbebc6 100644 --- a/lib/matplotlib/backends/backend_svg.py +++ b/lib/matplotlib/backends/backend_svg.py @@ -2,6 +2,8 @@ import os, codecs, base64, tempfile, urllib, gzip, cStringIO +import numpy as np + try: from hashlib import md5 except ImportError: @@ -54,6 +56,7 @@ def __init__(self, width, height, svgwriter, basename=None): self._path_collection_id = 0 self._imaged = {} self._hatchd = {} + self._n_gradients = 0 self.mathtext_parser = MathTextParser('SVG') svgwriter.write(svgProlog%(width,height,width,height)) @@ -298,6 +301,63 @@ def draw_path_collection(self, gc, master_transform, paths, all_transforms, self._path_collection_id += 1 + def draw_gouraud_triangle(self, gc, points, colors, trans): + # This uses a method described here: + # + # http://www.svgopen.org/2005/papers/Converting3DFaceToSVG/index.html + # + # that uses three overlapping linear gradients to simulate a + # Gouraud triangle. Each gradient goes from fully opaque in + # one corner to fully transparent along the opposite edge. + # The line between the stop points is perpendicular to the + # opposite edge. Underlying these three gradients is a solid + # triangle whose color is the average of all three points. + + trans_and_flip = self._make_flip_transform(trans) + tpoints = trans_and_flip.transform(points) + write = self._svgwriter.write + + write('') + for i in range(3): + x1, y1 = points[i] + x2, y2 = points[(i + 1) % 3] + x3, y3 = points[(i + 2) % 3] + c = colors[i][:3] + + if x2 == x3: + xb = x2 + yb = y1 + elif y2 == y3: + xb = x1 + yb = y2 + else: + m1 = (y2 - y3) / (x2 - x3) + b1 = y2 - (m1 * x2) + m2 = -(1.0 / m1) + b2 = y1 - (m2 * x1) + xb = (-b1 + b2) / (m1 - m2) + yb = m2 * xb + b2 + + write('' % + (self._n_gradients, i, x1, y1, xb, yb)) + write('' % rgb2hex(c)) + write('' % rgb2hex(c)) + write('') + + # Define the triangle itself as a "def" since we use it 4 times + write('' % + (self._n_gradients, x1, y1, x2, y2, x3, y3)) + write('\n') + + avg_color = np.sum(colors[:, :3], axis=0) / 3.0 + write('\n' % + (self._n_gradients, rgb2hex(avg_color))) + for i in range(3): + write('\n' % + (self._n_gradients, self._n_gradients, i)) + + self._n_gradients += 1 + def draw_image(self, gc, x, y, im): # MGDTODO: Support clippath here trans = [1,0,0,1,0,0] @@ -305,7 +365,7 @@ def draw_image(self, gc, x, y, im): if rcParams['svg.image_noscale']: trans = list(im.get_matrix()) trans[5] = -trans[5] - transstr = 'transform="matrix(%f %f %f %f %f %f)" '%tuple(trans) + transstr = 'transform="matrix(%f %f %f %f %f %f)" ' % tuple(trans) assert trans[1] == 0 assert trans[2] == 0 numrows,numcols = im.get_size() @@ -672,4 +732,5 @@ class FigureManagerSVG(FigureManagerBase): xmlns:xlink="http://www.w3.org/1999/xlink" version="1.1" id="svg1"> + """ From 133a95fe24eedb545464832a09c96107cd40ab62 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 2 Sep 2009 20:48:06 +0000 Subject: [PATCH 0142/1000] Add Gouraud triangle support to PS backend. svn path=/trunk/matplotlib/; revision=7630 --- lib/matplotlib/backends/backend_ps.py | 51 +++++++++++++++++++++++++++ 1 file changed, 51 insertions(+) diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py index 8d807902d752..471de46d5da8 100644 --- a/lib/matplotlib/backends/backend_ps.py +++ b/lib/matplotlib/backends/backend_ps.py @@ -754,6 +754,57 @@ def draw_mathtext(self, gc, """ % locals() self._pswriter.write(ps) + def draw_gouraud_triangle(self, gc, points, colors, trans): + self.draw_gouraud_triangles(gc, points.reshape((1, 3, 2)), + colors.reshape((1, 3, 4)), trans) + + def draw_gouraud_triangles(self, gc, points, colors, trans): + assert len(points) == len(colors) + assert points.ndim == 3 + assert points.shape[1] == 3 + assert points.shape[2] == 2 + assert colors.ndim == 3 + assert colors.shape[1] == 3 + assert colors.shape[2] == 4 + + points = trans.transform(points) + + shape = points.shape + flat_points = points.reshape((shape[0] * shape[1], 2)) + flat_colors = colors.reshape((shape[0] * shape[1], 4)) + points_min = npy.min(flat_points, axis=0) - (1 << 8) + points_max = npy.max(flat_points, axis=0) + (1 << 8) + factor = float(0xffffffff) / (points_max - points_min) + + xmin, ymin = points_min + xmax, ymax = points_max + + streamarr = npy.empty( + (shape[0] * shape[1],), + dtype=[('flags', 'u1'), + ('points', '>u4', (2,)), + ('colors', 'u1', (3,))]) + streamarr['flags'] = 0 + streamarr['points'] = (flat_points - points_min) * factor + streamarr['colors'] = flat_colors[:, :3] * 255.0 + + stream = quote_ps_string(streamarr.tostring()) + + self._pswriter.write(""" +gsave +<< /ShadingType 4 + /ColorSpace [/DeviceRGB] + /BitsPerCoordinate 32 + /BitsPerComponent 8 + /BitsPerFlag 8 + /AntiAlias true + /Decode [ %(xmin)f %(xmax)f %(ymin)f %(ymax)f 0 1 0 1 0 1 ] + /DataSource (%(stream)s) +>> +shfill +grestore +""" % locals()) + def _draw_ps(self, ps, gc, rgbFace, fill=True, stroke=True, command=None): """ Emit the PostScript sniplet 'ps' with all the attributes from 'gc' From e3be0448a0fae77f7f52754af469d8cff8f7945d Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Thu, 3 Sep 2009 14:36:37 +0000 Subject: [PATCH 0143/1000] Remove unnecessary line. svn path=/trunk/matplotlib/; revision=7631 --- lib/matplotlib/collections.py | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index 2ded57a9aace..d579832ef48c 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -1218,7 +1218,6 @@ def draw(self, renderer): if self._shading == 'gouraud': triangles, colors = self.convert_mesh_to_triangles( self._meshWidth, self._meshHeight, coordinates) - check = {} renderer.draw_gouraud_triangles(gc, triangles, colors, transform.frozen()) else: renderer.draw_quad_mesh( From 5bbf7d39a9bf73b299c9a19a40c784239f0ecf77 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Thu, 3 Sep 2009 16:01:00 +0000 Subject: [PATCH 0144/1000] Testing: mark test with knownfailure decorator This will let the buildbots detect any new errors while we figure out what's going on with this one. svn path=/trunk/matplotlib/; revision=7632 --- test/test_matplotlib/TestAxes.py | 1 + 1 file changed, 1 insertion(+) diff --git a/test/test_matplotlib/TestAxes.py b/test/test_matplotlib/TestAxes.py index e2edd5555101..cec50c3ab987 100644 --- a/test/test_matplotlib/TestAxes.py +++ b/test/test_matplotlib/TestAxes.py @@ -43,6 +43,7 @@ def tearDown( self ): pass #-------------------------------------------------------------------- + @knownfailureif(True, "Fails due to SF bug 2850075") def test_empty_datetime( self ): """Test plotting empty axes with dates along one axis.""" fname = self.outFile( "empty_datetime.png" ) From bb29f572a252402ab68b2ca7b1a8e9e3f1a731d0 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Fri, 4 Sep 2009 04:12:16 +0000 Subject: [PATCH 0145/1000] Merged revisions 7633 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7633 | leejjoon | 2009-09-03 23:35:25 -0400 (Thu, 03 Sep 2009) | 1 line fix a bug in axes_grid.inset_locator.inset_axes ........ svn path=/trunk/matplotlib/; revision=7634 --- lib/mpl_toolkits/axes_grid/inset_locator.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/mpl_toolkits/axes_grid/inset_locator.py b/lib/mpl_toolkits/axes_grid/inset_locator.py index 386cb45be4bd..7fb4e41c78b0 100644 --- a/lib/mpl_toolkits/axes_grid/inset_locator.py +++ b/lib/mpl_toolkits/axes_grid/inset_locator.py @@ -271,10 +271,10 @@ def inset_axes(parent_axes, width, height, loc=1, axes_class = Axes if axes_kwargs is None: - inset_axes = Axes(parent_axes.figure, parent_axes.get_position()) + inset_axes = axes_class(parent_axes.figure, parent_axes.get_position()) else: - inset_axes = Axes(parent_axes.figure, parent_axes.get_position(), - **axes_kwargs) + inset_axes = axes_class(parent_axes.figure, parent_axes.get_position(), + **axes_kwargs) axes_locator = AnchoredSizeLocator(parent_axes.bbox, width, height, From 835c4ac42b4d29ed189411d13b00d3a867bf3e33 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Fri, 4 Sep 2009 19:11:00 +0000 Subject: [PATCH 0146/1000] textpath support mathtext and tex svn path=/trunk/matplotlib/; revision=7635 --- CHANGELOG | 3 + examples/pylab_examples/demo_text_path.py | 37 +- lib/matplotlib/mathtext.py | 29 ++ lib/matplotlib/text.py | 171 +------- lib/matplotlib/textpath.py | 463 ++++++++++++++++++++++ src/ft2font.cpp | 47 +++ src/ft2font.h | 2 + 7 files changed, 578 insertions(+), 174 deletions(-) create mode 100644 lib/matplotlib/textpath.py diff --git a/CHANGELOG b/CHANGELOG index a10ab412af84..63915ce20cde 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2009-09-04 Make the textpath class as a separate moduel + (textpath.py). Add support for mathtext and tex.- JJL + 2009-09-01 Added support for Gouraud interpolated triangles. pcolormesh now accepts shading='gouraud' as an option. - MGD diff --git a/examples/pylab_examples/demo_text_path.py b/examples/pylab_examples/demo_text_path.py index 65d37c4acd32..eb0113941345 100644 --- a/examples/pylab_examples/demo_text_path.py +++ b/examples/pylab_examples/demo_text_path.py @@ -76,9 +76,33 @@ def draw(self, renderer=None): # make anchored offset box ao = AnchoredOffsetbox(loc=2, child=offsetbox, frameon=True, borderpad=0.2) - ax.add_artist(ao) + # another text + from matplotlib.patches import PathPatch + text_path = TextPath((0, 0), r"\mbox{textpath supports mathtext \& \TeX}", + size=20, usetex=True) + p1 = PathPatch(text_path, ec="w", lw=3, fc="w", alpha=0.9, + transform=IdentityTransform()) + p2 = PathPatch(text_path, ec="none", fc="k", + transform=IdentityTransform()) + + offsetbox2 = AuxTransformBox(IdentityTransform()) + offsetbox2.add_artist(p1) + offsetbox2.add_artist(p2) + + ab = AnnotationBbox(offsetbox2, (0.95, 0.05), + xycoords='axes fraction', + boxcoords="offset points", + box_alignment=(1.,0.), + frameon=False + ) + ax.add_artist(ab) + + ax.imshow([[0,1,2],[1,2,3]], cmap=plt.cm.gist_gray_r, + interpolation="bilinear", + aspect="auto") + # EXAMPLE 2 @@ -87,12 +111,17 @@ def draw(self, renderer=None): arr = np.arange(256).reshape(1,256)/256. - text_path = TextPath((0, 0), "TextPath", size=70) + usetex = plt.rcParams["text.usetex"] + if usetex: + s = r"$\displaystyle\left[\sum_{n=1}^\infty\frac{-e^{i\pi}}{2^n}\right]$!" + else: + s = r"$\left[\sum_{n=1}^\infty\frac{-e^{i\pi}}{2^n}\right]$!" + text_path = TextPath((0, 0), s, size=40, usetex=usetex) text_patch = PathClippedImagePatch(text_path, arr, ec="none", transform=IdentityTransform()) - shadow1 = mpatches.Shadow(text_patch, 3, -2, props=dict(fc="none", ec="0.6", lw=3)) - shadow2 = mpatches.Shadow(text_patch, 3, -2, props=dict(fc="0.3", ec="none")) + shadow1 = mpatches.Shadow(text_patch, 1, -1, props=dict(fc="none", ec="0.6", lw=3)) + shadow2 = mpatches.Shadow(text_patch, 1, -1, props=dict(fc="0.3", ec="none")) # make offset box diff --git a/lib/matplotlib/mathtext.py b/lib/matplotlib/mathtext.py index 60910c9f947a..a505d635584a 100644 --- a/lib/matplotlib/mathtext.py +++ b/lib/matplotlib/mathtext.py @@ -336,6 +336,34 @@ def get_results(self, box): svg_elements, self.fonts_object.get_used_characters()) +class MathtextBackendPath(MathtextBackend): + """ + Store information to write a mathtext rendering to the Cairo + backend. + """ + + def __init__(self): + self.glyphs = [] + self.rects = [] + + def render_glyph(self, ox, oy, info): + oy = self.height - oy + info.offset + thetext = unichr(info.num) + self.glyphs.append( + (info.font, info.fontsize, thetext, ox, oy)) + + def render_rect_filled(self, x1, y1, x2, y2): + self.rects.append( + (x1, self.height-y2 , x2 - x1, y2 - y1)) + + def get_results(self, box): + ship(0, -self.depth, box) + return (self.width, + self.height + self.depth, + self.depth, + self.glyphs, + self.rects) + class MathtextBackendCairo(MathtextBackend): """ Store information to write a mathtext rendering to the Cairo @@ -2751,6 +2779,7 @@ class MathTextParser(object): 'ps' : MathtextBackendPs, 'pdf' : MathtextBackendPdf, 'svg' : MathtextBackendSvg, + 'path' : MathtextBackendPath, 'cairo' : MathtextBackendCairo, 'macosx': MathtextBackendAgg, } diff --git a/lib/matplotlib/text.py b/lib/matplotlib/text.py index eb21d2a84bd5..7254956e9017 100644 --- a/lib/matplotlib/text.py +++ b/lib/matplotlib/text.py @@ -1770,173 +1770,4 @@ def draw(self, renderer): docstring.interpd.update(Annotation=Annotation.__init__.__doc__) -class TextPath(Path): - """ - Create a path from the text. - """ - - # TODO : math text is currently not supported, but it would not be easy. - - FONT_SCALE = 100. - - def __init__(self, xy, s, size=None, prop=None, - _interpolation_steps=1, - *kl, **kwargs): - """ - Create a path from the text. No support for TeX yet. Note that - it simply is a path, not an artist. You need to use the - PathPatch (or other artists) to draw this path onto the - canvas. - - xy : position of the text. - s : text - size : font size - prop : font property - """ - - - if prop is None: - prop = FontProperties() - - if size is None: - size = prop.get_size_in_points() - - - self._xy = xy - self.set_size(size) - - self._cached_vertices = None - - self._vertices, self._codes = self.text_get_vertices_codes(prop, s) - - self.should_simplify = False - self.simplify_threshold = rcParams['path.simplify_threshold'] - self.has_nonfinite = False - self._interpolation_steps = _interpolation_steps - - - def set_size(self, size): - """ - set the size of the text - """ - self._size = size - self._invalid = True - - def get_size(self): - """ - get the size of the text - """ - return self._size - - def _get_vertices(self): - """ - Return the cached path after updating it if necessary. - """ - self._revalidate_path() - return self._cached_vertices - - def _get_codes(self): - """ - Return the codes - """ - return self._codes - - vertices = property(_get_vertices) - codes = property(_get_codes) - - def _revalidate_path(self): - """ - update the path if necessary. - - The path for the text is initially create with the font size - of FONT_SCALE, and this path is rescaled to other size when - necessary. - - """ - if self._invalid or \ - (self._cached_vertices is None): - tr = Affine2D().scale(self._size/self.FONT_SCALE, - self._size/self.FONT_SCALE).translate(*self._xy) - self._cached_vertices = tr.transform(self._vertices) - self._invalid = False - - - def glyph_char_path(self, glyph, currx=0.): - """ - convert the glyph to vertices and codes. Mostly copied from - backend_svg.py. - """ - verts, codes = [], [] - for step in glyph.path: - if step[0] == 0: # MOVE_TO - verts.append((step[1], step[2])) - codes.append(Path.MOVETO) - elif step[0] == 1: # LINE_TO - verts.append((step[1], step[2])) - codes.append(Path.LINETO) - elif step[0] == 2: # CURVE3 - verts.extend([(step[1], step[2]), - (step[3], step[4])]) - codes.extend([Path.CURVE3, Path.CURVE3]) - elif step[0] == 3: # CURVE4 - verts.extend([(step[1], step[2]), - (step[3], step[4]), - (step[5], step[6])]) - codes.extend([Path.CURVE4, Path.CURVE4, Path.CURVE4]) - elif step[0] == 4: # ENDPOLY - verts.append((0, 0,)) - codes.append(Path.CLOSEPOLY) - - verts = [(x+currx, y) for (x,y) in verts] - - return verts, codes - - - def text_get_vertices_codes(self, prop, s): - """ - convert the string *s* to vertices and codes using the - provided font property *prop*. Mostly copied from - backend_svg.py. - """ - - fname = font_manager.findfont(prop) - font = FT2Font(str(fname)) - - font.set_size(self.FONT_SCALE, 72) - - cmap = font.get_charmap() - lastgind = None - - currx = 0 - - verts, codes = [], [] - - - # I'm not sure if I get kernings right. Needs to be verified. -JJL - - for c in s: - - ccode = ord(c) - gind = cmap.get(ccode) - if gind is None: - ccode = ord('?') - gind = 0 - glyph = font.load_char(ccode, flags=LOAD_NO_HINTING) - - - if lastgind is not None: - kern = font.get_kerning(lastgind, gind, KERNING_DEFAULT) - else: - kern = 0 - currx += (kern / 64.0) #/ (self.FONT_SCALE) - - verts1, codes1 = self.glyph_char_path(glyph, currx) - verts.extend(verts1) - codes.extend(codes1) - - - currx += (glyph.linearHoriAdvance / 65536.0) #/ (self.FONT_SCALE) - lastgind = gind - - return verts, codes - +from matplotlib.textpath import TextPath diff --git a/lib/matplotlib/textpath.py b/lib/matplotlib/textpath.py new file mode 100644 index 000000000000..e4592bfffe2a --- /dev/null +++ b/lib/matplotlib/textpath.py @@ -0,0 +1,463 @@ +# -*- coding: utf-8 -*- + +import urllib +from matplotlib.path import Path +import matplotlib.font_manager as font_manager + +from matplotlib.ft2font import FT2Font, KERNING_DEFAULT, LOAD_NO_HINTING, LOAD_TARGET_LIGHT + +from matplotlib.mathtext import MathTextParser + +import matplotlib.dviread as dviread +from matplotlib.texmanager import TexManager + +import numpy as np + +class TextToPath(object): + """ + A class that convert a given text to a path using ttf fonts. + """ + + FONT_SCALE = 50. + DPI = 72 + + def __init__(self): + """ + Initialization + """ + self.mathtext_parser = MathTextParser('path') + self.tex_font_map = None + + from matplotlib.cbook import maxdict + self._ps_fontd = maxdict(50) + + + def _get_font(self, prop): + """ + find a ttf font. + """ + fname = font_manager.findfont(prop) + font = FT2Font(str(fname)) + font.set_size(self.FONT_SCALE, self.DPI) + + return font + + + def _get_char_id(self, font, ccode): + """ + Return a unique id for the given font and character-code set. + """ + ps_name = font.get_sfnt()[(1,0,0,6)] + char_id = urllib.quote('%s-%d' % (ps_name, ccode)) + return char_id + + def _get_char_id_ps(self, font, ccode): + """ + Return a unique id for the given font and character-code set (for tex). + """ + ps_name = font.get_ps_font_info()[2] + char_id = urllib.quote('%s-%d' % (ps_name, ccode)) + return char_id + + + def glyph_to_path(self, glyph, currx=0.): + """ + convert the ft2font glyph to vertices and codes. + """ + #Mostly copied from backend_svg.py. + + verts, codes = [], [] + for step in glyph.path: + if step[0] == 0: # MOVE_TO + verts.append((step[1], step[2])) + codes.append(Path.MOVETO) + elif step[0] == 1: # LINE_TO + verts.append((step[1], step[2])) + codes.append(Path.LINETO) + elif step[0] == 2: # CURVE3 + verts.extend([(step[1], step[2]), + (step[3], step[4])]) + codes.extend([Path.CURVE3, Path.CURVE3]) + elif step[0] == 3: # CURVE4 + verts.extend([(step[1], step[2]), + (step[3], step[4]), + (step[5], step[6])]) + codes.extend([Path.CURVE4, Path.CURVE4, Path.CURVE4]) + elif step[0] == 4: # ENDPOLY + verts.append((0, 0,)) + codes.append(Path.CLOSEPOLY) + + verts = [(x+currx, y) for (x,y) in verts] + return verts, codes + + + def get_text_path(self, prop, s, ismath=False, usetex=False): + """ + convert text *s* to path (a tuple of vertices and codes for matplotlib.math.Path). + + *prop* + font property + + *s* + text to be converted + + *usetex* + If True, use matplotlib usetex mode. + + *ismath* + If True, use mathtext parser. Effective only if usetex == False. + + + """ + if usetex==False: + if ismath == False: + font = self._get_font(prop) + glyph_info, glyph_map, rects = self.get_glyphs_with_font(font, s) + else: + glyph_info, glyph_map, rects = self.get_glyphs_mathtext(prop, s) + else: + glyph_info, glyph_map, rects = self.get_glyphs_tex(prop, s) + + verts, codes = [], [] + + for glyph_id, xposition, yposition, scale in glyph_info: + verts1, codes1 = glyph_map[glyph_id] + if verts1: + verts1 = np.array(verts1)*scale + [xposition, yposition] + verts.extend(verts1) + codes.extend(codes1) + + for verts1, codes1 in rects: + verts.extend(verts1) + codes.extend(codes1) + + return verts, codes + + + def get_glyphs_with_font(self, font, s, glyph_map=None): + """ + convert the string *s* to vertices and codes using the + provided ttf font. + """ + + # Mostly copied from backend_svg.py. + + cmap = font.get_charmap() + lastgind = None + + currx = 0 + xpositions = [] + glyph_ids = [] + + if glyph_map is None: + glyph_map = dict() + + # I'm not sure if I get kernings right. Needs to be verified. -JJL + + for c in s: + + + ccode = ord(c) + gind = cmap.get(ccode) + if gind is None: + ccode = ord('?') + gind = 0 + + if lastgind is not None: + kern = font.get_kerning(lastgind, gind, KERNING_DEFAULT) + else: + kern = 0 + + + glyph = font.load_char(ccode, flags=LOAD_NO_HINTING) + horiz_advance = (glyph.linearHoriAdvance / 65536.0) + + char_id = self._get_char_id(font, ccode) + if not char_id in glyph_map: + glyph_map[char_id] = self.glyph_to_path(glyph) + + currx += (kern / 64.0) + + xpositions.append(currx) + glyph_ids.append(char_id) + + currx += horiz_advance + + lastgind = gind + + ypositions = [0] * len(xpositions) + sizes = [1.] * len(xpositions) + + rects = [] + + return zip(glyph_ids, xpositions, ypositions, sizes), glyph_map, rects + + + + + def get_glyphs_mathtext(self, prop, s): + """ + convert the string *s* to vertices and codes by parsing it with mathtext. + """ + + prop = prop.copy() + prop.set_size(self.FONT_SCALE) + + width, height, descent, glyphs, rects = self.mathtext_parser.parse( + s, self.DPI, prop) + + + glyph_map = dict() + + xpositions = [] + ypositions = [] + glyph_ids = [] + sizes = [] + + currx, curry = 0, 0 + for font, fontsize, s, ox, oy in glyphs: + + ccode = ord(s) + char_id = self._get_char_id(font, ccode) + if not char_id in glyph_map: + font.clear() + font.set_size(self.FONT_SCALE, self.DPI) + glyph = font.load_char(ccode, flags=LOAD_NO_HINTING) + glyph_map[char_id] = self.glyph_to_path(glyph) + + xpositions.append(ox) + ypositions.append(oy) + glyph_ids.append(char_id) + size = fontsize / self.FONT_SCALE + sizes.append(size) + + myrects = [] + for ox, oy, w, h in rects: + vert1=[(ox, oy), (ox, oy+h), (ox+w, oy+h), (ox+w, oy), (ox, oy), (0,0)] + code1 = [Path.MOVETO, + Path.LINETO, Path.LINETO, Path.LINETO, Path.LINETO, + Path.CLOSEPOLY] + myrects.append((vert1, code1)) + + + return zip(glyph_ids, xpositions, ypositions, sizes), glyph_map, myrects + + + + def get_glyphs_tex(self, prop, s): + """ + convert the string *s* to vertices and codes using matplotlib's usetex mode. + """ + + # codes are modstly borrowed from pdf backend. + + texmanager = TexManager() + + if self.tex_font_map is None: + self.tex_font_map = dviread.PsfontsMap(dviread.find_tex_file('pdftex.map')) + + fontsize = prop.get_size_in_points() + if hasattr(texmanager, "get_dvi"): # + dvifilelike = texmanager.get_dvi(s, self.FONT_SCALE) + dvi = dviread.DviFromFileLike(dvifilelike, self.DPI) + else: + dvifile = texmanager.make_dvi(s, self.FONT_SCALE) + dvi = dviread.Dvi(dvifile, self.DPI) + page = iter(dvi).next() + dvi.close() + + glyph_ids, xpositions, ypositions, sizes = [], [], [], [] + glyph_map = dict() + + # Gather font information and do some setup for combining + # characters into strings. + #oldfont, seq = None, [] + for x1, y1, dvifont, glyph, width in page.text: + font_and_encoding = self._ps_fontd.get(dvifont.texname) + + if font_and_encoding is None: + font_bunch = self.tex_font_map[dvifont.texname] + font = FT2Font(font_bunch.filename) + if font_bunch.encoding: + enc = dviread.Encoding(font_bunch.encoding) + else: + enc = None + self._ps_fontd[dvifont.texname] = font, enc + + else: + font, enc = font_and_encoding + + ft2font_flag = LOAD_TARGET_LIGHT + if enc: + ng = font.get_name_index(enc.encoding[glyph]) + else: + ng = glyph + + char_id = self._get_char_id_ps(font, ng) + + if not char_id in glyph_map: + font.clear() + font.set_size(self.FONT_SCALE, self.DPI) + + if ng == 0: + # While 0 is a valid index (e.g., "-", "\Gamma"), + # font.load_glyph(0) does not seem to work. This + # may not be a general solution. + glyph0 = font.load_glyph(128, flags=ft2font_flag) + else: + glyph0 = font.load_glyph(ng, flags=ft2font_flag) + + glyph_map[char_id] = self.glyph_to_path(glyph0) + + glyph_ids.append(char_id) + xpositions.append(x1) + ypositions.append(y1) + sizes.append(dvifont.size/self.FONT_SCALE) + + myrects = [] + + for ox, oy, h, w in page.boxes: + vert1=[(ox, oy), (ox+w, oy), (ox+w, oy+h), (ox, oy+h), (ox, oy), (0,0)] + code1 = [Path.MOVETO, + Path.LINETO, Path.LINETO, Path.LINETO, Path.LINETO, + Path.CLOSEPOLY] + myrects.append((vert1, code1)) + + + return zip(glyph_ids, xpositions, ypositions, sizes), glyph_map, myrects + + + + + + +from matplotlib.font_manager import FontProperties +from matplotlib import rcParams +from matplotlib.transforms import Affine2D + +text_to_path = TextToPath() + +class TextPath(Path): + """ + Create a path from the text. + """ + + def __init__(self, xy, s, size=None, prop=None, + _interpolation_steps=1, usetex=False, + *kl, **kwargs): + """ + Create a path from the text. No support for TeX yet. Note that + it simply is a path, not an artist. You need to use the + PathPatch (or other artists) to draw this path onto the + canvas. + + xy : position of the text. + s : text + size : font size + prop : font property + """ + + + if prop is None: + prop = FontProperties() + + if size is None: + size = prop.get_size_in_points() + + + self._xy = xy + self.set_size(size) + + self._cached_vertices = None + + self._vertices, self._codes = self.text_get_vertices_codes(prop, s, usetex=usetex) + + self.should_simplify = False + self.simplify_threshold = rcParams['path.simplify_threshold'] + self.has_nonfinite = False + self._interpolation_steps = _interpolation_steps + + + def set_size(self, size): + """ + set the size of the text + """ + self._size = size + self._invalid = True + + def get_size(self): + """ + get the size of the text + """ + return self._size + + def _get_vertices(self): + """ + Return the cached path after updating it if necessary. + """ + self._revalidate_path() + return self._cached_vertices + + def _get_codes(self): + """ + Return the codes + """ + return self._codes + + vertices = property(_get_vertices) + codes = property(_get_codes) + + def _revalidate_path(self): + """ + update the path if necessary. + + The path for the text is initially create with the font size + of FONT_SCALE, and this path is rescaled to other size when + necessary. + + """ + if self._invalid or \ + (self._cached_vertices is None): + tr = Affine2D().scale(self._size/text_to_path.FONT_SCALE, + self._size/text_to_path.FONT_SCALE).translate(*self._xy) + self._cached_vertices = tr.transform(self._vertices) + self._invalid = False + + + def is_math_text(self, s): + """ + Returns True if the given string *s* contains any mathtext. + """ + # copied from Text.is_math_text -JJL + + # Did we find an even number of non-escaped dollar signs? + # If so, treat is as math text. + dollar_count = s.count(r'$') - s.count(r'\$') + even_dollars = (dollar_count > 0 and dollar_count % 2 == 0) + + if rcParams['text.usetex']: + return s, 'TeX' + + if even_dollars: + return s, True + else: + return s.replace(r'\$', '$'), False + + def text_get_vertices_codes(self, prop, s, usetex): + """ + convert the string *s* to vertices and codes using the + provided font property *prop*. Mostly copied from + backend_svg.py. + """ + + if usetex: + verts, codes = text_to_path.get_text_path(prop, s, usetex=True) + else: + clean_line, ismath = self.is_math_text(s) + verts, codes = text_to_path.get_text_path(prop, clean_line, ismath=ismath) + + return verts, codes + + + + diff --git a/src/ft2font.cpp b/src/ft2font.cpp index 8dfdd4de6818..fd838bb35495 100644 --- a/src/ft2font.cpp +++ b/src/ft2font.cpp @@ -1105,6 +1105,51 @@ FT2Font::load_char(const Py::Tuple & args, const Py::Dict & kwargs) { return Py::asObject(gm); } + +char FT2Font::load_glyph__doc__[] = +"load_glyph(glyphindex, flags=LOAD_FORCE_AUTOHINT)\n" +"\n" +"Load character with glyphindex in current fontfile and set glyph.\n" +"The flags argument can be a bitwise-or of the LOAD_XXX constants.\n" +"Return value is a Glyph object, with attributes\n" +" width # glyph width\n" +" height # glyph height\n" +" bbox # the glyph bbox (xmin, ymin, xmax, ymax)\n" +" horiBearingX # left side bearing in horizontal layouts\n" +" horiBearingY # top side bearing in horizontal layouts\n" +" horiAdvance # advance width for horizontal layout\n" +" vertBearingX # left side bearing in vertical layouts\n" +" vertBearingY # top side bearing in vertical layouts\n" +" vertAdvance # advance height for vertical layout\n" +; +Py::Object +FT2Font::load_glyph(const Py::Tuple & args, const Py::Dict & kwargs) { + _VERBOSE("FT2Font::load_glyph"); + //load a char using the unsigned long charcode + + args.verify_length(1); + long glyph_index = Py::Long(args[0]), flags = Py::Long(FT_LOAD_FORCE_AUTOHINT); + if (kwargs.hasKey("flags")) + flags = Py::Long(kwargs["flags"]); + + int error = FT_Load_Glyph( face, glyph_index, flags ); + + if (error) + throw Py::RuntimeError(Printf("Could not load glyph index %d", glyph_index).str()); + + FT_Glyph thisGlyph; + error = FT_Get_Glyph( face->glyph, &thisGlyph ); + + if (error) + throw Py::RuntimeError(Printf("Could not get glyph for glyph index %d", glyph_index).str()); + + size_t num = glyphs.size(); //the index into the glyphs list + glyphs.push_back(thisGlyph); + Glyph* gm = new Glyph(face, thisGlyph, num); + return Py::asObject(gm); +} + + char FT2Font::get_width_height__doc__[] = "w, h = get_width_height()\n" "\n" @@ -1782,6 +1827,8 @@ FT2Font::init_type() { FT2Font::get_num_glyphs__doc__); add_keyword_method("load_char", &FT2Font::load_char, FT2Font::load_char__doc__); + add_keyword_method("load_glyph", &FT2Font::load_glyph, + FT2Font::load_glyph__doc__); add_keyword_method("set_text", &FT2Font::set_text, FT2Font::set_text__doc__); add_varargs_method("set_size", &FT2Font::set_size, diff --git a/src/ft2font.h b/src/ft2font.h index 88a221b394e9..e8f6b8e2423d 100644 --- a/src/ft2font.h +++ b/src/ft2font.h @@ -99,6 +99,7 @@ class FT2Font : public Py::PythonExtension { Py::Object get_kerning(const Py::Tuple & args); Py::Object get_num_glyphs(const Py::Tuple & args); Py::Object load_char(const Py::Tuple & args, const Py::Dict & kws); + Py::Object load_glyph(const Py::Tuple & args, const Py::Dict & kws); Py::Object get_width_height(const Py::Tuple & args); Py::Object get_descent(const Py::Tuple & args); Py::Object draw_rect_filled(const Py::Tuple & args); @@ -140,6 +141,7 @@ class FT2Font : public Py::PythonExtension { static char get_glyph__doc__ []; static char get_num_glyphs__doc__ []; static char load_char__doc__ []; + static char load_glyph__doc__ []; static char get_width_height__doc__ []; static char get_descent__doc__ []; static char get_kerning__doc__ []; From 25b463ca898517b14e2e608df7cc26116ed6cd3e Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Fri, 4 Sep 2009 20:20:06 +0000 Subject: [PATCH 0147/1000] textpath.py: import texmanager only when required svn path=/trunk/matplotlib/; revision=7636 --- examples/pylab_examples/demo_text_path.py | 13 ++++++++++--- lib/matplotlib/textpath.py | 13 +++++++++++-- 2 files changed, 21 insertions(+), 5 deletions(-) diff --git a/examples/pylab_examples/demo_text_path.py b/examples/pylab_examples/demo_text_path.py index eb0113941345..ef7d2cb35b7b 100644 --- a/examples/pylab_examples/demo_text_path.py +++ b/examples/pylab_examples/demo_text_path.py @@ -54,6 +54,8 @@ def draw(self, renderer=None): if 1: + usetex = plt.rcParams["text.usetex"] + fig = plt.figure(1) # EXAMPLE 1 @@ -80,8 +82,14 @@ def draw(self, renderer=None): # another text from matplotlib.patches import PathPatch - text_path = TextPath((0, 0), r"\mbox{textpath supports mathtext \& \TeX}", - size=20, usetex=True) + if usetex: + r = r"\mbox{textpath supports mathtext \& \TeX}" + else: + r = r"textpath supports mathtext & TeX" + + text_path = TextPath((0, 0), r, + size=20, usetex=usetex) + p1 = PathPatch(text_path, ec="w", lw=3, fc="w", alpha=0.9, transform=IdentityTransform()) p2 = PathPatch(text_path, ec="none", fc="k", @@ -111,7 +119,6 @@ def draw(self, renderer=None): arr = np.arange(256).reshape(1,256)/256. - usetex = plt.rcParams["text.usetex"] if usetex: s = r"$\displaystyle\left[\sum_{n=1}^\infty\frac{-e^{i\pi}}{2^n}\right]$!" else: diff --git a/lib/matplotlib/textpath.py b/lib/matplotlib/textpath.py index e4592bfffe2a..47ee33c290a8 100644 --- a/lib/matplotlib/textpath.py +++ b/lib/matplotlib/textpath.py @@ -9,7 +9,6 @@ from matplotlib.mathtext import MathTextParser import matplotlib.dviread as dviread -from matplotlib.texmanager import TexManager import numpy as np @@ -31,6 +30,7 @@ def __init__(self): from matplotlib.cbook import maxdict self._ps_fontd = maxdict(50) + self._texmanager = None def _get_font(self, prop): """ @@ -243,6 +243,15 @@ def get_glyphs_mathtext(self, prop, s): return zip(glyph_ids, xpositions, ypositions, sizes), glyph_map, myrects + def get_texmanager(self): + """ + return the :class:`matplotlib.texmanager.TexManager` instance + """ + if self._texmanager is None: + from matplotlib.texmanager import TexManager + self._texmanager = TexManager() + return self._texmanager + def get_glyphs_tex(self, prop, s): """ @@ -251,7 +260,7 @@ def get_glyphs_tex(self, prop, s): # codes are modstly borrowed from pdf backend. - texmanager = TexManager() + texmanager = self.get_texmanager() if self.tex_font_map is None: self.tex_font_map = dviread.PsfontsMap(dviread.find_tex_file('pdftex.map')) From 10018ba4970b53d2b62549fc805ca2699138fc53 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Sat, 5 Sep 2009 18:55:08 +0000 Subject: [PATCH 0148/1000] Fix bug related to autoscaling and masked values in quiver svn path=/trunk/matplotlib/; revision=7637 --- lib/matplotlib/quiver.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/quiver.py b/lib/matplotlib/quiver.py index c1eabaeef124..945b2d0b83cb 100644 --- a/lib/matplotlib/quiver.py +++ b/lib/matplotlib/quiver.py @@ -498,7 +498,11 @@ def _make_verts(self, U, V): a = np.absolute(uv) if self.scale is None: sn = max(10, math.sqrt(self.N)) - scale = 1.8 * a[~self.Umask].mean() * sn / self.span # crude auto-scaling + if self.Umask is not ma.nomask: + amean = a[~self.Umask].mean() + else: + amean = a.mean() + scale = 1.8 * amean * sn / self.span # crude auto-scaling self.scale = scale length = a/(self.scale*self.width) X, Y = self._h_arrows(length) From 452413416b1099a72f664f41a992b75a9fc1146b Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 01:42:16 +0000 Subject: [PATCH 0149/1000] testing: add KnownFailureDidNotFailTest svn path=/trunk/matplotlib/; revision=7641 --- lib/matplotlib/testing/decorators.py | 6 ++++-- lib/matplotlib/testing/noseclasses.py | 4 ++++ 2 files changed, 8 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index e3353106ad1d..561acaf13981 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -1,4 +1,5 @@ -from matplotlib.testing.noseclasses import KnownFailureTest +from matplotlib.testing.noseclasses import KnownFailureTest, \ + KnownFailureDidNotFailTest import sys def knownfailureif(fail_condition, msg=None): @@ -18,7 +19,8 @@ def failer(*args, **kwargs): raise KnownFailureTest(msg) else: raise - # Fixme: Should raise KnownFailureDidNotFail if fail_condition==True? + if fail_condition: + raise KnownFailureDidNotFailTest(msg) return result return nose.tools.make_decorator(f)(failer) return known_fail_decorator diff --git a/lib/matplotlib/testing/noseclasses.py b/lib/matplotlib/testing/noseclasses.py index 284678be0c36..9eee489c806a 100644 --- a/lib/matplotlib/testing/noseclasses.py +++ b/lib/matplotlib/testing/noseclasses.py @@ -5,6 +5,10 @@ class KnownFailureTest(Exception): '''Raise this exception to mark a test as a known failing test.''' pass +class KnownFailureDidNotFailTest(Exception): + '''Raise this exception to mark a test should have failed but did not.''' + pass + class KnownFailure(ErrorClassPlugin): '''Plugin that installs a KNOWNFAIL error class for the KnownFailureClass exception. When KnownFailureTest is raised, From 02d7003a8f917c04e1daedae199355827d7877b9 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 01:42:27 +0000 Subject: [PATCH 0150/1000] testing: allow fail_condition to be 'indeterminate' for knownfailureif decorator svn path=/trunk/matplotlib/; revision=7642 --- lib/matplotlib/testing/decorators.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index 561acaf13981..bd2964c595d9 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -19,7 +19,7 @@ def failer(*args, **kwargs): raise KnownFailureTest(msg) else: raise - if fail_condition: + if fail_condition and fail_condition != 'indeterminate': raise KnownFailureDidNotFailTest(msg) return result return nose.tools.make_decorator(f)(failer) From 1e909bd5d5701b30f9b13bb558e0dda20e7f678a Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 01:42:36 +0000 Subject: [PATCH 0151/1000] testing: switch known failure condition to 'indeterminate' for SF bug 2850075 svn path=/trunk/matplotlib/; revision=7643 --- test/test_matplotlib/TestAxes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/test_matplotlib/TestAxes.py b/test/test_matplotlib/TestAxes.py index cec50c3ab987..078d3022446c 100644 --- a/test/test_matplotlib/TestAxes.py +++ b/test/test_matplotlib/TestAxes.py @@ -43,7 +43,7 @@ def tearDown( self ): pass #-------------------------------------------------------------------- - @knownfailureif(True, "Fails due to SF bug 2850075") + @knownfailureif('indeterminate', "Fails due to SF bug 2850075") def test_empty_datetime( self ): """Test plotting empty axes with dates along one axis.""" fname = self.outFile( "empty_datetime.png" ) From 0495f31c08b09a663de2bff7533420f703932ea9 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 01:42:43 +0000 Subject: [PATCH 0152/1000] testing: install KnownFailure nose plugin if using setuptools svn path=/trunk/matplotlib/; revision=7644 --- setupegg.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/setupegg.py b/setupegg.py index ba315c87271f..56a373ae3a8b 100644 --- a/setupegg.py +++ b/setupegg.py @@ -5,4 +5,9 @@ from setuptools import setup execfile('setup.py', {'additional_params' : - {'namespace_packages' : ['mpl_toolkits']}}) + {'namespace_packages' : ['mpl_toolkits'], + 'entry_points': {'nose.plugins': + [ + 'KnownFailure = matplotlib.testing.noseclasses:KnownFailure', + ] + }}}) From 87ee161bfd2f0ab1f686765a737a0d2dcadab1dc Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 01:42:52 +0000 Subject: [PATCH 0153/1000] testing: workaround issue with nose testing's ZeroNinePlugin svn path=/trunk/matplotlib/; revision=7645 --- lib/matplotlib/testing/noseclasses.py | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/testing/noseclasses.py b/lib/matplotlib/testing/noseclasses.py index 9eee489c806a..9ea7c575602a 100644 --- a/lib/matplotlib/testing/noseclasses.py +++ b/lib/matplotlib/testing/noseclasses.py @@ -38,8 +38,15 @@ def configure(self, options, conf): if disable: self.enabled = False - def addError( self, test, err ): + def addError( self, test, err, *zero_nine_capt_args ): # Fixme (Really weird): if I don't leave empty method here, # nose gets confused and KnownFails become testing errors when # using the MplNosePlugin and MplTestCase. + + # The *zero_nine_capt_args captures an extra argument. There + # seems to be a bug in + # nose.testing.manager.ZeroNinePlugin.addError() in which a + # 3rd positional argument ("capt") is passed to the plugin's + # addError() method, even if one is not explicitly using the + # ZeroNinePlugin. pass From 88e74bb5c06b259fef31199318b440992a50878d Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 01:43:05 +0000 Subject: [PATCH 0154/1000] testing: move image comparison functions into matplotlib.testing svn path=/trunk/matplotlib/; revision=7646 --- {test/mplTest => lib/matplotlib/testing}/compare.py | 0 test/mplTest/MplTestCase.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename {test/mplTest => lib/matplotlib/testing}/compare.py (100%) diff --git a/test/mplTest/compare.py b/lib/matplotlib/testing/compare.py similarity index 100% rename from test/mplTest/compare.py rename to lib/matplotlib/testing/compare.py diff --git a/test/mplTest/MplTestCase.py b/test/mplTest/MplTestCase.py index b7f42a2cd07c..719cad0e1edc 100644 --- a/test/mplTest/MplTestCase.py +++ b/test/mplTest/MplTestCase.py @@ -6,7 +6,7 @@ import os.path import unittest -import compare +import matplotlib.testing.compare as compare import path_utils #======================================================================= From d8a9e85546d36723da1838ce76ca625e64463935 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 01:43:18 +0000 Subject: [PATCH 0155/1000] testing: add new, simplified testing infrastructure svn path=/trunk/matplotlib/; revision=7647 --- lib/matplotlib/tests/__init__.py | 0 lib/matplotlib/tests/test_basic.py | 11 +++++++ lib/matplotlib/tests/test_transforms.py | 40 +++++++++++++++++++++++++ setup.py | 1 + test/run-mpl-test.py | 3 ++ 5 files changed, 55 insertions(+) create mode 100644 lib/matplotlib/tests/__init__.py create mode 100644 lib/matplotlib/tests/test_basic.py create mode 100644 lib/matplotlib/tests/test_transforms.py diff --git a/lib/matplotlib/tests/__init__.py b/lib/matplotlib/tests/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/lib/matplotlib/tests/test_basic.py b/lib/matplotlib/tests/test_basic.py new file mode 100644 index 000000000000..a1dc83e7d639 --- /dev/null +++ b/lib/matplotlib/tests/test_basic.py @@ -0,0 +1,11 @@ +from nose.tools import assert_equal +from matplotlib.testing.decorators import knownfailureif + +def test_simple(): + '''very simple example test''' + assert_equal(1+1,2) + +@knownfailureif(True) +def test_simple_fail(): + '''very simple example test that should fail''' + assert_equal(1+1,3) diff --git a/lib/matplotlib/tests/test_transforms.py b/lib/matplotlib/tests/test_transforms.py new file mode 100644 index 000000000000..a17dab121156 --- /dev/null +++ b/lib/matplotlib/tests/test_transforms.py @@ -0,0 +1,40 @@ +from nose.tools import assert_equal +from numpy.testing import assert_almost_equal +from matplotlib.transforms import Affine2D +import numpy as np + +def test_Affine2D_from_values(): + points = [ [0,0], + [10,20], + [-1,0], + ] + + t = Affine2D.from_values(1,0,0,0,0,0) + actual = t.transform(points) + expected = np.array( [[0,0],[10,0],[-1,0]] ) + assert_almost_equal(actual,expected) + + t = Affine2D.from_values(0,2,0,0,0,0) + actual = t.transform(points) + expected = np.array( [[0,0],[0,20],[0,-2]] ) + assert_almost_equal(actual,expected) + + t = Affine2D.from_values(0,0,3,0,0,0) + actual = t.transform(points) + expected = np.array( [[0,0],[60,0],[0,0]] ) + assert_almost_equal(actual,expected) + + t = Affine2D.from_values(0,0,0,4,0,0) + actual = t.transform(points) + expected = np.array( [[0,0],[0,80],[0,0]] ) + assert_almost_equal(actual,expected) + + t = Affine2D.from_values(0,0,0,0,5,0) + actual = t.transform(points) + expected = np.array( [[5,0],[5,0],[5,0]] ) + assert_almost_equal(actual,expected) + + t = Affine2D.from_values(0,0,0,0,0,6) + actual = t.transform(points) + expected = np.array( [[0,6],[0,6],[0,6]] ) + assert_almost_equal(actual,expected) diff --git a/setup.py b/setup.py index c241dceaf4bb..06b040f6a61f 100644 --- a/setup.py +++ b/setup.py @@ -51,6 +51,7 @@ 'matplotlib.backends', 'matplotlib.projections', 'matplotlib.testing', + 'matplotlib.tests', # 'matplotlib.toolkits', 'mpl_toolkits', 'mpl_toolkits.mplot3d', diff --git a/test/run-mpl-test.py b/test/run-mpl-test.py index f443c8389512..d368f4f1daee 100755 --- a/test/run-mpl-test.py +++ b/test/run-mpl-test.py @@ -90,6 +90,9 @@ sys.exit( 0 ) ### Run nose +args.append('.') +args.append('matplotlib.tests.test_basic') +args.append('matplotlib.tests.test_transforms') success = nose.run( argv = args, plugins = [ MplNosePlugin(), KnownFailure() ] ) From 933cdb58e6b3b91df5ad6427e140cd1ff1f36922 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 01:43:29 +0000 Subject: [PATCH 0156/1000] testing: initial spine test (test for SF#2852168) svn path=/trunk/matplotlib/; revision=7648 --- lib/matplotlib/tests/test_spines.py | 22 ++++++++++++++++++++++ test/run-mpl-test.py | 1 + 2 files changed, 23 insertions(+) create mode 100644 lib/matplotlib/tests/test_spines.py diff --git a/lib/matplotlib/tests/test_spines.py b/lib/matplotlib/tests/test_spines.py new file mode 100644 index 000000000000..4b1b86f530ab --- /dev/null +++ b/lib/matplotlib/tests/test_spines.py @@ -0,0 +1,22 @@ +import numpy as np +import matplotlib +matplotlib.use('Agg') +from matplotlib.testing.decorators import image_comparison +import matplotlib.pyplot as plt + +@image_comparison(baseline_images=['spines_axes_positions.png']) +def test_spines_axes_positions(): + # SF bug 2852168 + fig = plt.figure() + x = np.linspace(0,2*np.pi,100) + y = 2*np.sin(x) + ax = fig.add_subplot(1,1,1) + ax.set_title('centered spines') + ax.plot(x,y) + ax.spines['right'].set_position(('axes',0.1)) + ax.yaxis.set_ticks_position('right') + ax.spines['top'].set_position(('axes',0.25)) + ax.xaxis.set_ticks_position('top') + ax.spines['left'].set_color('none') + ax.spines['bottom'].set_color('none') + fig.savefig('spines_axes_positions.png') diff --git a/test/run-mpl-test.py b/test/run-mpl-test.py index d368f4f1daee..5812f7358e00 100755 --- a/test/run-mpl-test.py +++ b/test/run-mpl-test.py @@ -93,6 +93,7 @@ args.append('.') args.append('matplotlib.tests.test_basic') args.append('matplotlib.tests.test_transforms') +args.append('matplotlib.tests.test_spines') success = nose.run( argv = args, plugins = [ MplNosePlugin(), KnownFailure() ] ) From 63a13ebae7ccbdef01ae44683d862feb17c6cf10 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 01:43:40 +0000 Subject: [PATCH 0157/1000] testing: convert function names to MPL coding standard svn path=/trunk/matplotlib/; revision=7649 --- lib/matplotlib/testing/compare.py | 14 +++++++------- test/mplTest/MplTestCase.py | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/lib/matplotlib/testing/compare.py b/lib/matplotlib/testing/compare.py index 3de97be0608d..99534a4c023f 100644 --- a/lib/matplotlib/testing/compare.py +++ b/lib/matplotlib/testing/compare.py @@ -11,12 +11,12 @@ #======================================================================= __all__ = [ - 'compareFloat', - 'compareImages', + 'compare_float', + 'compare_images', ] #----------------------------------------------------------------------- -def compareFloat( expected, actual, relTol = None, absTol = None ): +def compare_float( expected, actual, relTol = None, absTol = None ): """Fail if the floating point values are not close enough, with the givem message. @@ -72,7 +72,7 @@ def compareFloat( expected, actual, relTol = None, absTol = None ): return None #----------------------------------------------------------------------- -def compareImages( expected, actual, tol ): +def compare_images( expected, actual, tol ): '''Compare two image files - not the greatest, but fast and good enough. = EXAMPLE @@ -80,7 +80,7 @@ def compareImages( expected, actual, tol ): # img1 = "./baseline/plot.png" # img2 = "./output/plot.png" # - # compareImage( img1, img2, 0.001 ): + # compare_images( img1, img2, 0.001 ): = INPUT VARIABLES - expected The filename of the expected image. @@ -116,7 +116,7 @@ def compareImages( expected, actual, tol ): else: diff_image = os.path.join(os.path.dirname(actual), 'failed-diff-'+os.path.basename(actual)) - saveDiffImage( expected, actual, diff_image ) + save_diff_image( expected, actual, diff_image ) msg = " Error: Image files did not match.\n" \ " RMS Value: " + str( rms / 10000.0 ) + "\n" \ @@ -126,7 +126,7 @@ def compareImages( expected, actual, tol ): " Tolerance: " + str( tol ) + "\n" return msg -def saveDiffImage( expected, actual, output ): +def save_diff_image( expected, actual, output ): from PIL import Image expectedImage = np.array(Image.open( expected ).convert("RGB")).astype(np.float) actualImage = np.array(Image.open( actual ).convert("RGB")).astype(np.float) diff --git a/test/mplTest/MplTestCase.py b/test/mplTest/MplTestCase.py index 719cad0e1edc..2046c917f278 100644 --- a/test/mplTest/MplTestCase.py +++ b/test/mplTest/MplTestCase.py @@ -51,7 +51,7 @@ def checkImage( self, outfname, tol = 1.0e-3, msg = "" ): baselineImage = self.baseFile( basename ) - errorMessage = compare.compareImages( baselineImage, actualImage, tol ) + errorMessage = compare.compare_images( baselineImage, actualImage, tol ) if errorMessage: self.fail( msg + "\n" + errorMessage ) @@ -108,7 +108,7 @@ def checkClose( expected, actual, relTol = None, absTol = None, msg = "" ): You can specify a relative tolerance, absolute tolerance, or both. """ - errorMessage = compare.compareFloat( expected, actual, relTol, absTol ) + errorMessage = compare.compare_float( expected, actual, relTol, absTol ) if errorMessage: self.fail( msg + "\n" + errorMessage ) From b70544382d91e1ebc69ccc5417a9f2db0e9d1257 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 01:43:50 +0000 Subject: [PATCH 0158/1000] testing: clip abs diff image svn path=/trunk/matplotlib/; revision=7650 --- lib/matplotlib/testing/compare.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/testing/compare.py b/lib/matplotlib/testing/compare.py index 99534a4c023f..0ab1732e6f77 100644 --- a/lib/matplotlib/testing/compare.py +++ b/lib/matplotlib/testing/compare.py @@ -133,6 +133,6 @@ def save_diff_image( expected, actual, output ): absDiffImage = abs(expectedImage-actualImage) # expand differences in luminance domain absDiffImage *= 10 - save_image_np = absDiffImage.astype(np.uint8) + save_image_np = np.clip(absDiffImage,0,255).astype(np.uint8) save_image = Image.fromarray(save_image_np) save_image.save(output) From 26bad18d9b809e7b8a804c5effb851e0f9d2e29f Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 01:43:59 +0000 Subject: [PATCH 0159/1000] testing: give more informative error when nose plugin not installed svn path=/trunk/matplotlib/; revision=7651 --- lib/matplotlib/testing/decorators.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index bd2964c595d9..faafcd3f60b7 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -16,7 +16,7 @@ def failer(*args, **kwargs): result = f(*args, **kwargs) except: if fail_condition: - raise KnownFailureTest(msg) + raise KnownFailureTest(msg) # An error here when running nose means that you don't have the matplotlib.testing.noseclasses:KnownFailure plugin in use. else: raise if fail_condition and fail_condition != 'indeterminate': From e2f8829baa138ac9a1de6cfcd0f6d46f55560e1d Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 01:44:09 +0000 Subject: [PATCH 0160/1000] testing: implement image_comparison decorator svn path=/trunk/matplotlib/; revision=7652 --- lib/matplotlib/testing/compare.py | 24 +++++++++++++++++++----- lib/matplotlib/testing/decorators.py | 25 ++++++++++++++++++++++++- lib/matplotlib/testing/noseclasses.py | 3 +++ 3 files changed, 46 insertions(+), 6 deletions(-) diff --git a/lib/matplotlib/testing/compare.py b/lib/matplotlib/testing/compare.py index 0ab1732e6f77..8b7a45b78882 100644 --- a/lib/matplotlib/testing/compare.py +++ b/lib/matplotlib/testing/compare.py @@ -72,7 +72,7 @@ def compare_float( expected, actual, relTol = None, absTol = None ): return None #----------------------------------------------------------------------- -def compare_images( expected, actual, tol ): +def compare_images( expected, actual, tol, in_decorator=False ): '''Compare two image files - not the greatest, but fast and good enough. = EXAMPLE @@ -87,6 +87,8 @@ def compare_images( expected, actual, tol ): - actual The filename of the actual image. - tol The tolerance (a unitless float). This is used to determinte the 'fuzziness' to use when comparing images. + - in_decorator If called from image_comparison decorator, this should be + True. (default=False) ''' try: @@ -113,11 +115,21 @@ def compare_images( expected, actual, tol ): if ( (rms / 10000.0) <= tol ): return None - else: - diff_image = os.path.join(os.path.dirname(actual), - 'failed-diff-'+os.path.basename(actual)) - save_diff_image( expected, actual, diff_image ) + diff_image = os.path.join(os.path.dirname(actual), + 'failed-diff-'+os.path.basename(actual)) + save_diff_image( expected, actual, diff_image ) + + if in_decorator: + results = dict( + rms = rms, + expected = str(expected), + actual = str(actual), + diff = str(diff_image), + ) + return results + else: + # old-style call from mplTest directory msg = " Error: Image files did not match.\n" \ " RMS Value: " + str( rms / 10000.0 ) + "\n" \ " Expected:\n " + str( expected ) + "\n" \ @@ -130,6 +142,8 @@ def save_diff_image( expected, actual, output ): from PIL import Image expectedImage = np.array(Image.open( expected ).convert("RGB")).astype(np.float) actualImage = np.array(Image.open( actual ).convert("RGB")).astype(np.float) + assert expectedImage.ndim==expectedImage.ndim + assert expectedImage.shape==expectedImage.shape absDiffImage = abs(expectedImage-actualImage) # expand differences in luminance domain absDiffImage *= 10 diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index faafcd3f60b7..042e8c5f261d 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -1,6 +1,9 @@ from matplotlib.testing.noseclasses import KnownFailureTest, \ - KnownFailureDidNotFailTest + KnownFailureDidNotFailTest, ImageComparisonFailure import sys +import nose +from matplotlib.cbook import get_sample_data +from matplotlib.testing.compare import compare_images def knownfailureif(fail_condition, msg=None): # based on numpy.testing.dec.knownfailureif @@ -24,3 +27,23 @@ def failer(*args, **kwargs): return result return nose.tools.make_decorator(f)(failer) return known_fail_decorator + +def image_comparison(baseline_images=None, tol=1e-3): + if baseline_images is None: + raise ValueError('baseline_images must be specified') + def compare_images_decorator(func): + def decorated_compare_images(*args,**kwargs): + result = func(*args,**kwargs) + for fname in baseline_images: + actual = fname + expected = get_sample_data('test_baseline_%s'%fname, + asfileobj=False) + err = compare_images( expected, actual, tol, + in_decorator=True ) + if err: + raise ImageComparisonFailure( + 'images not close: %(actual)s vs. %(expected)s ' + '(RMS %(rms).3f)'%err) + return result + return nose.tools.make_decorator(func)(decorated_compare_images) + return compare_images_decorator diff --git a/lib/matplotlib/testing/noseclasses.py b/lib/matplotlib/testing/noseclasses.py index 9ea7c575602a..1a40452e7dc7 100644 --- a/lib/matplotlib/testing/noseclasses.py +++ b/lib/matplotlib/testing/noseclasses.py @@ -9,6 +9,9 @@ class KnownFailureDidNotFailTest(Exception): '''Raise this exception to mark a test should have failed but did not.''' pass +class ImageComparisonFailure(Exception): + '''Raise this exception to mark a test as a comparison between two images.''' + class KnownFailure(ErrorClassPlugin): '''Plugin that installs a KNOWNFAIL error class for the KnownFailureClass exception. When KnownFailureTest is raised, From 13eae44addc6e7983311700ad77d528d2d4c46c0 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 03:39:42 +0000 Subject: [PATCH 0161/1000] testing: collect new image results on failed image comparisons svn path=/trunk/matplotlib/; revision=7653 --- lib/matplotlib/testing/compare.py | 2 ++ test/_buildbot_test_postmortem.py | 31 ++++++++++++++++++++++++++++--- 2 files changed, 30 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/testing/compare.py b/lib/matplotlib/testing/compare.py index 8b7a45b78882..87e97f95a9af 100644 --- a/lib/matplotlib/testing/compare.py +++ b/lib/matplotlib/testing/compare.py @@ -7,6 +7,7 @@ import operator import os import numpy as np +import shutil #======================================================================= @@ -121,6 +122,7 @@ def compare_images( expected, actual, tol, in_decorator=False ): save_diff_image( expected, actual, diff_image ) if in_decorator: + shutil.copyfile( expected, 'expected-'+os.path.basename(actual)) results = dict( rms = rms, expected = str(expected), diff --git a/test/_buildbot_test_postmortem.py b/test/_buildbot_test_postmortem.py index 5a4c4b87ada6..672347d48908 100644 --- a/test/_buildbot_test_postmortem.py +++ b/test/_buildbot_test_postmortem.py @@ -9,9 +9,10 @@ roots = ['test_matplotlib','test_plots'] savedresults_dir = 'saved-results' baseline_dir = 'baseline' -basename = 'failed-diff-' +expected_basename = 'expected-' +diff_basename = 'failed-diff-' target_dir = os.path.abspath('status_images') -nbase = len(basename) +nbase = len(diff_basename) def listFiles(root, patterns='*', recurse=1, return_folders=0): """ @@ -76,7 +77,31 @@ def path_split_all(fname): if os.path.exists(target_dir): shutil.rmtree(target_dir) os.makedirs( target_dir ) # prevent buildbot DirectoryUpload failure + + # new matplotlib.testing infrastructure + os.chdir('test') + for fname in glob.glob('*.png'): + absdiff_fname = diff_basename + fname + expected_fname = expected_basename + fname + if not os.path.exists(absdiff_fname): + continue + if not os.path.exists(expected_fname): + continue + print fname + print absdiff_fname + + teststr = os.path.splitext(fname)[0] + this_targetdir = os.path.join(target_dir,teststr) + os.makedirs( this_targetdir ) + shutil.copy( expected_fname, + os.path.join(this_targetdir,'baseline.png') ) + shutil.copy( fname, + os.path.join(this_targetdir,'actual.png') ) + shutil.copy( absdiff_fname, + os.path.join(this_targetdir,'absdiff.png') ) + + # old mplTest infrastructure for fpath in get_recursive_filelist(roots): # only images if not fpath.endswith('.png'): continue @@ -87,7 +112,7 @@ def path_split_all(fname): root = pieces[0] testclass = pieces[2] fname = pieces[3] - if not fname.startswith(basename): + if not fname.startswith(diff_basename): # only failed images continue origname = fname[nbase:] From df3518fb573482fdd75e235c34271df0475f679b Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 05:05:57 +0000 Subject: [PATCH 0162/1000] docs: describe how to write tests svn path=/trunk/matplotlib/; revision=7654 --- doc/devel/coding_guide.rst | 117 ++++++++++++++++++++++++++- lib/matplotlib/testing/decorators.py | 15 ++++ 2 files changed, 129 insertions(+), 3 deletions(-) diff --git a/doc/devel/coding_guide.rst b/doc/devel/coding_guide.rst index 229ff3f50c86..03bf4dc264eb 100644 --- a/doc/devel/coding_guide.rst +++ b/doc/devel/coding_guide.rst @@ -561,8 +561,7 @@ external backend via the ``module`` directive. if -.. _license-discussion: - +.. _sample-data: Writing examples ================ @@ -602,6 +601,9 @@ object:: print 'datafile', datafile +.. _license-discussion: + + Licenses ======== @@ -669,4 +671,113 @@ The other reason is licensing compatibility with the other python extensions for scientific computing: ipython, numpy, scipy, the enthought tool suite and python itself are all distributed under BSD compatible licenses. -> \ No newline at end of file + +Testing +======= + +Matplotlib has a testing infrastructure based on nose_, making it easy +to write new tests. The tests are in :mod:`matplotlib.tests`, and +customizations to the nose testing infrastructure are in +:mod:`matplotlib.testing`. (There is other old testing cruft around, +please ignore it while we consolidate our testing to these locations.) + +.. _nose: http://somethingaboutorange.com/mrl/projects/nose/ + + +Writing a simple test +--------------------- + +Many elements of Matplotlib can be tested using standard tests. For +example, here is a test from :mod:`matplotlib.tests.test_basic`:: + + from nose.tools import assert_equal + + def test_simple(): + '''very simple example test''' + assert_equal(1+1,2) + +Nose determines which functions are tests by searching for functions +beginning with "test" in their name. + +Writing an image comparison test +-------------------------------- + +Writing an image based test is only slightly more difficult than a +simple test. The main consideration is that you must specify the +"baseline", or expected, images in the +:func:`~matplotlib.testing.decorators.image_comparison` decorator. For +example, this test generates a single image and automatically tests +it:: + + import numpy as np + import matplotlib + matplotlib.use('Agg') + from matplotlib.testing.decorators import image_comparison + import matplotlib.pyplot as plt + + @image_comparison(baseline_images=['spines_axes_positions.png']) + def test_spines_axes_positions(): + # SF bug 2852168 + fig = plt.figure() + x = np.linspace(0,2*np.pi,100) + y = 2*np.sin(x) + ax = fig.add_subplot(1,1,1) + ax.set_title('centered spines') + ax.plot(x,y) + ax.spines['right'].set_position(('axes',0.1)) + ax.yaxis.set_ticks_position('right') + ax.spines['top'].set_position(('axes',0.25)) + ax.xaxis.set_ticks_position('top') + ax.spines['left'].set_color('none') + ax.spines['bottom'].set_color('none') + fig.savefig('spines_axes_positions.png') + +The mechanism for comparing images is extremely simple -- it compares +an image saved in the current directory with one from the Matplotlib +sample_data repository. The correspondence is done by matching +filenames, so ensure that: + + * The filename given to :meth:`~matplotlib.figure.Figure.savefig` is + exactly the same as the filename given to + :func:`~matplotlib.testing.decorators.image_comparison` in the + ``baseline_images`` argument. + + * The correct image gets added to the sample_data respository with + the name ``test_baseline_``. (See + :ref:`sample-data` above for a description of how to add files to + the sample_data repository.) + + +Known failing tests +------------------- + +If you're writing a test, you may mark it as a known failing test with +the :func:`~matplotlib.testing.decorators.knownfailureif` +decorator. This allows the test to be added to the test suite and run +on the buildbots without causing undue alarm. For example, although +the following test will fail, it is an expected failure:: + + from nose.tools import assert_equal + from matplotlib.testing.decorators import knownfailureif + + @knownfailureif(True) + def test_simple_fail(): + '''very simple example test that should fail''' + assert_equal(1+1,3) + +Note that the first argument to the +:func:`~matplotlib.testing.decorators.knownfailureif` decorator is a +fail condition, which can be a value such as True, False, or +'indeterminate', or may be a dynamically evaluated expression. + +Creating a new module in matplotlib.tests +----------------------------------------- + +Let's say you've added a new module named +``matplotlib.tests.test_whizbang_features``. For the buildbot slave +machines to know to run a test, nose must look in that module. To add +a module to the list searched, add the line:: + + args.append('matplotlib.tests.test_whizbang_features') + +into :file:`test/run-mpl-test.py`. diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index 042e8c5f261d..a422408b6cd9 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -6,6 +6,14 @@ from matplotlib.testing.compare import compare_images def knownfailureif(fail_condition, msg=None): + """ + + Assume a will fail if *fail_condition* is True. *fail_condition* + may also be False or the string 'indeterminate'. + + *msg* is the error message displayed for the test. + + """ # based on numpy.testing.dec.knownfailureif if msg is None: msg = 'Test known to fail' @@ -29,6 +37,13 @@ def failer(*args, **kwargs): return known_fail_decorator def image_comparison(baseline_images=None, tol=1e-3): + """ + compare images generated by the test with those specified in + *baseline_images*, which must correspond within tolerance *tol*, + else an ImageComparisonFailure exception will be raised. + + """ + if baseline_images is None: raise ValueError('baseline_images must be specified') def compare_images_decorator(func): From bf8add9278a8d67d6beb96dcef8e37fbee9968e4 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 05:19:47 +0000 Subject: [PATCH 0163/1000] buildbot: run tests in verbose mode on Mac svn path=/trunk/matplotlib/; revision=7655 --- test/_buildbot_mac_sage.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/test/_buildbot_mac_sage.sh b/test/_buildbot_mac_sage.sh index 36a91e681d1a..b0119ff99584 100755 --- a/test/_buildbot_mac_sage.sh +++ b/test/_buildbot_mac_sage.sh @@ -11,4 +11,4 @@ export PYTHONPATH=${PREFIX}/lib/python2.6/site-packages:${HOME}/dev/lib/python2. make -f make.osx mpl_install echo ${PYTHONPATH} -cd test && python run-mpl-test.py --all --keep-failed \ No newline at end of file +cd test && python run-mpl-test.py --verbose --all --keep-failed From 782b5a1bd39837d0b216d73da0db8936e244b9ca Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Sun, 6 Sep 2009 07:11:57 +0000 Subject: [PATCH 0164/1000] Merged revisions 7638 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7638 | astraw | 2009-09-06 02:20:45 +0300 (Su, 06 Syy 2009) | 4 lines spines: fix 'axes' position bug (closes SF#2852168) Thanks to Jason Grout for reporting this. ........ svn path=/trunk/matplotlib/; revision=7656 --- lib/matplotlib/spines.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/spines.py b/lib/matplotlib/spines.py index 1799db4a5078..20a7eda67b92 100644 --- a/lib/matplotlib/spines.py +++ b/lib/matplotlib/spines.py @@ -172,10 +172,14 @@ def _calc_offset_transform(self): elif position_type=='axes': if self.spine_type in ('left','right'): self._spine_transform = ('pre', - mtransforms.Affine2D().translate(amount, 0.0)) + mtransforms.Affine2D.from_values( + # keep y unchanged, fix x at amount + 0,0,0,1,amount,0)) elif self.spine_type in ('bottom','top'): self._spine_transform = ('pre', - mtransforms.Affine2D().translate(0.0, amount)) + mtransforms.Affine2D.from_values( + # keep x unchanged, fix y at amount + 1,0,0,0,0,amount)) else: warnings.warn('unknown spine type "%s": no spine ' 'offset performed'%self.spine_type) From 82864862b36e6ee07855e762919d8c88b7d9f550 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Sun, 6 Sep 2009 12:16:41 +0000 Subject: [PATCH 0165/1000] add dyld to mac osx file svn path=/trunk/matplotlib/; revision=7657 --- make.osx | 2 ++ 1 file changed, 2 insertions(+) diff --git a/make.osx b/make.osx index 11070586fee0..1485a137fb11 100644 --- a/make.osx +++ b/make.osx @@ -76,6 +76,8 @@ mpl_build: export MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} &&\ export CFLAGS=${CFLAGS_DEPS} &&\ export LDFLAGS=${LDFLAGS_DEPS} &&\ + export LD_LIBRARY_PATH=${PREFIX}/lib &&\ + export DYLD_LIBRARY_PATH=${PREFIX}/lib &&\ python setup.py build mpl_install: From 7e04a559a4b51ceb78e21e5918c22e5d4eee7a0c Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 19:29:45 +0000 Subject: [PATCH 0166/1000] testing: remove leftover files from past image comparison failures svn path=/trunk/matplotlib/; revision=7658 --- lib/matplotlib/testing/compare.py | 15 ++++++++++++--- 1 file changed, 12 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/testing/compare.py b/lib/matplotlib/testing/compare.py index 87e97f95a9af..2bb36d692bb4 100644 --- a/lib/matplotlib/testing/compare.py +++ b/lib/matplotlib/testing/compare.py @@ -114,15 +114,21 @@ def compare_images( expected, actual, tol, in_decorator=False ): h2 = actualImage.histogram() rms = math.sqrt( reduce(operator.add, map(lambda a,b: (a-b)**2, h1, h2)) / len(h1) ) + diff_image = os.path.join(os.path.dirname(actual), + 'failed-diff-'+os.path.basename(actual)) + expected_copy = 'expected-'+os.path.basename(actual) + if ( (rms / 10000.0) <= tol ): + if os.path.exists(diff_image): + os.unlink(diff_image) + if os.path.exists(expected_copy): + os.unlink(expected_copy) return None - diff_image = os.path.join(os.path.dirname(actual), - 'failed-diff-'+os.path.basename(actual)) save_diff_image( expected, actual, diff_image ) if in_decorator: - shutil.copyfile( expected, 'expected-'+os.path.basename(actual)) + shutil.copyfile( expected, expected_copy ) results = dict( rms = rms, expected = str(expected), @@ -131,6 +137,9 @@ def compare_images( expected, actual, tol, in_decorator=False ): ) return results else: + # expected_copy is only for in_decorator case + if os.path.exists(expected_copy): + os.unlink(expected_copy) # old-style call from mplTest directory msg = " Error: Image files did not match.\n" \ " RMS Value: " + str( rms / 10000.0 ) + "\n" \ From ab4383b3fc16a64e2d7af16d61c28698b2b8fcd0 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 20:13:06 +0000 Subject: [PATCH 0167/1000] testing: add matplotlib.test() function to run tests svn path=/trunk/matplotlib/; revision=7659 --- doc/devel/coding_guide.rst | 10 +++------- lib/matplotlib/__init__.py | 26 ++++++++++++++++++++++++++ test/run-mpl-test.py | 6 +++--- 3 files changed, 32 insertions(+), 10 deletions(-) diff --git a/doc/devel/coding_guide.rst b/doc/devel/coding_guide.rst index 03bf4dc264eb..b47bfbfad80b 100644 --- a/doc/devel/coding_guide.rst +++ b/doc/devel/coding_guide.rst @@ -774,10 +774,6 @@ Creating a new module in matplotlib.tests ----------------------------------------- Let's say you've added a new module named -``matplotlib.tests.test_whizbang_features``. For the buildbot slave -machines to know to run a test, nose must look in that module. To add -a module to the list searched, add the line:: - - args.append('matplotlib.tests.test_whizbang_features') - -into :file:`test/run-mpl-test.py`. +``matplotlib.tests.test_whizbang_features``. To add this module to +the list of default tests, append its name to ``default_test_modules`` +in :file:`lib/matplotlib/__init__.py`. diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index d525b9586756..3eae041afabc 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -876,6 +876,32 @@ def tk_window_focus(): pass # we don't want to assume all -d flags are backends, eg -debug +default_test_modules = [ + 'matplotlib.tests.test_basic', + 'matplotlib.tests.test_transforms', + 'matplotlib.tests.test_spines', + ] + +def test(verbosity=0): + """run the matplotlib test suite""" + import nose + import nose.plugins.builtin + from testing.noseclasses import KnownFailure + from nose.plugins.manager import PluginManager + + plugins = [] + plugins.append( KnownFailure() ) + plugins.extend( [plugin() for plugin in nose.plugins.builtin.plugins] ) + + manager = PluginManager(plugins=plugins) + config = nose.config.Config(verbosity=verbosity, plugins=manager) + + success = nose.run( defaultTest=default_test_modules, + config=config, + ) + return success + +test.__test__ = False # nose: this function is not a test verbose.report('matplotlib version %s'%__version__) verbose.report('verbose.level %s'%verbose.level) diff --git a/test/run-mpl-test.py b/test/run-mpl-test.py index 5812f7358e00..802e24bdf21d 100755 --- a/test/run-mpl-test.py +++ b/test/run-mpl-test.py @@ -44,6 +44,7 @@ import nose from mplTest import MplNosePlugin, path_utils +import matplotlib from matplotlib.testing.noseclasses import KnownFailure if '--clean' in args: @@ -91,9 +92,8 @@ ### Run nose args.append('.') -args.append('matplotlib.tests.test_basic') -args.append('matplotlib.tests.test_transforms') -args.append('matplotlib.tests.test_spines') +args.extend( matplotlib.default_test_modules ) + success = nose.run( argv = args, plugins = [ MplNosePlugin(), KnownFailure() ] ) From 6e9ba37d5ad1c834c8f11df97b571f092fc57c84 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 20:13:36 +0000 Subject: [PATCH 0168/1000] docs: describe how to run tests svn path=/trunk/matplotlib/; revision=7660 --- doc/devel/coding_guide.rst | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/doc/devel/coding_guide.rst b/doc/devel/coding_guide.rst index b47bfbfad80b..3b117c41327e 100644 --- a/doc/devel/coding_guide.rst +++ b/doc/devel/coding_guide.rst @@ -683,6 +683,14 @@ please ignore it while we consolidate our testing to these locations.) .. _nose: http://somethingaboutorange.com/mrl/projects/nose/ +Running the tests +----------------- + +Running the tests is simple. Make sure you have nose installed and +type from within Python:: + + import matplotlib + matplotlib.test() Writing a simple test --------------------- From a188b6c1ee225fd37c8066a2cda0010a99089c2b Mon Sep 17 00:00:00 2001 From: John Hunter Date: Sun, 6 Sep 2009 21:16:27 +0000 Subject: [PATCH 0169/1000] fix to empty datetime bug; add datetime tests svn path=/trunk/matplotlib/; revision=7661 --- lib/matplotlib/axes.py | 67 +++----------------------- lib/matplotlib/axis.py | 52 ++++++++++++++++++++ lib/matplotlib/dates.py | 37 ++------------- lib/matplotlib/tests/test_dates.py | 76 ++++++++++++++++++++++++++++++ lib/matplotlib/transforms.py | 20 +++++++- lib/matplotlib/units.py | 8 ++-- 6 files changed, 163 insertions(+), 97 deletions(-) create mode 100644 lib/matplotlib/tests/test_dates.py diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index 639c1635478c..b053b0242d1a 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -2299,73 +2299,18 @@ def xaxis_date(self, tz=None): *tz* is the time zone to use in labeling dates. Defaults to rc value. """ - - xmin, xmax = self.dataLim.intervalx - if xmin==0.: - # no data has been added - let's set the default datalim. - # We should probably use a better proxy for the datalim - # have been updated than the ignore setting - dmax = today = datetime.date.today() - dmin = today-datetime.timedelta(days=10) - self._process_unit_info(xdata=(dmin, dmax)) - dmin, dmax = self.convert_xunits([dmin, dmax]) - self.viewLim.intervalx = dmin, dmax - self.dataLim.intervalx = dmin, dmax - - locator = self.xaxis.get_major_locator() - if not isinstance(locator, mdates.DateLocator): - locator = mdates.AutoDateLocator(tz) - self.xaxis.set_major_locator(locator) - - # the autolocator uses the viewlim to pick the right date - # locator, but it may not have correct viewlim before an - # autoscale. If the viewlim is still zero..1, set it to the - # datalim and the autoscaler will update it on request - if self.viewLim.intervalx[0]==0.: - self.viewLim.intervalx = tuple(self.dataLim.intervalx) - locator.refresh() - - formatter = self.xaxis.get_major_formatter() - if not isinstance(formatter, mdates.DateFormatter): - formatter = mdates.AutoDateFormatter(locator, tz) - self.xaxis.set_major_formatter(formatter) + # should be enough to inform the unit conversion interface + # dates are comng in + self.xaxis.update_units(datetime.date(2009,1,1)) def yaxis_date(self, tz=None): """Sets up y-axis ticks and labels that treat the y data as dates. *tz* is the time zone to use in labeling dates. Defaults to rc value. """ - ymin, ymax = self.dataLim.intervaly - if ymin==0.: - # no data has been added - let's set the default datalim. - # We should probably use a better proxy for the datalim - # have been updated than the ignore setting - dmax = today = datetime.date.today() - dmin = today-datetime.timedelta(days=10) - self._process_unit_info(ydata=(dmin, dmax)) - - dmin, dmax = self.convert_yunits([dmin, dmax]) - self.viewLim.intervaly = dmin, dmax - self.dataLim.intervaly = dmin, dmax - - - locator = self.yaxis.get_major_locator() - if not isinstance(locator, mdates.DateLocator): - locator = mdates.AutoDateLocator(tz) - self.yaxis.set_major_locator(locator) - - # the autolocator uses the viewlim to pick the right date - # locator, but it may not have correct viewlim before an - # autoscale. If the viewlim is still zero..1, set it to the - # datalim and the autoscaler will update it on request - if self.viewLim.intervaly[0]==0.: - self.viewLim.intervaly = tuple(self.dataLim.intervaly) - locator.refresh() - - formatter = self.xaxis.get_major_formatter() - if not isinstance(formatter, mdates.DateFormatter): - formatter = mdates.AutoDateFormatter(locator, tz) - self.yaxis.set_major_formatter(formatter) + # should be enough to inform the unit conversion interface + # dates are comng in + self.yaxis.update_units(datetime.date(2009,1,1)) def format_xdata(self, x): """ diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index be6dd6d90108..fccd79ae6a66 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -666,6 +666,19 @@ def set_data_interval(self): 'Set the axis data limits' raise NotImplementedError('Derived must override') + def set_default_intervals(self): + 'set the default limits for the axis data and view interval if they are not mutated' + + # this is mainly in support of custom object plotting. For + # example, if someone passes in a datetime object, we do not + # know automagically how to set the default min/max of the + # data and view limits. The unit conversion AxisInfo + # interface provides a hook for custom types to register + # default limits through the AxisInfo.default_limits + # attribute, and the derived code below will check for that + # and use it if is available (else just use 0..1) + pass + def _set_artist_props(self, a): if a is None: return a.set_figure(self.figure) @@ -1010,6 +1023,7 @@ def _update_axisinfo(self): self.set_label_text(info.label) self.isDefault_label = True + self.set_default_intervals() def have_units(self): return self.converter is not None or self.units is not None @@ -1420,6 +1434,25 @@ def set_data_interval(self, vmin, vmax, ignore=False): self.axes.dataLim.intervalx = min(vmin, Vmin), max(vmax, Vmax) + def set_default_intervals(self): + 'set the default limits for the axis interval if they are not mutated' + xmin, xmax = 0., 1. + dataMutated = self.axes.dataLim.mutatedx() + viewMutated = self.axes.viewLim.mutatedx() + if not dataMutated or not viewMutated: + if self.converter is not None: + info = self.converter.axisinfo(self.units, self) + if info.default_limits is not None: + valmin, valmax = info.default_limits + xmin = self.converter.convert(valmin, self.units, self) + xmax = self.converter.convert(valmax, self.units, self) + if not dataMutated: + self.axes.dataLim.intervalx = xmin, xmax + if not viewMutated: + self.axes.viewLim.intervalx = xmin, xmax + + + class YAxis(Axis): __name__ = 'yaxis' axis_name = 'y' @@ -1665,3 +1698,22 @@ def set_data_interval(self, vmin, vmax, ignore=False): else: Vmin, Vmax = self.get_data_interval() self.axes.dataLim.intervaly = min(vmin, Vmin), max(vmax, Vmax) + + def set_default_intervals(self): + 'set the default limits for the axis interval if they are not mutated' + ymin, ymax = 0., 1. + dataMutated = self.axes.dataLim.mutatedy() + viewMutated = self.axes.viewLim.mutatedy() + if not dataMutated or not viewMutated: + if self.converter is not None: + info = self.converter.axisinfo(self.units, self) + if info.default_limits is not None: + valmin, valmax = info.default_limits + ymin = self.converter.convert(valmin, self.units, self) + ymax = self.converter.convert(valmax, self.units, self) + if not dataMutated: + self.axes.dataLim.intervaly = ymin, ymax + if not viewMutated: + self.axes.viewLim.intervaly = ymin, ymax + + diff --git a/lib/matplotlib/dates.py b/lib/matplotlib/dates.py index 6a247e0bbb15..8594a2bcc193 100644 --- a/lib/matplotlib/dates.py +++ b/lib/matplotlib/dates.py @@ -1062,41 +1062,14 @@ class DateConverter(units.ConversionInterface): def axisinfo(unit, axis): 'return the unit AxisInfo' # make sure that the axis does not start at 0 - if axis: - ax = axis.axes - - if axis is ax.get_xaxis(): - xmin, xmax = ax.dataLim.intervalx - if xmin==0.: - # no data has been added - let's set the default datalim. - # We should probably use a better proxy for the datalim - # have been updated than the ignore setting - dmax = today = datetime.date.today() - dmin = today-datetime.timedelta(days=10) - - ax._process_unit_info(xdata=(dmin, dmax)) - dmin, dmax = ax.convert_xunits([dmin, dmax]) - - ax.viewLim.intervalx = dmin, dmax - ax.dataLim.intervalx = dmin, dmax - elif axis is ax.get_yaxis(): - ymin, ymax = ax.dataLim.intervaly - if ymin==0.: - # no data has been added - let's set the default datalim. - # We should probably use a better proxy for the datalim - # have been updated than the ignore setting - dmax = today = datetime.date.today() - dmin = today-datetime.timedelta(days=10) - - ax._process_unit_info(ydata=(dmin, dmax)) - dmin, dmax = ax.convert_yunits([dmin, dmax]) - - ax.viewLim.intervaly = dmin, dmax - ax.dataLim.intervaly = dmin, dmax majloc = AutoDateLocator(tz=unit) majfmt = AutoDateFormatter(majloc, tz=unit) - return units.AxisInfo( majloc=majloc, majfmt=majfmt, label='' ) + datemin = datetime.date(2000, 1, 1) + datemax = datetime.date(2010, 1, 1) + + return units.AxisInfo( majloc=majloc, majfmt=majfmt, label='', + default_limits=(datemin, datemax)) @staticmethod def convert(value, unit, axis): diff --git a/lib/matplotlib/tests/test_dates.py b/lib/matplotlib/tests/test_dates.py new file mode 100644 index 000000000000..b2c502145cdc --- /dev/null +++ b/lib/matplotlib/tests/test_dates.py @@ -0,0 +1,76 @@ +import datetime +import numpy as np +import matplotlib +matplotlib.use('Agg') +from matplotlib.testing.decorators import image_comparison +import matplotlib.pyplot as plt + +@image_comparison(baseline_images=['empty_datetime.png']) +def test_empty_datetime(): + # make sure mpl does the right thing when told to plot dates even + # if no date data has been presented, cf + # http://sourceforge.net/tracker/?func=detail&aid=2850075&group_id=80706&atid=560720 + fig = plt.figure() + ax = fig.add_subplot(1,1,1) + ax.xaxis_date() + fig.savefig('empty_datetime.png') + +@image_comparison(baseline_images=['date_axhspan.png']) +def test_date_axhspan(): + # test ax hspan with date inputs + t0 = datetime.datetime(2009, 1, 20) + tf = datetime.datetime(2009, 1, 21) + fig = plt.figure() + ax = fig.add_subplot(1,1,1) + ax.axhspan( t0, tf, facecolor="blue", alpha=0.25 ) + ax.set_xlim(t0-datetime.timedelta(days=5), + tf+datetime.timedelta(days=5)) + fig.autofmt_xdate() + fig.savefig('date_axhspan.png') + +@image_comparison(baseline_images=['date_axvspan.png']) +def test_date_axvspan(): + # test ax hspan with date inputs + t0 = datetime.datetime(2000, 1, 20) + tf = datetime.datetime(2010, 1, 21) + fig = plt.figure() + ax = fig.add_subplot(1,1,1) + ax.axvspan( t0, tf, facecolor="blue", alpha=0.25 ) + ax.set_xlim(t0-datetime.timedelta(days=5), + tf+datetime.timedelta(days=5)) + fig.autofmt_xdate() + fig.savefig('date_axvspan.png') + + +@image_comparison(baseline_images=['date_axhline.png']) +def test_date_axhline(): + # test ax hline with date inputs + t0 = datetime.datetime(2009, 1, 20) + tf = datetime.datetime(2009, 1, 31) + fig = plt.figure() + ax = fig.add_subplot(1,1,1) + ax.axhline( t0, tf, facecolor="blue", lw=3) + ax.set_xlim(t0-datetime.timedelta(days=5), + tf+datetime.timedelta(days=5)) + fig.autofmt_xdate() + fig.savefig('date_axhline.png') + +@image_comparison(baseline_images=['date_axvline.png']) +def test_date_axvline(): + # test ax hline with date inputs + t0 = datetime.datetime(2000, 1, 20) + tf = datetime.datetime(2010, 1, 21) + fig = plt.figure() + ax = fig.add_subplot(1,1,1) + ax.axvline( t0, tf, facecolor="blue", lw=3) + ax.set_xlim(t0-datetime.timedelta(days=5), + tf+datetime.timedelta(days=5)) + fig.autofmt_xdate() + fig.savefig('date_axvline.png') + + +if __name__=='__main__': + import nose + nose.runmodule(argv=['-s','--with-doctest'], exit=False) + + diff --git a/lib/matplotlib/transforms.py b/lib/matplotlib/transforms.py index bb1785067211..511d7bd155b1 100644 --- a/lib/matplotlib/transforms.py +++ b/lib/matplotlib/transforms.py @@ -711,7 +711,10 @@ def __init__(self, points): self._points = np.asarray(points, np.float_) self._minpos = np.array([0.0000001, 0.0000001]) self._ignore = True - + # it is helpful in some contexts to know if the bbox is a + # default or has been mutated; we store the orig points to + # support the mutated methods + self._points_orig = self._points.copy() if DEBUG: ___init__ = __init__ def __init__(self, points): @@ -939,6 +942,21 @@ def set(self, other): self._points = other.get_points() self.invalidate() + def mutated(self): + 'return whether the bbox has changed since init' + return self.mutatedx() or self.mutatedy() + + def mutatedx(self): + 'return whether the x-limits have changed since init' + return (self._points[0,0]!=self._points_orig[0,0] or + self._points[1,0]!=self._points_orig[1,0]) + def mutatedy(self): + 'return whether the y-limits have changed since init' + return (self._points[0,1]!=self._points_orig[0,1] or + self._points[1,1]!=self._points_orig[1,1]) + + + class TransformedBbox(BboxBase): """ diff --git a/lib/matplotlib/units.py b/lib/matplotlib/units.py index d5e0deb345c7..50323c96688d 100644 --- a/lib/matplotlib/units.py +++ b/lib/matplotlib/units.py @@ -46,14 +46,15 @@ def default_units(x, axis): from matplotlib.cbook import iterable, is_numlike, is_string_like class AxisInfo: - 'information to support default axis labeling and tick labeling' + 'information to support default axis labeling and tick labeling, and default limits' def __init__(self, majloc=None, minloc=None, - majfmt=None, minfmt=None, label=None): + majfmt=None, minfmt=None, label=None, + default_limits=None): """ majloc and minloc: TickLocators for the major and minor ticks majfmt and minfmt: TickFormatters for the major and minor ticks label: the default axis label - + default_limits: the default min, max of the axis if no data is present If any of the above are None, the axis will simply use the default """ self.majloc = majloc @@ -61,6 +62,7 @@ def __init__(self, majloc=None, minloc=None, self.majfmt = majfmt self.minfmt = minfmt self.label = label + self.default_limits = default_limits class ConversionInterface: From a91c86616979361e98e5fa347d3ab0deaa0914c3 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Sun, 6 Sep 2009 21:55:38 +0000 Subject: [PATCH 0170/1000] fix the test_date images svn path=/trunk/matplotlib/; revision=7662 --- lib/matplotlib/tests/test_dates.py | 27 +++++++++++++-------------- 1 file changed, 13 insertions(+), 14 deletions(-) diff --git a/lib/matplotlib/tests/test_dates.py b/lib/matplotlib/tests/test_dates.py index b2c502145cdc..7bdec10b35cb 100644 --- a/lib/matplotlib/tests/test_dates.py +++ b/lib/matplotlib/tests/test_dates.py @@ -1,19 +1,17 @@ import datetime import numpy as np -import matplotlib -matplotlib.use('Agg') from matplotlib.testing.decorators import image_comparison import matplotlib.pyplot as plt -@image_comparison(baseline_images=['empty_datetime.png']) -def test_empty_datetime(): +@image_comparison(baseline_images=['date_empty.png']) +def test_date_empty(): # make sure mpl does the right thing when told to plot dates even # if no date data has been presented, cf # http://sourceforge.net/tracker/?func=detail&aid=2850075&group_id=80706&atid=560720 fig = plt.figure() ax = fig.add_subplot(1,1,1) ax.xaxis_date() - fig.savefig('empty_datetime.png') + fig.savefig('date_empty.png') @image_comparison(baseline_images=['date_axhspan.png']) def test_date_axhspan(): @@ -23,9 +21,9 @@ def test_date_axhspan(): fig = plt.figure() ax = fig.add_subplot(1,1,1) ax.axhspan( t0, tf, facecolor="blue", alpha=0.25 ) - ax.set_xlim(t0-datetime.timedelta(days=5), + ax.set_ylim(t0-datetime.timedelta(days=5), tf+datetime.timedelta(days=5)) - fig.autofmt_xdate() + fig.subplots_adjust(left=0.25) fig.savefig('date_axhspan.png') @image_comparison(baseline_images=['date_axvspan.png']) @@ -36,8 +34,8 @@ def test_date_axvspan(): fig = plt.figure() ax = fig.add_subplot(1,1,1) ax.axvspan( t0, tf, facecolor="blue", alpha=0.25 ) - ax.set_xlim(t0-datetime.timedelta(days=5), - tf+datetime.timedelta(days=5)) + ax.set_xlim(t0-datetime.timedelta(days=720), + tf+datetime.timedelta(days=720)) fig.autofmt_xdate() fig.savefig('date_axvspan.png') @@ -49,20 +47,20 @@ def test_date_axhline(): tf = datetime.datetime(2009, 1, 31) fig = plt.figure() ax = fig.add_subplot(1,1,1) - ax.axhline( t0, tf, facecolor="blue", lw=3) - ax.set_xlim(t0-datetime.timedelta(days=5), + ax.axhline( t0, color="blue", lw=3) + ax.set_ylim(t0-datetime.timedelta(days=5), tf+datetime.timedelta(days=5)) - fig.autofmt_xdate() + fig.subplots_adjust(left=0.25) fig.savefig('date_axhline.png') @image_comparison(baseline_images=['date_axvline.png']) def test_date_axvline(): # test ax hline with date inputs t0 = datetime.datetime(2000, 1, 20) - tf = datetime.datetime(2010, 1, 21) + tf = datetime.datetime(2000, 1, 21) fig = plt.figure() ax = fig.add_subplot(1,1,1) - ax.axvline( t0, tf, facecolor="blue", lw=3) + ax.axvline( t0, color="red", lw=3) ax.set_xlim(t0-datetime.timedelta(days=5), tf+datetime.timedelta(days=5)) fig.autofmt_xdate() @@ -74,3 +72,4 @@ def test_date_axvline(): nose.runmodule(argv=['-s','--with-doctest'], exit=False) + From c6100754f4f7d794aad27a11c467e23fa8a83c2b Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 22:32:05 +0000 Subject: [PATCH 0171/1000] testing: move baseline image svn path=/trunk/matplotlib/; revision=7663 --- .../test_spines/spines_axes_positions.png | Bin 0 -> 26893 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_spines/spines_axes_positions.png diff --git a/lib/matplotlib/tests/baseline_images/test_spines/spines_axes_positions.png b/lib/matplotlib/tests/baseline_images/test_spines/spines_axes_positions.png new file mode 100644 index 0000000000000000000000000000000000000000..5d865d8e014fcef70e3c164e6294a7b69d11826b GIT binary patch literal 26893 zcmdqJg;$krw?4W+5XBcTKm;ijq(Kyr22r|OT9NJs$z`G-9ZDmx=#cJERFsrOHwXxe zPH8yv;r;gh?LE$KoIl`v<8}Dq;(68`^PcmX*SzNaR#jPsgqWHbg+h_Y$v#j=p-wTN zQ1}neoQ8jibARp#e-XGy%4wc~|M{FTeFHzAb(Gb0L7~VVBY*I+#51i>CP%;LPb^KDSw@_; z20ujwuS+XoMawU_n=+hRKRGGhKj`APu$eGUzuhQ{e*R@QX=cN(&U4q(CE10m@sA+o zc>5nm0UCT53W|A^hZgx8y`6$a{&u7$K7;(7`4Nr$_5br96YLN7w$|6yx?Y~Wq$uN* z&4HRAVPQZ`Wcc{_^b{Bhck>hkwVU6ey%x%DhKEx5V|SG-~GQ@mX=xg`1s_PFJ~|(`>4x=(s4RE442!@OiiUJyyvpQrpx8%R}{3o z=Pvy8=~gh+9qGZr!Kd5bo10skoA;7eMz+pX(Ki@3J91JL7Z>x|j|lYU>+8UmQHyvw zj)?}4(f7T%aKm-jt|HrKcRfctKhA4&?xRD)Vfn9>{$|u4+qZ-}GCCUb_7XFjh={?nXV2ERxBJ`gj^`24c}m#y<^A+>qO(Ti~h-|M%r8W_^5BZc0;@*^kN2netz>^X#w+n z`MD()oz~qMN^xSo)u;ct66Ue;j_S_l&Qxfw^GwS;yxh7c>tmhwHk+83kwOfInzeO~ zb#IQ=1Yc@uYE)cYPLim1j>)$`y<*e1W1dqai2_cNYinx}>2KbgsoR^+jl1>uxpjX* z{=mRMZF7a)@Zah?n{!?F$Ni7%ytd{sSM4kB-5qs}WMt*!R3Z~uMRz2L=Gu=|v%)%1 zQBmoAdh|@M%o-yVbU7RL?rEpX`m|h`?V$Sp_DcWZ_ITm`a*YZOhuiB;K8oVDaQcUu zSN7ax4%G(_UP`~a@)693R@6(=*#EGsufQ-jgjV=Zjrffl_w)5Dv}I-A(0MQNB#Qa! zZTxB1I6gXzPD(0JOOvMX3{K4`p_sLZSP0^-S6vya(<(3!bXyrStQd8V$98w~`5*ak z>X$1n^yO>77ct`cjs3N9wevT-Rm71|QVTeyfW4PGjElh+DT8gQAv?F}i;t?9K%oqJ zI}(Ly>+9=7;_a({t~HT~lkXf9J!xJ)S{beJ5I#6Kpz#=Wdp|Y(Gjex%xYR201_MK5 z7wnQxKm0WHY0x$VX5G2AP}uOtu(PGb`DH+Wa7#4%tbo_1WqtF2Ex!yL3F3BdQ7XiQ znyXx9*L}H|nVZ!zm1$+7*|cc%E9~31t1dAs3(WUqPn{tlaWgeDn=z#4xBbv$ULyEC zgf@QV2n@PUt={KpK)bn%;)h!we;vGUZEI`WA0z*>iR<1yvM(8=;g4^>KueprvUha2 zPYY%nf<~j7KffT_C@6#z_KSn*Fg8KRtwjwZPa*U0;fE*V^}f4FHl0bLAt@;gG7la+ z7%Tf0L`k`K=p;ZB0xL(cLxn#4R< zyAksI#fy#6{#2=RTZ@AlV3%DmO=6MGo@@=RkCLxy8;A%9EE~~y#luVT3JUCMV>a!p z{S8N26ztk<9(IGpWIgA-xxNzaAjSs5vl9~i6<;v|lcbKvt>X(_Dn#xApREpD_7UhpuYB<`ndA0!F ziLhX%o~q6jr(RTSoC7YQN2 zHu&mYLwgwn~_Qw9jU*^a~@-{WkJOyWZywf-RWA`_{)ze6@&OJ)78JFAcFMk>|7 zFUl(__JGGMwd&3=5%pi*8u7ufZVNWRs3bFS6o1J4cV1k)cyXPs!hK1vZhOp|THLP| zqENv@2E0Z?p6};S-+qD33(}D0KP*Ze*tQ?3EK#mn8^YdxKzFUva%*7JAFKD ze1D4mIP1a&d2o*8YB-C(R+f%cC{te2xZ+o;*F? zhHyANJDX{d^i&$6BbQ_0sC_?JMxn5Vqod=;*{4xbujxd+vXm2ryk-+UN*_19mRuPu zw~L2~G3o|25|Pqmy?ggh-FgfA?(#m2j_=9$cP0&ge?~HwK|IIrFDWi|Jvw;0ySq#A z@SOA7Zz<9J#gbj(A@Dj|dkclFw-p-RHP#RTukDqbf}7i5{UG#m9X%g44i}gn&~K_VM+l1=!%? zx;W6qX7vcJ+Wu9mOICsXA-Lj$MAz0|t5g$E21e|t75)Oq^H1sPXY*D)J#hoi5K5(0&Y zruF=8k_I$6O*G;)!-=4QeRqojH*w+o`3YFkkTn0}qY!Yvv!mO9T!aCiOul*Z#!)jz zlXWE_7S59}zx{}3@5(t;C3}36+85(0Jk-P&1UQ%54cA^^MWJmTll)(EiU0cN#{>ji zHgIeM0|T*k6{83e)XLY>GOTv(0*GRm*PIOC3;-nY*|Tcj0x5cn%@i(UAZxiIjrXiI zj^8d008$1L#h93+V8Ml4{=6G1v&n>s7_Jpjav7)wkkUp)M5I=X`{@T!a%%%t?}4y; zTRf2(QX8o!#Fq{F0OD!_vh(TpJKWOgEilwau#7eYgXt%L`Fw+~@JJ%K35=3aPEb$~ z>`X^hHB4PYqm@?}UP9b_=8Qq#N^1b4R^CH3xA~qf@HvG$0{{S7IXE~9ePkox%U;3j%!)BD1vsR=-~|fzgg$@%EaWz? z2@~xHRHP7Ay?D4kj@`sz^K{kCGswvq`D|{A9+qy+)@{q{1p442qLR3l#vOcZ$2d6k z80+>6T&IH7GnLgV?A2Gs`o{54D8-NH#+kZ<_13-N@uQ4>BX1?{+EvLSy6!Bs8+POM zb&XpiW%RG|$(+i&GxNXj_*QR@dSKh{Dl`QsoFbAZp_XN$`pT-KoTJscS9$EmdQ;kK zMbv7T-wLO0_46Vtzcw|WJT;FbwV*ojS=JJ65)>*$HV^NaLOkROM&3(&!Sv!r5Mwz1 zP9YxYegNr=@Wu^hW*L`1ZEAqkDX6LSE;|Lyj0oa-bujw&;Yq&QIflb*XT%Q~mEsr= z*Fu@t>7|MW(`%L^jt(qr9!zH@r(e6D-f(PKy`_y)@h{G>he--tA|&8i2);Y^3zF5I zG8-MRHo5HV>|HTu5?Ucmz#u}9$&Hm=yZ@R6k~WAiaiZSkfC|&sSSK=i)MLMt*G*9TUiS zITSxXZ`CWejkV>EhlDo6tTkq4KcU^c8;p=q&b`JE{(GOCjaykMgh+s-sNmIm5VM7> z3L?KG?n;aIvxb9`7LUF>WWM<(H|fJ7f9%ADia9 zQ1O`M$|hGf7;yH7=Y&z=d^YLdgE30+>4fLfw-yZHF!sIqv58Zc59DLYb9!RK*)lV{ z2mU1LGVvMJmf{i&rEwJGx5Q)>?y2+L&0CrLWe(hS@@`}F%HH=@}w)O?DWZ1s&2R_ms$d|EECl1+)4z-sZyBuj3X@#=|V~ab8_ieR%bHzsAn2Z6Vu$O zvezu0UMaxJDrY^cE#xx!Uf)q_IS)ptLT&X(FF=>wtQm;+R}l7#8U4H+yih*w5k&5+)B?b zz1i@H>zqa$W!7dw;R{*X?R)i_h4xBH5LsQXgTc(h(ohU6^=a26`*U$VWN=%wgx@<$ z9HE^TR$QEy_}Opw+sQAsAipTGolw@h+!l+yPZp~@Rc&9_%XaN}+aKFRrf-oBqa%L} zbjRdWXnqsnxUbH9f2S*TzsGDMHdP8cREC`j)zAD2&i#N6?C5K?8@5|TK}FQeH^o!P zHSG8A^c_!Jw2opXY(l}0epggu@8T%?){>1K_kO7V2jwZh)HKWunRH6y(hPIazaLJf z84c5HO%QyNzjcN*=1=GQg9BJxl{6Xs06ww9(w@p9*Oj`HZPocq&N0!zWf+l~nw}h^;dDWlbopq-%ryi4csDWG_Bi!IBWz(qoHD_`A;5;y&^mwD^Uw{q zTmz%=xjV+fX~04&@F*BzT~{99J<}2L8HghV+v0Uj$MKG(-8+RiJe38np4GnJ=+aLExH8aoZHblrB(M$R>47`HJT2y z61nb71=4`cfhT>*Feh(Si3zRxLv61mKG?~0?R*%r(cMu--}Sd{zYmy`KOo>P$*9^SiCP4 zTW2}l*$kI_TuRDf@Tu`+5SL*P0;B=FCNJIUza}5s3X#a?csOKRs6cp(P)_DQ`3ipc zijFU@ur1M8;T2g5whziLY}PvcpF?3FTWJpcVz4?eyk>@MqnT;ujf zW@#v+d%|mXM|P#&=FmWV@5jk2kl#52>RN$IC{s%_C2LPby{|5I9~Y$R=cj6_wjQ+ zl7*U;6aUa3gpdE;ZFxix3Awbw?wXE{p8$aKKK}9&e;a`od%2r?3&%B=>FK$Fvyl{s zb6!lReLIncBZI^hoqBcN8 zMyCm*dFE~8B?rLCYw{_ukC5H8++s>#x~)FntKc&h4Yn!GS@cj z>yPx}#K+^FYxTsd1vIJ6J()}z^XVQUS#a>blL%+sfSvfvNW>_Y=zd;LX*RFpqpod) zuK|h@VYl}-acQs?0^E%9qx46Q>;zW#7O>AwWpu;YwYdklTV6Q^&Ic~PBJb3KUm>KU zaRN@M5fKqE`TQK?hYM$NG0J8T<-pYY* zZXtd)>Sg<9f~QwvVq!8fl;W)+*MK}(?&CI%fTIM$-+m9JFLa(Uf&vA0dt9Mn+^D!8 z($n_{tTXo8#gIodMFmk}UXx%x-LmRsLmZTZ+%3X$_F&|Bgg&c4tmH`A)%f8_F$J|3uKKyGE0U8$QdKI6RpM(LH8_PrcfI$5>f zspv)w0^@+H{uM~U&M0SPCES}ojGwPtA~D;U{GRcD0?;WS4KtAZ4Jc-;jO#DC< zvY#kmS%CO@=flZj$RE$^mb1CyuOELAJo9$rb=S($%p@;)Fqwmuaa(7BKkPhC^$`)a zLk<27U@~BpW);I5iQ7*5OBL)~T*`=Txx1I==oA*XFAZ4%17;2ENG$hh%yRvHUU-<( zRC>KH28}{6MPu)$Gqm3+EH3Od9CPwnT?aSJ>zWmL>I-IR$c$4qS*Ul2;vDQQf5xNF zobRqOk2(dAUwR^R)3yn( z#pypIm6*X{>)eN|z(oM@v3X5@_WtrEo-UaG6OXY-jvn*XL0}kiOn{rJEQMDT)&q|i z;j_~p$nJUc)aIpa3wgI33^#f;hLj6KrbM!t8n9O)2cmzUZ zXpOt8GF0A9eK@h|Ox~QOrv50!O-}P{nvE!RDXda zq1EC;)@z^RS|Ds05WzAs2@ZNS?X0(EL^h6!uDyi%6ZY%dj7T`6tq=@ua~T#(i-U)@ z#(stA*R0QAU`KUJ(hX})9A6cD0Tmz<@4vEz_0~dXMZW#|s2)t6a1I}ZW`|_Z%m+g4 zvP^ddyk3KVKo*ct8pHnISY+)OiO(4Pcy?;h=M{E);EB3w7?>h5Y6-A%LV$qDoO-g` zV>bNfL{wf8V>db#oSYC)4DJK)&N~IUq9dQ*XG;Vps$P>-1pc_{a1vNp7;d#pe(Lj+ zRZo*PFKKkq%3%zqVfEb%-`wa#9-SD4->}|wCJlVy@{Wcznw|OZa0Qv}$p`Ze{*lyo z`4jQS7z7650wF7hL>P&yp4{-2yYuY0g+k2d7fQ^}Dm<43abE}_IPxN%a77C58BZj$ z!sMiSt~Sh7|K)20YjuC>NCdR-FXp*$yc=3-8@q{Bh#)&Ao_qk9&Z1NA92O6S-dO7+ zlU9tqKI)a*Q<#inT;+fK7@KmhFQ%4~3jrzUZCFd(-=)YuZQ(|q_f8Vpg zA4SAiSH;NB3yj7)=m}pWp)wIVTdP&)r5;Mx$MR;>UI-H9u~+!`nL>UBaXk0E{!lHL zS~o@k2Vz*0j!{5POk)jLo90UGjom$YfWYv)VQWlZ^Fm=fL~FDMe7jXgQW@zp?{&Fs zYc23@Hk?0njOE6C;CRBzU%<@XXo^a@fg6% zNOp$DAtr`wXR`0jrNJjBgL?+gf4Hk6Xv{m|^%0%u52B_xu2z%2^m#T!1Y(KC0mBC3KW(3ec}90eS*4CIp(b zj6jkaOf5$%9H)#=USO?dHE;`exQ%g{MQpecaHML6Gnp3@b$*(|Zm|qyscHG1*7`3k zK%aJ3H=K4@2a7axiXzyHx@8tQ1uT-IS;ZKe==vMChkq~%C)Ne$f#r_)F$dF4`5V%* zczE!SI(Mz3N*$6*P2Zl3hYQBjMnwOxyCBI2>v}Q8bGc5(dQctGL`7sDTwpLa!I5o` zMV=;$dHw?MXP`q**74E^SdlzEA%U4mABPQbUzQpeEmL>yd-BWQSs;9wy~2O4KIMM_V;5vT8QUD+1bM96E>Xvieo6ahE7 z!uQUPJ(UT36Q)0C#4?j=vNe4%i zJG|eqIE9kHA#-75lx;Y?NkVTV)ad~QULd-ZfB_Np+6-eH3=}L}`10!9{I8EM)Ya8D zfwQv#5*Gm`LLSR`Q1XdUmhi0oyM&Pr9*Cesp|R5-DiC=w$_19wQ&Ff{VvZBBfcmT3 z-lmlt7K)P;^z_Dy&C1DQhEO5sf#BMcp>$PF9T-V+I=TX&cv<-P%3LMCqz&5kvHbY; zv2X8YdGu-2#2yc$KhUkK(6(GH015x%EnAA3uKlbmo2p)NOkj{QaS}D1}H4 zmfozYs;Q|ve%d_RKk-XcU{VxtGDm$YdQxBE7-IlaWkD%~upl5HKq10?c?7p8>!|VU z8H7mPh4}wCoNXDr&u+tY`g_06^$&U7h1xZ6^@IhpMy)@7IJz@d7ELx`jQzsR+ixT8 zYrC2Hyg`Nkkw%V@q1SYH?s$AcLf-WBv`;@&+Z04KoG5coeREpKSKnUlYuIY0_ee}7 zIpG^7suKind}~(d6lEqPFgQHQ%3_g{lA5Xc4~&YjE|{2jlqlqu1I(Wd@Qs)~uT>v7 z8MMOkaA56*k!%mWZ$f;zK*1m(Dw;`jHyy{g%V*sqJ6z$w?I`N8B=dOTKAPQX+$hI* zoSG0~dw&T2a~tytg_SyH(SuK}8|@k0)BU+R+)#928IPq0ZaD6aMM&IThk{?fRA1mG zLTveM$frv>)9(kI9Cu$e3CDKr!Wh4UE-wvjZSA~=9|_N0wgg@~BJaXGVf*X5LP{wKS{)=%*)&RilOLmdH@bJ#`3E zGW4;Cr`R_kIa4sWzoOtVrdzJRBDU3|A>_H5!f5k&_h5Ge5duK%ZE3v07>oc)&G6rD z2l3kWwvN1f;P-b_Y2i0y=7B9oWCF+l`||bQ8$R+Zz3LEUVv-L0nvq|X=Ry+1N$>~7v_#d{q0!|zuBP3w@ zi_64zitA_IKQ)$RqqE>BDSZ!ELP6x=y6tpQ+PrKQ^j$Wc4z>xGS$Qg|6YppQrX0Rf zAIWbQk>u6lda*I@+Wou|$KO*YA*fDOLiIX8tKO_@ZY%aeXCG>q;-PYmLK<%8S^a&v*~)WCS>I2$yI#(wFtYC}H zPR{Ti3qxfN)tx-U!qX&h;2f1MT)@_C7hj=8p?{~KCjuAUt%i7U;W7vb1P}Ma!;m}I z`<^^J1P`b7=3)-_^Km+;z`nv{O-$fsm(2h9FjOppnlD1H^cK9@?%6YS+dMwAwJ(Gx z^D>0dvx*w-9k^UhKJ{&DIuiRc5}TO}kq}7ERCJ2$9rK5?SO1~0go)A3_eKttm6T5t zqEN3O)~UYd(sfAP+pg#kM5&52y@ry+Ln04&@HuQ`52dke0BO+<4NJCBUHZf$WoaT* z3JZMOd|D{Npf6W7!w%O)adUtBD!aDEfqZ-mK6ac7b4$Gw)cMTjj_rrCD~BbWCxH*( zu4>~Zt}iC_)M-F+m6>~6n7(}7ccdtZ$1Ds#W`9fBEbpQ5)G_j4O3Mpt&6qM9488ve z`s#<^BnFH&t)NNWQ+&szz0L3(Z8ILg;0-eHNwSX#rBCW)ABD)%Q-ozyO$$j zsS?7{I*lkB5LTQiW^00uhp$N@l@r3mjzM~apo%g$Mvl6;j_!WiR74_;* z#?+REmVh%r8c=4&g2p0j=BS6uO@IIw3BN7~(qK!i5XM^e4UQK*OD)txjVI{*6`4z0 zD%!KEM-#WdqU%E%RhGrV${-;x3nqg?m9Q`v*$?q%yW3^oCjxiSsSP8&(f5w3ue={1 z6g%-7N?~tpU>D-3e>XJ{q_hFuS?W;;OfUjzJ~Rz0bH^lbK*_482#j(JP982qSl|-D z38*%*-E+-Wpv1-K!(3}$w3`PDa6M#56thE+pSh|;ZO`8&Y{QXR9TonB2<#1%MM^AA z;1(76d2YTZuQltcd-CIPjA)OuB++zUZ|;Dj84JSy{R#>N>5RB8876UY*npKgu31n{ zQrC+^1|>jG`1PFcQB_p;mk1 z!=X7cstzfg?UU2C0dxKFJs2!xxoqcPq{@Yw&pOJw zFE1PF*HRB2ST2uL>G&G>_|yVdLwqQ!qT(UxJTdRJUG7J9o*w)TjB5%YN`eKfr@dje z7JIi`U?GTThKkLCGL#c@pytKO!vlpsH3%nA{Hvayq6DG{v?_w*Wnp1q#ewIdWM2`h zA0PGg{8*d9IL{~o-IKDYCQb&_tC$_cFuOcR)(!dt+$C?CLGg z=mJB`d@tf;5rUeGl9HLvj*ZXSR7mdU*7B%6=vx6xDc3K^$;svDmSn(JYNyUBsHh+? zMX%ISEsp1z`s6IL=w24WVHCIkhpG1A`ON1K`U+`@qcyT_xdJ6X`G|xB5&7uq>LLnS z^NxgUlB@iPQ10msDk#%xnV6)4-YXNdWO5P6qJjKnu0wc56Oq$AX(mO;K*05pHa?yX#)_x_F@hK=NGeI@N2I{-sTpb-m5e%|jKFeQ?U*F>!Xn9t;amgCc5Q5LB zvL#iv+K>gW8&-Djl+~C>w^aehf5WUx-A<@9v4dYjXBU25%a$fN8I>>CiK>2uys&%a z>~ELG_^lQ0-F^L?6a^`&^@U2j+Ix$XPc$S=!xyK?2|N*aX{POMKLX9DMJe9~Xe2gm|{hbyHf%MOv?R00|HBlwgRAH|6p0 z)EoT3i&xTlj9e?TwfgVpzD|Dn^KN^YQ!B?*hy=Yrag{ya$S&9x-pUGZW#rQuDha^p zpff$EFW5Y|!}{~&rQi`?d~H^MeO(#?V4T9MSpXyX-i!pSMi*5Hk*~WO*paHf4neU4 zO}x+xSJ{`wIH7oncstCCiX1wVH4~fWgb!C>a#0!XOL^f+m(xz6L>--dT2MT_l29EMUJ1cp;>39P&O z3S{E&J?LV`{Uso66r1o-o~Mc5#Mc}whPFfl3{%yHWrxyrQvl-lC-zh&Mn+;du?2>T z4frCXO=Jo)t@<|rgIC^xrxawvtox#dD()r{Na*Hh%FXu%A#rLs6#w^kNav?b7ZyXo z;lf+{oI42yi@%+W1;!bS1gY4cgY@VM%keSlHN}&VjJA=%b9!?2ta{L8^*S%u4#(Hd zGwCw)WgP_nCgfRcuQdCW1MA5yR*Sj1lV$%!2J)ksT zKug1zm3pL5fR6Zxu8f^&#k~6`!x(R@K!X{V5&sapj-xnyU1S)8)B{}4c;87{gJy>nsNCJaoTJRU6pEL^vOUH=>O|E2 z2@Dxb>-WV=m=Ic!vLMrBFB!~J3ww1A^7@m-OI4FF7=Xgjdt*Q`5^ExRSy0Z0Fpt0^ z@?iYmUm_yXuiA%s{RIew7S7UAupUoBY_euaF#K7hE!MBuC;iQ{`d?}!kY z68Ff@Q^GKK9g_H>zXT+oM_&Zx{oa}klzdM1;7vsZm*tuXZc*1p<|>LMyWB3H5SMTk zALS?oPey%UDYIooj{MuF2z!*JmIgeH60|L_UB52rGTXt~_vHV=9yu%W)}lj0x6Zw* za>3+rAl~^0te!~-U9@&VX@;uA{Af+Z@2RP+`P{;JM7s}>hMa-|0}Kee*z*4;i6q1- z`luu29yaz4b~YJ7t&ouiyf6zam~Ov|P~}gW(~(o=6au<2kWFiXgkB5YzFxo$7;CiJ zO#{JLT*IV!AX(f4IoTHU0{qN;BXxVF;kX`YMF0_9HlUJ-^n?VOR{;U+EG)91H8R_m z!sAML>XNO;2jVDX<#y<$B@7fLpZBB%Y)6H%>y}!EL$3!gOUFL_L?qOR-qLQYb~iAT zX7X6J9`>!Whg`-JX;w#);=nSyxK4_fOBqSv2 z7k~tbNC!cw(OMD2a1O^hflxvbsRlpwDrfBCAmT$#p40%)o*juJFSz!<(N<(Le$sUo zS+BWkHl`FPc?Id$D0BD7UeuZn-fNeK?x~gxu&1;{4BQRrUW0MC6yjw8CC3#$T0-o3a z1VnG|rV*wfz>s}6IedwtBzY)`3@RvSM zgQJ0^;R?!1qXc;RYo`kJEr~cjh3b<+^s;?FmsRWKzTDpsA|{HxwwLo47j4^P?=X*V z0qKHt9JR;sv9A|_yb=5He!zO-Zg^y58Yq6V0KO8FkZ_iapmX28EpqkXv5%!^PKx6Y^XJVSn0+{Hy@B;doaWK|Q}J z$-{$<<3mbc00XoXVq`N_?!b#fkr#tz9LR}(Ye1DbF9{&ZXB&yafUS@LzhcuVC%vht zSn6Jdhi(OeD*xeQJ3YK8&}X1Lvp-w`E&$>npqmM6^Um@<-^~?BGes@{-mTSa4pFyc zfvlE=<=Q=egWFVKXNbfjT2(WRqtz9)tOvg84~An3m{vb6@5zcW=U*pzX_#B&9Ex zzK3U#f<~d%AIRu8kR*bB<07i#B0YC+F7v2&Art~Hg9S(=#XFR{e|~(Iqfr>>c1{D! zV7~!dC#W8`^W(f{JgaCe*F`HN-@Ow$N=b z+QTv1bf0Y;gyls`BB^2`XL~%7n_w@)MDy9pEFVL?5wSYeENZ^IJNHgF0M$6ZU8%iI zjgBLX%e%T(fqG_pc@7w1)mAJU{F-3 zsrA_l!XPUfeD~9XuLA7_L>JVhkzJ$-S67Ea?g+x@{1S1mZ76w-y@S_Prg|@jAMMC= z5a5j@0>PKL*sqeK`WfbS2VOf72;g0}RJNrJc;Ch{y_!Cu{U@uB;Jhs%Z_cF__$747 zblCtLlR<8!031aing09J>Rt0}7Yjh)%WQWv^eV$j#3z6zM4?UI21l!FK!yhcQdM`E z)l2*E;xw2yvVY$|Bd1x$md1b<4h)JEa*MF;0T_#zOd#-g)VCUiE=~VNIC}DaXbX$K zTe3q_0M*z~7etH%a%tc;G#@=mLHbE6KCoL%O-(^NtHzv+mzNh6Gm*h~*fnfd8a77@ zd<#p#jwc**>Td)F&kAuU39AJ_Mdh}GsnDB*G;u)-lBT9+)S`P0bZ`c4(Llo(Xt&2f z)eb!nx?c%L59Q0ijV1nx6__KrEme;o;$l z0MYu8CA3LWi+Ys;O~Oo{oJ)29Oc)CXM_%3(zI`(iN2EhzfD6shx|4XOF*?tHl~&l? z?mAv2F=#~6IG~CK{k8Ms4gU2DFHV!FdwEs!g8(US7Wx961!&AJTyXU6>gr1_F^_G> zo0tbpr*v@oO(j_8Be0#&V&E2_$xH^X;i?5G(zvoTQdRP>v%B`G%kJJ@4$u+v-I<~8 zivw!&x_BO1`Eh*jefC`6CXrS`$isAsS6ohZ`AcMQ7PM?k{|n|+{+@!sn~k*Xg7OzC zgji_GEVCQthuJGySy`DyP&vxne+@-0g#!z`%7Vd?eB+BJ9DEqP4HV*k{`@JgtlZ(j z37pa|Z)jpH1bT#W;c3JEvM`_h$WHZ!l(aP4?c29kRsdRPRM?MdHu(7l(+X>|>lD;3 z_oGBUpCWshnb!ObYN7z(Q*HrYRbhY8JFBr5Df9zCB6LrM;I7dvIrbU)qK%V%*5!(l z?s|OoL|U)XXrSMyW#32c)$7+ehBfYb0J7iGpYvpc^z5ee-s*i^@ZI$F8IX%PR+aMN zYF5(UUIMR849X2Nc*Gj|o|wE8p_eHNS{VTh?e6c-8g?4)Bdx|Z9Z#O%bB1+Je1=8A z{{Dv04PY!IK!00i^nkoP;j`#S@ad0?h(LfoEMMN&&e;DWk}5U9 zr<)8BPTyZH8Jj~n($043*Yte*`Yf=4JYZWgcl3s!W=g==&E;q_4&EUMFVH{vb;| zOR*6RM)q4=rU9jtOUFF@Vu(mAI5_9vYi)S9t1$6g4 z8my9*dqEHZuX4kffgQ$CF~^uU^86Z zwkC&!PjTfOG47td%SPW;)3UyWwT&7dy4VP}{2A2RQ`)YpE)7dAjW1;uhcRAzoq zLtcsRoH5?O+H#Hg{WnRXcFcHwAQnZbJ_;3MOBB3O_cv~dQDR44F5J35rr=TY(?+e6 zH%D`GgYKP)c~}|$WhTh7quJZ%h-Uv>|D^_ARIIBcv(&ey)Gi)*_URJe&xL5Zr(fMK zPGG?SqmnCU>9QpW?~o9nYt+@#K@;FS1B2%ZhEc7){UPhJ+!(a@3wc6 z_@5Cdx|$9B1K4iN@ln6~MTX7%hu02wZgdx(H#iwk^|2pr$VQNg*73e`aZfQuGas4t z(aBu2O0$4?E`^o-o43R(F}JsP2h=R>SvSrro;)FEU!?KNN~pR=TCJU7VEn` z2$Bpsh+vJgK+Ft0gks&n%%&C44%yxw*|Hagt2V$g~phyiVE;GN%7RU*jPzEGBU`V6hH zA8WobH%Q8s7#pJzym64B!_9i9+vg$v#8p;S^|u$XFUW>qSX9Wc9H{TcK=skc>nE%R zZ-S^z2A>#I%xWu_c>nYC_bHz42V*`Odq>_d+KKlu=KSuD_9&iHfpJXej8@BqhyQsb zi6V?lIN0Ftm-qy@5p}>OqzB*?5If=4QU##scYX{z$Rhgn=e~yu*5-0ec_ivHJChWf zp62{eulvQ6N5~pB*bHexXVAOns7fD;&N!UT+L}2L2g8SxM`zbQsD(kN$tfb+OuXkR zdU3JOduu9Sdp;u{7XbgsdR@|Mh5{^NV&iv^`Q$EV#Q+G8PI%-%EC!>T*v8AzTm*|m zXY6k$Epg>gA`3Al1CaB;xr$1%hXodih;0A(Vr>n^R}VcFsLDU!=B_&MBG6)Ju*7^j z7r1+y0(i?R39^8EbfK}*>))?p$;1bgPZ8Af*|hzf1^mo{EWN?jT$=hvNo*@O91nte zN~18S7gO_og4!1?@~{?0Ue2)kgVn>TDzNcq3m~oZKX}na_VUDJ+v%<+Q-GF8RSb;}EF5eY37RN>x(S$EA62CD6pG$q)^bOMR znJN{;cJrn*v^-bPvYVQknIXk0kfUniuo#L97d}G9IUGWv-Uq>MXU7vdMU@~*A$kkZ z?U6L-J{=CZd=Wx1qJ=f2IUhLKVKeCSilYx^PA{I*l-67P49aou61ZkIR{JzCIJn(qDFY5>)Xi1c6%b}?R@fgcH&}LEXJTZ`0+LLx*0V@Hh9euA zTj!t?@Q8%^CS2W+>vy;}Q}st61a3Gegw2}ogPx!$4q3rZ=1^`5X`XVr%w_Ol)(aZx z5<#RYSXEUO6H&!}<3>~Xw5h4-&X!yK-aLEr)SAFlbLjTM!pnGizn#hFHedqEvA4|< zpkGZ-mYi<6a*8w)?m#GiLjDl?T3trnLR|Jrml&m?_>zF!Pl1E$MW&F2JA3x(U3*s% zy3h@1jvNfR$SZc(RceGKi}i7;`&!~N}Thg;L(NlD9|B6Jo|X)8}7p#A=y z6AEsaKyubpF2m~SDyV;XAR!*1PcWt*e>%|&UyuaGYKE&)yVlbQxpQFLZ$JOlgUM?` zLPCtv8+)5P-HO`z#fcA)#X8#U^tXoc?7{IDGMeT|-}X#6K`k-Sa7D%Vp@zD;D`?M< zX7D4D*CL=bBL{1SUj3nvi>@pTmtpY~km6GKb*XiOLg?pZwAx-C_)>GfGP zGSSVj>o;z=!Bqh{z!7>KA8y;p5X5@nYrYXF;H>qit)O2gTNpQ1PBe8jhhLXfVXBdsQd(`@fL;+ zOeQeJ#tFwk%Ly(v;`4tzRzw+4aQ~0AMuuV+$j&59>?Bic20ncR=UBh{=jyPUPpS$% zB3H(#dl+y3`gmW+aRP1L_TeK4dJ-FuTX7;{#lETtOvV63Pt6CtT3jnmBp?XbT!_zq z`QaIY^9w9%p^|(*{WpOKhNf18zA; zkPfCc6IOmW0KOjZd^#ZEfso&q`i;5E?AS%O6JlTgjzMrfv`5RUsC2prZ%0l8RW7>G zc4wK8_!2lT#F2nX<7rn}*yLOzp4B(vlAH6+osEl|{=;S%3}&XvZ+Y7%X*Cgc4N;gv z<(X%8fE;Bb!2#DJ1tYf*f%9Jg^FT`Im${Ad;Cc=fxOrxh`Lb99w41rX>N1B zfOV@k06HH^Z*Ub%FO7hz^{C!Z?cn0Onb+5)0ui#A(!hUr<~@^~$B0va@IA?gp>(2} za96>ob1NsCTI$Qc%cHq)ZN(fIKsO`_cFpIm08slV2}1Js#{=NNkz5eT)){dS9D3m& zc-Vznx8qY{fSo( zAjS6Ot2ey{Aa(?@+?P>6v|Ak=?5=y&A#NzWRo}-0B*}=g9{Tk7#h)R`6<2iNT&aJo?x`bLAP)x^$=Jv{Y13~ox(qJ_(?BBEkrvq33g)Heko ztkiqk9UV&K|ZXQ59otNF)eRmmk1Ywe#(n9P5-p9pedJMFUkJVvv3yKp@ zJCbR9!k2}PBQa<{ALcRGhAT^Eb~6hXAzFk?S%TMu!=hhL=K|+JFvR8aAsM|GN3&C@ z+k*DrJR*Z%(Ddq430i#3n(`%Hv_FUbO*4ylyUdN zxrYad|EFD(?GDFpXJk>?aDf^k3mPo37!LWJ(+T-Ll<>OY{sygmO7VFS*SRpDpArgZ z-vk9|yuHY@ZU8FgWCTwE0Lj%UG@30Wqq;qoNU5?Okg)lw04wiK4b>Q|(HcP{=NoC{5+CQ{$YHLuANCj1Oa%e--h&D(SW*5bmXvha@g z!xzU|W>H5z8_5*3Te5R-5ze(H#7;%=YuSjeI*za`Y)+z|=6RX6-X(VPHxC+H^RcYU zh9~$=eI42t0+@SPc3J}3HF`jzu=kRv|g^;%m%bTeX53gv`Knb*R@ zG{$69EOWKs*(>U-e-Wd6x>e!t56%JNQ_P~$>Y&M}ro7Yw$FQcqBWIZ^Z{9LjRZi@- z&DBCYz~soccWxoWQ+>F`-<1_Iuh5hU9!b%0${Tn$v;N#zBI%%~rrxEMp5=|HN+5fHVzFW)XiGP``aTv6 zZcfkupE6*$PDqe+(h`IE(U1g0+Xk3EuPaQPUlag?Eu{LtT|x`{dOsRbp^H$%!Ln|_ zyhmF9d?&rb8M!xB(Ma>Fed~x?Z`l;5HGf@Bi|EG$dcHmSL3%C-hckrp?&I$~|N zRPSgX_JN_V5BQwSJ6C0b-k|5-Oz;xzR4Y}b^-m3*1%kEBuOV5jQPPCbV(Ug1llX;< z`)1d-xC^2!*->Z(d{=fhLLwVD8Jd0iJd?Dd!9e?n2ER5QjcWPE?JZeW{+$B7W99eJ zYD*K8=s@V@tMkRxi|r9(LKhqCBXGj|MX&>*SFg|^H<$Rf)M$y{fCm17IaaIc)B!02 zKnfuwQ&6;?=wDs*YfAi_0(VOs-!o&`R$>K(Ee1b0H+UB;y~m>Pq61gbfkao$6?S3L zaFZ^Yrg-?yuTQFPZ1k&7K+`_n3i}k7>r`E+a}h9tAhtnDqF`TmMA^hX2z~Jh&H$}l zg4ugq0S3g)-TdL4Bw$M;vE_^_4sYeh~9>k;-m#TPTg8uV2*Wwfr>VfnHx~QG6 z)9@KX0Rb=XxmzzDHs;#@rn*q@b##p5LPm})fFaWC6M|C2RffGn*pI&&VJqz}5_LE? z+!yg)6<3@{CG+}rddvV76EDu5E?U{#`?9<9k!MHkVh<{iaA^`FvU1>YIpxzvZN+%% zA*o0+n4aPtmu9^q1YJl-h>+^nz_xAedJ>+0_@wo|Oq&{ra&5ut5}D(g7>Y-l!h^x; zoSVw--zK5}KOwAgBOjv(HbZz>krn7DESS6_5=GVC9PXhsP%GXJ1O+0zTS&Ou9YkrU z7cYT6g)Ub4sQ9ZsWOs7=$#WAYQ_uMcle9secij==f7HZ26)9BhNq*?JqQq* zY)=iTg)eE*=YHgA1UY?V_{fN{eh~OXr|zE=C_K8&Tq~GQ*|DAv_234@V=p3)eJ%fC zA4eexv~A?wyY9EO72EFW>KjBo4Ud!^-zIFcY$ggr@BZxU5C=1`Zp8|cPtnuhR5g!^B`lYS6`Y|9#PyYw3ZrPz zhH*5!@xaP)3tnX9>zMzw5}_9chte6hja!W`9LPOaJkot5JdhG5*ilG9on>(;N&KykX^ z=)(fS(FOh(56}$ks=NsFs;CE%N#_C$7gu;Z2{ZUmO>%nb{HQwQOnx75ye!kHLO$bv zR)_M>e1skNAc30puQ?aZH!pOzVpa>=wSuI82GeAZi|;PMyZJmWA89hD`pA8xGuj0x zCb+JQD>Lu9XK*$iDe~%Cy4%FiFdW_g`>Nk5LDSzkNSSC#xuDUPa>}he)UN$ON5j*< z<^bk!7VUQp;c@Tu4?BeYcd*38e115x?NC92{3txFE@clOivOAIkWH(wJql>w(RD}?F>#R^GWJsOMNpB}AxxS~_ zg4s;+J;6wRjxyO}imr{YYVF^s@n;_Q^%8f+ug)`0M46}#-?3G|9?t}+)mYOKZI<%{ zEl5%$BrQP4ke9c-^aRL4wAGP0{Ej?_KRwZ<3i92WGh)!NothbgKhPYAlv$?vMna<^ z4nTR(jS?}0#}@%2)1x_!gI$F$D~ztlp?W7T<83y<;!{}_hjH{@X0z*k(8qZoNUTeE zEE{zrBu&GkC1~fr>y?EmG0RHczkfdhjq`ZF8uj{gl^7zlV7zWb*RKsWyJd69)+fAu)tN5)X;^x`2pI?+!R)wkP&wicNtKa3IE>Cp^;W>Wfq^0!& zU6^yK5s*qBfui!5U~{CX#mJMuRKoe9maRAG0@IX8Om-k{GcEIuA@3~~CWH++EtzPi z+9!aVXPB%RPC41B1#)8Iz{=-WWYogy&VG;n+(M4yHCVd|=+Kl@RS#W_SHE}c$wCrr zfD#pH3ZEwC%`dghDX~3~G`xqz2*Z`9h(Cn45BZu2n7L?Z^>In-34eq^Y(41z-HNNb zNOg54Hl@%`m8kXcN9&UU+ptBKoRK!RzTn7Tmg4;T?~3Z`uY9Gc2>IRPHw*moN0Mh5 zEjBnx1NvW@@cynY@^<2hQ)9XFArlQl=$~PO{ddP6Z)wEr^iKA*{;?vL97YwoKW4@n zYa&r*G$!rF)W;&`Oy49HaL{Eb@@iwnf?&`+cFQa!82JYM@`Ev`4-1PE=?3LHPA_AH zVNaxfT)w5t`<~_YDz56Y#1D|%cq?m`QS`arU7Gs3T~i7DJ>si;S4!>OcL{n)1df1Q z!Xg_dJO1FRT{68Be6p)Qy@Drhv0=N#=XQ$>3rN!{u*H>-a;zxib2HC38^#uE6fqZ+ z!B0W58ozbLGo|A!LYq-T_Q=ygFapl6I#QOzegMMJr0DbB?`1lQ15&a@h(|^ug$yB3 z+uW}8Z!3}pZw>oe6Bnm*1R3r}>#9rLRbLL7=rIHA>0(0;pY(z9xYS8=4Og_gPz-XN zO)o-3Vfw`)@80Vnbf@Z1Ugfanj47d9R#JSj9T)wCO-`kR2AL^rbab)67ZvB>hng7s z^bIw2r!;naDwcc7ZCG+N$p+ z9bF)`7p!@0EScm~x2?~6*~Vj^mrC@Ic^a>%i6qh`IW|Lc`ggj~nTc@+%(W6UYA>H+ z8e&NSTCo7d6tXN9OGnKA$t64>WlBPE4*~^D{4pBr3yRxQQu%hWL8;hU0pq8a}*YO-@YC6ywkro z7ZVyUq9dKi=Kp5P>vyRW+_U!LT^$NMFKw zK`My~6KF8Fhj<>J^xIu@s&GD*jwK-)$EiV+)kz4*3ic)O*n#qQ360aO&V?_9?(>uJ zW~tq$e=UIGCWb8i&iyiM$e7`#J6XRQNf?Ea!neg%)z%$@d92jG6>10C+;m%kVQfEf zV{{QT)5zE8-}}h1UIyHiqd{-HGfwye2gt*=Iq={v5xjS}`FcHnmY1lw19m{f&BZ7? zFJ2Y?QAm~6Ll%+OGsF~Tns08?51=TKF!CJ%dcD2fLMOoEDdxiZ1}}5I8R8W;ST*{} zQe~ttt&q6`R|Sb8tenjeq6pb|crvnVs_sj~VeVCk z_51gpU#C!Qcxb9e&ZT1~P&N+*!A=7*&R>7oX*T)Y8Wl_ao%4x_;rY&Kf3CR($NrK0 zeXg%+$u&tWRw2l){?Y?xxCyBtlLf6#>Ir_O2X%rA{O@TT&poW%9!ibR!)m1rWMw&s zL%H+tdBO?rAx?DMae54vbo}MQGkFCkxmL3Rv~A?Zb89|CrkliGUKW!SaB$}-{gtXu zZN!&jF?19gaJh)^1Lxbnm->MeEsEtR!zSAl=U=TW`abHxNj0dr79IuIG(1{mOTS&3 zP-Fc=MoH6>Ul$)4fu;dWJwGYx)-CtjL&-Vi*V+mq1IM-7aap`AC&zlf(#Fi3>qoPnUQsLdn;t6%no}4hAOd-6NHi$VK7`)35c0*oYCZ|| zt!A&W06OL4;N@>lQab>fu*5bBrCn?+C9(8T1kpixe)|l486Qm9LNmuvJ8VUHJ$TETs-E7~! zOUE1>7LC{tq!q;8kPY4YeF)MX2bt(NM1o4Mc+lWG zH$jm=)J>cpCnh2|Kmjvh!JI_Ugv!J?3cU=lq>O_&R`7UrWbqhssc?9;^y;Z$KLBYCTxki;-n7oa`(_F$d3ZiodGg?{DY* zU4yl1a4jw}!ii_-UDP!nH4QI&ZzwaU?2V1fm?tcpL1p9(`=hyl+bT1j@~5TE;?5x~ zrAFy$(;VB<=o>dOIUJ6`+gXstsK}dyTk4O}1IBafRRvj^j~~aizcjhQJ&2NK>(;=M z=)~#aY5kb3x*tDhrb#N)id2V6c7K0qLi*@h0WyPo@$0&*p~x|U({J2n%+Zm>08*YHVC z2cM5<*6uz({n$;}NKCcyntpSy(VdSlv;#CL2}_GC%e=6Gz{5z02Lfr+;B)1_nJ)0O zg8`Z(=zemneD>U86o@9}ja?&2fX456=uZ-MAQGFRK2gS01F6XM9$I-=hiIu2BgjXv)i?N(BP>Vh;4xG;Q>G)HG=B4~hSF&cSg)EdD3_`z~R zLxrCeYUF5w=!KvpI3&f$$%5aK{R&4bInZ%l|JOI!w2(3ng&rcW@Z;J_x4bKYn X6}iPOyjxX4=2lPFc<&t@yWoEVCTX-G literal 0 HcmV?d00001 From e23682602450062003deb16f962d339316c47638 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 22:45:48 +0000 Subject: [PATCH 0172/1000] testing: set backend to Agg only once svn path=/trunk/matplotlib/; revision=7664 --- doc/devel/coding_guide.rst | 1 - lib/matplotlib/__init__.py | 2 +- lib/matplotlib/tests/test_spines.py | 1 - 3 files changed, 1 insertion(+), 3 deletions(-) diff --git a/doc/devel/coding_guide.rst b/doc/devel/coding_guide.rst index 3b117c41327e..1cde77463135 100644 --- a/doc/devel/coding_guide.rst +++ b/doc/devel/coding_guide.rst @@ -719,7 +719,6 @@ it:: import numpy as np import matplotlib - matplotlib.use('Agg') from matplotlib.testing.decorators import image_comparison import matplotlib.pyplot as plt diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index 3eae041afabc..4d4c8f0cd0a2 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -888,7 +888,7 @@ def test(verbosity=0): import nose.plugins.builtin from testing.noseclasses import KnownFailure from nose.plugins.manager import PluginManager - + use('Agg') # use Agg backend for these tests plugins = [] plugins.append( KnownFailure() ) plugins.extend( [plugin() for plugin in nose.plugins.builtin.plugins] ) diff --git a/lib/matplotlib/tests/test_spines.py b/lib/matplotlib/tests/test_spines.py index 4b1b86f530ab..712dc7ebe985 100644 --- a/lib/matplotlib/tests/test_spines.py +++ b/lib/matplotlib/tests/test_spines.py @@ -1,6 +1,5 @@ import numpy as np import matplotlib -matplotlib.use('Agg') from matplotlib.testing.decorators import image_comparison import matplotlib.pyplot as plt From a1af04fa4452b1323dc8fccfc57c30f5e11cd1f5 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 22:46:00 +0000 Subject: [PATCH 0173/1000] testing: baseline images now in svn. specify image names without '.png' svn path=/trunk/matplotlib/; revision=7665 --- lib/matplotlib/testing/decorators.py | 24 ++++++++++++++++++------ lib/matplotlib/tests/test_spines.py | 4 ++-- setup.py | 12 ++++++++++++ 3 files changed, 32 insertions(+), 8 deletions(-) diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index a422408b6cd9..fe341d1e9525 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -1,8 +1,8 @@ from matplotlib.testing.noseclasses import KnownFailureTest, \ KnownFailureDidNotFailTest, ImageComparisonFailure -import sys +import os, sys import nose -from matplotlib.cbook import get_sample_data +import matplotlib.tests from matplotlib.testing.compare import compare_images def knownfailureif(fail_condition, msg=None): @@ -36,7 +36,7 @@ def failer(*args, **kwargs): return nose.tools.make_decorator(f)(failer) return known_fail_decorator -def image_comparison(baseline_images=None, tol=1e-3): +def image_comparison(baseline_images=None): """ compare images generated by the test with those specified in *baseline_images*, which must correspond within tolerance *tol*, @@ -49,10 +49,22 @@ def image_comparison(baseline_images=None, tol=1e-3): def compare_images_decorator(func): def decorated_compare_images(*args,**kwargs): result = func(*args,**kwargs) + extension = '.png' # TODO: test more backends for fname in baseline_images: - actual = fname - expected = get_sample_data('test_baseline_%s'%fname, - asfileobj=False) + actual = fname + extension + + # compute filename for baseline image + module_name = func.__module__ + mods = module_name.split('.') + assert mods.pop(0)=='matplotlib' + assert mods.pop(0)=='tests' + subdir = '/'.join(mods) + basedir = os.path.dirname(matplotlib.tests.__file__) + baseline_dir = os.path.join(basedir,'baseline_images',subdir) + expected = os.path.join(baseline_dir,fname) + extension + + # compare the images + tol=1e-3 # default tolerance err = compare_images( expected, actual, tol, in_decorator=True ) if err: diff --git a/lib/matplotlib/tests/test_spines.py b/lib/matplotlib/tests/test_spines.py index 712dc7ebe985..adebc44a4b84 100644 --- a/lib/matplotlib/tests/test_spines.py +++ b/lib/matplotlib/tests/test_spines.py @@ -3,7 +3,7 @@ from matplotlib.testing.decorators import image_comparison import matplotlib.pyplot as plt -@image_comparison(baseline_images=['spines_axes_positions.png']) +@image_comparison(baseline_images=['spines_axes_positions']) def test_spines_axes_positions(): # SF bug 2852168 fig = plt.figure() @@ -18,4 +18,4 @@ def test_spines_axes_positions(): ax.xaxis.set_ticks_position('top') ax.spines['left'].set_color('none') ax.spines['bottom'].set_color('none') - fig.savefig('spines_axes_positions.png') + fig.savefig('spines_axes_positions') diff --git a/setup.py b/setup.py index 06b040f6a61f..2ec1e8551d7a 100644 --- a/setup.py +++ b/setup.py @@ -101,6 +101,18 @@ 'backends/Matplotlib.nib/*', ]} +if 1: + # TODO: exclude these when making release? + baseline_images = glob.glob(os.path.join('lib','matplotlib','tests', + 'baseline_images','*','*')) + def chop_package(fname): + badstr = os.path.join('lib','matplotlib','') + assert fname.startswith(badstr) + result = fname[ len(badstr): ] + return result + baseline_images = [chop_package(f) for f in baseline_images] + package_data['matplotlib'].extend(baseline_images) + if not check_for_numpy(): sys.exit(1) From 07df46ee3e63127d15088f12907fba6132d8b7b1 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 22:46:27 +0000 Subject: [PATCH 0174/1000] testing: move test/mplTest/units to lib/matplotlib/testing/jpl_units svn path=/trunk/matplotlib/; revision=7666 --- .../units => lib/matplotlib/testing/jpl_units}/Duration.py | 0 {test/mplTest/units => lib/matplotlib/testing/jpl_units}/Epoch.py | 0 .../units => lib/matplotlib/testing/jpl_units}/EpochConverter.py | 0 .../units => lib/matplotlib/testing/jpl_units}/StrConverter.py | 0 .../mplTest/units => lib/matplotlib/testing/jpl_units}/UnitDbl.py | 0 .../matplotlib/testing/jpl_units}/UnitDblConverter.py | 0 .../matplotlib/testing/jpl_units}/UnitDblFormatter.py | 0 .../units => lib/matplotlib/testing/jpl_units}/__init__.py | 0 8 files changed, 0 insertions(+), 0 deletions(-) rename {test/mplTest/units => lib/matplotlib/testing/jpl_units}/Duration.py (100%) rename {test/mplTest/units => lib/matplotlib/testing/jpl_units}/Epoch.py (100%) rename {test/mplTest/units => lib/matplotlib/testing/jpl_units}/EpochConverter.py (100%) rename {test/mplTest/units => lib/matplotlib/testing/jpl_units}/StrConverter.py (100%) rename {test/mplTest/units => lib/matplotlib/testing/jpl_units}/UnitDbl.py (100%) rename {test/mplTest/units => lib/matplotlib/testing/jpl_units}/UnitDblConverter.py (100%) rename {test/mplTest/units => lib/matplotlib/testing/jpl_units}/UnitDblFormatter.py (100%) rename {test/mplTest/units => lib/matplotlib/testing/jpl_units}/__init__.py (100%) diff --git a/test/mplTest/units/Duration.py b/lib/matplotlib/testing/jpl_units/Duration.py similarity index 100% rename from test/mplTest/units/Duration.py rename to lib/matplotlib/testing/jpl_units/Duration.py diff --git a/test/mplTest/units/Epoch.py b/lib/matplotlib/testing/jpl_units/Epoch.py similarity index 100% rename from test/mplTest/units/Epoch.py rename to lib/matplotlib/testing/jpl_units/Epoch.py diff --git a/test/mplTest/units/EpochConverter.py b/lib/matplotlib/testing/jpl_units/EpochConverter.py similarity index 100% rename from test/mplTest/units/EpochConverter.py rename to lib/matplotlib/testing/jpl_units/EpochConverter.py diff --git a/test/mplTest/units/StrConverter.py b/lib/matplotlib/testing/jpl_units/StrConverter.py similarity index 100% rename from test/mplTest/units/StrConverter.py rename to lib/matplotlib/testing/jpl_units/StrConverter.py diff --git a/test/mplTest/units/UnitDbl.py b/lib/matplotlib/testing/jpl_units/UnitDbl.py similarity index 100% rename from test/mplTest/units/UnitDbl.py rename to lib/matplotlib/testing/jpl_units/UnitDbl.py diff --git a/test/mplTest/units/UnitDblConverter.py b/lib/matplotlib/testing/jpl_units/UnitDblConverter.py similarity index 100% rename from test/mplTest/units/UnitDblConverter.py rename to lib/matplotlib/testing/jpl_units/UnitDblConverter.py diff --git a/test/mplTest/units/UnitDblFormatter.py b/lib/matplotlib/testing/jpl_units/UnitDblFormatter.py similarity index 100% rename from test/mplTest/units/UnitDblFormatter.py rename to lib/matplotlib/testing/jpl_units/UnitDblFormatter.py diff --git a/test/mplTest/units/__init__.py b/lib/matplotlib/testing/jpl_units/__init__.py similarity index 100% rename from test/mplTest/units/__init__.py rename to lib/matplotlib/testing/jpl_units/__init__.py From c4883c98b5630b034c1165b87d7188dfabf851bb Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 22:46:52 +0000 Subject: [PATCH 0175/1000] testing: move baseline images svn path=/trunk/matplotlib/; revision=7667 --- .../test_axes}/empty_datetime.png | Bin .../test_axes}/formatter_ticker_001.png | Bin .../test_axes}/formatter_ticker_002.png | Bin .../test_axes}/formatter_ticker_003.png | Bin .../test_axes}/formatter_ticker_004.png | Bin .../test_axes}/formatter_ticker_005.png | Bin .../baseline/TestAxes/default_datetime.png | Bin 19599 -> 0 bytes 7 files changed, 0 insertions(+), 0 deletions(-) rename {test/test_matplotlib/baseline/TestAxes => lib/matplotlib/tests/baseline_images/test_axes}/empty_datetime.png (100%) rename {test/test_matplotlib/baseline/TestAxes => lib/matplotlib/tests/baseline_images/test_axes}/formatter_ticker_001.png (100%) rename {test/test_matplotlib/baseline/TestAxes => lib/matplotlib/tests/baseline_images/test_axes}/formatter_ticker_002.png (100%) rename {test/test_matplotlib/baseline/TestAxes => lib/matplotlib/tests/baseline_images/test_axes}/formatter_ticker_003.png (100%) rename {test/test_matplotlib/baseline/TestAxes => lib/matplotlib/tests/baseline_images/test_axes}/formatter_ticker_004.png (100%) rename {test/test_matplotlib/baseline/TestAxes => lib/matplotlib/tests/baseline_images/test_axes}/formatter_ticker_005.png (100%) delete mode 100644 test/test_matplotlib/baseline/TestAxes/default_datetime.png diff --git a/test/test_matplotlib/baseline/TestAxes/empty_datetime.png b/lib/matplotlib/tests/baseline_images/test_axes/empty_datetime.png similarity index 100% rename from test/test_matplotlib/baseline/TestAxes/empty_datetime.png rename to lib/matplotlib/tests/baseline_images/test_axes/empty_datetime.png diff --git a/test/test_matplotlib/baseline/TestAxes/formatter_ticker_001.png b/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_001.png similarity index 100% rename from test/test_matplotlib/baseline/TestAxes/formatter_ticker_001.png rename to lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_001.png diff --git a/test/test_matplotlib/baseline/TestAxes/formatter_ticker_002.png b/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_002.png similarity index 100% rename from test/test_matplotlib/baseline/TestAxes/formatter_ticker_002.png rename to lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_002.png diff --git a/test/test_matplotlib/baseline/TestAxes/formatter_ticker_003.png b/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_003.png similarity index 100% rename from test/test_matplotlib/baseline/TestAxes/formatter_ticker_003.png rename to lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_003.png diff --git a/test/test_matplotlib/baseline/TestAxes/formatter_ticker_004.png b/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_004.png similarity index 100% rename from test/test_matplotlib/baseline/TestAxes/formatter_ticker_004.png rename to lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_004.png diff --git a/test/test_matplotlib/baseline/TestAxes/formatter_ticker_005.png b/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_005.png similarity index 100% rename from test/test_matplotlib/baseline/TestAxes/formatter_ticker_005.png rename to lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_005.png diff --git a/test/test_matplotlib/baseline/TestAxes/default_datetime.png b/test/test_matplotlib/baseline/TestAxes/default_datetime.png deleted file mode 100644 index bf8be2a8d7b0d3b457b132c2f3d6627e882fbfed..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 19599 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 QI+@HlxwG+SZa(_|03H_S6951J From 6f035b8a635af5fe26b108a88474d8bb3bba53bc Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 22:47:08 +0000 Subject: [PATCH 0176/1000] testing: convert some JPL units tests to simple nose tests svn path=/trunk/matplotlib/; revision=7668 --- lib/matplotlib/__init__.py | 1 + .../testing/jpl_units/UnitDblConverter.py | 4 +- lib/matplotlib/testing/jpl_units/__init__.py | 14 +-- setup.py | 1 + test/test_matplotlib/TestAxes.py | 102 ------------------ 5 files changed, 11 insertions(+), 111 deletions(-) delete mode 100644 test/test_matplotlib/TestAxes.py diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index 4d4c8f0cd0a2..fc6aca9185a8 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -879,6 +879,7 @@ def tk_window_focus(): default_test_modules = [ 'matplotlib.tests.test_basic', 'matplotlib.tests.test_transforms', + 'matplotlib.tests.test_axes', 'matplotlib.tests.test_spines', ] diff --git a/lib/matplotlib/testing/jpl_units/UnitDblConverter.py b/lib/matplotlib/testing/jpl_units/UnitDblConverter.py index b0bc9f1ae384..18218412c093 100644 --- a/lib/matplotlib/testing/jpl_units/UnitDblConverter.py +++ b/lib/matplotlib/testing/jpl_units/UnitDblConverter.py @@ -66,7 +66,7 @@ def axisinfo( unit, axis ): label information. """ # Delay-load due to circular dependencies. - import mplTest.units as U + import matplotlib.testing.jpl_units as U # Check to see if the value used for units is a string unit value # or an actual instance of a UnitDbl so that we can use the unit @@ -105,7 +105,7 @@ def convert( value, unit, axis ): - Returns the value parameter converted to floats. """ # Delay-load due to circular dependencies. - import mplTest.units as U + import matplotlib.testing.jpl_units as U isNotUnitDbl = True diff --git a/lib/matplotlib/testing/jpl_units/__init__.py b/lib/matplotlib/testing/jpl_units/__init__.py index 330d548ec510..8d414e087cc8 100644 --- a/lib/matplotlib/testing/jpl_units/__init__.py +++ b/lib/matplotlib/testing/jpl_units/__init__.py @@ -30,15 +30,15 @@ """ #======================================================================= -from mplTest.units.Duration import Duration -from mplTest.units.Epoch import Epoch -from mplTest.units.UnitDbl import UnitDbl +from Duration import Duration +from Epoch import Epoch +from UnitDbl import UnitDbl -from mplTest.units.StrConverter import StrConverter -from mplTest.units.EpochConverter import EpochConverter -from mplTest.units.UnitDblConverter import UnitDblConverter +from StrConverter import StrConverter +from EpochConverter import EpochConverter +from UnitDblConverter import UnitDblConverter -from mplTest.units.UnitDblFormatter import UnitDblFormatter +from UnitDblFormatter import UnitDblFormatter #======================================================================= diff --git a/setup.py b/setup.py index 2ec1e8551d7a..96cd1f364520 100644 --- a/setup.py +++ b/setup.py @@ -51,6 +51,7 @@ 'matplotlib.backends', 'matplotlib.projections', 'matplotlib.testing', + 'matplotlib.testing.jpl_units', 'matplotlib.tests', # 'matplotlib.toolkits', 'mpl_toolkits', diff --git a/test/test_matplotlib/TestAxes.py b/test/test_matplotlib/TestAxes.py deleted file mode 100644 index 078d3022446c..000000000000 --- a/test/test_matplotlib/TestAxes.py +++ /dev/null @@ -1,102 +0,0 @@ -#======================================================================= -"""The Axes unit-test class implementation.""" -#======================================================================= - -from mplTest import MplTestCase, units -from matplotlib.testing.decorators import knownfailureif - -#======================================================================= -# Add import modules below. -import matplotlib -matplotlib.use( "Agg", warn = False ) - -import pylab -import numpy as npy -from datetime import datetime -# -#======================================================================= - -#======================================================================= -class TestAxes( MplTestCase ): - """Test the various axes non-plotting methods.""" - - # Uncomment any appropriate tags - tags = [ - # 'gui', # requires the creation of a gui window - 'agg', # uses agg in the backend - 'agg-only', # uses only agg in the backend - # 'wx', # uses wx in the backend - # 'qt', # uses qt in the backend - # 'ps', # uses the postscript backend - # 'units', # uses units in the test - 'PIL', # uses PIL for image comparison - ] - - #-------------------------------------------------------------------- - def setUp( self ): - """Setup any data needed for the unit test.""" - units.register() - - #-------------------------------------------------------------------- - def tearDown( self ): - """Clean-up any generated files here.""" - pass - - #-------------------------------------------------------------------- - @knownfailureif('indeterminate', "Fails due to SF bug 2850075") - def test_empty_datetime( self ): - """Test plotting empty axes with dates along one axis.""" - fname = self.outFile( "empty_datetime.png" ) - - t0 = datetime(2009, 1, 20) - tf = datetime(2009, 1, 21) - - fig = pylab.figure() - pylab.axvspan( t0, tf, facecolor="blue", alpha=0.25 ) - fig.autofmt_xdate() - - fig.savefig( fname ) - self.checkImage( fname ) - - #-------------------------------------------------------------------- - def test_formatter_ticker( self ): - """Test Some formatter and ticker issues.""" - - # This essentially test to see if user specified labels get overwritten - # by the auto labeler functionality of the axes. - xdata = [ x*units.sec for x in range(10) ] - ydata1 = [ (1.5*y - 0.5)*units.km for y in range(10) ] - ydata2 = [ (1.75*y - 1.0)*units.km for y in range(10) ] - - fname = self.outFile( "formatter_ticker_001.png" ) - fig = pylab.figure() - ax = pylab.subplot( 111 ) - ax.set_xlabel( "x-label 001" ) - fig.savefig( fname ) - self.checkImage( fname ) - - fname = self.outFile( "formatter_ticker_002.png" ) - ax.plot( xdata, ydata1, color='blue', xunits="sec" ) - fig.savefig( fname ) - self.checkImage( fname ) - - fname = self.outFile( "formatter_ticker_003.png" ) - ax.set_xlabel( "x-label 003" ) - fig.savefig( fname ) - self.checkImage( fname ) - - fname = self.outFile( "formatter_ticker_004.png" ) - ax.plot( xdata, ydata2, color='green', xunits="hour" ) - ax.set_xlabel( "x-label 004" ) - fig.savefig( fname ) - self.checkImage( fname ) - - # See SF bug 2846058 - # https://sourceforge.net/tracker/?func=detail&aid=2846058&group_id=80706&atid=560720 - fname = self.outFile( "formatter_ticker_005.png" ) - ax.set_xlabel( "x-label 005" ) - ax.autoscale_view() - fig.savefig( fname ) - self.checkImage( fname ) - - From b5e3f96b92d256e19bb358140a1359666a91566d Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 23:08:03 +0000 Subject: [PATCH 0177/1000] testing: enable test_dates svn path=/trunk/matplotlib/; revision=7669 --- lib/matplotlib/__init__.py | 1 + .../test_dates/date_axhline.png | Bin 0 -> 23948 bytes .../test_dates/date_axhspan.png | Bin 0 -> 19895 bytes .../test_dates/date_axvline.png | Bin 0 -> 17021 bytes .../test_dates/date_axvspan.png | Bin 0 -> 16646 bytes .../baseline_images/test_dates/date_empty.png | Bin 0 -> 11981 bytes lib/matplotlib/tests/test_dates.py | 35 ++++++++---------- 7 files changed, 17 insertions(+), 19 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_dates/date_axhline.png create mode 100644 lib/matplotlib/tests/baseline_images/test_dates/date_axhspan.png create mode 100644 lib/matplotlib/tests/baseline_images/test_dates/date_axvline.png create mode 100644 lib/matplotlib/tests/baseline_images/test_dates/date_axvspan.png create mode 100644 lib/matplotlib/tests/baseline_images/test_dates/date_empty.png diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index fc6aca9185a8..afab91410258 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -880,6 +880,7 @@ def tk_window_focus(): 'matplotlib.tests.test_basic', 'matplotlib.tests.test_transforms', 'matplotlib.tests.test_axes', + 'matplotlib.tests.test_dates', 'matplotlib.tests.test_spines', ] diff --git a/lib/matplotlib/tests/baseline_images/test_dates/date_axhline.png b/lib/matplotlib/tests/baseline_images/test_dates/date_axhline.png new file mode 100644 index 0000000000000000000000000000000000000000..9c73cfcaf84366c195538571bc709adfc4124e7f GIT binary patch literal 23948 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


    nOEV+{~v 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_dates/date_axvspan.png b/lib/matplotlib/tests/baseline_images/test_dates/date_axvspan.png new file mode 100644 index 0000000000000000000000000000000000000000..47ebd008bc1ef96b534293421ff3325f42a39130 GIT binary patch literal 16646 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_dates/date_empty.png b/lib/matplotlib/tests/baseline_images/test_dates/date_empty.png new file mode 100644 index 0000000000000000000000000000000000000000..6f551f9830fb9b5932690d775e1b3a45198ca0e2 GIT binary patch literal 11981 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 Date: Sun, 6 Sep 2009 23:28:13 +0000 Subject: [PATCH 0178/1000] testing: add missing file svn path=/trunk/matplotlib/; revision=7670 --- lib/matplotlib/tests/test_axes.py | 73 +++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 lib/matplotlib/tests/test_axes.py diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py new file mode 100644 index 000000000000..93b87096be38 --- /dev/null +++ b/lib/matplotlib/tests/test_axes.py @@ -0,0 +1,73 @@ +import numpy as np +import matplotlib +from matplotlib.testing.decorators import image_comparison, knownfailureif +import matplotlib.pyplot as plt +import pylab + +@knownfailureif('indeterminate', "Fails due to SF bug 2850075") +@image_comparison(baseline_images=['empty_datetime']) +def test_empty_datetime(): + """Test plotting empty axes with dates along one axis.""" + from datetime import datetime + + t0 = datetime(2009, 1, 20) + tf = datetime(2009, 1, 21) + + fig = pylab.figure() + pylab.axvspan( t0, tf, facecolor="blue", alpha=0.25 ) + fig.autofmt_xdate() + + fig.savefig( 'empty_datetime' ) + +@image_comparison(baseline_images=['formatter_ticker_001', + 'formatter_ticker_002', + 'formatter_ticker_003', + 'formatter_ticker_004', + 'formatter_ticker_005', + ]) +def test_formatter_ticker(): + """Test Some formatter and ticker issues.""" + import matplotlib.testing.jpl_units as units + def register_units(): + """Register the unit conversion classes with matplotlib.""" + import matplotlib.units as munits + import matplotlib.testing.jpl_units as jpl_units + from matplotlib.testing.jpl_units.Duration import Duration + from matplotlib.testing.jpl_units.Epoch import Epoch + from matplotlib.testing.jpl_units.UnitDbl import UnitDbl + + from matplotlib.testing.jpl_units.StrConverter import StrConverter + from matplotlib.testing.jpl_units.EpochConverter import EpochConverter + from matplotlib.testing.jpl_units.UnitDblConverter import UnitDblConverter + + munits.registry[ str ] = StrConverter() + munits.registry[ Epoch ] = EpochConverter() + munits.registry[ UnitDbl ] = UnitDblConverter() + register_units() + + # This essentially test to see if user specified labels get overwritten + # by the auto labeler functionality of the axes. + xdata = [ x*units.sec for x in range(10) ] + ydata1 = [ (1.5*y - 0.5)*units.km for y in range(10) ] + ydata2 = [ (1.75*y - 1.0)*units.km for y in range(10) ] + + fig = pylab.figure() + ax = pylab.subplot( 111 ) + ax.set_xlabel( "x-label 001" ) + fig.savefig( 'formatter_ticker_001' ) + + ax.plot( xdata, ydata1, color='blue', xunits="sec" ) + fig.savefig( 'formatter_ticker_002' ) + + ax.set_xlabel( "x-label 003" ) + fig.savefig( 'formatter_ticker_003' ) + + ax.plot( xdata, ydata2, color='green', xunits="hour" ) + ax.set_xlabel( "x-label 004" ) + fig.savefig( 'formatter_ticker_004' ) + + # See SF bug 2846058 + # https://sourceforge.net/tracker/?func=detail&aid=2846058&group_id=80706&atid=560720 + ax.set_xlabel( "x-label 005" ) + ax.autoscale_view() + fig.savefig( 'formatter_ticker_005' ) From 0df14b2a9186f72bf121e74f77dd83b61dc62a75 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 6 Sep 2009 23:28:28 +0000 Subject: [PATCH 0179/1000] testing: fixup failing jpl unit test infrastructure svn path=/trunk/matplotlib/; revision=7671 --- lib/matplotlib/testing/jpl_units/Duration.py | 2 +- lib/matplotlib/testing/jpl_units/Epoch.py | 2 +- lib/matplotlib/testing/jpl_units/EpochConverter.py | 4 ++-- test/mplTest/__init__.py | 2 +- 4 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/matplotlib/testing/jpl_units/Duration.py b/lib/matplotlib/testing/jpl_units/Duration.py index c29aec5667ce..cde977931382 100644 --- a/lib/matplotlib/testing/jpl_units/Duration.py +++ b/lib/matplotlib/testing/jpl_units/Duration.py @@ -100,7 +100,7 @@ def __add__( self, rhs ): - Returns the sum of ourselves and the input Duration. """ # Delay-load due to circular dependencies. - import mplTest.units as U + import matplotlib.testing.jpl_units as U if isinstance( rhs, U.Epoch ): return rhs + self diff --git a/lib/matplotlib/testing/jpl_units/Epoch.py b/lib/matplotlib/testing/jpl_units/Epoch.py index b7be697ec143..93821c3e48ed 100644 --- a/lib/matplotlib/testing/jpl_units/Epoch.py +++ b/lib/matplotlib/testing/jpl_units/Epoch.py @@ -173,7 +173,7 @@ def __sub__( self, rhs ): Epoch that is the result of subtracting a duration from an epoch. """ # Delay-load due to circular dependencies. - import mplTest.units as U + import matplotlib.testing.jpl_units as U # Handle Epoch - Duration if isinstance( rhs, U.Duration ): diff --git a/lib/matplotlib/testing/jpl_units/EpochConverter.py b/lib/matplotlib/testing/jpl_units/EpochConverter.py index 1dd474e9f531..e46764ec53ab 100644 --- a/lib/matplotlib/testing/jpl_units/EpochConverter.py +++ b/lib/matplotlib/testing/jpl_units/EpochConverter.py @@ -63,7 +63,7 @@ def float2epoch( value, unit ): - Returns the value converted to an Epoch in the sepcified time system. """ # Delay-load due to circular dependencies. - import mplTest.units as U + import matplotlib.testing.jpl_units as U secPastRef = value * 86400.0 * U.UnitDbl( 1.0, 'sec' ) return U.Epoch( unit, secPastRef, EpochConverter.jdRef ) @@ -111,7 +111,7 @@ def convert( value, unit, axis ): - Returns the value parameter converted to floats. """ # Delay-load due to circular dependencies. - import mplTest.units as U + import matplotlib.testing.jpl_units as U isNotEpoch = True isDuration = False diff --git a/test/mplTest/__init__.py b/test/mplTest/__init__.py index e2fe8dbc71e9..0b4c2fe861bc 100644 --- a/test/mplTest/__init__.py +++ b/test/mplTest/__init__.py @@ -10,4 +10,4 @@ from mplTest.MplNosePlugin import MplNosePlugin from mplTest.MplTestCase import MplTestCase -import mplTest.units as units +import matplotlib.testing.jpl_units as units From 06941236a88330afd5fd50ba66edfd7dff7c1ab3 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Mon, 7 Sep 2009 14:09:01 +0000 Subject: [PATCH 0180/1000] removed empty datetime example from test_axes; now in test_dates svn path=/trunk/matplotlib/; revision=7672 --- .../test_axes/empty_datetime.png | Bin 16866 -> 0 bytes lib/matplotlib/tests/test_axes.py | 15 --------------- 2 files changed, 15 deletions(-) delete mode 100644 lib/matplotlib/tests/baseline_images/test_axes/empty_datetime.png diff --git a/lib/matplotlib/tests/baseline_images/test_axes/empty_datetime.png b/lib/matplotlib/tests/baseline_images/test_axes/empty_datetime.png deleted file mode 100644 index 7fd243a6f363a71ae4fec815c08be01b51d7cef7..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16866 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 c)`7b1!g0^F#Ub`g!j^_wy|SMS{aKhN_R`v3p{ diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 93b87096be38..13541fcbe28c 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -4,21 +4,6 @@ import matplotlib.pyplot as plt import pylab -@knownfailureif('indeterminate', "Fails due to SF bug 2850075") -@image_comparison(baseline_images=['empty_datetime']) -def test_empty_datetime(): - """Test plotting empty axes with dates along one axis.""" - from datetime import datetime - - t0 = datetime(2009, 1, 20) - tf = datetime(2009, 1, 21) - - fig = pylab.figure() - pylab.axvspan( t0, tf, facecolor="blue", alpha=0.25 ) - fig.autofmt_xdate() - - fig.savefig( 'empty_datetime' ) - @image_comparison(baseline_images=['formatter_ticker_001', 'formatter_ticker_002', 'formatter_ticker_003', From eaf54918270423c1b5890d3978922edda36489e1 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 16:32:28 +0000 Subject: [PATCH 0181/1000] testing: remove previous test images, preventing upload of removed tests svn path=/trunk/matplotlib/; revision=7673 --- test/_buildbot_mac_sage.sh | 4 +++- test/_buildbot_test.py | 7 ++++++- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/test/_buildbot_mac_sage.sh b/test/_buildbot_mac_sage.sh index b0119ff99584..9de9ada4b412 100755 --- a/test/_buildbot_mac_sage.sh +++ b/test/_buildbot_mac_sage.sh @@ -11,4 +11,6 @@ export PYTHONPATH=${PREFIX}/lib/python2.6/site-packages:${HOME}/dev/lib/python2. make -f make.osx mpl_install echo ${PYTHONPATH} -cd test && python run-mpl-test.py --verbose --all --keep-failed +cd test +rm -f failed-diff-*.png +python run-mpl-test.py --verbose --all --keep-failed diff --git a/test/_buildbot_test.py b/test/_buildbot_test.py index 294b3d015c7f..42448140dedc 100644 --- a/test/_buildbot_test.py +++ b/test/_buildbot_test.py @@ -1,6 +1,6 @@ """This script will install matplotlib to a virtual environment to faciltate testing.""" -import shutil, os, sys +import shutil, os, sys, glob from subprocess import Popen, PIPE, STDOUT from _buildbot_util import check_call @@ -13,5 +13,10 @@ TARGET_py = os.path.join(TARGET,'bin','python') check_call('%s -c "import shutil,matplotlib; x=matplotlib.get_configdir(); shutil.rmtree(x)"'%TARGET_py) + +previous_test_images = glob.glob(os.path.join('test','failed-diff-*.png')) +for fname in previous_test_images: + os.unlink(fname) + check_call('%s run-mpl-test.py --verbose --all --keep-failed'%TARGET_py, cwd='test') From 6ab7c6fc447cb5cfd3fab2d27cd20508c728eb17 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 16:57:36 +0000 Subject: [PATCH 0182/1000] Patch artist: emit warning when kwargs conflict (addresses SF#2848629) svn path=/trunk/matplotlib/; revision=7674 --- lib/matplotlib/patches.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 23514396aed3..3fd14385480c 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -73,6 +73,13 @@ def __init__(self, if linestyle is None: linestyle = "solid" if antialiased is None: antialiased = mpl.rcParams['patch.antialiased'] + if 'color' in kwargs: + if (edgecolor is not None or + facecolor is not None): + import warnings + warnings.warn("Setting the 'color' property will override" + "the edgecolor or facecolor properties. ") + self.set_edgecolor(edgecolor) self.set_facecolor(facecolor) self.set_linewidth(linewidth) From e4a5ddf710a94b673bd95cea27a29909583049a9 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 17:18:44 +0000 Subject: [PATCH 0183/1000] testing: add test for bug SF#2715172 svn path=/trunk/matplotlib/; revision=7675 --- lib/matplotlib/tests/test_dates.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/lib/matplotlib/tests/test_dates.py b/lib/matplotlib/tests/test_dates.py index bb52d0eb100c..7d718457187e 100644 --- a/lib/matplotlib/tests/test_dates.py +++ b/lib/matplotlib/tests/test_dates.py @@ -66,6 +66,25 @@ def test_date_axvline(): fig.autofmt_xdate() fig.savefig('date_axvline') +@image_comparison(baseline_images=['date_xlim_empty']) +def test_set_xlim_and_unexpected_handling(): + # Attempt to test SF 2715172, see + # https://sourceforge.net/tracker/?func=detail&aid=2715172&group_id=80706&atid=560720 + t0 = datetime.datetime(2000, 1, 20) + tf = datetime.datetime(2000, 1, 20) + fig = plt.figure() + ax = fig.add_subplot(1,1,1) + ax.set_xlim((t0,tf)) + ax.plot([],[]) + from matplotlib.dates import DayLocator, DateFormatter, HourLocator + ax.xaxis.set_major_locator(DayLocator()) + ax.xaxis.set_major_formatter(DateFormatter("%m/%d/%y, %I:%M%p")) + ax.xaxis.set_minor_locator(HourLocator()) + if 1: + # this seems to cause an ininite loop. + from nose.plugins.skip import SkipTest + raise SkipTest('avoiding never-ending drawing') + fig.savefig('date_xlim_empty') if __name__=='__main__': import nose From 0022de240f91b984a8ddff7af353a6a10d5516b5 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Mon, 7 Sep 2009 18:42:41 +0000 Subject: [PATCH 0184/1000] raise if num ticks exceeds some threshold to address sf bug 2715172 svn path=/trunk/matplotlib/; revision=7676 --- lib/matplotlib/dates.py | 2 ++ lib/matplotlib/tests/test_dates.py | 9 ++++++--- lib/matplotlib/ticker.py | 9 ++++++++- lib/matplotlib/transforms.py | 1 + 4 files changed, 17 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/dates.py b/lib/matplotlib/dates.py index 8594a2bcc193..46d32ca73274 100644 --- a/lib/matplotlib/dates.py +++ b/lib/matplotlib/dates.py @@ -522,6 +522,8 @@ def __call__(self): self.rule.set(dtstart=start, until=stop) dates = self.rule.between(dmin, dmax, True) + if len(dates)>=ticker.Locator.MAXTICKS: + raise RuntimeError('RRuleLocator attempting to generate %d ticks from %s to %s: exceeds matplotlib.ticker.Locator.MAXTICKS'%(len(dates), dates[0], dates[-1])) return date2num(dates) def _get_unit(self): diff --git a/lib/matplotlib/tests/test_dates.py b/lib/matplotlib/tests/test_dates.py index 7d718457187e..ba1349e736bc 100644 --- a/lib/matplotlib/tests/test_dates.py +++ b/lib/matplotlib/tests/test_dates.py @@ -1,6 +1,6 @@ import datetime import numpy as np -from matplotlib.testing.decorators import image_comparison +from matplotlib.testing.decorators import image_comparison, knownfailureif import matplotlib.pyplot as plt @image_comparison(baseline_images=['date_empty']) @@ -66,7 +66,10 @@ def test_date_axvline(): fig.autofmt_xdate() fig.savefig('date_axvline') -@image_comparison(baseline_images=['date_xlim_empty']) +# we want to test that this method raises a RuntimeError -- what is +# the rightway to do this in the current framework +@knownfailureif(True) +#@image_comparison(baseline_images=['date_xlim_empty']) def test_set_xlim_and_unexpected_handling(): # Attempt to test SF 2715172, see # https://sourceforge.net/tracker/?func=detail&aid=2715172&group_id=80706&atid=560720 @@ -80,7 +83,7 @@ def test_set_xlim_and_unexpected_handling(): ax.xaxis.set_major_locator(DayLocator()) ax.xaxis.set_major_formatter(DateFormatter("%m/%d/%y, %I:%M%p")) ax.xaxis.set_minor_locator(HourLocator()) - if 1: + if 0: # this seems to cause an ininite loop. from nose.plugins.skip import SkipTest raise SkipTest('avoiding never-ending drawing') diff --git a/lib/matplotlib/ticker.py b/lib/matplotlib/ticker.py index 52be4410b251..48f3fa35fc86 100644 --- a/lib/matplotlib/ticker.py +++ b/lib/matplotlib/ticker.py @@ -657,7 +657,14 @@ class Locator(TickHelper): because the locator stores references to the Axis data and view limits """ - + + # some automatic tick locators can generate so many ticks they + # kill the machine when you try and render them, see eg sf bug + # report + # https://sourceforge.net/tracker/index.php?func=detail&aid=2715172&group_id=80706&atid=560720. + # This parameter is set to cause locators to raise an error if too + # many ticks are generated + MAXTICKS = 1000 def __call__(self): 'Return the locations of the ticks' raise NotImplementedError('Derived must override') diff --git a/lib/matplotlib/transforms.py b/lib/matplotlib/transforms.py index 511d7bd155b1..63dba7d396d4 100644 --- a/lib/matplotlib/transforms.py +++ b/lib/matplotlib/transforms.py @@ -2266,6 +2266,7 @@ def nonsingular(vmin, vmax, expander=0.001, tiny=1e-15, increasing=True): else: vmin -= expander*abs(vmin) vmax += expander*abs(vmax) + if swapped and not increasing: vmin, vmax = vmax, vmin return vmin, vmax From 252c12308ee7d7ef64040a7d56d8fe74b432c2e0 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Mon, 7 Sep 2009 18:50:11 +0000 Subject: [PATCH 0185/1000] use the max tick limit for all tick locators svn path=/trunk/matplotlib/; revision=7677 --- lib/matplotlib/dates.py | 4 +--- lib/matplotlib/ticker.py | 26 +++++++++++++++++--------- 2 files changed, 18 insertions(+), 12 deletions(-) diff --git a/lib/matplotlib/dates.py b/lib/matplotlib/dates.py index 46d32ca73274..9b8dee42f5ae 100644 --- a/lib/matplotlib/dates.py +++ b/lib/matplotlib/dates.py @@ -522,9 +522,7 @@ def __call__(self): self.rule.set(dtstart=start, until=stop) dates = self.rule.between(dmin, dmax, True) - if len(dates)>=ticker.Locator.MAXTICKS: - raise RuntimeError('RRuleLocator attempting to generate %d ticks from %s to %s: exceeds matplotlib.ticker.Locator.MAXTICKS'%(len(dates), dates[0], dates[-1])) - return date2num(dates) + return self.raise_if_exceeds(date2num(dates)) def _get_unit(self): """ diff --git a/lib/matplotlib/ticker.py b/lib/matplotlib/ticker.py index 48f3fa35fc86..fe1ab298d9f6 100644 --- a/lib/matplotlib/ticker.py +++ b/lib/matplotlib/ticker.py @@ -669,6 +669,13 @@ def __call__(self): 'Return the locations of the ticks' raise NotImplementedError('Derived must override') + def raise_if_exceeds(self, locs): + 'raise a RuntimeError if Locator attempts to create more than MAXTICKS locs' + if len(locs)>=self.MAXTICKS: + raise RuntimeError('Locator attempting to generate %d ticks from %s to %s: exceeds Locator.MAXTICKS'%(len(locs), locs[0], locs[-1])) + + return locs + def view_limits(self, vmin, vmax): """ select a scale for the range from vmin to vmax @@ -728,7 +735,8 @@ def __init__(self, base, offset): def __call__(self): 'Return the locations of the ticks' dmin, dmax = self.axis.get_data_interval() - return np.arange(dmin + self.offset, dmax+1, self._base) + return self.raise_if_exceeds( + np.arange(dmin + self.offset, dmax+1, self._base)) class FixedLocator(Locator): @@ -758,7 +766,7 @@ def __call__(self): ticks1 = self.locs[i::step] if np.absolute(ticks1).min() < np.absolute(ticks).min(): ticks = ticks1 - return ticks + return self.raise_if_exceeds(ticks) @@ -812,7 +820,7 @@ def __call__(self): if self.numticks==0: return [] ticklocs = np.linspace(vmin, vmax, self.numticks) - return ticklocs + return self.raise_if_exceeds(ticklocs) def _set_numticks(self): @@ -900,7 +908,7 @@ def __call__(self): base = self._base.get_base() n = (vmax - vmin + 0.001*base)//base locs = vmin + np.arange(n+1) * base - return locs + return self.raise_if_exceeds(locs) def view_limits(self, dmin, dmax): """ @@ -1010,7 +1018,7 @@ def __call__(self): locs = locs[:-1] elif prune=='both': locs = locs[1:-1] - return locs + return self.raise_if_exceeds(locs) def view_limits(self, dmin, dmax): if self._symmetric: @@ -1106,7 +1114,7 @@ def __call__(self): else: ticklocs = b**decades - return np.array(ticklocs) + return self.raise_if_exceeds(np.array(ticklocs)) def view_limits(self, vmin, vmax): 'Try to choose the view limits intelligently' @@ -1177,7 +1185,7 @@ def __call__(self): ticklocs.extend(subs * (np.sign(decade) * b ** np.abs(decade))) else: ticklocs = np.sign(decades) * b ** np.abs(decades) - return np.array(ticklocs) + return self.raise_if_exceeds(np.array(ticklocs)) def view_limits(self, vmin, vmax): 'Try to choose the view limits intelligently' @@ -1241,7 +1249,7 @@ def __call__(self): if vmin > vmax: vmin,vmax = vmax,vmin - return locs[(vmin < locs) & (locs < vmax)] + return self.raise_if_exceeds(locs[(vmin < locs) & (locs < vmax)]) class OldAutoLocator(Locator): @@ -1256,7 +1264,7 @@ def __init__(self): def __call__(self): 'Return the locations of the ticks' self.refresh() - return self._locator() + return self.raise_if_exceeds(self._locator()) def refresh(self): 'refresh internal information based on current lim' From 252e016b7f620cccdb130c6c27ddd140ef18fdc0 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Mon, 7 Sep 2009 19:19:23 +0000 Subject: [PATCH 0186/1000] fix test_dates to chek for RuntimeError on identical date lim test svn path=/trunk/matplotlib/; revision=7678 --- lib/matplotlib/axes.py | 5 +++++ lib/matplotlib/tests/test_dates.py | 18 ++++++------------ 2 files changed, 11 insertions(+), 12 deletions(-) diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index b053b0242d1a..c261571eac87 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -2033,6 +2033,8 @@ def set_xlim(self, xmin=None, xmax=None, emit=True, **kwargs): if xmin is None: xmin = old_xmin if xmax is None: xmax = old_xmax + if xmin==xmax: + warnings.warn('Attempting to set identical xmin==xmax results in singular transformations; automatically expanding. xmin=%s, xmax=%s'%(xmin, xmax)) xmin, xmax = mtransforms.nonsingular(xmin, xmax, increasing=False) xmin, xmax = self.xaxis.limit_range_for_scale(xmin, xmax) @@ -2205,6 +2207,9 @@ def set_ylim(self, ymin=None, ymax=None, emit=True, **kwargs): if ymin is None: ymin = old_ymin if ymax is None: ymax = old_ymax + if ymin==ymax: + warnings.warn('Attempting to set identical ymin==ymax results in singular transformations; automatically expanding. ymin=%s, ymax=%s'%(ymin, ymax)) + ymin, ymax = mtransforms.nonsingular(ymin, ymax, increasing=False) ymin, ymax = self.yaxis.limit_range_for_scale(ymin, ymax) self.viewLim.intervaly = (ymin, ymax) diff --git a/lib/matplotlib/tests/test_dates.py b/lib/matplotlib/tests/test_dates.py index ba1349e736bc..b77dc5d5b70d 100644 --- a/lib/matplotlib/tests/test_dates.py +++ b/lib/matplotlib/tests/test_dates.py @@ -2,6 +2,7 @@ import numpy as np from matplotlib.testing.decorators import image_comparison, knownfailureif import matplotlib.pyplot as plt +from nose.tools import assert_raises @image_comparison(baseline_images=['date_empty']) def test_date_empty(): @@ -66,13 +67,12 @@ def test_date_axvline(): fig.autofmt_xdate() fig.savefig('date_axvline') -# we want to test that this method raises a RuntimeError -- what is -# the rightway to do this in the current framework -@knownfailureif(True) -#@image_comparison(baseline_images=['date_xlim_empty']) -def test_set_xlim_and_unexpected_handling(): +def test_too_many_date_ticks(): # Attempt to test SF 2715172, see # https://sourceforge.net/tracker/?func=detail&aid=2715172&group_id=80706&atid=560720 + # setting equal datetimes triggers and expander call in + # transforms.nonsingular which results in too many ticks in the + # DayLocator. This should trigger a Locator.MAXTICKS RuntimeError t0 = datetime.datetime(2000, 1, 20) tf = datetime.datetime(2000, 1, 20) fig = plt.figure() @@ -81,13 +81,7 @@ def test_set_xlim_and_unexpected_handling(): ax.plot([],[]) from matplotlib.dates import DayLocator, DateFormatter, HourLocator ax.xaxis.set_major_locator(DayLocator()) - ax.xaxis.set_major_formatter(DateFormatter("%m/%d/%y, %I:%M%p")) - ax.xaxis.set_minor_locator(HourLocator()) - if 0: - # this seems to cause an ininite loop. - from nose.plugins.skip import SkipTest - raise SkipTest('avoiding never-ending drawing') - fig.savefig('date_xlim_empty') + assert_raises(RuntimeError, fig.savefig, 'junk.png') if __name__=='__main__': import nose From cd7870d58f62c8df0ee9deb2c4b76e0ce6e0d737 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 20:01:17 +0000 Subject: [PATCH 0187/1000] testing: remove duplicate code svn path=/trunk/matplotlib/; revision=7679 --- lib/matplotlib/tests/test_axes.py | 17 +---------------- 1 file changed, 1 insertion(+), 16 deletions(-) diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 13541fcbe28c..f399881e1bd8 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -13,22 +13,7 @@ def test_formatter_ticker(): """Test Some formatter and ticker issues.""" import matplotlib.testing.jpl_units as units - def register_units(): - """Register the unit conversion classes with matplotlib.""" - import matplotlib.units as munits - import matplotlib.testing.jpl_units as jpl_units - from matplotlib.testing.jpl_units.Duration import Duration - from matplotlib.testing.jpl_units.Epoch import Epoch - from matplotlib.testing.jpl_units.UnitDbl import UnitDbl - - from matplotlib.testing.jpl_units.StrConverter import StrConverter - from matplotlib.testing.jpl_units.EpochConverter import EpochConverter - from matplotlib.testing.jpl_units.UnitDblConverter import UnitDblConverter - - munits.registry[ str ] = StrConverter() - munits.registry[ Epoch ] = EpochConverter() - munits.registry[ UnitDbl ] = UnitDblConverter() - register_units() + units.register() # This essentially test to see if user specified labels get overwritten # by the auto labeler functionality of the axes. From bf84307db50174a618d91ae84799f388cc89a1d8 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 20:01:25 +0000 Subject: [PATCH 0188/1000] testing: use all builtin nose plugins in old test runner script svn path=/trunk/matplotlib/; revision=7680 --- test/run-mpl-test.py | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/test/run-mpl-test.py b/test/run-mpl-test.py index 802e24bdf21d..2706fbdd97ad 100755 --- a/test/run-mpl-test.py +++ b/test/run-mpl-test.py @@ -43,6 +43,7 @@ os.chdir( working ) import nose +import nose.plugins.builtin from mplTest import MplNosePlugin, path_utils import matplotlib from matplotlib.testing.noseclasses import KnownFailure @@ -94,8 +95,12 @@ args.append('.') args.extend( matplotlib.default_test_modules ) +plugins = [plugin() for plugin in nose.plugins.builtin.plugins] +plugins.extend( [ MplNosePlugin(), KnownFailure() ]) + success = nose.run( argv = args, - plugins = [ MplNosePlugin(), KnownFailure() ] ) + plugins = plugins, + ) ### do other stuff here From 8d00db9b3af6803eb402b71d6f0c629db2dcb090 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 20:01:33 +0000 Subject: [PATCH 0189/1000] test conversion: remove template for old-style tests svn path=/trunk/matplotlib/; revision=7681 --- test/mplTest/TestTEMPLATE.py | 62 ------------------------------------ 1 file changed, 62 deletions(-) delete mode 100644 test/mplTest/TestTEMPLATE.py diff --git a/test/mplTest/TestTEMPLATE.py b/test/mplTest/TestTEMPLATE.py deleted file mode 100644 index a88358764948..000000000000 --- a/test/mplTest/TestTEMPLATE.py +++ /dev/null @@ -1,62 +0,0 @@ -#======================================================================= -"""The UNITTEST unit-test class implementation.""" -#======================================================================= - -from mplTest import * - -#======================================================================= -# Add import modules below. -import matplotlib -matplotlib.use( "Agg", warn = False ) - -import pylab -import numpy as npy -# -#======================================================================= - -#======================================================================= -class TestUNITTEST( MplTestCase ): - """UNITTEST unit test class.""" - - # Uncomment any appropriate tags - tags = [ - # 'gui', # requires the creation of a gui window - # 'agg', # uses agg in the backend - # 'agg-only', # uses only agg in the backend - # 'wx', # uses wx in the backend - # 'qt', # uses qt in the backend - # 'ps', # uses the postscript backend - # 'pdf', # uses the PDF backend - # 'units', # uses units in the test - # 'PIL', # uses PIL for image comparison - ] - - #-------------------------------------------------------------------- - def setUp( self ): - """Setup any data needed for the unit test.""" - #TODO: Put set-up code here - pass - - #-------------------------------------------------------------------- - def tearDown( self ): - """Clean-up any generated files here.""" - #TODO: Put clean-up code here - pass - - #-------------------------------------------------------------------- - def test_case_001( self ): - """TODO: A very brief description of the test case.""" - #TODO: Put test-case code here - - fname = self.outFile( "test_case_001a" ) - fout = open( fname, 'w' ) - fout.write( "A UNITTEST.test_case_001 output file.\n" ) - fout.close() - - fname = self.outFile( "test_case_001b" ) - fout = open( fname, 'w' ) - fout.write( "Another UNITTEST.test_case_001 output file.\n" ) - fout.close() - - pass - From 0efe877fb364dff5ab5ee79a7c5a124bc8ae9c0f Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 20:01:49 +0000 Subject: [PATCH 0190/1000] test conversion: move old-style test to new-style test svn path=/trunk/matplotlib/; revision=7682 --- .../test_dates}/RRuleLocator_bounds.png | Bin lib/matplotlib/tests/test_dates.py | 30 ++++++++++++++++++ test/test_matplotlib/TestTickers.py | 27 ---------------- 3 files changed, 30 insertions(+), 27 deletions(-) rename {test/test_matplotlib/baseline/TestTickers => lib/matplotlib/tests/baseline_images/test_dates}/RRuleLocator_bounds.png (100%) diff --git a/test/test_matplotlib/baseline/TestTickers/RRuleLocator_bounds.png b/lib/matplotlib/tests/baseline_images/test_dates/RRuleLocator_bounds.png similarity index 100% rename from test/test_matplotlib/baseline/TestTickers/RRuleLocator_bounds.png rename to lib/matplotlib/tests/baseline_images/test_dates/RRuleLocator_bounds.png diff --git a/lib/matplotlib/tests/test_dates.py b/lib/matplotlib/tests/test_dates.py index b77dc5d5b70d..cc914bf43334 100644 --- a/lib/matplotlib/tests/test_dates.py +++ b/lib/matplotlib/tests/test_dates.py @@ -83,6 +83,36 @@ def test_too_many_date_ticks(): ax.xaxis.set_major_locator(DayLocator()) assert_raises(RuntimeError, fig.savefig, 'junk.png') +@image_comparison(baseline_images=['RRuleLocator_bounds']) +def test_RRuleLocator(): + import pylab + import matplotlib.dates as mpldates + import matplotlib.testing.jpl_units as units + from datetime import datetime + import dateutil + units.register() + + # This will cause the RRuleLocator to go out of bounds when it tries + # to add padding to the limits, so we make sure it caps at the correct + # boundary values. + t0 = datetime( 1000, 1, 1 ) + tf = datetime( 6000, 1, 1 ) + + fig = pylab.figure() + ax = pylab.subplot( 111 ) + ax.set_autoscale_on( True ) + ax.plot( [t0, tf], [0.0, 1.0], marker='o' ) + + rrule = mpldates.rrulewrapper( dateutil.rrule.YEARLY, interval=500 ) + locator = mpldates.RRuleLocator( rrule ) + ax.xaxis.set_major_locator( locator ) + ax.xaxis.set_major_formatter( mpldates.AutoDateFormatter(locator) ) + + ax.autoscale_view() + fig.autofmt_xdate() + + fig.savefig( 'RRuleLocator_bounds' ) + if __name__=='__main__': import nose nose.runmodule(argv=['-s','--with-doctest'], exit=False) diff --git a/test/test_matplotlib/TestTickers.py b/test/test_matplotlib/TestTickers.py index 97cfeed28f63..616397ef5a42 100644 --- a/test/test_matplotlib/TestTickers.py +++ b/test/test_matplotlib/TestTickers.py @@ -45,33 +45,6 @@ def tearDown( self ): """Clean-up any generated files here.""" pass - #-------------------------------------------------------------------- - def test_RRuleLocator( self ): - """Test RRuleLocator""" - fname = self.outFile( "RRuleLocator_bounds.png" ) - - # This will cause the RRuleLocator to go out of bounds when it tries - # to add padding to the limits, so we make sure it caps at the correct - # boundary values. - t0 = datetime( 1000, 1, 1 ) - tf = datetime( 6000, 1, 1 ) - - fig = pylab.figure() - ax = pylab.subplot( 111 ) - ax.set_autoscale_on( True ) - ax.plot( [t0, tf], [0.0, 1.0], marker='o' ) - - rrule = mpldates.rrulewrapper( dateutil.rrule.YEARLY, interval=500 ) - locator = mpldates.RRuleLocator( rrule ) - ax.xaxis.set_major_locator( locator ) - ax.xaxis.set_major_formatter( mpldates.AutoDateFormatter(locator) ) - - ax.autoscale_view() - fig.autofmt_xdate() - - fig.savefig( fname ) - self.checkImage( fname ) - #-------------------------------------------------------------------- def test_DateFormatter( self ): """Test DateFormatter""" From 9f49dc92e269ad49da060cf2df1c861a5784713e Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 20:02:06 +0000 Subject: [PATCH 0191/1000] test conversion: move old-style test to new-style test svn path=/trunk/matplotlib/; revision=7683 --- .../DateFormatter_fractionalSeconds.png | Bin lib/matplotlib/tests/test_dates.py | 29 +++++++ test/test_matplotlib/TestTickers.py | 75 ------------------ 3 files changed, 29 insertions(+), 75 deletions(-) rename {test/test_matplotlib/baseline/TestTickers => lib/matplotlib/tests/baseline_images/test_dates}/DateFormatter_fractionalSeconds.png (100%) delete mode 100644 test/test_matplotlib/TestTickers.py diff --git a/test/test_matplotlib/baseline/TestTickers/DateFormatter_fractionalSeconds.png b/lib/matplotlib/tests/baseline_images/test_dates/DateFormatter_fractionalSeconds.png similarity index 100% rename from test/test_matplotlib/baseline/TestTickers/DateFormatter_fractionalSeconds.png rename to lib/matplotlib/tests/baseline_images/test_dates/DateFormatter_fractionalSeconds.png diff --git a/lib/matplotlib/tests/test_dates.py b/lib/matplotlib/tests/test_dates.py index cc914bf43334..03231f46439c 100644 --- a/lib/matplotlib/tests/test_dates.py +++ b/lib/matplotlib/tests/test_dates.py @@ -113,6 +113,35 @@ def test_RRuleLocator(): fig.savefig( 'RRuleLocator_bounds' ) +@image_comparison(baseline_images=['DateFormatter_fractionalSeconds']) +def test_DateFormatter(): + """Test DateFormatter""" + import pylab + from datetime import datetime + import matplotlib.testing.jpl_units as units + units.register() + + # Lets make sure that DateFormatter will allow us to have tick marks + # at intervals of fractional seconds. + + t0 = datetime( 2001, 1, 1, 0, 0, 0 ) + tf = datetime( 2001, 1, 1, 0, 0, 1 ) + + fig = pylab.figure() + ax = pylab.subplot( 111 ) + ax.set_autoscale_on( True ) + ax.plot( [t0, tf], [0.0, 1.0], marker='o' ) + + # rrule = mpldates.rrulewrapper( dateutil.rrule.YEARLY, interval=500 ) + # locator = mpldates.RRuleLocator( rrule ) + # ax.xaxis.set_major_locator( locator ) + # ax.xaxis.set_major_formatter( mpldates.AutoDateFormatter(locator) ) + + ax.autoscale_view() + fig.autofmt_xdate() + + fig.savefig( 'DateFormatter_fractionalSeconds' ) + if __name__=='__main__': import nose nose.runmodule(argv=['-s','--with-doctest'], exit=False) diff --git a/test/test_matplotlib/TestTickers.py b/test/test_matplotlib/TestTickers.py deleted file mode 100644 index 616397ef5a42..000000000000 --- a/test/test_matplotlib/TestTickers.py +++ /dev/null @@ -1,75 +0,0 @@ -#======================================================================= -"""The Tickers unit-test class implementation.""" -#======================================================================= - -from mplTest import * - -#======================================================================= -# Add import modules below. -import matplotlib -matplotlib.use( "Agg", warn = False ) - -import pylab -import numpy as npy -from datetime import datetime - -import dateutil -import matplotlib.dates as mpldates -import matplotlib.ticker as ticker -# -#======================================================================= - -#======================================================================= -class TestTickers( MplTestCase ): - """Test the various axes non-plotting methods.""" - - # Uncomment any appropriate tags - tags = [ - # 'gui', # requires the creation of a gui window - 'agg', # uses agg in the backend - 'agg-only', # uses only agg in the backend - # 'wx', # uses wx in the backend - # 'qt', # uses qt in the backend - # 'ps', # uses the postscript backend - # 'units', # uses units in the test - 'PIL', # uses PIL for image comparison - ] - - #-------------------------------------------------------------------- - def setUp( self ): - """Setup any data needed for the unit test.""" - units.register() - - #-------------------------------------------------------------------- - def tearDown( self ): - """Clean-up any generated files here.""" - pass - - #-------------------------------------------------------------------- - def test_DateFormatter( self ): - """Test DateFormatter""" - - # Lets make sure that DateFormatter will allow us to have tick marks - # at intervals of fractional seconds. - fname = self.outFile( "DateFormatter_fractionalSeconds.png" ) - - t0 = datetime( 2001, 1, 1, 0, 0, 0 ) - tf = datetime( 2001, 1, 1, 0, 0, 1 ) - - fig = pylab.figure() - ax = pylab.subplot( 111 ) - ax.set_autoscale_on( True ) - ax.plot( [t0, tf], [0.0, 1.0], marker='o' ) - - # rrule = mpldates.rrulewrapper( dateutil.rrule.YEARLY, interval=500 ) - # locator = mpldates.RRuleLocator( rrule ) - # ax.xaxis.set_major_locator( locator ) - # ax.xaxis.set_major_formatter( mpldates.AutoDateFormatter(locator) ) - - ax.autoscale_view() - fig.autofmt_xdate() - - fig.savefig( fname ) - self.checkImage( fname ) - - #-------------------------------------------------------------------- From 11d026ad385a58a4a7605421fee1145f5b69a75d Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 20:02:22 +0000 Subject: [PATCH 0192/1000] test conversion: move old-style test to new-style test svn path=/trunk/matplotlib/; revision=7684 --- .../test_axes}/offset_points.png | Bin lib/matplotlib/tests/test_axes.py | 17 ++++++++++++++ test/test_plots/TestAnnotation.py | 21 ------------------ 3 files changed, 17 insertions(+), 21 deletions(-) rename {test/test_plots/baseline/TestAnnotation => lib/matplotlib/tests/baseline_images/test_axes}/offset_points.png (100%) diff --git a/test/test_plots/baseline/TestAnnotation/offset_points.png b/lib/matplotlib/tests/baseline_images/test_axes/offset_points.png similarity index 100% rename from test/test_plots/baseline/TestAnnotation/offset_points.png rename to lib/matplotlib/tests/baseline_images/test_axes/offset_points.png diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index f399881e1bd8..9beb1a169da2 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -41,3 +41,20 @@ def test_formatter_ticker(): ax.set_xlabel( "x-label 005" ) ax.autoscale_view() fig.savefig( 'formatter_ticker_005' ) + +@image_comparison(baseline_images=['offset_points']) +def test_basic_annotate(): + # Setup some data + t = np.arange( 0.0, 5.0, 0.01 ) + s = np.cos( 2.0*np.pi * t ) + + # Offset Points + + fig = pylab.figure() + ax = fig.add_subplot( 111, autoscale_on=False, xlim=(-1,5), ylim=(-3,5) ) + line, = ax.plot( t, s, lw=3, color='purple' ) + + ax.annotate( 'local max', xy=(3, 1), xycoords='data', + xytext=(3, 3), textcoords='offset points' ) + + fig.savefig( 'offset_points' ) diff --git a/test/test_plots/TestAnnotation.py b/test/test_plots/TestAnnotation.py index 33f5996cdf45..69b45ba24e2d 100644 --- a/test/test_plots/TestAnnotation.py +++ b/test/test_plots/TestAnnotation.py @@ -41,27 +41,6 @@ def tearDown( self ): """Clean-up any generated files here.""" pass - #-------------------------------------------------------------------- - def testBasicAnnotate( self ): - """Basic Annotations""" - - # Setup some data - t = npy.arange( 0.0, 5.0, 0.01 ) - s = npy.cos( 2.0*npy.pi * t ) - - # Offset Points - fname = self.outFile( "offset_points.png" ) - - fig = figure() - ax = fig.add_subplot( 111, autoscale_on=False, xlim=(-1,5), ylim=(-3,5) ) - line, = ax.plot( t, s, lw=3, color='purple' ) - - ax.annotate( 'local max', xy=(3, 1), xycoords='data', - xytext=(3, 3), textcoords='offset points' ) - - fig.savefig( fname ) - self.checkImage( fname ) - #-------------------------------------------------------------------- def testPolarAnnotations( self ): """Polar Plot Annotations""" From fbf431abcb3357b7b6b5c072075c90cc22a14311 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 20:02:39 +0000 Subject: [PATCH 0193/1000] test conversion: move old-style test to new-style test svn path=/trunk/matplotlib/; revision=7685 --- .../baseline_images/test_axes}/polar_axes.png | Bin lib/matplotlib/tests/test_axes.py | 36 ++++++++++++++++ test/test_plots/TestAnnotation.py | 39 ------------------ 3 files changed, 36 insertions(+), 39 deletions(-) rename {test/test_plots/baseline/TestAnnotation => lib/matplotlib/tests/baseline_images/test_axes}/polar_axes.png (100%) diff --git a/test/test_plots/baseline/TestAnnotation/polar_axes.png b/lib/matplotlib/tests/baseline_images/test_axes/polar_axes.png similarity index 100% rename from test/test_plots/baseline/TestAnnotation/polar_axes.png rename to lib/matplotlib/tests/baseline_images/test_axes/polar_axes.png diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 9beb1a169da2..8df83555e8c6 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -58,3 +58,39 @@ def test_basic_annotate(): xytext=(3, 3), textcoords='offset points' ) fig.savefig( 'offset_points' ) + +@image_comparison(baseline_images=['polar_axes']) +def test_polar_annotations(): + """Polar Plot Annotations""" + + # you can specify the xypoint and the xytext in different + # positions and coordinate systems, and optionally turn on a + # connecting line and mark the point with a marker. Annotations + # work on polar axes too. In the example below, the xy point is + # in native coordinates (xycoords defaults to 'data'). For a + # polar axes, this is in (theta, radius) space. The text in this + # example is placed in the fractional figure coordinate system. + # Text keyword args like horizontal and vertical alignment are + # respected + + # Setup some data + r = np.arange(0.0, 1.0, 0.001 ) + theta = 2.0 * 2.0 * np.pi * r + + fig = pylab.figure() + ax = fig.add_subplot( 111, polar=True ) + line, = ax.plot( theta, r, color='#ee8d18', lw=3 ) + + ind = 800 + thisr, thistheta = r[ind], theta[ind] + ax.plot([thistheta], [thisr], 'o') + ax.annotate('a polar annotation', + xy=(thistheta, thisr), # theta, radius + xytext=(0.05, 0.05), # fraction, fraction + textcoords='figure fraction', + arrowprops=dict(facecolor='black', shrink=0.05), + horizontalalignment='left', + verticalalignment='bottom', + ) + + fig.savefig( 'polar_axes' ) diff --git a/test/test_plots/TestAnnotation.py b/test/test_plots/TestAnnotation.py index 69b45ba24e2d..b11ac67e1fa4 100644 --- a/test/test_plots/TestAnnotation.py +++ b/test/test_plots/TestAnnotation.py @@ -41,45 +41,6 @@ def tearDown( self ): """Clean-up any generated files here.""" pass - #-------------------------------------------------------------------- - def testPolarAnnotations( self ): - """Polar Plot Annotations""" - - # you can specify the xypoint and the xytext in different - # positions and coordinate systems, and optionally turn on a - # connecting line and mark the point with a marker. Annotations - # work on polar axes too. In the example below, the xy point is - # in native coordinates (xycoords defaults to 'data'). For a - # polar axes, this is in (theta, radius) space. The text in this - # example is placed in the fractional figure coordinate system. - # Text keyword args like horizontal and vertical alignment are - # respected - - # Setup some data - r = npy.arange(0.0, 1.0, 0.001 ) - theta = 2.0 * 2.0 * npy.pi * r - - fname = self.outFile( "polar_axes.png" ) - - fig = figure() - ax = fig.add_subplot( 111, polar=True ) - line, = ax.plot( theta, r, color='#ee8d18', lw=3 ) - - ind = 800 - thisr, thistheta = r[ind], theta[ind] - ax.plot([thistheta], [thisr], 'o') - ax.annotate('a polar annotation', - xy=(thistheta, thisr), # theta, radius - xytext=(0.05, 0.05), # fraction, fraction - textcoords='figure fraction', - arrowprops=dict(facecolor='black', shrink=0.05), - horizontalalignment='left', - verticalalignment='bottom', - ) - - fig.savefig( fname ) - self.checkImage( fname ) - #-------------------------------------------------------------------- def testPolarCoordAnnotations( self ): """Polar Coordinate Annotations""" From 029be1fe6eb29d5f28c40faa1b16fa8a1aee6e23 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 20:02:56 +0000 Subject: [PATCH 0194/1000] test conversion: move old-style test to new-style test svn path=/trunk/matplotlib/; revision=7686 --- .../test_axes}/polar_coords.png | Bin lib/matplotlib/tests/test_axes.py | 34 ++++++++ test/test_plots/TestAnnotation.py | 78 ------------------ 3 files changed, 34 insertions(+), 78 deletions(-) rename {test/test_plots/baseline/TestAnnotation => lib/matplotlib/tests/baseline_images/test_axes}/polar_coords.png (100%) delete mode 100644 test/test_plots/TestAnnotation.py diff --git a/test/test_plots/baseline/TestAnnotation/polar_coords.png b/lib/matplotlib/tests/baseline_images/test_axes/polar_coords.png similarity index 100% rename from test/test_plots/baseline/TestAnnotation/polar_coords.png rename to lib/matplotlib/tests/baseline_images/test_axes/polar_coords.png diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 8df83555e8c6..77ad1f68bcd4 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -94,3 +94,37 @@ def test_polar_annotations(): ) fig.savefig( 'polar_axes' ) + + #-------------------------------------------------------------------- +@image_comparison(baseline_images=['polar_coords']) +def test_polar_coord_annotations(): + """Polar Coordinate Annotations""" + + # You can also use polar notation on a catesian axes. Here the + # native coordinate system ('data') is cartesian, so you need to + # specify the xycoords and textcoords as 'polar' if you want to + # use (theta, radius) + from matplotlib.patches import Ellipse + el = Ellipse((0,0), 10, 20, facecolor='r', alpha=0.5) + + fig = pylab.figure() + ax = fig.add_subplot( 111, aspect='equal' ) + + ax.add_artist( el ) + el.set_clip_box( ax.bbox ) + + ax.annotate('the top', + xy=(np.pi/2., 10.), # theta, radius + xytext=(np.pi/3, 20.), # theta, radius + xycoords='polar', + textcoords='polar', + arrowprops=dict(facecolor='black', shrink=0.05), + horizontalalignment='left', + verticalalignment='bottom', + clip_on=True, # clip to the axes bounding box + ) + + ax.set_xlim( -20, 20 ) + ax.set_ylim( -20, 20 ) + fig.savefig( 'polar_coords' ) + diff --git a/test/test_plots/TestAnnotation.py b/test/test_plots/TestAnnotation.py deleted file mode 100644 index b11ac67e1fa4..000000000000 --- a/test/test_plots/TestAnnotation.py +++ /dev/null @@ -1,78 +0,0 @@ -#======================================================================= -"""The Annotation unite-test class implementation.""" -#======================================================================= - -from mplTest import * - -#======================================================================= -# Add import modules below. -import matplotlib -matplotlib.use( "Agg", warn = False ) - -from matplotlib.pyplot import figure -from matplotlib.patches import Ellipse -import numpy as npy -# -#======================================================================= - -#======================================================================= -class TestAnnotation( MplTestCase ): - """Annotation unit test class.""" - - # Uncomment any appropriate tags - tags = [ - # 'gui', # requires the creation of a gui window - 'agg', # uses agg in the backend - 'agg-only', # uses only agg in the backend - # 'wx', # uses wx in the backend - # 'qt', # uses qt in the backend - # 'ps', # uses the postscript backend - # 'units', # uses units in the test - 'PIL', # uses PIL for image comparison - ] - - #-------------------------------------------------------------------- - def setUp( self ): - """Setup any data needed for the unit test.""" - pass - - #-------------------------------------------------------------------- - def tearDown( self ): - """Clean-up any generated files here.""" - pass - - #-------------------------------------------------------------------- - def testPolarCoordAnnotations( self ): - """Polar Coordinate Annotations""" - - # You can also use polar notation on a catesian axes. Here the - # native coordinate system ('data') is cartesian, so you need to - # specify the xycoords and textcoords as 'polar' if you want to - # use (theta, radius) - - el = Ellipse((0,0), 10, 20, facecolor='r', alpha=0.5) - - fname = self.outFile( "polar_coords.png" ) - - fig = figure() - ax = fig.add_subplot( 111, aspect='equal' ) - - ax.add_artist( el ) - el.set_clip_box( ax.bbox ) - - ax.annotate('the top', - xy=(npy.pi/2., 10.), # theta, radius - xytext=(npy.pi/3, 20.), # theta, radius - xycoords='polar', - textcoords='polar', - arrowprops=dict(facecolor='black', shrink=0.05), - horizontalalignment='left', - verticalalignment='bottom', - clip_on=True, # clip to the axes bounding box - ) - - ax.set_xlim( -20, 20 ) - ax.set_ylim( -20, 20 ) - fig.savefig( fname ) - self.checkImage( fname ) - From 1fd575e0143c87c79a76d8a06d23d66c9ec41ebc Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 20:03:12 +0000 Subject: [PATCH 0195/1000] test conversion: move old-style test to new-style test svn path=/trunk/matplotlib/; revision=7687 --- .../baseline_images/test_axes}/fill_units.png | Bin lib/matplotlib/tests/test_axes.py | 42 +++++++++ test/test_plots/TestFill.py | 87 ------------------ 3 files changed, 42 insertions(+), 87 deletions(-) rename {test/test_plots/baseline/TestFill => lib/matplotlib/tests/baseline_images/test_axes}/fill_units.png (100%) delete mode 100644 test/test_plots/TestFill.py diff --git a/test/test_plots/baseline/TestFill/fill_units.png b/lib/matplotlib/tests/baseline_images/test_axes/fill_units.png similarity index 100% rename from test/test_plots/baseline/TestFill/fill_units.png rename to lib/matplotlib/tests/baseline_images/test_axes/fill_units.png diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 77ad1f68bcd4..043226288843 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -128,3 +128,45 @@ def test_polar_coord_annotations(): ax.set_ylim( -20, 20 ) fig.savefig( 'polar_coords' ) +@image_comparison(baseline_images=['fill_units']) +def test_fill_units(): + """Test the fill method with unitized-data.""" + from datetime import datetime + import matplotlib.testing.jpl_units as units + units.register() + + # generate some data + t = units.Epoch( "ET", dt=datetime(2009, 4, 27) ) + value = 10.0 * units.deg + day = units.Duration( "ET", 24.0 * 60.0 * 60.0 ) + + fig = pylab.figure() + + # Top-Left + ax1 = fig.add_subplot( 221 ) + ax1.plot( [t], [value], yunits='deg', color='red' ) + ax1.fill( [733525.0, 733525.0, 733526.0, 733526.0], + [0.0, 0.0, 90.0, 0.0], 'b' ) + + # Top-Right + ax2 = fig.add_subplot( 222 ) + ax2.plot( [t], [value], yunits='deg', color='red' ) + ax2.fill( [t, t, t+day, t+day], + [0.0, 0.0, 90.0, 0.0], 'b' ) + + # Bottom-Left + ax3 = fig.add_subplot( 223 ) + ax3.plot( [t], [value], yunits='deg', color='red' ) + ax1.fill( [733525.0, 733525.0, 733526.0, 733526.0], + [0*units.deg, 0*units.deg, 90*units.deg, 0*units.deg], 'b' ) + + # Bottom-Right + ax4 = fig.add_subplot( 224 ) + ax4.plot( [t], [value], yunits='deg', color='red' ) + ax4.fill( [t, t, t+day, t+day], + [0*units.deg, 0*units.deg, 90*units.deg, 0*units.deg], + facecolor="blue" ) + + fig.autofmt_xdate() + fig.savefig( 'fill_units' ) + diff --git a/test/test_plots/TestFill.py b/test/test_plots/TestFill.py deleted file mode 100644 index 534119ccdbf9..000000000000 --- a/test/test_plots/TestFill.py +++ /dev/null @@ -1,87 +0,0 @@ -#======================================================================= -"""The Fill unit-test class implementation.""" -#======================================================================= - -from mplTest import * - -#======================================================================= -# Add import modules below. -import matplotlib -matplotlib.use( "Agg", warn = False ) - -import pylab -import numpy as npy -from datetime import datetime -# -#======================================================================= - -#======================================================================= -class TestFill( MplTestCase ): - """Test the various axes fill methods.""" - - # Uncomment any appropriate tags - tags = [ - # 'gui', # requires the creation of a gui window - 'agg', # uses agg in the backend - 'agg-only', # uses only agg in the backend - # 'wx', # uses wx in the backend - # 'qt', # uses qt in the backend - # 'ps', # uses the postscript backend - # 'units', # uses units in the test - 'PIL', # uses PIL for image comparison - ] - - #-------------------------------------------------------------------- - def setUp( self ): - """Setup any data needed for the unit test.""" - units.register() - - #-------------------------------------------------------------------- - def tearDown( self ): - """Clean-up any generated files here.""" - pass - - #-------------------------------------------------------------------- - def test_fill_units( self ): - """Test the fill method with unitized-data.""" - - fname = self.outFile( "fill_units.png" ) - - # generate some data - t = units.Epoch( "ET", dt=datetime(2009, 4, 27) ) - value = 10.0 * units.deg - day = units.Duration( "ET", 24.0 * 60.0 * 60.0 ) - - fig = pylab.figure() - - # Top-Left - ax1 = fig.add_subplot( 221 ) - ax1.plot( [t], [value], yunits='deg', color='red' ) - ax1.fill( [733525.0, 733525.0, 733526.0, 733526.0], - [0.0, 0.0, 90.0, 0.0], 'b' ) - - # Top-Right - ax2 = fig.add_subplot( 222 ) - ax2.plot( [t], [value], yunits='deg', color='red' ) - ax2.fill( [t, t, t+day, t+day], - [0.0, 0.0, 90.0, 0.0], 'b' ) - - # Bottom-Left - ax3 = fig.add_subplot( 223 ) - ax3.plot( [t], [value], yunits='deg', color='red' ) - ax1.fill( [733525.0, 733525.0, 733526.0, 733526.0], - [0*units.deg, 0*units.deg, 90*units.deg, 0*units.deg], 'b' ) - - # Bottom-Right - ax4 = fig.add_subplot( 224 ) - ax4.plot( [t], [value], yunits='deg', color='red' ) - ax4.fill( [t, t, t+day, t+day], - [0*units.deg, 0*units.deg, 90*units.deg, 0*units.deg], - facecolor="blue" ) - - fig.autofmt_xdate() - fig.savefig( fname ) - self.checkImage( fname ) - - #-------------------------------------------------------------------- - From 9a10fc3846e43a226e51e1e3b9cc0de8d27a25c3 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 20:03:29 +0000 Subject: [PATCH 0196/1000] test conversion: move old-style test to new-style test svn path=/trunk/matplotlib/; revision=7688 --- .../baseline_images/test_axes}/single_point.png | Bin lib/matplotlib/tests/test_axes.py | 11 +++++++++++ test/test_plots/TestPlot.py | 15 --------------- 3 files changed, 11 insertions(+), 15 deletions(-) rename {test/test_plots/baseline/TestPlot => lib/matplotlib/tests/baseline_images/test_axes}/single_point.png (100%) diff --git a/test/test_plots/baseline/TestPlot/single_point.png b/lib/matplotlib/tests/baseline_images/test_axes/single_point.png similarity index 100% rename from test/test_plots/baseline/TestPlot/single_point.png rename to lib/matplotlib/tests/baseline_images/test_axes/single_point.png diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 043226288843..2217628eaecf 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -170,3 +170,14 @@ def test_fill_units(): fig.autofmt_xdate() fig.savefig( 'fill_units' ) +@image_comparison(baseline_images=['single_point']) +def test_single_point(): + """Test single-point plots.""" + fig = pylab.figure() + pylab.subplot( 211 ) + pylab.plot( [0], [0], 'o' ) + + pylab.subplot( 212 ) + pylab.plot( [1], [1], 'o' ) + + fig.savefig( 'single_point' ) diff --git a/test/test_plots/TestPlot.py b/test/test_plots/TestPlot.py index fb2d65d2cd5b..7810fa80a770 100644 --- a/test/test_plots/TestPlot.py +++ b/test/test_plots/TestPlot.py @@ -40,21 +40,6 @@ def tearDown( self ): """Clean-up any generated files here.""" pass - #-------------------------------------------------------------------- - def test_single_point( self ): - """Test single-point plots.""" - fname = self.outFile( "single_point.png" ) - - fig = pylab.figure() - pylab.subplot( 211 ) - pylab.plot( [0], [0], 'o' ) - - pylab.subplot( 212 ) - pylab.plot( [1], [1], 'o' ) - - fig.savefig( fname ) - self.checkImage( fname ) - #-------------------------------------------------------------------- def test_single_date( self ): """Test single-point date plots.""" From 8a6632fbd5a1637afa8a027d56cfbf548c1da6fe Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 20:03:46 +0000 Subject: [PATCH 0197/1000] test conversion: move old-style test to new-style test svn path=/trunk/matplotlib/; revision=7689 --- .../test_axes}/single_date.png | Bin lib/matplotlib/tests/test_axes.py | 16 +++++++++++++++ test/test_plots/TestPlot.py | 19 ------------------ 3 files changed, 16 insertions(+), 19 deletions(-) rename {test/test_plots/baseline/TestPlot => lib/matplotlib/tests/baseline_images/test_axes}/single_date.png (100%) diff --git a/test/test_plots/baseline/TestPlot/single_date.png b/lib/matplotlib/tests/baseline_images/test_axes/single_date.png similarity index 100% rename from test/test_plots/baseline/TestPlot/single_date.png rename to lib/matplotlib/tests/baseline_images/test_axes/single_date.png diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 2217628eaecf..7aee3399ed7d 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -181,3 +181,19 @@ def test_single_point(): pylab.plot( [1], [1], 'o' ) fig.savefig( 'single_point' ) + +@image_comparison(baseline_images=['single_date']) +def test_single_date(): + """Test single-point date plots.""" + + time1=[ 721964.0 ] + data1=[ -65.54 ] + + fig = pylab.figure() + pylab.subplot( 211 ) + pylab.plot_date( time1, data1, 'o', color='r' ) + + pylab.subplot( 212 ) + pylab.plot( time1, data1, 'o', color='r' ) + + fig.savefig( 'single_date' ) diff --git a/test/test_plots/TestPlot.py b/test/test_plots/TestPlot.py index 7810fa80a770..7e9308288071 100644 --- a/test/test_plots/TestPlot.py +++ b/test/test_plots/TestPlot.py @@ -40,25 +40,6 @@ def tearDown( self ): """Clean-up any generated files here.""" pass - #-------------------------------------------------------------------- - def test_single_date( self ): - """Test single-point date plots.""" - - fname = self.outFile( "single_date.png" ) - - time1=[ 721964.0 ] - data1=[ -65.54 ] - - fig = pylab.figure() - pylab.subplot( 211 ) - pylab.plot_date( time1, data1, 'o', color='r' ) - - pylab.subplot( 212 ) - pylab.plot( time1, data1, 'o', color='r' ) - - fig.savefig( fname ) - self.checkImage( fname ) - #-------------------------------------------------------------------- def test_shaped_data( self ): """Test numpy shaped data.""" From 46be1086e682b0c87a8a23b5b4148b77df8c2171 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 20:04:04 +0000 Subject: [PATCH 0198/1000] test conversion: move old-style test to new-style test svn path=/trunk/matplotlib/; revision=7690 --- .../test_axes}/shaped_data.png | Bin lib/matplotlib/tests/test_axes.py | 46 +++++++++++++++ test/test_plots/TestPlot.py | 54 ------------------ 3 files changed, 46 insertions(+), 54 deletions(-) rename {test/test_plots/baseline/TestPlot => lib/matplotlib/tests/baseline_images/test_axes}/shaped_data.png (100%) diff --git a/test/test_plots/baseline/TestPlot/shaped_data.png b/lib/matplotlib/tests/baseline_images/test_axes/shaped_data.png similarity index 100% rename from test/test_plots/baseline/TestPlot/shaped_data.png rename to lib/matplotlib/tests/baseline_images/test_axes/shaped_data.png diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 7aee3399ed7d..d914850d22ce 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -197,3 +197,49 @@ def test_single_date(): pylab.plot( time1, data1, 'o', color='r' ) fig.savefig( 'single_date' ) + +@image_comparison(baseline_images=['single_date']) +def test_shaped_data(): + """Test numpy shaped data.""" + + xdata = np.array([[ 0.53295185, 0.23052951, 0.19057629, 0.66724975, 0.96577916, + 0.73136095, 0.60823287, 0.017921 , 0.29744742, 0.27164665], + [ 0.2798012 , 0.25814229, 0.02818193, 0.12966456, 0.57446277, + 0.58167607, 0.71028245, 0.69112737, 0.89923072, 0.99072476], + [ 0.81218578, 0.80464528, 0.76071809, 0.85616314, 0.12757994, + 0.94324936, 0.73078663, 0.09658102, 0.60703967, 0.77664978], + [ 0.28332265, 0.81479711, 0.86985333, 0.43797066, 0.32540082, + 0.43819229, 0.92230363, 0.49414252, 0.68168256, 0.05922372], + [ 0.10721335, 0.93904142, 0.79163075, 0.73232848, 0.90283839, + 0.68408046, 0.25502302, 0.95976614, 0.59214115, 0.13663711], + [ 0.28087456, 0.33127607, 0.15530412, 0.76558121, 0.83389773, + 0.03735974, 0.98717738, 0.71432229, 0.54881366, 0.86893953], + [ 0.77995937, 0.995556 , 0.29688434, 0.15646162, 0.051848 , + 0.37161935, 0.12998491, 0.09377296, 0.36882507, 0.36583435], + [ 0.37851836, 0.05315792, 0.63144617, 0.25003433, 0.69586032, + 0.11393988, 0.92362096, 0.88045438, 0.93530252, 0.68275072], + [ 0.86486596, 0.83236675, 0.82960664, 0.5779663 , 0.25724233, + 0.84841095, 0.90862812, 0.64414887, 0.3565272 , 0.71026066], + [ 0.01383268, 0.3406093 , 0.76084285, 0.70800694, 0.87634056, + 0.08213693, 0.54655021, 0.98123181, 0.44080053, 0.86815815]]) + + y1 = np.arange( 10 ) + y1.shape = 1, 10 + + y2 = np.arange( 10 ) + y2.shape = 10, 1 + + fig = pylab.figure() + pylab.subplot( 411 ) + pylab.plot( y1 ) + pylab.subplot( 412 ) + pylab.plot( y2 ) + + pylab.subplot( 413 ) + from nose.tools import assert_raises + assert_raises(ValueError,pylab.plot, (y1,y2)) + + pylab.subplot( 414 ) + pylab.plot( xdata[:,1], xdata[1,:], 'o' ) + + fig.savefig( 'shaped data' ) diff --git a/test/test_plots/TestPlot.py b/test/test_plots/TestPlot.py index 7e9308288071..6a9bd6a312d0 100644 --- a/test/test_plots/TestPlot.py +++ b/test/test_plots/TestPlot.py @@ -40,60 +40,6 @@ def tearDown( self ): """Clean-up any generated files here.""" pass - #-------------------------------------------------------------------- - def test_shaped_data( self ): - """Test numpy shaped data.""" - - xdata = npy.array([[ 0.53295185, 0.23052951, 0.19057629, 0.66724975, 0.96577916, - 0.73136095, 0.60823287, 0.017921 , 0.29744742, 0.27164665], - [ 0.2798012 , 0.25814229, 0.02818193, 0.12966456, 0.57446277, - 0.58167607, 0.71028245, 0.69112737, 0.89923072, 0.99072476], - [ 0.81218578, 0.80464528, 0.76071809, 0.85616314, 0.12757994, - 0.94324936, 0.73078663, 0.09658102, 0.60703967, 0.77664978], - [ 0.28332265, 0.81479711, 0.86985333, 0.43797066, 0.32540082, - 0.43819229, 0.92230363, 0.49414252, 0.68168256, 0.05922372], - [ 0.10721335, 0.93904142, 0.79163075, 0.73232848, 0.90283839, - 0.68408046, 0.25502302, 0.95976614, 0.59214115, 0.13663711], - [ 0.28087456, 0.33127607, 0.15530412, 0.76558121, 0.83389773, - 0.03735974, 0.98717738, 0.71432229, 0.54881366, 0.86893953], - [ 0.77995937, 0.995556 , 0.29688434, 0.15646162, 0.051848 , - 0.37161935, 0.12998491, 0.09377296, 0.36882507, 0.36583435], - [ 0.37851836, 0.05315792, 0.63144617, 0.25003433, 0.69586032, - 0.11393988, 0.92362096, 0.88045438, 0.93530252, 0.68275072], - [ 0.86486596, 0.83236675, 0.82960664, 0.5779663 , 0.25724233, - 0.84841095, 0.90862812, 0.64414887, 0.3565272 , 0.71026066], - [ 0.01383268, 0.3406093 , 0.76084285, 0.70800694, 0.87634056, - 0.08213693, 0.54655021, 0.98123181, 0.44080053, 0.86815815]]) - - fname = self.outFile( "shaped_data.png" ) - - y1 = npy.arange( 10 ) - y1.shape = 1, 10 - - y2 = npy.arange( 10 ) - y2.shape = 10, 1 - - fig = pylab.figure() - pylab.subplot( 411 ) - pylab.plot( y1 ) - pylab.subplot( 412 ) - pylab.plot( y2 ) - - pylab.subplot( 413 ) - try: - pylab.plot( y1, y2 ) - except: - # This should fail - pass - else: - self.fail( "Failed to raise an exception for mis-matched dimensions." ) - - pylab.subplot( 414 ) - pylab.plot( xdata[:,1], xdata[1,:], 'o' ) - - fig.savefig( fname ) - self.checkImage( fname ) - #-------------------------------------------------------------------- def test_const_xy( self ): """Test constant xy data.""" From 32282ac3cd24c5717f8655ed6d07e0de8d670d8f Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 20:04:20 +0000 Subject: [PATCH 0199/1000] test conversion: move old-style test to new-style test svn path=/trunk/matplotlib/; revision=7691 --- .../baseline_images/test_axes}/const_xy.png | Bin lib/matplotlib/tests/test_axes.py | 16 +++++ test/test_plots/TestPlot.py | 63 ------------------ 3 files changed, 16 insertions(+), 63 deletions(-) rename {test/test_plots/baseline/TestPlot => lib/matplotlib/tests/baseline_images/test_axes}/const_xy.png (100%) delete mode 100644 test/test_plots/TestPlot.py diff --git a/test/test_plots/baseline/TestPlot/const_xy.png b/lib/matplotlib/tests/baseline_images/test_axes/const_xy.png similarity index 100% rename from test/test_plots/baseline/TestPlot/const_xy.png rename to lib/matplotlib/tests/baseline_images/test_axes/const_xy.png diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index d914850d22ce..12e4a25aa528 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -243,3 +243,19 @@ def test_shaped_data(): pylab.plot( xdata[:,1], xdata[1,:], 'o' ) fig.savefig( 'shaped data' ) + +@image_comparison(baseline_images=['const_xy']) +def test_const_xy(): + """Test constant xy data.""" + fig = pylab.figure() + + pylab.subplot( 311 ) + pylab.plot( np.arange(10), np.ones( (10,) ) ) + + pylab.subplot( 312 ) + pylab.plot( np.ones( (10,) ), np.arange(10) ) + + pylab.subplot( 313 ) + pylab.plot( np.ones( (10,) ), np.ones( (10,) ), 'o' ) + + fig.savefig( 'const_xy' ) diff --git a/test/test_plots/TestPlot.py b/test/test_plots/TestPlot.py deleted file mode 100644 index 6a9bd6a312d0..000000000000 --- a/test/test_plots/TestPlot.py +++ /dev/null @@ -1,63 +0,0 @@ -#======================================================================= -"""The Plot unit-test class implementation.""" -#======================================================================= - -from mplTest import * - -#======================================================================= -# Add import modules below. -import matplotlib -matplotlib.use( "Agg", warn = False ) - -import pylab -import numpy as npy -# -#======================================================================= - -#======================================================================= -class TestPlot( MplTestCase ): - """Plot unit test class.""" - - # Uncomment any appropriate tags - tags = [ - # 'gui', # requires the creation of a gui window - 'agg', # uses agg in the backend - 'agg-only', # uses only agg in the backend - # 'wx', # uses wx in the backend - # 'qt', # uses qt in the backend - # 'ps', # uses the postscript backend - # 'units', # uses units in the test - 'PIL', # uses PIL for image comparison - ] - - #-------------------------------------------------------------------- - def setUp( self ): - """Setup any data needed for the unit test.""" - pass - - #-------------------------------------------------------------------- - def tearDown( self ): - """Clean-up any generated files here.""" - pass - - #-------------------------------------------------------------------- - def test_const_xy( self ): - """Test constant xy data.""" - - fname = self.outFile( "const_xy.png" ) - fig = pylab.figure() - - pylab.subplot( 311 ) - pylab.plot( npy.arange(10), npy.ones( (10,) ) ) - - pylab.subplot( 312 ) - pylab.plot( npy.ones( (10,) ), npy.arange(10) ) - - pylab.subplot( 313 ) - pylab.plot( npy.ones( (10,) ), npy.ones( (10,) ), 'o' ) - - fig.savefig( fname ) - self.checkImage( fname ) - - #-------------------------------------------------------------------- - From 597da3abf06ef08c33c99b743c5dd60ac5ec3edb Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 20:04:38 +0000 Subject: [PATCH 0200/1000] test conversion: move old-style test to new-style test svn path=/trunk/matplotlib/; revision=7692 --- .../test_axes}/polar_wrap_180.png | Bin .../test_axes}/polar_wrap_360.png | Bin lib/matplotlib/tests/test_axes.py | 29 +++++++++++++++ test/test_plots/TestPolar.py | 34 ------------------ 4 files changed, 29 insertions(+), 34 deletions(-) rename {test/test_plots/baseline/TestPolar => lib/matplotlib/tests/baseline_images/test_axes}/polar_wrap_180.png (100%) rename {test/test_plots/baseline/TestPolar => lib/matplotlib/tests/baseline_images/test_axes}/polar_wrap_360.png (100%) diff --git a/test/test_plots/baseline/TestPolar/polar_wrap_180.png b/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_180.png similarity index 100% rename from test/test_plots/baseline/TestPolar/polar_wrap_180.png rename to lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_180.png diff --git a/test/test_plots/baseline/TestPolar/polar_wrap_360.png b/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_360.png similarity index 100% rename from test/test_plots/baseline/TestPolar/polar_wrap_360.png rename to lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_360.png diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 12e4a25aa528..512a38811855 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -259,3 +259,32 @@ def test_const_xy(): pylab.plot( np.ones( (10,) ), np.ones( (10,) ), 'o' ) fig.savefig( 'const_xy' ) + +@image_comparison(baseline_images=['polar_wrap_180', + 'polar_wrap_360', + ]) +def test_polar_wrap(): + """Test polar plots where data crosses 0 degrees.""" + + D2R = np.pi / 180.0 + + fig = pylab.figure() + + #NOTE: resolution=1 really should be the default + pylab.subplot( 111, polar=True, resolution=1 ) + pylab.polar( [179*D2R, -179*D2R], [0.2, 0.1], "b.-" ) + pylab.polar( [179*D2R, 181*D2R], [0.2, 0.1], "g.-" ) + pylab.rgrids( [0.05, 0.1, 0.15, 0.2, 0.25, 0.3] ) + + fig.savefig( 'polar_wrap_180' ) + + fig = pylab.figure() + + #NOTE: resolution=1 really should be the default + pylab.subplot( 111, polar=True, resolution=1 ) + pylab.polar( [2*D2R, -2*D2R], [0.2, 0.1], "b.-" ) + pylab.polar( [2*D2R, 358*D2R], [0.2, 0.1], "g.-" ) + pylab.polar( [358*D2R, 2*D2R], [0.2, 0.1], "r.-" ) + pylab.rgrids( [0.05, 0.1, 0.15, 0.2, 0.25, 0.3] ) + + fig.savefig( 'polar_wrap_360' ) diff --git a/test/test_plots/TestPolar.py b/test/test_plots/TestPolar.py index 4a38275dc958..619234fa46ad 100644 --- a/test/test_plots/TestPolar.py +++ b/test/test_plots/TestPolar.py @@ -40,40 +40,6 @@ def tearDown( self ): """Clean-up any generated files here.""" pass - #-------------------------------------------------------------------- - def test_polar_wrap( self ): - """Test polar plots where data crosses 0 degrees.""" - - fname = self.outFile( "polar_wrap_180.png" ) - - D2R = npy.pi / 180.0 - - fig = pylab.figure() - - #NOTE: resolution=1 really should be the default - pylab.subplot( 111, polar=True, resolution=1 ) - pylab.polar( [179*D2R, -179*D2R], [0.2, 0.1], "b.-" ) - pylab.polar( [179*D2R, 181*D2R], [0.2, 0.1], "g.-" ) - pylab.rgrids( [0.05, 0.1, 0.15, 0.2, 0.25, 0.3] ) - - fig.savefig( fname ) - self.checkImage( fname ) - - - fname = self.outFile( "polar_wrap_360.png" ) - - fig = pylab.figure() - - #NOTE: resolution=1 really should be the default - pylab.subplot( 111, polar=True, resolution=1 ) - pylab.polar( [2*D2R, -2*D2R], [0.2, 0.1], "b.-" ) - pylab.polar( [2*D2R, 358*D2R], [0.2, 0.1], "g.-" ) - pylab.polar( [358*D2R, 2*D2R], [0.2, 0.1], "r.-" ) - pylab.rgrids( [0.05, 0.1, 0.15, 0.2, 0.25, 0.3] ) - - fig.savefig( fname ) - self.checkImage( fname ) - #-------------------------------------------------------------------- def test_polar_units( self ): """Test polar plots with unitized data.""" From 4819d22214b0d43e4c2d310d4e2191a413216906 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 20:04:56 +0000 Subject: [PATCH 0201/1000] test conversion: move old-style test to new-style test svn path=/trunk/matplotlib/; revision=7693 --- .../test_axes}/polar_units.png | Bin lib/matplotlib/tests/test_axes.py | 24 +++++++ test/test_plots/TestPolar.py | 67 ------------------ 3 files changed, 24 insertions(+), 67 deletions(-) rename {test/test_plots/baseline/TestPolar => lib/matplotlib/tests/baseline_images/test_axes}/polar_units.png (100%) delete mode 100644 test/test_plots/TestPolar.py diff --git a/test/test_plots/baseline/TestPolar/polar_units.png b/lib/matplotlib/tests/baseline_images/test_axes/polar_units.png similarity index 100% rename from test/test_plots/baseline/TestPolar/polar_units.png rename to lib/matplotlib/tests/baseline_images/test_axes/polar_units.png diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 512a38811855..772db065f1c7 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -288,3 +288,27 @@ def test_polar_wrap(): pylab.rgrids( [0.05, 0.1, 0.15, 0.2, 0.25, 0.3] ) fig.savefig( 'polar_wrap_360' ) + +@image_comparison(baseline_images=['polar_units']) +def test_polar_units(): + """Test polar plots with unitized data.""" + import matplotlib.testing.jpl_units as units + units.register() + + pi = np.pi + deg = units.UnitDbl( 1.0, "deg" ) + + x1 = [ pi/6.0, pi/4.0, pi/3.0, pi/2.0 ] + x2 = [ 30.0*deg, 45.0*deg, 60.0*deg, 90.0*deg ] + + y1 = [ 1.0, 2.0, 3.0, 4.0] + y2 = [ 4.0, 3.0, 2.0, 1.0 ] + + fig = pylab.figure() + + pylab.polar( x2, y1, color = "blue" ) + + # polar( x2, y1, color = "red", xunits="rad" ) + # polar( x2, y2, color = "green" ) + + fig.savefig( 'polar_units' ) diff --git a/test/test_plots/TestPolar.py b/test/test_plots/TestPolar.py deleted file mode 100644 index 619234fa46ad..000000000000 --- a/test/test_plots/TestPolar.py +++ /dev/null @@ -1,67 +0,0 @@ -#======================================================================= -"""The Polar unit-test class implementation.""" -#======================================================================= - -from mplTest import * - -#======================================================================= -# Add import modules below. -import matplotlib -matplotlib.use( "Agg", warn = False ) - -import pylab -import numpy as npy -# -#======================================================================= - -#======================================================================= -class TestPolar( MplTestCase ): - """Polar unit test class.""" - - # Uncomment any appropriate tags - tags = [ - # 'gui', # requires the creation of a gui window - 'agg', # uses agg in the backend - 'agg-only', # uses only agg in the backend - # 'wx', # uses wx in the backend - # 'qt', # uses qt in the backend - # 'ps', # uses the postscript backend - # 'units', # uses units in the test - 'PIL', # uses PIL for image comparison - ] - - #-------------------------------------------------------------------- - def setUp( self ): - """Setup any data needed for the unit test.""" - units.register() - - #-------------------------------------------------------------------- - def tearDown( self ): - """Clean-up any generated files here.""" - pass - - #-------------------------------------------------------------------- - def test_polar_units( self ): - """Test polar plots with unitized data.""" - - fname = self.outFile( "polar_units.png" ) - - pi = npy.pi - deg = units.UnitDbl( 1.0, "deg" ) - - x1 = [ pi/6.0, pi/4.0, pi/3.0, pi/2.0 ] - x2 = [ 30.0*deg, 45.0*deg, 60.0*deg, 90.0*deg ] - - y1 = [ 1.0, 2.0, 3.0, 4.0] - y2 = [ 4.0, 3.0, 2.0, 1.0 ] - - fig = pylab.figure() - - pylab.polar( x2, y1, color = "blue" ) - - # polar( x2, y1, color = "red", xunits="rad" ) - # polar( x2, y2, color = "green" ) - - fig.savefig( fname ) - self.checkImage( fname ) - From f3144f3f86194c6c8dad2f580f8fd650b418909b Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 20:05:12 +0000 Subject: [PATCH 0202/1000] test conversion: move old-style test to new-style test svn path=/trunk/matplotlib/; revision=7694 --- .../test_axes}/axvspan_epoch.png | Bin lib/matplotlib/tests/test_axes.py | 22 ++++++++++++++++++ test/test_plots/TestSpan.py | 22 ------------------ 3 files changed, 22 insertions(+), 22 deletions(-) rename {test/test_plots/baseline/TestSpan => lib/matplotlib/tests/baseline_images/test_axes}/axvspan_epoch.png (100%) diff --git a/test/test_plots/baseline/TestSpan/axvspan_epoch.png b/lib/matplotlib/tests/baseline_images/test_axes/axvspan_epoch.png similarity index 100% rename from test/test_plots/baseline/TestSpan/axvspan_epoch.png rename to lib/matplotlib/tests/baseline_images/test_axes/axvspan_epoch.png diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 772db065f1c7..aae8359fa688 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -312,3 +312,25 @@ def test_polar_units(): # polar( x2, y2, color = "green" ) fig.savefig( 'polar_units' ) + +@image_comparison(baseline_images=['axvspan_epoch']) +def test_axvspan_epoch(): + """Test the axvspan method with Epochs.""" + from datetime import datetime + import matplotlib.testing.jpl_units as units + units.register() + + # generate some data + t0 = units.Epoch( "ET", dt=datetime(2009, 1, 20) ) + tf = units.Epoch( "ET", dt=datetime(2009, 1, 21) ) + + dt = units.Duration( "ET", units.day.convert( "sec" ) ) + + fig = pylab.figure() + + pylab.axvspan( t0, tf, facecolor="blue", alpha=0.25 ) + + ax = pylab.gca() + ax.set_xlim( t0 - 5.0*dt, tf + 5.0*dt ) + + fig.savefig( 'axvspan_epoch' ) diff --git a/test/test_plots/TestSpan.py b/test/test_plots/TestSpan.py index 1b720c62bc4d..1637510c189c 100644 --- a/test/test_plots/TestSpan.py +++ b/test/test_plots/TestSpan.py @@ -41,28 +41,6 @@ def tearDown( self ): """Clean-up any generated files here.""" pass - #-------------------------------------------------------------------- - def test_axvspan_epoch( self ): - """Test the axvspan method with Epochs.""" - - fname = self.outFile( "axvspan_epoch.png" ) - - # generate some data - t0 = units.Epoch( "ET", dt=datetime(2009, 1, 20) ) - tf = units.Epoch( "ET", dt=datetime(2009, 1, 21) ) - - dt = units.Duration( "ET", units.day.convert( "sec" ) ) - - fig = pylab.figure() - - pylab.axvspan( t0, tf, facecolor="blue", alpha=0.25 ) - - ax = pylab.gca() - ax.set_xlim( t0 - 5.0*dt, tf + 5.0*dt ) - - fig.savefig( fname ) - self.checkImage( fname ) - #-------------------------------------------------------------------- def test_axhspan_epoch( self ): """Test the axhspan method with Epochs.""" From 6e494b8bee71d3140ec43d0a6c5726422f2b6fe3 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 20:05:29 +0000 Subject: [PATCH 0203/1000] test conversion: move old-style test to new-style test svn path=/trunk/matplotlib/; revision=7695 --- .../test_axes}/axhspan_epoch.png | Bin lib/matplotlib/tests/test_axes.py | 22 ++++++ test/test_plots/TestSpan.py | 64 ------------------ 3 files changed, 22 insertions(+), 64 deletions(-) rename {test/test_plots/baseline/TestSpan => lib/matplotlib/tests/baseline_images/test_axes}/axhspan_epoch.png (100%) delete mode 100644 test/test_plots/TestSpan.py diff --git a/test/test_plots/baseline/TestSpan/axhspan_epoch.png b/lib/matplotlib/tests/baseline_images/test_axes/axhspan_epoch.png similarity index 100% rename from test/test_plots/baseline/TestSpan/axhspan_epoch.png rename to lib/matplotlib/tests/baseline_images/test_axes/axhspan_epoch.png diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index aae8359fa688..ed150f20bbac 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -334,3 +334,25 @@ def test_axvspan_epoch(): ax.set_xlim( t0 - 5.0*dt, tf + 5.0*dt ) fig.savefig( 'axvspan_epoch' ) + +@image_comparison(baseline_images=['axhspan_epoch']) +def test_axhspan_epoch(): + """Test the axhspan method with Epochs.""" + from datetime import datetime + import matplotlib.testing.jpl_units as units + units.register() + + # generate some data + t0 = units.Epoch( "ET", dt=datetime(2009, 1, 20) ) + tf = units.Epoch( "ET", dt=datetime(2009, 1, 21) ) + + dt = units.Duration( "ET", units.day.convert( "sec" ) ) + + fig = pylab.figure() + + pylab.axhspan( t0, tf, facecolor="blue", alpha=0.25 ) + + ax = pylab.gca() + ax.set_ylim( t0 - 5.0*dt, tf + 5.0*dt ) + + fig.savefig( 'axhspan_epoch' ) diff --git a/test/test_plots/TestSpan.py b/test/test_plots/TestSpan.py deleted file mode 100644 index 1637510c189c..000000000000 --- a/test/test_plots/TestSpan.py +++ /dev/null @@ -1,64 +0,0 @@ -#======================================================================= -"""The Span unit-test class implementation.""" -#======================================================================= - -from mplTest import * - -#======================================================================= -# Add import modules below. -import matplotlib -matplotlib.use( "Agg", warn = False ) - -import pylab -import numpy as npy -from datetime import datetime -# -#======================================================================= - -#======================================================================= -class TestSpan( MplTestCase ): - """Test the various axes spanning methods.""" - - # Uncomment any appropriate tags - tags = [ - # 'gui', # requires the creation of a gui window - 'agg', # uses agg in the backend - 'agg-only', # uses only agg in the backend - # 'wx', # uses wx in the backend - # 'qt', # uses qt in the backend - # 'ps', # uses the postscript backend - # 'units', # uses units in the test - 'PIL', # uses PIL for image comparison - ] - - #-------------------------------------------------------------------- - def setUp( self ): - """Setup any data needed for the unit test.""" - units.register() - - #-------------------------------------------------------------------- - def tearDown( self ): - """Clean-up any generated files here.""" - pass - - #-------------------------------------------------------------------- - def test_axhspan_epoch( self ): - """Test the axhspan method with Epochs.""" - - fname = self.outFile( "axhspan_epoch.png" ) - - # generate some data - t0 = units.Epoch( "ET", dt=datetime(2009, 1, 20) ) - tf = units.Epoch( "ET", dt=datetime(2009, 1, 21) ) - - dt = units.Duration( "ET", units.day.convert( "sec" ) ) - - fig = pylab.figure() - - pylab.axhspan( t0, tf, facecolor="blue", alpha=0.25 ) - - ax = pylab.gca() - ax.set_ylim( t0 - 5.0*dt, tf + 5.0*dt ) - - fig.savefig( fname ) - self.checkImage( fname ) From 2746e9ce7f35f346f2338e7da9fe8d1ea53acf22 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 20:05:42 +0000 Subject: [PATCH 0204/1000] test conversion: move old-style test to new-style test svn path=/trunk/matplotlib/; revision=7696 --- lib/matplotlib/__init__.py | 1 + lib/matplotlib/tests/test_agg.py | 64 +++++++++++++++++++ test/test_backends/TestAgg.py | 106 ------------------------------- 3 files changed, 65 insertions(+), 106 deletions(-) create mode 100644 lib/matplotlib/tests/test_agg.py delete mode 100644 test/test_backends/TestAgg.py diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index afab91410258..7b4a6d4b6812 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -877,6 +877,7 @@ def tk_window_focus(): # we don't want to assume all -d flags are backends, eg -debug default_test_modules = [ + 'matplotlib.tests.test_agg', 'matplotlib.tests.test_basic', 'matplotlib.tests.test_transforms', 'matplotlib.tests.test_axes', diff --git a/lib/matplotlib/tests/test_agg.py b/lib/matplotlib/tests/test_agg.py new file mode 100644 index 000000000000..4d971e117e15 --- /dev/null +++ b/lib/matplotlib/tests/test_agg.py @@ -0,0 +1,64 @@ +import os + +def report_memory(i): + pid = os.getpid() + a2 = os.popen('ps -p %d -o rss,sz' % pid).readlines() + print i, ' ', a2[1], + return int(a2[1].split()[0]) + +# This test is disabled -- it uses old API. -ADS 2009-09-07 +## def test_memleak(): +## """Test agg backend for memory leaks.""" +## from matplotlib.ft2font import FT2Font +## from numpy.random import rand +## from matplotlib.backend_bases import GraphicsContextBase +## from matplotlib.backends._backend_agg import RendererAgg + +## fontname = '/usr/local/share/matplotlib/Vera.ttf' + +## N = 200 +## for i in range( N ): +## gc = GraphicsContextBase() +## gc.set_clip_rectangle( [20, 20, 20, 20] ) +## o = RendererAgg( 400, 400, 72 ) + +## for j in range( 50 ): +## xs = [ 400*int(rand()) for k in range(8) ] +## ys = [ 400*int(rand()) for k in range(8) ] +## rgb = (1, 0, 0) +## pnts = zip( xs, ys ) +## o.draw_polygon( gc, rgb, pnts ) +## o.draw_polygon( gc, None, pnts ) + +## for j in range( 50 ): +## x = [ 400*int(rand()) for k in range(4) ] +## y = [ 400*int(rand()) for k in range(4) ] +## o.draw_lines( gc, x, y ) + +## for j in range( 50 ): +## args = [ 400*int(rand()) for k in range(4) ] +## rgb = (1, 0, 0) +## o.draw_rectangle( gc, rgb, *args ) + +## if 1: # add text +## font = FT2Font( fontname ) +## font.clear() +## font.set_text( 'hi mom', 60 ) +## font.set_size( 12, 72 ) +## o.draw_text_image( font.get_image(), 30, 40, gc ) + +## fname = "agg_memleak_%05d.png" +## o.write_png( fname % i ) +## val = report_memory( i ) +## if i==1: start = val + +## end = val +## avgMem = (end - start) / float(N) +## print 'Average memory consumed per loop: %1.4f\n' % (avgMem) + +## #TODO: Verify the expected mem usage and approximate tolerance that should be used +## #self.checkClose( 0.32, avgMem, absTol = 0.1 ) + +## # w/o text and w/o write_png: Average memory consumed per loop: 0.02 +## # w/o text and w/ write_png : Average memory consumed per loop: 0.3400 +## # w/ text and w/ write_png : Average memory consumed per loop: 0.32 diff --git a/test/test_backends/TestAgg.py b/test/test_backends/TestAgg.py deleted file mode 100644 index 5cd855899289..000000000000 --- a/test/test_backends/TestAgg.py +++ /dev/null @@ -1,106 +0,0 @@ -#======================================================================= -"""The Agg backend unit-test class implementation.""" -#======================================================================= - -from mplTest import * - -#======================================================================= -# Add import modules below. -# import matplotlib -# matplotlib.use( "Agg", warn = False ) - -import sys, time, os -from matplotlib.ft2font import FT2Font -from numpy.random import rand -from matplotlib.backend_bases import GraphicsContextBase -from matplotlib.backends._backend_agg import RendererAgg - -# -#======================================================================= - -#======================================================================= -def report_memory(i): - pid = os.getpid() - a2 = os.popen('ps -p %d -o rss,sz' % pid).readlines() - print i, ' ', a2[1], - return int(a2[1].split()[0]) - -#======================================================================= -class TestAgg( MplTestCase ): - """Agg backend unit test class.""" - - # Uncomment any appropriate tags - tags = [ - # 'gui', # requires the creation of a gui window - 'agg', # uses agg in the backend - 'agg-only', # uses only agg in the backend - # 'wx', # uses wx in the backend - # 'qt', # uses qt in the backend - # 'ps', # uses the postscript backend - # 'units', # uses units in the test - # 'PIL', # uses PIL for image comparison - ] - - #-------------------------------------------------------------------- - def setUp( self ): - """Setup any data needed for the unit test.""" - pass - - #-------------------------------------------------------------------- - def tearDown( self ): - """Clean-up any generated files here.""" - pass - - #-------------------------------------------------------------------- - def DISABLED_memleak( self ): - """Test agg backend for memory leaks.""" - - fontname = '/usr/local/share/matplotlib/Vera.ttf' - fname = self.outFile( "agg_memleak_%05d.png" ) - - N = 200 - for i in range( N ): - gc = GraphicsContextBase() - gc.set_clip_rectangle( [20, 20, 20, 20] ) - o = RendererAgg( 400, 400, 72 ) - - for j in range( 50 ): - xs = [ 400*int(rand()) for k in range(8) ] - ys = [ 400*int(rand()) for k in range(8) ] - rgb = (1, 0, 0) - pnts = zip( xs, ys ) - o.draw_polygon( gc, rgb, pnts ) - o.draw_polygon( gc, None, pnts ) - - for j in range( 50 ): - x = [ 400*int(rand()) for k in range(4) ] - y = [ 400*int(rand()) for k in range(4) ] - o.draw_lines( gc, x, y ) - - for j in range( 50 ): - args = [ 400*int(rand()) for k in range(4) ] - rgb = (1, 0, 0) - o.draw_rectangle( gc, rgb, *args ) - - if 1: # add text - font = FT2Font( fontname ) - font.clear() - font.set_text( 'hi mom', 60 ) - font.set_size( 12, 72 ) - o.draw_text_image( font.get_image(), 30, 40, gc ) - - - o.write_png( fname % i ) - val = report_memory( i ) - if i==1: start = val - - end = val - avgMem = (end - start) / float(N) - print 'Average memory consumed per loop: %1.4f\n' % (avgMem) - - #TODO: Verify the expected mem usage and approximate tolerance that should be used - self.checkClose( 0.32, avgMem, absTol = 0.1 ) - - # w/o text and w/o write_png: Average memory consumed per loop: 0.02 - # w/o text and w/ write_png : Average memory consumed per loop: 0.3400 - # w/ text and w/ write_png : Average memory consumed per loop: 0.32 From f6b72c6b3fe585609dad70936fe896608139c98a Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 20:05:54 +0000 Subject: [PATCH 0205/1000] test conversion: move old-style test to new-style test svn path=/trunk/matplotlib/; revision=7697 --- lib/matplotlib/__init__.py | 1 + lib/matplotlib/tests/test_cbook.py | 14 +++++++ test/test_matplotlib/TestCookbook.py | 59 ---------------------------- 3 files changed, 15 insertions(+), 59 deletions(-) create mode 100644 lib/matplotlib/tests/test_cbook.py delete mode 100644 test/test_matplotlib/TestCookbook.py diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index 7b4a6d4b6812..c9c2edbb55ea 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -879,6 +879,7 @@ def tk_window_focus(): default_test_modules = [ 'matplotlib.tests.test_agg', 'matplotlib.tests.test_basic', + 'matplotlib.tests.test_cbook', 'matplotlib.tests.test_transforms', 'matplotlib.tests.test_axes', 'matplotlib.tests.test_dates', diff --git a/lib/matplotlib/tests/test_cbook.py b/lib/matplotlib/tests/test_cbook.py new file mode 100644 index 000000000000..848686804d21 --- /dev/null +++ b/lib/matplotlib/tests/test_cbook.py @@ -0,0 +1,14 @@ +import numpy as np +import matplotlib.cbook as cbook +from nose.tools import assert_equal + +def test_is_string_like(): + y = np.arange( 10 ) + assert_equal( cbook.is_string_like( y ), False ) + y.shape = 10, 1 + assert_equal( cbook.is_string_like( y ), False ) + y.shape = 1, 10 + assert_equal( cbook.is_string_like( y ), False ) + + assert cbook.is_string_like( "hello world" ) + assert_equal( cbook.is_string_like(10), False ) diff --git a/test/test_matplotlib/TestCookbook.py b/test/test_matplotlib/TestCookbook.py deleted file mode 100644 index c6de1913cd64..000000000000 --- a/test/test_matplotlib/TestCookbook.py +++ /dev/null @@ -1,59 +0,0 @@ -#======================================================================= -"""The Cookbook unit-test class implementation.""" -#======================================================================= - -from mplTest import * - -#======================================================================= -# Add import modules below. -import matplotlib -matplotlib.use( "Agg", warn = False ) - -import numpy as npy -import matplotlib.cbook as cbook -# -#======================================================================= - -#======================================================================= -class TestCookbook( MplTestCase ): - """Cookbook unit test class.""" - - # Uncomment any appropriate tags - tags = [ - # 'gui', # requires the creation of a gui window - # 'agg', # uses agg in the backend - # 'agg-only', # uses only agg in the backend - # 'wx', # uses wx in the backend - # 'qt', # uses qt in the backend - # 'ps', # uses the postscript backend - # 'units', # uses units in the test - # 'PIL', # uses PIL for image comparison - ] - - #-------------------------------------------------------------------- - def setUp( self ): - """Setup any data needed for the unit test.""" - pass - - #-------------------------------------------------------------------- - def tearDown( self ): - """Clean-up any generated files here.""" - pass - - #-------------------------------------------------------------------- - def test_is_string_like( self ): - """Test the 'is_string_like cookbook' function.""" - y = npy.arange( 10 ) - self.failUnless( cbook.is_string_like( y ) == False ) - y.shape = 10, 1 - self.failUnless( cbook.is_string_like( y ) == False ) - y.shape = 1, 10 - self.failUnless( cbook.is_string_like( y ) == False ) - - - self.failUnless( cbook.is_string_like( "hello world" ) ) - self.failUnless( cbook.is_string_like(10) == False ) - - #-------------------------------------------------------------------- - #TODO: More cookbook tests - From 248088063d5c213d74bccb0b96b04ddecbc5147f Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 20:06:06 +0000 Subject: [PATCH 0206/1000] test conversion: remove old mplTest nose extensions svn path=/trunk/matplotlib/; revision=7698 --- test/_buildbot_test.py | 2 +- test/mplTest/MplNosePlugin.py | 838 ---------------------------------- test/mplTest/MplTestCase.py | 117 ----- test/mplTest/__init__.py | 13 - test/mplTest/directories.py | 16 - test/mplTest/path_utils.py | 81 ---- test/run-mpl-test.py | 19 +- 7 files changed, 2 insertions(+), 1084 deletions(-) delete mode 100644 test/mplTest/MplNosePlugin.py delete mode 100644 test/mplTest/MplTestCase.py delete mode 100644 test/mplTest/__init__.py delete mode 100644 test/mplTest/directories.py delete mode 100644 test/mplTest/path_utils.py diff --git a/test/_buildbot_test.py b/test/_buildbot_test.py index 42448140dedc..dda37c725702 100644 --- a/test/_buildbot_test.py +++ b/test/_buildbot_test.py @@ -18,5 +18,5 @@ for fname in previous_test_images: os.unlink(fname) -check_call('%s run-mpl-test.py --verbose --all --keep-failed'%TARGET_py, +check_call('%s run-mpl-test.py --verbose --all'%TARGET_py, cwd='test') diff --git a/test/mplTest/MplNosePlugin.py b/test/mplTest/MplNosePlugin.py deleted file mode 100644 index b23422802b32..000000000000 --- a/test/mplTest/MplNosePlugin.py +++ /dev/null @@ -1,838 +0,0 @@ -#======================================================================= - -import os -import sys -import shutil -import os.path -import optparse - -import nose.case -from nose.plugins import Plugin - -from path_utils import * -import directories as dirs -from MplTestCase import MplTestCase -from matplotlib.testing.noseclasses import KnownFailureTest - -#======================================================================= - -__all__ = [ 'MplNosePlugin' ] - -#======================================================================= -def getInstance( test ): - """Given a nose test case, will return the actual unit test instance. - - We do this with a function call in case the method for getting the - actual unit test instance needs to change. - """ - assert isinstance( test, nose.case.Test ) - - if isinstance( test.test, nose.case.MethodTestCase ): - return test.test.inst - elif isinstance( test.test, nose.case.FunctionTestCase ): - return test.test.test - # elif isinstance( test.test, unittest.TestCase ): - else: - return test.test - - -#======================================================================= -class MplNosePlugin( Plugin ): - - enabled = True - name = "MplNosePlugin" - score = 0 - - KEEP_NONE = 0 - KEEP_FAIL = 1 - KEEP_ALL = 2 - - TEST_ERRORED = -1 - TEST_FAILED = 0 - TEST_KNOWN_FAILED = 1 - TEST_PASSED = 2 - - #-------------------------------------------------------------------- - # Some 'property' functions - def getRootDir( self ): - # The bottom directory of the stack is the root directory. - return self.dirStack[0] - - def getInputDir( self ): - return os.path.join( self.currentDir, dirs.inputDirName ) - - def getOutputDir( self ): - return os.path.join( self.currentDir, dirs.outputDirName ) - - def getBaselineRootDir( self ): - return os.path.join( self.currentDir, dirs.baselineDirName ) - - def getSaveRootDir( self ): - return os.path.join( self.currentDir, dirs.saveDirName ) - - rootDir = property( getRootDir ) - inputDir = property( getInputDir ) - outputDir = property( getOutputDir ) - baselineRootDir = property( getBaselineRootDir ) - saveRootDir = property( getSaveRootDir ) - - def getBaselineDir( self, test ): - t = getInstance( test ) - return os.path.join( self.baselineRootDir, t.__class__.__name__ ) - - def getSaveDir( self, test ): - t = getInstance( test ) - return os.path.join( self.saveRootDir, t.__class__.__name__ ) - - #-------------------------------------------------------------------- - def saveResults( self, test ): - """Save the output directory for the gived test.""" - saveDir = self.getSaveDir( test ) - if not os.path.exists( saveDir ): - mkdir( saveDir, recursive = True ) - - outDir = getInstance( test ).outputDir - - for fname in walk( outDir ): - if os.path.isdir( fname ): - shutil.copytree( fname, saveDir ) - else: - shutil.copy( fname, saveDir ) - - #-------------------------------------------------------------------- - def filterTestItem( self, item ): - """Return true if you want the main test selector to collect tests from - this class, false if you don't, and None if you don't care. - - Parameters: - item : An instance of the testable item that has a 'tag' attribute. - """ - - reallyWant = False - reallyDontWant = False - - if hasattr( item, 'tags' ): - itemTags = item.tags - else: - itemTags = [] - - for tag in self.skipTags: - if tag in itemTags: - reallyDontWant = True - break - - for tag in self.includeTags: - if tag in itemTags: - reallyWant = True - else: - reallyDontWant = True - break - - if self.includeTags and not itemTags: - reallyDontWant = True - - if reallyDontWant: - return False - if reallyWant: - return True - - return None - - #-------------------------------------------------------------------- - def addError( self, test, err ): - """Called when a test raises an uncaught exception. DO NOT return a value - unless you want to stop other plugins from seeing that the test has - raised an error. - - Parameters: - test : nose.case.Test - the test case - err : 3-tuple - sys.exc_info() tuple - """ - (type, value, traceback) = err - if isinstance(value,KnownFailureTest): - self.testResults.append( (test, self.TEST_KNOWN_FAILED, err) ) - else: - self.testResults.append( (test, self.TEST_ERRORED, err) ) - - #-------------------------------------------------------------------- - def addFailure( self, test, err ): - """Called when a test fails. DO NOT return a value unless you want to - stop other plugins from seeing that the test has failed. - - Parameters: - test : nose.case.Test - the test case - err : 3-tuple - sys.exc_info() tuple - """ - self.testResults.append( (test, self.TEST_FAILED, err) ) - - #-------------------------------------------------------------------- - def addSuccess( self, test ): - """Called when a test passes. DO NOT return a value unless you want to - stop other plugins from seeing the passing test. - - Parameters: - test : nose.case.Test - the test case - """ - self.testResults.append( (test, self.TEST_PASSED, None) ) - - #-------------------------------------------------------------------- - def afterContext( self ): - """Called after a context (generally a module) has been lazy-loaded, - imported, setup, had its tests loaded and executed, and torn down. - """ - return None - - #-------------------------------------------------------------------- - def afterDirectory( self, path ): - """Called after all tests have been loaded from directory at path and run. - - Parameters: - path : string - the directory that has finished processing - """ - # Set the current directory to the previous directory - self.currentDir = self.dirStack.pop() - chdir( self.currentDir ) - return None - - #-------------------------------------------------------------------- - def afterImport( self, filename, module ): - """Called after module is imported from filename. afterImport is called - even if the import failed. - - Parameters: - filename : string - The file that was loaded - module : string - The name of the module - """ - return None - - #-------------------------------------------------------------------- - def afterTest( self, test ): - """Called after the test has been run and the result recorded - (after stopTest). - - Parameters: - test : nose.case.Test - the test case - """ - return None - - #-------------------------------------------------------------------- - def beforeContext( self ): - """Called before a context (generally a module) is examined. Since the - context is not yet loaded, plugins don't get to know what the - context is; so any context operations should use a stack that is - pushed in beforeContext and popped in afterContext to ensure they - operate symmetrically. - - beforeContext and afterContext are mainly useful for tracking and - restoring global state around possible changes from within a - context, whatever the context may be. If you need to operate on - contexts themselves, see startContext and stopContext, which are - passed the context in question, but are called after it has been - loaded (imported in the module case). - """ - return None - - #-------------------------------------------------------------------- - def beforeDirectory( self, path ): - """Called before tests are loaded from directory at path. - - Parameters: - path : string - the directory that is about to be processed - """ - # Save the cuurent directory and set to the new directory. - self.dirStack.append( self.currentDir ) - self.currentDir = path - chdir( self.currentDir ) - - # Remove any existing 'saved-results' directory - #NOTE: We must do this after setting 'self.currentDir' - rmdir( self.saveRootDir ) - - return None - - #-------------------------------------------------------------------- - def beforeImport( self, filename, module ): - """Called before module is imported from filename. - - Parameters: - filename : string - The file that will be loaded - module : string - The name of the module found in file - """ - return None - - #-------------------------------------------------------------------- - def beforeTest( self, test ): - """Called before the test is run (before startTest). - - Parameters: - test : nose.case.Test - the test case - """ - return None - - #-------------------------------------------------------------------- - def begin( self ): - """Called before any tests are collected or run. Use this to perform - any setup needed before testing begins. - """ - return None - - #-------------------------------------------------------------------- - def configure( self, options, conf ): - """Called after the command line has been parsed, with the parsed - options and the config container. Here, implement any config - storage or changes to state or operation that are set by command - line options. - - Do not return a value from this method unless you want to stop all - other plugins from being configured. - """ - self.includeTags = [ t for t in options.mpl_process_tags ] - self.skipTags = [ t for t in options.mpl_skip_tags ] - self.keepLevel = options.mpl_keep - - self.currentDir = os.getcwd() - self.dirStack = [] - - self.testResults = [] - - #-------------------------------------------------------------------- - def describeTest( self, test ): - """Return a test description. Called by nose.case.Test.shortDescription. - - Parameters: - test : nose.case.Test - the test case - """ - return None - - #-------------------------------------------------------------------- - def finalize( self, result ): - """Called after all report output, including output from all plugins, - has been sent to the stream. Use this to print final test results - or perform final cleanup. Return None to allow other plugins to - continue printing, any other value to stop them. - - Note - When tests are run under a test runner other than - nose.core.TextTestRunner, for example when tests are run via - 'python setup.py test', this method may be called before the default - report output is sent. - """ - return None - - #-------------------------------------------------------------------- - def formatError( self, test, err ): - """Called in result.addError, before plugin.addError. If you want to - replace or modify the error tuple, return a new error tuple. - - Parameters: - test : nose.case.Test - the test case - err : 3-tuple - sys.exc_info() tuple - """ - return err - - #-------------------------------------------------------------------- - def formatFailure( self, test, err ): - """Called in result.addFailure, before plugin.addFailure. If you want to - replace or modify the error tuple, return a new error tuple. Since - this method is chainable, you must return the test as well, so you - you'll return something like: - return (test, err) - - Parameters: - test : nose.case.Test - the test case - err : 3-tuple - sys.exc_info() tuple - """ - return None - - #-------------------------------------------------------------------- - def handleError( self, test, err ): - """Called on addError. To handle the error yourself and prevent normal - error processing, return a true value. - - Parameters: - test : nose.case.Test - the test case - err : 3-tuple - sys.exc_info() tuple - """ - if (self.keepLevel == self.KEEP_FAIL) or (self.keepLevel == self.KEEP_ALL): - self.saveResults( test ) - - return None - - #-------------------------------------------------------------------- - def handleFailure( self, test, err ): - """Called on addFailure. To handle the failure yourself and prevent - normal failure processing, return a true value. - - Parameters: - test : nose.case.Test - the test case - err : 3-tuple - sys.exc_info() tuple - """ - if (self.keepLevel == self.KEEP_FAIL) or (self.keepLevel == self.KEEP_ALL): - self.saveResults( test ) - - return None - - #-------------------------------------------------------------------- - def loadTestsFromDir( self, path ): - """Return iterable of tests from a directory. May be a generator. - Each item returned must be a runnable unittest.TestCase - (or subclass) instance or suite instance. Return None if your - plugin cannot collect any tests from directory. - - Parameters: - path : string - The path to the directory. - """ - return None - - #-------------------------------------------------------------------- - def loadTestsFromFile( self, filename ): - """Return tests in this file. Return None if you are not interested in - loading any tests, or an iterable if you are and can load some. May - be a generator. If you are interested in loading tests from the file - and encounter no errors, but find no tests, yield False or - return [False]. - - Parameters: - filename : string - The full path to the file or directory. - """ - return None - - #-------------------------------------------------------------------- - def loadTestsFromModule( self, module ): - """Return iterable of tests in a module. May be a generator. Each - item returned must be a runnable unittest.TestCase (or subclass) - instance. Return None if your plugin cannot collect any tests - from module. - - Parameters: - module : python module - The module object - """ - return None - - #-------------------------------------------------------------------- - def loadTestsFromName( self, name, module=None, importPath=None ): - """Return tests in this file or module. Return None if you are not able - to load any tests, or an iterable if you are. May be a generator. - - Parameters: - name : string - The test name. May be a file or module name plus a test - callable. Use split_test_name to split into parts. Or it might - be some crazy name of your own devising, in which case, do - whatever you want. - module : python module - Module from which the name is to be loaded - """ - return None - - #-------------------------------------------------------------------- - def loadTestsFromNames( self, names, module=None ): - """Return a tuple of (tests loaded, remaining names). Return None if you - are not able to load any tests. Multiple plugins may implement - loadTestsFromNames; the remaining name list from each will be passed - to the next as input. - - Parameters: - names : iterable - List of test names. - module : python module - Module from which the names are to be loaded - """ - return None - - #-------------------------------------------------------------------- - def loadTestsFromTestCase( self, cls ): - """Return tests in this test case class. Return None if you are not able - to load any tests, or an iterable if you are. May be a generator. - - Parameters: - cls : class - The test case class. Must be subclass of unittest.TestCase. - """ - return None - - #-------------------------------------------------------------------- - def loadTestsFromTestClass( self, cls ): - """Return tests in this test class. Class will not be a unittest.TestCase - subclass. Return None if you are not able to load any tests, an - iterable if you are. May be a generator. - - Parameters: - cls : class - The test class. Must NOT be subclass of unittest.TestCase. - """ - return None - - #-------------------------------------------------------------------- - def makeTest( self, obj, parent ): - """Given an object and its parent, return or yield one or more test - cases. Each test must be a unittest.TestCase (or subclass) instance. - This is called before default test loading to allow plugins to load - an alternate test case or cases for an object. May be a generator. - - Parameters: - obj : any object - The object to be made into a test - parent : class, module or other object - The parent of obj (eg, for a method, the class) - """ - return None - - #-------------------------------------------------------------------- - def options( self, parser, env = os.environ ): - """Called to allow plugin to register command line options with the parser. - - Do not return a value from this method unless you want to stop all other - plugins from setting their options. - - NOTE: By default, parser is a Python optparse.OptionParser instance. - """ - helpMsg = "The following are options specific to the matplotlib test harness" - group = optparse.OptionGroup( parser, "Matplotlib Options", helpMsg ) - - # Options to handle tags - helpMsg = "Will only run test cases that have the specified tag. Each " - helpMsg += "test case should have a 'tag' attribute (if a case does not h" - helpMsg += "ave one, then it is assumed to be an empty list). The 'tag' " - helpMsg += "attribute is a list of strings, where each value is a " - helpMsg += "representative propery of the test case. Example tags are " - helpMsg += "'qt' or 'units'. This can be specified multiple times." - group.add_option( '-t', '--with-tag', - action = 'append', type = 'string', dest = 'mpl_process_tags', - default = [], metavar = 'TAG', help = helpMsg ) - - helpMsg = "This will run those test cases that do not have the specified tags." - group.add_option( '--without-tag', - action = 'append', type = 'string', dest = 'mpl_skip_tags', - default = [], metavar = 'TAG', help = helpMsg ) - - - # Some Miscellaneous options - helpMsg = "This will remove all output files, saved results, and .pyc files. " - helpMsg += "If this is specified, no other processing will be performed." - group.add_option( '--clean', - action = "store_true", dest = "mpl_clean", - default = False, help = helpMsg ) - - helpMsg = "This will run all test programs regardless of working directory." - group.add_option( '--all', - action = "store_true", dest = "mpl_all", - default = False, help = helpMsg ) - - - # Options to handle generated data files - helpMsg = "Keep any generated output files in a directory called " - helpMsg += "'saved-results'. This directory will be created if it " - helpMsg += "doesn't already exist. This directory is in the same " - helpMsg += "location as the test case whose results are being saved." - group.add_option( '--keep', - action = "store_const", dest = "mpl_keep", - default = self.KEEP_NONE, const = self.KEEP_ALL, help = helpMsg ) - - helpMsg = "This acts just like '--keep' except will only keeps the results " - helpMsg += "from tests that error or fail." - group.add_option( '--keep-failed', - action = "store_const", dest = "mpl_keep", - default = self.KEEP_NONE, const = self.KEEP_FAIL, help = helpMsg ) - - - # Options to create a test case file - helpMsg = "Creates a template test case file in the current directory " - helpMsg += "with the name TestFoo. Where 'Foo' is the provided test name." - group.add_option( '--make-test', - action = 'store', dest = 'mpl_make_test', - default = False, metavar = 'testName', help = helpMsg ) - - - parser.add_option_group( group ) - - #-------------------------------------------------------------------- - def prepareTest( self, test ): - """Called before the test is run by the test runner. Please note the - article the in the previous sentence: prepareTest is called only once, - and is passed the test case or test suite that the test runner will - execute. It is not called for each individual test case. If you return - a non-None value, that return value will be run as the test. Use this - hook to wrap or decorate the test with another function. If you need - to modify or wrap individual test cases, use prepareTestCase instead. - - Parameters: - test : nose.case.Test - the test case - """ - return None - - #-------------------------------------------------------------------- - def prepareTestCase( self, test ): - """Prepare or wrap an individual test case. Called before execution of - the test. The test passed here is a nose.case.Test instance; the case - to be executed is in the test attribute of the passed case. To modify - the test to be run, you should return a callable that takes one - argument (the test result object) -- it is recommended that you do not - side-effect the nose.case.Test instance you have been passed. - - Keep in mind that when you replace the test callable you are replacing - the run() method of the test case -- including the exception handling - and result calls, etc. - - Parameters: - test : nose.case.Test - the test case - """ - # Save the dir names in the test class instance to make it available - # to the individual test cases. - t = getInstance( test ) - t.inputDir = self.inputDir - t.outputDir = self.outputDir - t.baselineDir = self.getBaselineDir( test ) - t.workingDir = self.currentDir - - return None - - #-------------------------------------------------------------------- - def prepareTestLoader( self, loader ): - """Called before tests are loaded. To replace the test loader, return a - test loader. To allow other plugins to process the test loader, - return None. Only one plugin may replace the test loader. Only valid - when using nose.TestProgram. - - Parameters: - loader : nose.loader.TestLoader or other loader instance - the test loader - """ - return None - - #-------------------------------------------------------------------- - def prepareTestResult( self, result ): - """Called before the first test is run. To use a different test result - handler for all tests than the given result, return a test result - handler. NOTE however that this handler will only be seen by tests, - that is, inside of the result proxy system. The TestRunner and - TestProgram -- whether nose's or other -- will continue to see the - original result handler. For this reason, it is usually better to - monkeypatch the result (for instance, if you want to handle some - exceptions in a unique way). Only one plugin may replace the result, - but many may monkeypatch it. If you want to monkeypatch and stop - other plugins from doing so, monkeypatch and return the patched result. - - Parameters: - result : nose.result.TextTestResult or other result instance - the test result - """ - return None - - #-------------------------------------------------------------------- - def prepareTestRunner( self, runner ): - """Called before tests are run. To replace the test runner, return a - test runner. To allow other plugins to process the test runner, - return None. Only valid when using nose.TestProgram. - - Parameters: - runner : nose.core.TextTestRunner or other runner instance - the test runner - """ - return None - - #-------------------------------------------------------------------- - def report( self, stream ): - """Called after all error output has been printed. Print your plugin's - report to the provided stream. Return None to allow other plugins to - print reports, any other value to stop them. - - Parameters: - stream : file-like object - stream object; send your output here - """ - return None - - #-------------------------------------------------------------------- - def setOutputStream( self, stream ): - """Called before test output begins. To direct test output to a new - stream, return a stream object, which must implement a write(msg) - method. If you only want to note the stream, not capture or redirect - it, then return None. - - Parameters: - stream : file-like object - the original output stream - """ - return None - - #-------------------------------------------------------------------- - def startContext( self, context ): - """Called before context setup and the running of tests in the context. - Note that tests have already been loaded from the context before this call. - - Parameters: - context : module, class or other object - the context about to be setup. May be a module or class, or - any other object that contains tests. - """ - return None - - #-------------------------------------------------------------------- - def startTest( self, test ): - """Called before each test is run. DO NOT return a value unless you want - to stop other plugins from seeing the test start. - - Parameters: - test : nose.case.Test - the test case - """ - # make sure there is a fresh output directory to use. - rmdir( self.outputDir ) - mkdir( self.outputDir, recursive = True ) - - #-------------------------------------------------------------------- - def stopContext( self, context ): - """Called after the tests in a context have run and the context has been - torn down. - - Parameters: - context : module, class or other object - the context that has just been torn down. - """ - return None - - #-------------------------------------------------------------------- - def stopTest( self, test ): - """Called after each test is run. DO NOT return a value unless you want - to stop other plugins from seeing that the test has stopped. - - Parameters: - test : nose.case.Test - the test case - """ - assert test == self.testResults[-1][0] - - if self.keepLevel == self.KEEP_ALL: - self.saveResults( test ) - - # KEEP_FAIL is handled by the 'handleError' and 'handleFailed' methods. - - rmdir( self.outputDir ) - - #-------------------------------------------------------------------- - def testName( self, test ): - """Return a short test name. Called by nose.case.Test.__str__. - - Parameters: - test : nose.case.Test - the test case - """ - return None - - #-------------------------------------------------------------------- - def wantClass( self, cls ): - """Return true if you want the main test selector to collect tests from - this class, false if you don't, and None if you don't care. - - Parameters: - cls : class - The class being examined by the selector - """ - # Filter out classes that do not inherit from MplTestCase - if not issubclass( cls, MplTestCase ): - return False - - return self.filterTestItem( cls ) - - #-------------------------------------------------------------------- - def wantDirectory( self, dirname ): - """Return true if you want test collection to descend into this - directory, false if you do not, and None if you don't care. - - Parameters: - dirname : string - Full path to directory being examined by the selector - """ - # Skip the unit-test utility module. - if dirname == os.path.join( self.rootDir, 'mplTest' ): - return False - - return None - - #-------------------------------------------------------------------- - def wantFile( self, file ): - """Return true if you want to collect tests from this file, false if - you do not and None if you don't care. - - Parameters: - file : string - Full path to file being examined by the selector - """ - # Skip anything not under the root test directory - if self.rootDir not in file: - return False - - return None - - #-------------------------------------------------------------------- - def wantFunction( self, function ): - """Return true to collect this function as a test, false to prevent it - from being collected, and None if you don't care. - - Parameters: - function : function - The function object being examined by the selector - """ - #TODO: Filter out functions that exist outside of the test-structure - name = function.__name__.lower() - if "disabled" in name: return False - return self.filterTestItem( function ) - - #-------------------------------------------------------------------- - def wantMethod( self, method ): - """Return true to collect this method as a test, false to prevent it - from being collected, and None if you don't care. - - Parameters: - method : unbound method - The method object being examined by the selector - """ - #TODO: Filter out methods that exist outside of the test-structure - name = method.__name__.lower() - if "disabled" in name: return False - return self.filterTestItem( method ) - - #-------------------------------------------------------------------- - def wantModule( self, module ): - """Return true if you want to collection to descend into this module, - false to prevent the collector from descending into the module, and - None if you don't care. - - Parameters: - module : python module - The module object being examined by the selector - """ - #TODO: Filter out modules that exist outside of the test-structure - name = module.__name__.lower() - if "disabled" in name: return False - return self.filterTestItem( module ) - - diff --git a/test/mplTest/MplTestCase.py b/test/mplTest/MplTestCase.py deleted file mode 100644 index 2046c917f278..000000000000 --- a/test/mplTest/MplTestCase.py +++ /dev/null @@ -1,117 +0,0 @@ -#======================================================================= -"""Defines the base matplotlib test-case.""" -#======================================================================= - -import os -import os.path -import unittest - -import matplotlib.testing.compare as compare -import path_utils - -#======================================================================= - -__all__ = [ 'MplTestCase' ] - -#======================================================================= -class MplTestCase( unittest.TestCase ): - """This is the base class for the matplotlib unit-tests. - - It provides a few utility functions for accessing managed directories: - - inputs - All input files for the test case are stored here. - - outputs - All output files for the test case are written here. - - baseline - All baseline files (those used for verifying results) for - athe test case are stored here. - """ - #-------------------------------------------------------------------- - def inFile( self, fname ): - """Returns the pathname of the specified input file.""" - return os.path.join( self.inputDir, fname ) - - def outFile( self, fname ): - """Returns the pathname of the specified output file.""" - return os.path.join( self.outputDir, fname ) - - def baseFile( self, fname ): - """Returns the pathname of the specified basline file.""" - return os.path.join( self.baselineDir, fname ) - - #-------------------------------------------------------------------- - def checkImage( self, outfname, tol = 1.0e-3, msg = "" ): - """Check to see if the image is similair to one stored in the - baseline directory. - """ - if self.outputDir in outfname: - # We are passed the path name and just want the file name. - actualImage = outfname - basename = path_utils.name( outfname ) - else: - basename = outfname - actualImage = self.outFile( basename ) - - baselineImage = self.baseFile( basename ) - - errorMessage = compare.compare_images( baselineImage, actualImage, tol ) - - if errorMessage: - self.fail( msg + "\n" + errorMessage ) - - #-------------------------------------------------------------------- - def checkEq( expected, actual, msg = "" ): - """Fail if the values are not equal, with the given message.""" - if not expected == actual: - expectedStr = str( expected ) - actualStr = str( actual ) - isMultiLine = ( "\n" in expectedStr or "\n" in actualStr or - len( expectedStr ) > 70 or len( actualStr ) > 70 ) - - if isMultiLine: - if msg: - msg += "\n\n" - msg += "Expected:\n" - msg += expectedStr + "\n\n" - msg += "Actual:\n" - msg += actualStr + "\n" - else: - if msg: - msg += "\n" - msg += " Expected: " + expectedStr + "\n" - msg += " Actual: " + actualStr + "\n" - - self.fail( msg ) - - #-------------------------------------------------------------------- - def checkNeq( expected, actual, msg = "" ): - """Fail is the values are equal, with the given message.""" - if expected == actual: - expectedStr = str( expected ) - isMultiLine = ( "\n" in expectedStr or len( expectedStr ) > 55 ) - - if isMultiLine: - if msg: - msg += "\n\n" - msg += "Expected and actual should not be equal.\n" - msg += "Expected and actual:\n" - msg += expectedStr + "\n" - else: - if msg: - msg += "\n" - msg += " Expected and actual should not be equal.\n" - msg += " Expected and actual: " + expectedStr + "\n" - - self.fail( msg ) - - #-------------------------------------------------------------------- - def checkClose( expected, actual, relTol = None, absTol = None, msg = "" ): - """Fail if the floating point values are not close enough, with - the givem message. - - You can specify a relative tolerance, absolute tolerance, or both. - """ - errorMessage = compare.compare_float( expected, actual, relTol, absTol ) - - if errorMessage: - self.fail( msg + "\n" + errorMessage ) - - #-------------------------------------------------------------------- - diff --git a/test/mplTest/__init__.py b/test/mplTest/__init__.py deleted file mode 100644 index 0b4c2fe861bc..000000000000 --- a/test/mplTest/__init__.py +++ /dev/null @@ -1,13 +0,0 @@ - -""" -A matplotlib unit test module. This module provides several utilities for -performing unit-tests on matplotlib. Theis module depends on a properly -installed version of 'nose'. -""" - -from directories import * - -from mplTest.MplNosePlugin import MplNosePlugin -from mplTest.MplTestCase import MplTestCase - -import matplotlib.testing.jpl_units as units diff --git a/test/mplTest/directories.py b/test/mplTest/directories.py deleted file mode 100644 index a0829ebcf537..000000000000 --- a/test/mplTest/directories.py +++ /dev/null @@ -1,16 +0,0 @@ -#======================================================================= -"""Default directories for the matplotlib unit-test structure.""" -#======================================================================= - -import os.path - -#======================================================================= -saveDirName = "saved-results" -inputDirName = "inputs" -outputDirName = "outputs" -baselineDirName = "baseline" - -#----------------------------------------------------------------------- -def baselineFile( fname ): - return os.path.join( baselineDirName, fname ) - diff --git a/test/mplTest/path_utils.py b/test/mplTest/path_utils.py deleted file mode 100644 index dd60e5d2eac1..000000000000 --- a/test/mplTest/path_utils.py +++ /dev/null @@ -1,81 +0,0 @@ -#======================================================================= -""" A set of utilities for manipulating path information. -""" -#======================================================================= - -import os -import shutil -import os.path - -#======================================================================= - -__all__ = [ - 'chdir', - 'exists', - 'extension', - 'joinPath', - 'mkdir', - 'name', - 'rm', - 'rmdir', - 'walk', - ] - -#----------------------------------------------------------------------- -def chdir( path ): - """Change the current working directory to the specified directory.""" - os.chdir( path ) - -#----------------------------------------------------------------------- -def exists( path ): - """Returns true if the specified path exists.""" - return os.path.exists( path ) - -#----------------------------------------------------------------------- -def extension( path ): - """Returns the extension name of a filename.""" - unused, ext = os.path.splitext( path ) - return ext - -#----------------------------------------------------------------------- -def joinPath( *args ): - """Returns true if the specified path exists.""" - return os.path.join( *args ) - -#----------------------------------------------------------------------- -def mkdir( path, mode = 0777, recursive = False ): - """Create the specified directory.""" - if recursive: - os.makedirs( path, mode ) - else: - os.mkdir( path, mode ) - -#----------------------------------------------------------------------- -def name( path ): - """Returns the name portion of a specified path.""" - return os.path.basename( path ) - -#----------------------------------------------------------------------- -def rm( path ): - """Remove the specified file.""" - os.remove( path ) - -#----------------------------------------------------------------------- -def rmdir( path ): - """Remove the specified directory.""" - shutil.rmtree( path, ignore_errors = True ) - -#----------------------------------------------------------------------- -def walk( path ): - """Recursively iterate over files and sub-directories.""" - children = os.listdir( path ) - children = [ os.path.join( path, child ) for child in children ] - - for child in children: - yield child - - if os.path.isdir( child ): - for grandchild in walk( child ): - yield grandchild - - diff --git a/test/run-mpl-test.py b/test/run-mpl-test.py index 2706fbdd97ad..39f32a92138a 100755 --- a/test/run-mpl-test.py +++ b/test/run-mpl-test.py @@ -44,26 +44,9 @@ import nose import nose.plugins.builtin -from mplTest import MplNosePlugin, path_utils import matplotlib from matplotlib.testing.noseclasses import KnownFailure -if '--clean' in args: - # perform the cleaning process and exit - for filename in path_utils.walk( working ): - ext = path_utils.extension( filename ) - if ext == '.cover': - print "Cleaning coverage file: %s" % (filename) - path_utils.rm( filename ) - elif ext == '.pyc': - print "Cleaning bytecode file: %s" % (filename) - path_utils.rm( filename ) - elif path_utils.name( filename ) == 'saved-results': - print "Cleaning directory: %s" % (filename) - path_utils.rmdir( filename ) - - sys.exit( 0 ) - for arg in args: # We need to do this here, because we do not actually want nose to start. if arg.startswith( '--make-test=' ): @@ -96,7 +79,7 @@ args.extend( matplotlib.default_test_modules ) plugins = [plugin() for plugin in nose.plugins.builtin.plugins] -plugins.extend( [ MplNosePlugin(), KnownFailure() ]) +plugins.extend( [ KnownFailure() ]) success = nose.run( argv = args, plugins = plugins, From 30767390d637498eb4a53a61c2fee1c515959078 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 20:18:32 +0000 Subject: [PATCH 0207/1000] test conversion: remove empy directories svn path=/trunk/matplotlib/; revision=7699 From 9407dea3e8c9577b0542c93431e68655b19ca1db Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 20:27:44 +0000 Subject: [PATCH 0208/1000] test conversion: remove infrastructure cruft svn path=/trunk/matplotlib/; revision=7700 --- test/README.txt | 301 +------------------------------- test/_buildbot_mac_sage.sh | 2 +- test/_buildbot_test.py | 2 +- test/consolidate_diff_images.sh | 7 - test/movegood.py | 53 ------ test/run-mpl-test.py | 100 ----------- 6 files changed, 4 insertions(+), 461 deletions(-) delete mode 100755 test/consolidate_diff_images.sh delete mode 100644 test/movegood.py delete mode 100755 test/run-mpl-test.py diff --git a/test/README.txt b/test/README.txt index d2622ecaad2a..c9e2fcb4c4b2 100644 --- a/test/README.txt +++ b/test/README.txt @@ -1,299 +1,2 @@ -======================================================================== - matplotlib test structure -======================================================================== - -===== How To Use - -= Running - -Run the 'run-mpl-test.py' script to execute the test harness. This must -be run with the version of python that you wish to test matplotlib with. -This means that it must have nose installed (and PIL if image comparison -is to be done). By default this will pick up whatever python is on your -path, so make sure it is the correct one. - -- Command-Line Options -In addition to the standard nose command-line options, there are several -specific to the matplotlib test harness. They are as follows: - - -t TAG, --with-tag=TAG - Will only run test cases that have the specified tag. - Each test case should have a 'tag' attribute (if a - case does not have one, then it is assumed to be an - empty list). The 'tag' attribute is a list of - strings, where each value is a representative propery - of the test case. Example tags are 'qt' or 'units'. - This can be specified multiple times. - --without-tag=TAG This will run those test cases that do not have the - specified tags. - --clean This will remove all output files and saved results. - If this is specified, no other processing will be - performed. - --all This will runn all test programs regardless of working - directory. - --keep Keep any generated output files in a directory called - 'saved-results'. This directory will be created if it - doesn't already exist. This directory is in the same - location as the test case whose results are being - saved. - --keep-failed This acts just like '--keep' except will only keeps - the results from tests that error or fail. - --make-test=testName - Creates a template test case file in the current - directory with the name TestFoo. Where 'Foo' is the - provided test name. - - -- Running Specific Tests -In order to can specify the exact test case you want to run use the -standard nose mechanism. For example, if you have the following setup: - -TestFoo.py - def test_func(): - ... - - class TestFoo: - def test_bar( self ): - ... - def test_bug( self ): - ... - -Then to test everything in TestFoo.py do the following: -$> run-mpl-test.py TestFoo.py - -To run all tests in the test class TestFoo do this: -$> run-mpl-test.py TestFoo.py:TestFoo - -To run the specific 'test_bar' methodd do the following: -$> run-mpl-test.py TestFoo.py:TestFoo.test_bar - - -= Detecting Test Cases - -When running the matplotlib test script it will search for all tests -in the current working directory and below (unless '--all' is specified). -This is provided that the current working directory is a sub-directory -of the matplotlib test directory. In the event that it is not, then the -matplotlib root test directory will be used and all appropriate test cases -will be run. - -This will not search outside of the test structure and will not look in -the mplTest module. This will only search for test cases in the root -test directory and any of its sub-directories. - -= Saving Results - -When using the keep flag any generated files in the 'output' directory -are copied to the 'saved-results/' directory, where -is the name of the unit-test class. This means that for each test case -within a given test class, all output files should have unique names. - -The 'saved-results' directory will always contain the results from the -last test run. This is considered a volatile directory since running -the test cases without the '--keep' flag will remove any existing -'saved-results' directory. This is to ensure the integrity of the -saved results, they will always match the last test run. - -= Filtering Tests - -In the case of filtering via tags, a unit-test cane have multiple tags. -When running the test program if any tags are specified as 'skip' then -this will take precedence over any tags that might say 'process'. For -example, if a test case has both the 'gui' and 'qt' tag, but the command- -line is specified with the following flags: - '--with-tag=gui --without-tag=qt' -then the example test case will not be run because it matches the skip -tag. - - -===== Directory Structure - -There are several directories in the matplotlib test structure. The first -directory is the 'mplTest' directory. This is the matplotlib test module -and contains the various python scripts that the test harness needs to -run. The remaining directories are as follows and contain the various test -cases for matplotlib. - -mplTest - This directory does not contain any test cases, rather it is the location - of the matplotlib specific utilities for performing unit tests. - -test_artists - This directory contains tests that focus on the rendering aspects of - the various artists. Essentially the artist derived functionality. - -test_backends - This directory contains various tests that focus on making sure the - various backend targets work. - -test_basemap - This directory contains test cases that excercise the basemap add-on - module. - -test_cxx - This directoy contains tests that focus on testing the interface of - the compiled code contained in matplotlib. - -test_mathtext - This directory contains tests that focus on excercising the mathtext - sub-system. - -test_numerix - This directory contains tests that focus on validating the numerix - component. - -test_plots - This directory contains tests that validate the various plot funtions. - -test_pylab - This directory has pylab specific test cases. - -test_transforms - This directory has test cases that focus on testing the various - transformation and projection functions. - -test_matplotlib - This directory has all other test cases. This contins test that focus - on making sure that Axis, Axes, Figure, etc are all acting properly. This - has test cases that are general to the overall funtionality of matplotlib. - - -===== Writing Test Cases - -= The Test Case - -As per the nose implementation, a test case is ultimately any function that -has the phrase 'test' in its name. The matplotlib cases however are grouped -into directories, by what is being tested, and from there are grouped into -classes (one class per file), by similarity. - -It is desireable that all matplotlib tests follow the same structure to -not only facilitate the writing of test cases, but to make things easier -for maintaining them and keeping things uniform. - -There is a class 'MplTestCase' provided to be the base class for all matplotlib -test classes. This class provides some extra functionality in the form of -verification functions and test data management. - -= Comparison Functions - -There are several methods provided for testing whether or not a particular -test case should fail or succeed. The following methods are provided by -the base matplotlib test class: - -- MplTestCase.checkEq( expected, actual, msg = "" ) - Fail if the values are not equal, with the given message. - -- MplTestCase.checkNeq( expected, actual, msg = "" ) - Fail if the values are equal, with the given message. - -- MplTestCase.checkClose( expected, actual, relTol=None, absTol=None, msg="" ) - Fail if the floating point values are not close enough, with the given message. - You can specify a relative tolerance, absolute tolerance, or both. - -- MplTestCase.checkImage( filename, tol = 1.0e-3, msg = "" ) - Check to see if the image is similair to the one stored in the baseline - directory. filename can be a fully qualified name (via the 'outFile' method), - or it can be the name of the file (to be passed into the 'outFile' method). - The default tolerance is typically fine, but might need to be adjusted in some - cases (see the 'compareImages' function for more details). Fails with - the specified message. - -Note that several of the tests will perform image comparison for validation -of a specific plot. Though not 100% accurate it at least flags potential -failures and signals a human to come and take a closer look. If an image has -changed and after a human deems the change is acceptable, then updating the -baseline image with the appropriate image from the 'saved-results' directory -(when using the '--keep' or '--keep-failed' command-line arguments) will make -the test pass properly. - -Image comparison depends on the python imaging library (PIL) being installed. -If PIL is not installed, then any test cases that rely on it will not -pass. To not run these test cases, then pass the '--without-tag=PIL' -option on the command-line. - -= Directories - -Input data files for a given test case should be place in a directory -called 'inputs' with the test case that uses it. A convienence function -is provided with each test class for accessing input files. - -For example if a test case has an input file of the name 'inputs.txt' -you can get the path to the file by calling 'self.inFile("inputs.txt")'. -This is to allow for a uniform convention that all test cases can follow. - -Output files are handled just like input files with the exception that -they are written to the 'output' directory and the path name can be -had by calling 'self.outFile'. It is more important to use this mechanism -for getting the pathname for an output file because it allows for the -management of cleaning up and saving generated output files (It also -significantly reduces the probability of typo errors when specifying -where to place the files). - -A Third and final directory used by the test cases is the 'baseline' -directory. This is where data files used for verifying test results -are stored. The path name can be had by using the 'self.baseFile' -method. - -Accessing these directories can be made simple (and reduce the chance of a -typo) via the following MplTestCase methods: - -- MplTestCase.inFile( filename ) - Returns the full pathname of filename in the input data directory. - -- MplTestCase.outFile( filename ) - Returns the full pathname of filename in the output data directory. - -- MplTestCase.baseFile( filename ) - Returns the full pathname of filename in the baseline data directory. - -= Units - -Located in the mplTest directory is a set of unit classes. These classes -are provided for testing the various unitized data interfaces that matplotlib -supports (ie unit conversion). These are used because they provide a very -strict enforcement of unitized data which will test the entire spectrum of how -unitized data might be used (it is not always meaningful to convert to -a float without specific units given). This allows us to test for cases that -might accidentally be performing operations that really do not make sense -physically for unitized data. - -The provided classes are as follows: -- UnitDbl - UnitDbl is essentially a unitized floating point number. It has a - minimal set of supported units (enough for testing purposes). All - of the mathematical operation are provided to fully test any behaviour - that might occur with unitized data. Remeber that unitized data has - rules as to how it can be applied to one another (a value of distance - cannot be added to a value of time). Thus we need to guard against any - accidental "default" conversion that will strip away the meaning of the - data and render it neutered. - -- Epoch - Epoch is different than a UnitDbl of time. Time is something that can be - measured where an Epoch is a specific moment in time. Epochs are typically - referenced as an offset from some predetermined epoch. Conceptally an Epoch - is like saying 'January 1, 2000 at 12:00 UTC'. It is a specific - time, but more importantly it is a time with a frame. In the example - the frame is 'UTC'. This class is provided to test the functionality of - matplotlib's various routines and mechanisms for dealing with datetimes. - -- Duration - A difference of two epochs is a Duration. The distinction between a - Duration and a UnitDbl of time is made because an Epoch can have different - frames (or units). In the case of our test Epoch class the two allowed - frames are 'UTC' and 'ET' (Note that these are rough estimates provided for - testing purposes and should not be used in production code where accuracy - of time frames is desired). As such a Duration also has a frame of - reference and therefore needs to be called out as different that a simple - measurement of time since a delta-t in one frame may not be the same in another. - - - -Updating after diff -==================== - - python run-mpl-test.py --all --keep-failed - ./consolidate_diff_images.sh - # check your images, decide which are good - python movegood.py +Please see doc/devel/coding_guide.rst for information about the +testing infrastructure. diff --git a/test/_buildbot_mac_sage.sh b/test/_buildbot_mac_sage.sh index 9de9ada4b412..d5b89535ae96 100755 --- a/test/_buildbot_mac_sage.sh +++ b/test/_buildbot_mac_sage.sh @@ -13,4 +13,4 @@ echo ${PYTHONPATH} cd test rm -f failed-diff-*.png -python run-mpl-test.py --verbose --all --keep-failed +python -c "import matplotlib; matplotlib.test(verbosity=2)" diff --git a/test/_buildbot_test.py b/test/_buildbot_test.py index dda37c725702..e3449e2324dc 100644 --- a/test/_buildbot_test.py +++ b/test/_buildbot_test.py @@ -18,5 +18,5 @@ for fname in previous_test_images: os.unlink(fname) -check_call('%s run-mpl-test.py --verbose --all'%TARGET_py, +check_call('%s -c "import matplotlib; matplotlib.test(verbosity=2)"'%TARGET_py, cwd='test') diff --git a/test/consolidate_diff_images.sh b/test/consolidate_diff_images.sh deleted file mode 100755 index f128c4c054c0..000000000000 --- a/test/consolidate_diff_images.sh +++ /dev/null @@ -1,7 +0,0 @@ -#!/bin/bash -set -e - -TARGET_DIR="diff-images" -rm -rf $TARGET_DIR -mkdir $TARGET_DIR -find . -name 'failed-diff-*png' -exec mv {} $TARGET_DIR/ \; diff --git a/test/movegood.py b/test/movegood.py deleted file mode 100644 index 89235911874b..000000000000 --- a/test/movegood.py +++ /dev/null @@ -1,53 +0,0 @@ -import os, sys, glob, shutil -import matplotlib.cbook as cbook - -savedresults_dir = 'saved-results' -baseline_dir = 'baseline' -diff_dir = 'diff-images' -basename = 'failed-diff-' -nbase = len(basename) - -failed = set() -for fname in glob.glob(os.path.join(diff_dir, '%s*.png'%basename)): - ind = fname.find(basename) - fname = fname[ind+nbase:] - failed.add(fname) - -datad = dict() -for fpath in cbook.get_recursive_filelist('.'): - if not fpath.endswith('.png'): continue - if fpath.find(diff_dir)>0: continue - rel_dir, fname = os.path.split(fpath) - - - saved = fpath.find(savedresults_dir)>0 - baseline = fpath.find(baseline_dir)>0 - - if saved: - datad.setdefault(fname, [None,None])[0] = fpath - elif baseline: - datad.setdefault(fname, [None,None])[1] = fpath - -nfailed = len(failed) -for ithis, fname in enumerate(sorted(failed)): - data = datad.get(fname) - if data is not None: - saved, baseline = data - #print ithis, fname, saved, baseline - if saved is None: - print 'could not find saved data for', fname - elif baseline is None: - print 'could not find baseline data for', fname - else: - x = raw_input('Copy %d of %d\n saved="%s" to\n baseline="%s" (n|Y):'%(ithis, nfailed, saved, baseline)) - if x.lower()=='y' or x=='': - shutil.copy(saved, baseline) - print ' copied' - elif x.lower()=='n': - print ' skipping' - else: - print ' skipping unrecognized response="%s"'%x - print - - else: - print 'could not find data for', fname diff --git a/test/run-mpl-test.py b/test/run-mpl-test.py deleted file mode 100755 index 39f32a92138a..000000000000 --- a/test/run-mpl-test.py +++ /dev/null @@ -1,100 +0,0 @@ -#!/bin/env python -""" - - TODO-NOTES: - Command-line executable that runs the tests. - -- nice report on test pass/fail status - -- hooks to add coverage checking and reporting - - Utilities - -- image comparison tools (non-PIL dependant) - -""" -import os -import sys -import os.path - -# Save stdout/stderr -originalStdout = sys.stdout -originalStderr = sys.stderr - -# get the current directory and the root test directory -cwd = os.path.abspath( os.getcwd() ) -root = os.path.dirname( os.path.abspath( sys.argv[0] ) ) -sys.path = [ root ] + sys.path - -# command-line arguments -args = [ arg for arg in sys.argv ] - -# determine the actual working directory to use -if root in cwd: - working = cwd -else: - working = root - -if '--all' in args: - working = root - -# print "DBG: mpl.test.run - cwd = '%s'" % (cwd) -# print "DBG: mpl.test.run - root = '%s'" % (root) -# print "DBG: mpl.test.run - working = '%s'" % (working) - -# make the working directory current -os.chdir( working ) - -import nose -import nose.plugins.builtin -import matplotlib -from matplotlib.testing.noseclasses import KnownFailure - -for arg in args: - # We need to do this here, because we do not actually want nose to start. - if arg.startswith( '--make-test=' ): - testname = arg[ 12: ] - # Remove any surrounding quotation marks - if (testname[0] == '"' and testname[-1] == '"') or \ - (testname[0] == "'" and testname[-1] == "'"): - testname = testname[1:-1] - - filename = os.path.join( cwd, 'Test' + testname + '.py' ) - templName = os.path.join( root, 'mplTest', "TestTEMPLATE.py" ) - - fin = open( templName, "r" ) - fout = open( filename, "w" ) - - lines = fin.readlines() - for line in lines: - newline = line.replace( 'UNITTEST', testname ) - fout.write( newline ) - - fin.close() - fout.close() - - print "Generated '%s'" % (filename) - - sys.exit( 0 ) - -### Run nose -args.append('.') -args.extend( matplotlib.default_test_modules ) - -plugins = [plugin() for plugin in nose.plugins.builtin.plugins] -plugins.extend( [ KnownFailure() ]) - -success = nose.run( argv = args, - plugins = plugins, - ) - -### do other stuff here - - -# $> nosetests [-w ] -# Run a specific test -# $> nosetests tests/test_stuff.py:test_function -# $> nosetests tests/test_stuff.py:TestClass.test_method - -# Restore the original stdout/stderr -sys.stdout = originalStdout -sys.stderr = originalStderr - -sys.exit(not success) From b65d1db0dc83185a6b994745a33a4246588c8d0e Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 20:56:17 +0000 Subject: [PATCH 0209/1000] testing: remove docstrings on tests, which makes easier discovery of test location svn path=/trunk/matplotlib/; revision=7701 --- lib/matplotlib/tests/test_axes.py | 17 ----------------- lib/matplotlib/tests/test_basic.py | 4 +--- lib/matplotlib/tests/test_dates.py | 1 - 3 files changed, 1 insertion(+), 21 deletions(-) diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index ed150f20bbac..233f8231d30a 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -11,7 +11,6 @@ 'formatter_ticker_005', ]) def test_formatter_ticker(): - """Test Some formatter and ticker issues.""" import matplotlib.testing.jpl_units as units units.register() @@ -61,8 +60,6 @@ def test_basic_annotate(): @image_comparison(baseline_images=['polar_axes']) def test_polar_annotations(): - """Polar Plot Annotations""" - # you can specify the xypoint and the xytext in different # positions and coordinate systems, and optionally turn on a # connecting line and mark the point with a marker. Annotations @@ -98,8 +95,6 @@ def test_polar_annotations(): #-------------------------------------------------------------------- @image_comparison(baseline_images=['polar_coords']) def test_polar_coord_annotations(): - """Polar Coordinate Annotations""" - # You can also use polar notation on a catesian axes. Here the # native coordinate system ('data') is cartesian, so you need to # specify the xycoords and textcoords as 'polar' if you want to @@ -130,7 +125,6 @@ def test_polar_coord_annotations(): @image_comparison(baseline_images=['fill_units']) def test_fill_units(): - """Test the fill method with unitized-data.""" from datetime import datetime import matplotlib.testing.jpl_units as units units.register() @@ -172,7 +166,6 @@ def test_fill_units(): @image_comparison(baseline_images=['single_point']) def test_single_point(): - """Test single-point plots.""" fig = pylab.figure() pylab.subplot( 211 ) pylab.plot( [0], [0], 'o' ) @@ -184,8 +177,6 @@ def test_single_point(): @image_comparison(baseline_images=['single_date']) def test_single_date(): - """Test single-point date plots.""" - time1=[ 721964.0 ] data1=[ -65.54 ] @@ -200,8 +191,6 @@ def test_single_date(): @image_comparison(baseline_images=['single_date']) def test_shaped_data(): - """Test numpy shaped data.""" - xdata = np.array([[ 0.53295185, 0.23052951, 0.19057629, 0.66724975, 0.96577916, 0.73136095, 0.60823287, 0.017921 , 0.29744742, 0.27164665], [ 0.2798012 , 0.25814229, 0.02818193, 0.12966456, 0.57446277, @@ -246,7 +235,6 @@ def test_shaped_data(): @image_comparison(baseline_images=['const_xy']) def test_const_xy(): - """Test constant xy data.""" fig = pylab.figure() pylab.subplot( 311 ) @@ -264,8 +252,6 @@ def test_const_xy(): 'polar_wrap_360', ]) def test_polar_wrap(): - """Test polar plots where data crosses 0 degrees.""" - D2R = np.pi / 180.0 fig = pylab.figure() @@ -291,7 +277,6 @@ def test_polar_wrap(): @image_comparison(baseline_images=['polar_units']) def test_polar_units(): - """Test polar plots with unitized data.""" import matplotlib.testing.jpl_units as units units.register() @@ -315,7 +300,6 @@ def test_polar_units(): @image_comparison(baseline_images=['axvspan_epoch']) def test_axvspan_epoch(): - """Test the axvspan method with Epochs.""" from datetime import datetime import matplotlib.testing.jpl_units as units units.register() @@ -337,7 +321,6 @@ def test_axvspan_epoch(): @image_comparison(baseline_images=['axhspan_epoch']) def test_axhspan_epoch(): - """Test the axhspan method with Epochs.""" from datetime import datetime import matplotlib.testing.jpl_units as units units.register() diff --git a/lib/matplotlib/tests/test_basic.py b/lib/matplotlib/tests/test_basic.py index a1dc83e7d639..02304d733614 100644 --- a/lib/matplotlib/tests/test_basic.py +++ b/lib/matplotlib/tests/test_basic.py @@ -2,10 +2,8 @@ from matplotlib.testing.decorators import knownfailureif def test_simple(): - '''very simple example test''' assert_equal(1+1,2) @knownfailureif(True) -def test_simple_fail(): - '''very simple example test that should fail''' +def test_simple_knownfail(): assert_equal(1+1,3) diff --git a/lib/matplotlib/tests/test_dates.py b/lib/matplotlib/tests/test_dates.py index 03231f46439c..9f85668fa2d8 100644 --- a/lib/matplotlib/tests/test_dates.py +++ b/lib/matplotlib/tests/test_dates.py @@ -115,7 +115,6 @@ def test_RRuleLocator(): @image_comparison(baseline_images=['DateFormatter_fractionalSeconds']) def test_DateFormatter(): - """Test DateFormatter""" import pylab from datetime import datetime import matplotlib.testing.jpl_units as units From b0f2ada756394e3687abd37aa676c4a69915e8c3 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 7 Sep 2009 20:56:27 +0000 Subject: [PATCH 0210/1000] testing: fix image_comparison decorator to guess image location when test run as script svn path=/trunk/matplotlib/; revision=7702 --- lib/matplotlib/testing/decorators.py | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index fe341d1e9525..f9877492da92 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -55,11 +55,19 @@ def decorated_compare_images(*args,**kwargs): # compute filename for baseline image module_name = func.__module__ - mods = module_name.split('.') - assert mods.pop(0)=='matplotlib' - assert mods.pop(0)=='tests' - subdir = '/'.join(mods) - basedir = os.path.dirname(matplotlib.tests.__file__) + if module_name=='__main__': + # FIXME: this won't work for nested packages in matplotlib.tests + import warnings + warnings.warn('test module run as script. guessing baseline image locations') + script_name = sys.argv[0] + basedir = os.path.abspath(os.path.dirname(script_name)) + subdir = os.path.splitext(os.path.split(script_name)[1])[0] + else: + mods = module_name.split('.') + assert mods.pop(0)=='matplotlib' + assert mods.pop(0)=='tests' + subdir = os.path.join(*mods) + basedir = os.path.dirname(matplotlib.tests.__file__) baseline_dir = os.path.join(basedir,'baseline_images',subdir) expected = os.path.join(baseline_dir,fname) + extension From 3c2d910be8f68e6b52f69e020f4c3cbf0160c1c9 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Mon, 7 Sep 2009 22:39:44 +0000 Subject: [PATCH 0211/1000] Merged revisions 7703 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7703 | leejjoon | 2009-09-07 18:29:04 -0400 (Mon, 07 Sep 2009) | 1 line fix a bug in lib/matplotlib/bezier.py ........ svn path=/trunk/matplotlib/; revision=7704 --- lib/matplotlib/bezier.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/bezier.py b/lib/matplotlib/bezier.py index 6c261f40c311..aca1bc3ecbd9 100644 --- a/lib/matplotlib/bezier.py +++ b/lib/matplotlib/bezier.py @@ -474,7 +474,7 @@ def make_path_regular(p): """ c = p.codes if c is None: - c = np.empty(p.vertices.shape, "i") + c = np.empty(p.vertices.shape[:1], "i") c.fill(Path.LINETO) c[0] = Path.MOVETO From 6bac4436f6243893c673243341dc88af49ddfc6a Mon Sep 17 00:00:00 2001 From: John Hunter Date: Tue, 8 Sep 2009 01:46:42 +0000 Subject: [PATCH 0212/1000] add basic image interp unit test svn path=/trunk/matplotlib/; revision=7705 --- .../test_image/image_interps.png | Bin 0 -> 67924 bytes lib/matplotlib/tests/test_image.py | 31 ++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 lib/matplotlib/tests/baseline_images/test_image/image_interps.png create mode 100644 lib/matplotlib/tests/test_image.py diff --git a/lib/matplotlib/tests/baseline_images/test_image/image_interps.png b/lib/matplotlib/tests/baseline_images/test_image/image_interps.png new file mode 100644 index 0000000000000000000000000000000000000000..e022746ae76ebce5b2a0b7ea9ab0743d5dc39d8f GIT binary patch literal 67924 zcmdpeby$?&x9=b*qNKE>w9<%3hms;7N_U7zgLETEs-U#AgmelFJv7oK-JL`C5O=?P z&+puG&vWki=iI;UJP!u*&KrBLz1Anzp5RxCGB|hc-+{qkIC8R*uVFBBS{Uqx#_e0+ zH*rqBw%{)e`)6`0x53Nf_S+!ve=J*BO?wy&&k*`S%M!~pgTZKFa*`4%E(x1ct{%ig zQ(`;4la`;zXfdLsj7N#ESXfGO*d7^ur^_*&%%Ja%55w&!_# zeE*kO94#I6x+B514hw=_tA84>ZWBN+{{TY#f8NAlrj>+VME4cNuMcA3P4K~oj!}Nk zkM;mMD7DY_#c?JuR|Q1HJIJ$Lr? zSLPYq#;vp@pA9>s*&iY^i;D2`wc(0pG?J2zc_Zx1Ox#A@}z8zb7ZtXt>LCc-_5k zgP@~(y}+&^slus{EJ_7#1Pvy9d9o1HVzhfj?R{=1bBZT+j_-$wCmq40@GT<3ug()S zpAVnDSFU}L(2^D=8uGY@A6-B|AX;Jtyv1cP%;vB*a8riLk?4cHeSfvH4Vz|(TY^wrtw^(|E`yDFOWH%YE^?4A|6* zc7M9MBo|u0+AaSuoeySCDvHdl%h)~~(GN6>i}oBucwe~)j6J4ZT3V{uD5&lO3y#-v z6#py5Q|XyH&ti|$4>DuT6PQn}#y@p(RAWPf0`9-caU;Mq$yIvvGSPWDI5m~-t*I&f zr4Hm>(UJK1T%>(5l8(eXSS;!+^&6-BXeAkIJJ=_9DUPnu}hth!^l(I3C- z5(j7IHfp}TxU#aa5GK~@c{~-UnyWSkBIH?`^w;olnri25>10vQZ}IV;`_p8M!Q*R` zyu~W0*?ZA!#QlZ*@huoM;A8v)9SF;7_V2?pAe3|Esi=$n)%=p}372x<*=R>W%LBr|`(iv-R9! z>nXu6lmhoah&1f?iiM%Js_`sF3R*S_5usgOT`psp$zJzk^xPf}3=G(|GsdK(q`sZZr323jRw|W7nK?0ZS2z@W2FqPPU_Lc9 z!jpDwR2oGFXnZ!)U)BaQ+a_4p*h)*y5K_6|p3pIIo5#y6lvPwdSrpcifPm8|wN@t_PyY1uw8Ce+K0lrDAS|reyVE0btTW;%AxU&6A}A|qywohhj4VLFX;Z`S zGPkhK{C1HqAF>2ieoV5FQ&1>6qa4{~AK zPuI9cAAk%H*A#&B*tj_Mv;mW*c~IYVi5Pl!w*KQXSomy?(d^pqz{wTkc;zhIbB*1R zWg~2B0fx6HPS0I4)S&r zD)Kj2PF0mLT7e0K2BOHYsq1+lZp$D7wI%f1abp=7Ju?U%Fn+cUl(~+aa=$}d0pFvA>DN0>y4+_8$UFQZ~g>$5h_vg&3(_U|BHj<_q z*ZpsaiB{S6P;|NR+8K!t(204$M*1R4ar4G&J#h_3PQam0{psu+9HaaRB~B9)fdTE(_h_>_>{_5W6(Bb! z;CM8i2Lxa&9wxp7si%`qP3Uwn;(L62t|h`|rY^K}xjR116LoZQzTaEyysfvmxH#*F zCknH5*<;}`sE2u+F2!7@#S#;FlVqs4OgYbdjnVfazq;7=F803ilCSGwkX`}_r4fw! zS5SsdE)`WgEmRKq7}tmM2=f65W1wNBpes=kvyz)~^&o15TTxXfT(JeE284BJ{wkXNfLl zh9Fz;JFMbw)$A*pc?1}yfW?-L6=Y6Lm`gQvx=IwD8W%}uZlq+*o-lGt^t&FNa9Y1fs+`iYrJ`^+7Rbf>LJtR}8`yan|( z<%=CemWPqR4=8a9Id3)3TwOZrd}wEkuDL=Xt_Z!1cphP_IhO25(XDS>h}5=E8rv#rxWV3NZ(2 zR~x`X{Qv`jAQ0MRb&!-)UI0jWJs;E%PznJ&3>cW{m!bKpf3dFavXbb`W!gh&_yf8J z5O~3b`ra3ZFdx>!ntPzUIz?WA6`Fz9nEB!mDPMBo)P(airKW}w0)QQzom8i&BV-ep zzs=ljFe@V^-j7&Wxy=R`RMgarHb;wh51`_r5YN|ge!5SETDe4Rx2+_5hl1sWm0T(N z7r>|3Uu&^{YIa*GPLi)qX$%w3&pp7e*2cbF9baA2;8F>G0wAY{r+A{yQ^>j+$p;<* zlx{P)sk)X{h?3}O^LITxz0eEPF+DxKU#~B|a()9?_gT||>se`iAm(fKI#|h`T2lhJ zh10~v<*@q7VQW%=(Npwf*6#$27PmD0eZD=hC?~34};ayL5}C&s#qv`-%t1U z-Md!rT;so4$}B7_^#FSAZhK!*0MN@d?XjWZabwr3{w-df)JHedy$5A*{dF-Febw;p^@Pka=RoyhS-`4_+rY4r^W` zEhqr=ug*yI+}0RN&4*qHew5|4o0nwMt04pRwdv1y`hJjL&R4{)8bIFk`}sU@9;~qs ze+7;w?IGZZO(RMPkc8yBcT9Kg-nDBXR+mLpuKkMNnY8aU94j$7+5Fwh^}dgGbE=xO zGlo;f%MQ)I%Z`IlpjcR)HYTIz@zt#V{7 zKwP@D!Se_Rq?k%LVN7&)8bFAf;F9w+clGu@1?8Xob4wS9rb%9frdTJtp}q;6|CcdzJRXalc>SDG;hn`Q86izJ5u zxp!)6(XQvaZSha1UD7nw)R^*)x2m_}NOc{)kL77T2CqRjHa6bEx-;|r>g~G0>0tm6 z+o3}L0~F%r<>fd~bE7N4WY~k$(73Pwvhy-KeA1}gY_JtPjjd(;Y6Z8#AR8y=Q`4RV zGpF^x?UsEhAIGwk>G#3(@WrreFSBT02+@|z6s?UECNIHdowlc~roB+eWe{and=|r9 zFXiPQQ#`e{OmbcRu?$wGzZE`#R0~)4H|tO)I=XPO$M3L7ICO%bbz6uF$oECF>3_+` zQ~!_$JUHKdMn{+94JAP6Bn=n11ik z_DmSKg*i|&Wq!ZwPQ?x6wY~8HL%Y`PNkPSYNLCXhDZCg@mHNDstAFumol6#-nO3G~ zIA2?x9S3vvkn>hAI@w~{2pf%K_;sh~d$v_rNAuVV zzWomN+hZ8Vo#Oc=K})G^^>ZT9_6tfrF~uAAyFt1iogh0hqiNAL(?B_Fo7SJP-fMlL zGGPa9#-cC9jdl!M{BB{H=U=o&??4+OaG{flSc(tcUScgDV5R%YoSR7WMltJklOT7F{BP^gHibWg--^6>MML_Z1%wF}Gl{pFU7qcu;KYc=EzS@`oBugHAO*e=k;FB!8|${RZatQ) zh_aemfLsLAPXM~Wh)V;2Qw*qeRueSvbS1MRJHv!cfp~2oLO;82RboPX7K(`Zc_Wb7 zQ!8S<37`X0$3GH&b29*m&t)wmW@pqm%D zOB--AXbB;PAgf7??mIb}C+0)|K?DFaEJZ{P9rK--nf9~^q9 zp#1h)pi-;3nM+N^`yRhXXj@pvdCHN6lT!xN%VJO&YL3P&T=v?T4aubcKDY-x7TPRE z`n1b>b|#nAIPXiKmq37|ojLgnqkObMa}a@Ypfq$=qBbyl-+@+AX}@B$HCd?~c&&yp zwEWjA6neD(Rx#6WlCRf9+`OMmqNp$9Kd7MN_YH;KIMaGor_?kpnsRAl>^W1%a+bG^ zD*Z_QAy9lX%k$^a2-o5z4~5F7as8%JTR0w!hoFa#+6953t%R4sdgpfG|2xg@FCn0^ zu{>rqz? z!-F!CLe2!JgGjzS$UHd%h}#ZOeWTO8rHYgJ&&4jg^S9HkXW|YCGc5rM z5|R+!-moX?V%8ONw=BVRAXSta5YHg`f6j;tj$>tKZvpzvT^K~ab^)_81nC3j1HqpN zCDC9WVd&ba;&wOg6@$5%52W#e!D>#IvNeC%uJB8FZJk2EVeh5?b{O zuD!zh*g%pa`Hu$zZKfXZ#9hFZF{uO{!~vUIa0OHP9OMl8FQM0$)=2RAdjparx2J2V z)_`z=n{iccKSGZxeg5-c2p{!qEmMo>(K94o*42c@3>@#aH^l}@6vrLqbB6eOcoB=X ze#JL@4C>KDE6!+`^3MZFiMi*iW%U4)`T+KGygK%qc^qyNcDONu4x{$ik;v1AbIh+o z*ADV+!jf%L$o2Wu8!NM-PThJ1|Hp4;KN zzw@*!bLyXe&edirPIm+eZM$tWGS=1{xYWY$+kqk@0Mb6mza`Ly1>$c(Q86*}PoJvC z!T|{e)Z3pDN|pr5>$YIF2$h5hz)jp+&e!~XD^bw#jsP^1bg6&m*fj_!#Jq$Hs<#9w zJrDX%4hy|;W_MJ-L&+3mO-NCo3%xEHEc`X#Oh7s@06`He==cb*cq|zIe%E6=K*|?J z5SLFt!buzIf%r72e-P{X@#6>31DbA<>i7Ug}MnKpFQg-LU2s^sspW;oxZQ2&wBl@%7FmFy)5`x%y3aPC_x$0>^pME%b=lU5$ zz%qLe^dx9Pz*-Q4DE)Il<2~VrKslI?H4ZIKPXwhI%5H!oxBO#)4Be@@$@&bahRq<5 z`oZ!_pD0lhh0y{A3q+C@aI+B(sO!*_m<6E;1mSlbUY52Xz#wt~)WgW|BTzMif@wYn}|jGxuT>4twk$GjFYx^2At z0F8r$5N{yg)Qu+!yYfJptSeE76sTD^{N~rs={w?loW+v5m|CU*sfh$7& z-W@*WL;(a4e<0P*|BAOB$Qd-+I{YJ=|2)MG@{w*L&*z!=5f#CVR!t}r_xeG25FMSE z%Uv}Q9w7U7B?u4>W-7G-l27T#e?3gNH8)=0r4)9-?-e5V;r&KtR~g;AToU5>^~ z*QBk2+{HG8AP966JDYkZ}@oohm(RM)OLWda@lL5=dWfJHf72u6B8U|))z;o{M zqXmzKQVG2RzC>v$FPI>}t2@savWasrs} zyz7kTF%=NrNdG-)Jzpi*7%yXm#0+doe#psb&C~qd2YAlgw{K^MwQZ!rs6|q7ze5ql z!UZDQ64ag18rR3LS%8U}f%xeMRuoJetl^y)#5rTf4s>MD4NxhY!I++(>~XhI`W?@B z(|}ufh)c=u!=YP63y6N>>h*!XP)Q~H+ye1UNvd1WB2<0>;NjhKP#G$K)L!(i`#uB} zuK?$Tv~f%t4}8-EJL!&O^dJ85{REm1k!euA1X=U>rz?E#)d?5cNh`|=IM3h9FMF@5 zg)9r*zl&4du0#~UIX5q1w3`b7Z7+A$Q5G6AVdOBDyP5H&$hm{(4RdeMWGD9=`dN0*pHFJ}^$Q84H0*1nDqzAzz@U zVsQa$*oYHx&I5U5i_6RNvkiXHHDEy-Pn25`Nc{r?h4s*aHC$Z? zh5#=O!+xcw{3IBtOAn2_mZJt&Dm*>5t9*8gV1d?3lSey+V8_+NDYyDUj| zf!N;rLl0>!Y6UvM+lVV_aOtLR51#h{rw-|q!^{oI&N~;!GxQ=NRG`AuN2%)t2NN>? zvb}pfod^exO>DgF$WrH6sj2(nh=U zEfvdg7DZsefVKNLWA{1_uR*B|n12n;!GybE-skAV#69|beAwuLxKtmkGJzhuIsq?a zL_!%=P7dqx*!wExAMlq$3@s4wv0|f^J1-OX38bW?WaZ`WmR?+IX9Vx#uZP78LJA>j(GTR@BcRC}{Q36aJ*b>sr=9w#hD`x-WzIl=SO5tf69!qDzyWEdxjK>gLL)}a zu3b(vTrFm}qa~bCo(qU{0R3YQKyaBrnTH=On^{rp!a?|KHO&R6b&%$qs+=YbDP}+jXQ-|H ze7%$`0bC-4BBsJ_ArlXc`%BB1y$>h zAe$THAL^HbU;dF^QuzVB{Q>g+wI&G?LUTJNH1I=$U_9x8VJ*U>5cdfPZfW3z%7M?J z3oSyj!iU2l^)z5$R;=gbrsDcTmyu-=S%r$7Cn30;(5$+^1cd3W~vZKDTQP)&aY$QF&)37Y+Kmjnc+uh>C~ zgMEvM2?VP|ijom}B!WVpzjq-M94NW#C*5I?aSgOq!0K>7B+`Xk!|tqGkZ_=;Msjw9 z+>lKMvMX#BRC8RRYmPzp0B8kaKI6ps?ra~Kf0{*G~&kz0(&VSbjgGWH!0K|AS zSTgcR&)NCr&Lu8Q;?}V;Gr8e0CXD#OG3gQC*<{^RpwIE~X_m%TAtL?L`TaP|CZvsx zNyP=#j^?%uj0TlgJz^??IJZvIH+gWpvhr6UI{A$^Ck!$3{q;=Pk0L-OY$)V&FQ*V< zA$Xn;v7;Yt{Ti6efSAYeK2-8%syA2-vOObJmJxUCu7`vt(-%N^ddmkI5kx)DKz%mj zdI|Au-&BaQLwFYy!LhNie*$Px6I3&ZT>yWW1{99Zf|LXG|K8Yx_wzdE{hw_>S{)r7 zT)=FAiY++LDu5!<9J==%HB>%BgrHdC<;je;O)asb3lUHUc%YsTU{G>^E){~$El{6_ z;TVK1px=Qq`W?gt!1(-^H}5;V?H92I*pA*~MgZtK^g(e!k|*pM=_V&Tb1nd)+5t2; zn;xOq*yw*(Sx4tfN5=~yQc@Wz>LDXY+*cGr^2%!g=3;|} z8)N}c#!db3D~+ZkgzKbhqdj7HBILLM_z3DB||o~a0{kY`u-y^tD45Z zeV`;s$4aJuB*gzvW%#70|&&b1)yEN>0-ti%gRUBs^p}Z( z#K4u6f_&2C;SNA5aZfC`+>b140N#eYqdwr|WIbmPoVNo>{h=Mu_2&P+QTkfw3_by5 zDk;zqV+Xu6sG02{q;Y5sqYl>mfKD~vc$c#oq})%yZ4v-%IqN>K{nbxTPaAV7hhl#3 z@9#I^2Cru&Bv4{g2@>ghoif@4(q^n56ZhMd*smx8d#t9Wrl=`ZaGex!auejR9pGon zP~9N_aWeol3q?jo@^8TlypEnbgzM+HqyaRWHnX{(x?W9De|El@fqH zP_b3D@e25PkiXxbD&+!326EwEc;5~QwKQ)1A`#DL)t9gRloxa*%7>GtNp9VindLbbSVDr@HsOH+v`IF8^YgoYl?p}yG$(=9F+qrrmfFlvgIIHnoFh~wZd!aIH&6s@{Fi{S zdS9Vtiow7qfB~!kq7mp=3d(w(rezK!H>fWPY6;t%LD0Cmx~>jp;(@-0M#QswQ1ch0 zox!l1f@Y|V|0SEWgk1#ab^$lpv@%l?8tj+FM>U@+A`*)=M>o+<>76MZ0&6V7((@c zbg4WuH6f>9t0bnX?6hWQkOVe~ZJ-v;y>1Q9`a;_N7boQ|r>kIQFdO^WUaDi_iNnSP zKh}HRkqPaO)*gB@dk*_=msAeVTer$QtoYR&HZQO>yrmi|0?dUJ#X}8n?(=48ncqtB z9~oD5tf>=X+PA)cglKP#?aiYB*pJH$c@R{iK}fq$`nP%OSVdM!FS5|E#I@89d_rt_vf?q@&yW1kI$Nuib|il0dYkQhm(HXxS5uu|BpR zv$cLVq5d_9^~-lC z=bX4sy;f#k^;SLK8aZp-;QQs4{I}7wz+RR)o>|aAHPErdHOGY0waVm8v2N8;ZSz{0 zCH}5|8IA9Id3AQ-uX0}r@oyNJ`OF=^k{znoiH_MRd>}WHoqK3gQhb)Zz-TQI_dTTl zuq|3dr6`Bg*J&wUQ^dY{fG3IwLJ$^6t}4@z%+)+=Yf*{M~SX03J46_}H9 zhwNH-XZ&||Yq&Pe^yXET%#uh$JsDW&m+T$VEIDQaM@fW0?8E8KIHGdYfPbrD0yuZH)t9@Zlr6ZX*( z=sS)HI8i!(3-Yesj`i*u#J?&3@zTvFGa{4Mg!0!rfv-mlX3~d`#Uv7!t1`2bu_CpT zM&PwROjzxUtjGS#l@Y^E7=2Ek7`rD=(Qs?~o)@A)(m^&Rv_?QLULn+m3c5CkmApX% zZ(oio>%r>Whu5tGA4|V5q!rc1la&ZdXlf=o_(Uu+XC9>}JXULZuGwF8#2_EO>{`U3 z8NFqrYDvA$K%B|a${_uwuCVp}vcOTsBfW;I!uCQ2YUIL{MN+L5XR%to{0#G3WLA&K zR~IQ>Opzp3l$pAkOk~o_F_@y1zFDYAgZ{McMpj4gRrvNASMm8qLLLjAtA3{MbaS&k zq6#IY)t29#GpgIcL<}eWan2K56#!YfeJK+B+co>PKqUGJ+I>JxZG(LFaf`w^;7NWm ztVrlLGZWXs@AZ)#rrQ2+f1?8}Ay7#~KUuiMiNUpzY_0^y`obkh>2$%^2it+DdiTrj)+LdDN*g2bvQ;l zgVIL+Ur*l$+Dr`}W^WyFvx`;FH!X3-x_pKD8mGpwljy+V$6C7z2G=9nA>(xj_&LxKdkGk{r zkzH5T@K$jxkE{(b2R(ZY*J_2_<;cDo|Cf(@3Bq!cR*l6=**Q7`Q3oT*o?~v~u9k!J z^ohW&1iK>Eg8}e^WOSg^9qI|NuWA?3lD%Aw#Imi=$Xj@=FHk|ylJTasbG8#X*kD1P zsD$~IECVHDuY2tHcZ@XYC?@%PL>^wgk_W|5-M2+;lBw~7ow$kp3{;zykd$k=Lmf5&t4Nibalv3>b)x@e_XY7qdQTbYYk|vbJ zK?}~FD79rxW@|T_k5BwQ)FP&0smDo<(>&bw$D=W&0e^M`n>#Sb)-DTtDsVzeF&~ET z6l{;m;Wnoyi~7b+-rBVGQ-WVCy>BwDu{KFh#%+%*JKoN);w;Rx68O{pVjeNx=KsFg zn3F!_`75S1x#}3JBX^EbePf9)1#J?laV0ny`{QSV`V5g13u+RT_j{(CeQ+i4pi387F$Es6k^+rZ>A|`Lehm`B0 z6pZvMyaluLISUK*=c_C%_2BYRG0oibsB-@HI$MTnD&wOgMw1(ro=Qb|)rB|23XvD6 zAf+m?rS|dDfs=5nH?Mk{%$BM{-wP0*?(!yT7djNUj21}$>0mJ;n2w9wu~Derb1`RP zI>Q^#RwB27TWG>n@nhJWR4Lmdm4|li;&r>TH|*&eX3(F8)2Rkkwc65f*S_Ep8(DC%9X-g6wm zC0@mt^kJl#b!T=DDMz(}=%h9C2lt{$2kPi(Z-tEq3!@}&7AC5@Q!m`ULmH!ZPvPA7O(0VH2j3DeOgNKCqOv3GhW2|c1InzXiJ=*jHO5lk`ZRO zlhI;LyuwLWK_{2cE%cMsN6F(yu<4lz<#?{%uCL^nP#kgMMTKwaw`?q1^kx6CpMW>I z)Rz8~#q>w#~p`vW?@_i{>uOu@)*UCz1FuJej9G55;cre%bvYg_1q0 zm33&5er^m`hCF7%RWgDk%yqZv1#|BJV%CX6Ga>8I_8Pm~lLv%4j3uQ%M>9KwWsfU2 zymsD9qXT93I%+CeX&aphWN)d2JIweM(%w=GQ8Mi>cO9Ef?|d{*r0^)+j}y;Cm3w{b zF1+Cv8yM@ji!5|g%Q=-t!IU+LabZnG;vGYdN3SB7OuR)W~3I*+Q7gpNwAk?YO# zmV((l9Dy0zj#I+$C6%a~w1{pw$J{9MXK8Ms&yU!G-tKU==L#$?B7ChM(tjB&e?Rd~ zIX>EoK*3gLU!~VSi|OV1M3H&8ju-Lty)->n-CF<~LV;sYcT=99jEJc3J`u}6*{z@> zk2#?nxW}A}EU)dozsEH;k=vubE<}g^yRx^OODc3WLX7Sm<`T-6Owf%zZQP41UM8@Def{I@<;>)4CEKsl0gV^k)NuXy0E1S(Qe zhhcH5|H2r06K;y}EmK=ft+lgc+f9_2CbUk95W7V+YW=y&t7(A-{3ueOjvMJUR-HJM z;6^Ta6DoTkt>=&U&x)s>Ww2=zhGpexBN~q|Og?FXeFFJ&?>(Et907%!5g2U`nJe7V8fH0vjtC_9^v&hc)FE!(6}=@FY@*_Kqs2f$ zO>rpGvTuGkdg7=Or$QKyO$yb?sMgQtdOx8u1C_U6`s~4r{VMj4!s-kb^7s6TuxQ%6 zgu9!#ndR*d3f;RlEPu1%!UY9SOYA#VHaMr+s5?&-M)K1_9)9^ChI8`5^E6SBBa123sKsOJjDZ@46jS^{!Z#G4`lLm@9`~Ao(rAfw{Qk2 zkcAcH8PJ^6v(h@^flj$??V?H1nyFhbJxpYYv%s1`%QlStXTd~0%Z`U;QVd#jFIpU% zv?i+2DExxytHf}U)q21r55hjW%Ea( zO!D%oRhF7?ot$+Fy^bm|hkWzuWk$ja#lW^;X(JK(Vk^1088oS zgB~Nv2Zm0)2!>9r^3JB+t*ng!XO@)^1Kns6NlkaRSDo4BPlHTia%lpuhJL)4EeMre zCkr-VGfOR8D8mbv>h*j-$?+@E)T(zJ{z!>8mb7`R^2=&8dpo;nu+-5?bZ5iTvpWPeM>d`J$_%s4zL&Cg z*<0#AOQzo2yg)rP4r@Oo;m{mYS*e_Td>s@R`ZK;6LiGbw4kuIzvY1M?xH_B2oblh8 zLeYL4F-5eU`?Z`V6L(@f7t0c8Ti?#_mU1$-ecalh8r`MOBJJ3H&>qvmV6Lt)f_!r5 zN}bzdHicDXE+%`Nv0kRU=pXg&_JGAck560!q7{9`YfmZy5AGo^bYv==0N2z^M#`4d zuq)cQrrMz5JE#M--9t3)jsHG+u-e(5l}F=w&UgTg@1FNfNq6z@ z-%>7qF7w?kHp#m6sD!7ZA?htx=HntcC-Gk*2I0*QS?SrC$J7kt%#$CU9S*=ptQ@9d z&?qq*-CiL?qaCM4CdyMB>nduQtP2axDI9vy;Uj-!62*Jb6O9ShVW9CooQ^a3;laX07gBYkosO-Y5Fnory%#N5PR8b$y|<~(V!1o9Q1TZp;yvf0 z*3^m7>}1k0oXqu3UVoVHlWQo_t~}#2;*;Jn&_U5e(8DV>9gF;%oyEKH#9HcKWqzqu z%J-_pjvX$)DInY(5lYQmMJ(>gQ!BBauYg3-#oC9rRU8sZoK zgHlYX4oX^~cD%>dWk zb)4Y4>88lQQSD(~-D+O3$U00_Opay~&jKnId-sTkRimELJMUAu!8Q5VOzuA`DM7Wemog?31T`;z$>?){sl!UJcvf0&_v*j-Q z`OQu-FId7mS3WvEl(UTvP?^Cz@n7j(=Mv8Ds}~^gS2bJLV_NrL5>o*#JagxccCtpKGpURT9xNRbh?b6TrHt_g zWFh6vaLr(wjC;|9mcKJ{YVl;q$Jo`wd9)k}%k?$X=(~%4352H~ia>c3OaM{W^VNqJ zeR-GlcMXab9jEMTq$|*a(+3&QA8S&HZCIm*kNL>X93z4U-{|6T-%R}VMc!2RUbS}h z$J(U!^b7;UL`-b~>S25iuh;~0*PF>lOTz(-B&UlhzY;bp@odyZKUq~pl8P4~tGj(r@?%g*1w3uYEY)965D=I3gxFsw8-TP?5^tJhal03mU!dvW@ zVqysB9{8yZx9-0g-i1eSYgb}*#qV*Ju<95~IeW<7k%^LPfUr^~qUgwfMolT`V*SVfSSZATOG_Yu{XQZ;g&iQ$yej9wqh&7`L>?Ia(~jw=zTNX}`d zN45q`cVGrfvH&9k>IVS=>Yw-Ma*qwtC&UDJr9}8`wegI0zO5s(*!?)*hbfpwSTtJ$ z6~3d^-7eTtNik00Ay58{^r|OW;*%KUInD{cW_NGjA5>HO_7V>i&|I6Db>=-d z%_N5H?YS<#tq2magEkH|&}9W0^M5KOi}v3vzI2Nv|H>{W-C)9XhvUu2{;7l+gYw9C z4z1(YYFZttuCTlLNljsA8iV?_3C@tC>h zBtjiPV9Sx+!q=y%V9O%ZgUP_1p2&?UJy_sN*#duYLVnJ;Z)l+(T3CG^#TVrG^<>D8 z0WX4_#?#$O#%9Ki?3;_OI#LLEL3_elm`63`qBHD|QXq*?)DhKlU;6ZtD2zwncxu~K zxhzkVGso!5EG2$MC8Dm}Mb+~}vrx20XTkZ$=E)dyqhr67WX@iWV?PGHVI%E@l>G)q zldOhQ9sC6oo+$IZVeJauLJxlH-yiD2a=h4zm^4L{cimN+%D&M4QhE8TMv;Frju=n; z_dHs3spqzLD5oM#?$j-*Fwh(ZwnJlr1}O<(iS`#8%Ye?Bw*8lbpTLe?&^`Y8zTbDl z#y@*r?fbS%>xf_Vd$)f4HK46aI3Z=%_QK!DxukLprg_2PC}QJ2ALy5SCc2O8^f^2v zT4t_JI(d*8#Qeufz4?1M^1xp4JwolFD0BE!k9gRa3Vb`9Mn9$|>0=%nIZ|cRMSB2{`o{@_&t0p&sy%EhX2PHwD*SvnBw&vPZbzZXjmH@O} z4RqaN!l17h0F5Z1EedSC104g6Zqm|>Mn6PRU%gM-uO6+Cu~p&}5t$_Do355{u+s;t z_rX7;Bvfqf#mFh4zy5k8eE1;OR5RwPWwI#$^9FNi8cW21IBQ*=or&DvOj>P}AO)I)wJL}4pg(?o0ZU)E56~CE%O$+baM}G1mKSFWf=f^vf~H zw->9+JH3n&N5x?dZVQ17O3ru+jf>NB#{%5&EW2bH+F5s3jS(-xAUI z^hkWkX0t(Rn9fEu>u=;lNYaeo=dRi!mC_wSOUk1P^JDEl9?%|{dplafdrSR@_pn~u z{@I*KA9?Sf81=bzvI{JW%qMd`mY~d#lheG(MAzfxy3#lQmGHbI3*GGtchQ+mEAf!`BYhL4hn}#6< zcQwB=b*5Ri#^|+ujcdh+kL$=69|rE}N0$I%vV0pAyW1TKr5ELlxbLf z5wn#@PWP9Mg7@1h4BT~5&e%S4=`RVDv_4(jG4AJYedD<0B8&%1JdSBLX|dbTfa5)z z>eMWGi|W)H-nhIsOi(j&+nBgCpG`e6FYfkdX0*n@0mcY|v7yj7)`umc_twYvYB*Rs z*YuX~n-?`m4|BVFFQF~q(E4cJ&;*nWze>uIYlth65^Dw57)`yMiTC^(+IT(W!1xe+91r!zVroG4Rrg0WQE zV}`dh|9N0U_mY~yTdd@em38|y$C|yoTbG4mfx{Kq+}efmPSuMILHO8dn)|zFFMHa9 zp6K%Se@mYjAN;|>&xCV-=@YsK%1t$HIK8nb-=dtEs)n^=O_9Sl?h~LY&=#6asDl~m z^<++RxdC?S3qarM0qyGt9d0eqcV>uzZr6ul50+ORIEdy*;zk5rf4K!NLlhBv}CBw54G6fCS*Bp_f~KQ&N!2rk?{WgOP2HqG!#sK zMeUKYP-^*G!h2sG$D+dC7W%rF(Gzb70u&0(?dW{VXKt`Z4caJQalY3HZAngW8aD%5 zGFhSTiJ1ePG%aAaO!7D_&xHq$&3t?zJL_DNgx7Wv?aU?GyU}nAnz-P#^^&2rqo;zZ zW1skuODYqFxf_2*a#*d~9FrN!kz{!+9U=3Q&+2ORB|LYDdQ z!cQuB=vk|O;-W+xRh*Gq{$^5o{%E3;af=2o;*Pc^YNv>K^rtSL643E_<9`t&n+<8OY9&+GN|zp z>eU5b0wk2d-OTecxz|TyhUjB6o>;qn2ZrAbdG5IpLZ$-w=~$gxp>9iw6X>I2eMlPd zy|ZDo@VDPs#%OxZ!cRUSUD*rcA}cLzo-taehmYw0EvJ=UN|ABvlA9;N?P5f?tv|i5 zP2#bMH}cUoye*Qk+hj)I4vQYC>I9l~#1s9)x(9_eu3xEKIVR|TFx(Eo^tNPJ#)3;+ zdD8#5*k;R2GN4ophZ}p>Hg8|dvr;}GL?4^gFT*a!}Moy#FT8T zJ<(vZZY=L6EPgpxzxb4{kcn~Mosw>%JS8|{boUCNVGE&N_N>I$Bs8Uo6c96{WEZ zr|qxTuuSXJN$=%k;Ig?b_Pck03iCga4dhHf^uZv*pw)W|kSA`B5?hym9E*gkEC!ON zlL;VV&m-G^a>rgh(eDqIa?VyqL{tUBdxXNwgkl;FO%m}WjPTnr3(8nVF)LOBM&=Tx zT~-RS_R4xJEo?s1$UpAdVpxdDFSmoj6y6g7#e>t>KU9;Vam_WM0W_L53QQuI`*G0Y zl0CI9I``sdasH#Ci=$P=(_l;;@*ll{dsg!5B3FT3THWg}K4nl$D+HI>wJ&LL zN0&`kuFo1fHM`UFR&HK3A7yx)(uE0+Hjw-~1#AG?5CA(+Q3il$lXD0V}+B%G4#-p6(t5>?9vSl>RRO* zTFteN=z2n!-Qw6U3pjH#D#ZqW^vn{s?|!)PRA48Pc0;`2>qy&M*XhUtxxp& zY`=EU_XtUgLe`7%8v#yjr5}muygc1G9QL^-1Og^)NJ5x$s$i}#1}Gh>v)me4_^3MN zQQXS$v1GOwA1p%|1xQkzKf)dyt@i#vjoU)gLY%o>-I|Hz*YBw7Bp)2-6e~1r1&7au+n(1>Fc-*{(U0Ol6h8kty28XH+71B)Y zRVoPvrjxCNhW;VO_VCzN2z4p zJ^XVQuBD6khyz zbTbV1cpNkth=*>zy8aPN|68UkPB2&2WSbOVGb?T|0zvtW7h)}DY*bg3`AMsygt?GQ z>u6Nv1wCEEf7f`x;6La$xFtY}egV8R65t3Zd8mMi;|dsNfLSOdd@>^SJiJ|=&&WhA z{p2jxpvAT|<;`AthMorH#%)2K(-cHO zi>U*HSqMhy5r46l>!Nwg@!PYxdq;nRl7uB%-Z#c^)KSh;F76PF6YZ0YIsH_jSf-n} zx>{X+x^g_?X!>I;`YJHX?CxvKD#PLV=@@041|%oIVX{+#x4eA45z^pH&wdy_ZlPkn zuqrJ}K}GEuF5LNKf<@EwK{M#l(Y*)gu?`U6f{z=GWpYyY{_qaa1VBW^0c0_Z= zZr1*L_F?9Rjq2-n{PpsjY-vj_*k6OESse5@NJr-)y)oplIQr(|don(eY#YCwX*CqX zXc}B`LHGK$$RNCiWgw?0@YhMcKK#si`C>P0aOaSrS!86a^xJ;Yi7Q9DM=tv;XW8TU zc-+7R+rkQcp6Ht53xO5H!;s*cUBMZbRQQBVtQQpma_a>P*jJEuBn;1>rv{WqP>&}l z2iy)LfUn(}EF^(YRt+s-V`G;CZIlVjZWQXEgOHq zzN2NELN17emJZI8O97z?C>7YooXPC4t~Wy@yBubYsJ)e#y&91n@9cT$PDQucRlZ)& z-W@|0T5HAD2riYX-yMtZBtXX%w{$+aVbwr=aq}vo$J3h3x}m74B4Vws=sWEbHIJs4 z=n+{ZJ%^SZ-#M877wMLv94W0H*i~~;zTsGAm`Gc1D9L{>1fZ9Ypyn~p@sm3eRG@Ux z+8PL1hhYriQMhS&=&V#sodqI7%R|TX#OTm(3T!`o(+73z9~G2yZ@bWcVm|l-!>Z9C zNZhgBs4wASMOZWPn?aq`3`lGu6%L-%7hAWQjkR3w33=$)-rN&JlP&EDEn;EYtZH?V ztNPY z^gLru22Qg((p@Z+Y#PhLCDS#9|9d2W4z~hm+I*KMh}EB0fW0>YXrggFkNS&VZ3jP? zw9}qyz5n8Oig1e-rE=VF!HiT}`7sJF?K@7^!OH1l&8gYaj3VQVTt>DT_UY+Y_@B=( zGcsqCEh+HUdCvUyr&0a);<`7+A~yEO(uRna4Rws~UalPdis(0FuB-TT{C2gjr1#*= zJ45VeY||NQz-vn({UHG(ts7VA^^b@kIuV+|Hv?&`Umsy5Qj{0i)xK3ZYEq^y;t1*g zIe#L|`1g%ipF(gtsQ@Ys87Nt}fHZ0q&*vNsNM`r}4nfyAA5b<#vT6ZiQ+p3dNJR=9 z0qRn)UCRXq&^y`!TxcY0dwH$zs>^B z)L@LqIH@grrO8(;!c(F$uy1_@^JRI3we9-v?8w!I#au&4{HJBr^*42o?03)Ih96bi zF&^F9Yy7l5zfFf2s~Gb_a4xCgbnj^>F!y8igjA-P=zZ{yo=G&LKvZ7KfXPvDa4Z2kh)A zGO`A(r!${Txg`?qUf-9#4|NTt{=D`6WlADHbqfdnqx%GzmTlZr4;H*y#Qt!l6kP6Q zZl`RD{zWW$6#vnw&Y$Di_bM22JDUjrkaj7+BO-~w zYY|o!PuM(RldE+#O$Gx*i|S||H{Loqd;M5P5p7 z@5a%ARTFz{3jNOXIS=;90GeVEF0-a2b5@1LTLWCfIe^A^bFynLHlMQz2pBoAnpyfb z3ZQ3N1sD&PGd-g87}U?iq~%R?>{s()ur#8~roh^jAGqw}?~FzVye`qxUvcvGkkj`t z^l`1%xLGB3U^*B&4aRKlqOML@Sr?Y;#c#1VNk&mZ5=EvYrSpeA!YF#b>&z(EAI;uy z7Kq9sWS8QbOSI<*_4}QHWq&mMa}3=nn{MgnMsy|U@PPg0w#Iv=A;R`?8u9elB__0M zCe2t(N?)5!q?*|{$d8=_0Vi9gr?hL7>`b3D)!~puZJedrk4EKTB%jEHt!+I;)8|F}rc6 z!Tz$yMaw~p{N?Z7tyQM&i(_25V%wSDtLAQ9xRpf_&m5gZlzTF16EMlm|p1B-4 zN_iAH>Io+3)yipH^6Q2k!$w73n2XeU&$wh&@L0mnJ}d^)CSB>(O0b?27yW0jGQBIx za2gT_)(6|maX=qe86O`%Y)CdIP8}TL0XWExwv#A8=vBYk7S9dq}mBjWV@BR9* z3dxh{p?KOCZiT;cl6kFrIFPR-Q&}y|YHwB`o3t(Jz(|hycrelK3Xv3ImEl1>S;Q4w z$&V>ma+P1Am)ltJv2-6r0}Z+o(BOKLT{>^keZN#}y8Bz2bECTpM_Tu2+C@H9y(KKQ z%Q5_!waMv=LcGMZ15u(LA6u#;`&ISG@o)_h%B9=Q!_!Z39i9ONX`c-moD7YEDO@s) zBLsqOZ};z7xKcq4J|Bn^MgkI%43a+8{{hg0#(`*~qQ~{Q&v?RB6Mtih1OFDk%Ea0C z`0jCMLsO+=7kuY8n*~#s=9W-^l7Wz~qNQMdhiq=%TR7N_c8Hso|Cery6j8j`k3)hL&b^||(Iyi6 z6;ics=O1|e%O#C-OLw;?3YW>It(nMZR|OP`O-VvF#g78 zwSu>_n~ITJn^Q1PEErnb?IR2!2r&+4iXNlgN#?BDDEdM2%hRPs_#~zGB6<-s5ywLjC#0sI>Vk z>-X(hZR(bGz2h^aR!9|KwF?5?_MjtIRS6>s&9<3Qwctwj1IY%55xHgII2-r9IbSbH zb*}TU%N!S8&dyawS2U<<#A8i~uMOh#`OrGI&7B1M%AxdVjj?%C9rjfK!?1~jF~=lc zqUtgQdgeKpt}&5S%F`R;e3>g6T2kNZ;&mB)j4B2t|G1i~?55-#HtsxNUTpj|oVoOk z9p8?zwDE>Ick81aixMZARC=lP>_ZE2M8rz`o2>qE;bl$&EQEyl@EP2Eg_$L-SnU$aEHCp zEo)+SIv_&xF^s;(S_Zd%aU(E=G}gF7FeC-yTe^CAtbtNz_-UPmB_Mn9JDTZaz;2=& z`MGp=w_T}*#FaRMOf3gwWbm3Jg5~$3k5%ed&NXi{*LGd5aDJ(7!1Di(M?j*{+hwII z?$7Bfg0)|`s?}LndMP$T!@^sWPi50o1Xi`WNCxBmt5N1)2r-Jh>xWaFewft8K@BB{ zE;etD(^hn_Nz@|p0g{j;^CPS%G!N4g!WN$=_Er7d+}Ko)LMOR$IeI@5ZA03@{g6Az zRX^f`IF9Q^G8yC6!;=Y%U!4~XqoPmP@XOo3Jk{wr!O_YT&3qN`u7_Kh-dWn7U9nTI z%l{(6m1glZUqW{kjWw+hZ;nIz*7l~8>u3sZq()vu&}~|EY&-4kFBgiRYgIB9t#sro zp)1y!^{2kqd8ekDE{QwX41`D6oNq+xIN{{MaIZn*BgtgzC5oymVEcSkTizcRrxSw8IH)ZN!1c7!?Kc)i%o2F z_fNeFiuN0#Pnr)wNn2P8K7XSn&O+xNqaU{A&ypI= zcy{?V#}(JtVLKU>s5CL!2p+P|eJrqlIl)0WPA6a@SHS0T=DU#4@KU4ri|BBLP8t68 zM-7cIXX3s$J1-Li$P==UqKc`ayk0Ym!!1WxcDnWm=YJk>k60~ayHWabQqpNf%f^Z1 zDOrEc^qLSv)sglpFPezltxMeN77Oc(WWZJ%u6pD`ijBM^B=yG&a609mb!@oToVCEJ=vi+P-%w2oe0Q zP)bJ4ATtr)MPfIG&$_XCX8mUyJ)f{j#Y)bk@*8#>Ug*K0V-ptE zXC!LYrxK$-uHp=Sq@TS!Wif-8Ojna9V;+6iemQ5Oyy@$Sjz71+sFCw|2TMQp9pAHBf_B_2TTmk->6>|F`Jp@zPZYoeSnp5VcjFu&tSr3H{)V#d$1+p zJ8DeiEM13D{55Kef5c+$&Ai2{Z}E0^7%U_EV0`yl>~yr9AO^_u608cb=F= zKs4?CgbGf}DtN`Y-%FxT-iq2{*;TuGyKT@8Pnk((`1IlUmr7J{fu zqu#bQV)1n`*|w-mTMKJPZFSbKTEg$qAlF43PK~n$XlfO3-&bD4?{TIF1S@1#PjxWQ z_@yjQ7)Q}({X#+W=3#P-N@Adb-3y&j{;J%I5y9(x=zc#A4|`qNd4=im$eE~J>Pob5 zVRpnei@*C z=Ur1og(A0DC_u^fxqAFf#vzcNp~~c0*C^v%Uou*pu6=AFt#I%b75YZsHyVR4T9e?H--F{>SlpTNdD=wAmwwap z?TDMF^7B&AG74(-Cfw#qZIUsCtEZQs{*=X-vsqg0wq;FwKFr-ZU@V%B z7a1%%#Lm}1Dffm<;Q}>u+2|5wo_U5~`ga8eyZi3q=%fF0_6#ZZl8^7`?o&IoFky-W ze`rz`!*|Xwk1CDlw30A?TpVm;bN}2Vurp7R8=(@+_UNSs z?h;S1CViReD7uA!hU&~wIB%e5b66YU%!4^2d2={%RXn^)rr-lk5v5vMo}%#c2R#Lv zEi;tSF=HI}Hc~Z3H4;p9+4l$nI;Rzy!*8C47xR~?{t>V6D-4JWKWkyW(#H znu(??6DIeMUoEu;iXxLe(j^c(DQmG%tFE5GyGPZJoV@%EH)*%Iqbw}>ayZD@Nb2Od zNo}N+->LJt(&`p8ey3&4mk4vEAx%{|`y@l#uZK;Yb@EB7f{gH)hLDwhKHT)DEE?}a z?x#PdIefVYw16OeS3hIi8taMLXE3@MqXed=n2F&+ z@Jc1NfbMNyyqWF+3WIYY7OndfmP#O%t-FVf?;R2y4Lx~cQ}R$`DSEqfhPaw5tGDL#I41ki&R~3b zb)=?GxbjcGHMa|n4(iU^9aHTonsPC#RoJpiM)$2!(F1Q>>I6*QdccVk2cMFkEQ3(j(xBD=nxG$3%iml7Ex&O7?{W=L=tpl^K zx_U+_IC~9h7O`&^QHB{`+St+ID62->=&H0E^;vt&N>qf=DDzfzv05XXYSQUMes){@ z$ygJgM!|dWXx?N?_4HCLqG&^$kd(xiZRbhakLlqLT#K-Z1kuv4y@V?CN@$MtqipiH z=mcU8&Q*!(a2*4use5Su-9w}BEx-wz_r3OMpJstJ{a27#3yKcyEjzX(s6Wic5tmK1 zi)CFWcV2vK@hG%i0oExu^zyZAMQ;Y1(d=3fFX5svVg5ZK4|(NgS!zMWH(9;?38h=m zwN+6J&)KHuZ#@fO@D~>@p~sf32Pz42qi0PNUR8T>%uioBe=>c!W3sm1<78DDnuxRa zU9^3}(nv5{iR|mjrJ}J&0>|LjD!f=n&=J3XjJ5sIQS;q|k(NiD!|1MR^&qaN>;d6_ zN>(UHEeb<--4R|Cnj{8@yW-ai0^b4FU0HH#Upa=SA*G4R0iT}SCmn>RE+wm!7)HI# zcYd7e+oBvD>~O?g-@ReyvgnbVyDli1k-qB3fAd5+gs|k%*WK*4sm_c3u~Blxjk8xh zY2TSm@?X#%K5&tDF|8G;d!IF-3hyp5mh1Er?N7pU5LNw+LUQW&!kpAvfVaDemf~;a z-S<^dO6(XVdZ@8^#E@%?rcJ5Nfw@0mRw2igu%DgRjt(5;{o}Ne!jhj!*z(Zugrjbc z*zU%d@5a+_<3z8Q@y3BTjN;|OzPB8ZM6Ut{4C4w6snYwNn?f?P4)>{_aq6KH9dmAt z>=vLJz;NX2xJl%>ow*MKIIk?BHa|6L7z63>x)m~=EbE^HjBPuk(!(wZhy$47yT}{g zS4tc27*DWN2lt{PdNIz!YKUCzquRF~?^fzF_^tEpsJ$1$PoYh*aU?D@gwnZGQP};g zdBTn*$gDvxlU#TC$h4UF+p9Be^{Iw&Ma`@H;10j~u@c!7e(#+vJ6c#w?AZSv5zgJQ z*qxNm&9sjaQV5hqv&C=R;~IjM<6irw-zuRUYS1Oh72 z`Un0bBj6Va15o2ZfE&Rla?pkb2Vx@?6nA7z(iOp0jstFa*hpTQF?4QIJC>NHKveuhY~(S({C@BeQt3^Ce6%c>sA5 z(gW5lCqRHKEiXSGSw@2cf2a}Ua|J{z%&n}?tZz@D_HC%}HdM^}by5(4K+r{Jy#!Uv zLJVrXyGJyAA85Er;2LL}8MUEXlw7}ewWK2X)q9f*I5Z;1mS_CKPu8g^M#3Gn^*~1! z?|d-=p*m zBWnSK{_!5sGY23NXpf*LQhDi zW!zKpDW9l}dQj#Hha}EIXU8L+9KQE*P>owy?Y>x3ZOtWbj3yCV=tyn};SwUMH1q=N zNB;MZ5fiB28_U0&>ihhr9Ut;{|I!^{K^v>#8sk`hB&X#gC8|df=QcT6$2p{+{3IL5zouJ;?ie9ZW4U&7V>lLpPjfEm}XT#+)8qe(qmUbMJ$zsbi!F_XSy`M z+Io6yy5)?gVL6E00@xg64KVs(ny3j2_;u>0`@`E~NnYW<`9)bx5QgLWt-O4)m!3g? z@E-a5D2V-0_ZOdCyW!+Cvl_>T+eE)*TKxKb6z1gFR*L2HZKts3VRKr!el08xS%FpG z?TUpJC>hC4`Hi;JhoMehl~=e$9JFM2ybU*(Z;a}tE$?bHjbFKS(H~A^-%mvS-A<=C|`$O#Ufnwx^Fa0rVW;KEz`_A_Iz6)sk>v_zOZ_n5dzGggHZPw<9| z<_lVXgxIqj4`!6vE@_vt>4ET5haHKa5PzIs^GF$%f^-DK+qfTjj#7hvd zv&gLw<2(81EGY-yxx!tG_|q^&5AC8iPUB|_W`~!P7|;>eDb?&wkda{zI0>9g?!#2r^crNMy-zp~ z?PH<15Oi9lv7Ucl;m#(;6vuKk(UHBNwM>b`T+o5!%{SwXyi zg;g{0u=znE>dp;Q6CvobgrVl_yw>Z0)h@__KEX*ANpr~h_cWR$_XhhZ!WMs`CF`#w zt54fQB0c8Pj}Vp#?`mrW6w~VUi8q%Ushrh<1+5CjNqFEqV_zAli1O#JeKmA8NBT5Y z9#uKuZ2Vl7teJrAvN==;=2V)RZYV`)Zk)exu`Nc3zN{o%wu)l;D)w#h@$G{L}$^E#MXg$w`3|1Iv zFuw&fOg|Kv&g*2Q!#kRtj@^E+FsW&~T^#{<1+W$S$Mq#PgYhzMzD#>UacsDx^Hmbb zj)Q{6qUajrt^{fb_rBcGOX^%MP^d=sX?O`{fFKg$IQ>r8YlAC26LjYPR!zRs83o80 z#|8k6MF1u2N=BjT65B&sQRkz;=5z^-0s_y$B`uNb$-=0_%*p5BtsCekX7fx-)|uYU zDP|V90G7P2s*MZJX?o_TfRN4ApSQ{slCRBmY9hG%=6bd80`^v(H(t<$lus?7*KE*fV1Md^pGDVm6VLgF|7UC^0 zmFcX$$To$@b)wC`a<|fHiIWXn#QUzQy^xcSkXG@jMObtwbW1624mDUlKGufyEwf~3 zsjyjnwB2A@3m@0g05}WT0kpk|wJh$P6Nekd!%jhT(Vg$ny)7jd@AV6D{M?_PR-GmD zyhdnd*Wmi2O*r|f zgi`cYkl5q2p!@9Ebool5^2-a$1y!;T^IapDS&1P&mPUc*+=z?ryQGLyh$*@74~&@8 zd+y!cy3Fa>`Ej+KCA{2g-z<_vvdHI91f{1qaV;w=za31VkYo^TzN{i2;r4hmxFTOk z^^$vnkhxJ)-^yHy+yt=%Keg9xT@OS3R$B(ig1yy?KkKL9D@cXny-y~D3hUoC7iX-Y3OsOia*k9=g(bdHOJg}$C6X6h$qwyc2WY=*Id{66=XL@b*DlOif}*OynTJ|O5Pf;GoWwXgxs}wLBL%h z^`(gjk1iG(B|&EgoKga>gT?dW@|6#C>vi3S z^!Yc(vL{$_8#g|0$MWNP3Dd^%Q+=X*mzYPA!$T>(|08t8HMEU80s1^g%CYZ>TW9PS zRo~5b@FClp1;Ld>6AVU^s<$6L3s2*{&Xc+|ODk@aXqA`aWxN(}lBm>4{hc#FTzvDt zTRft6i1qVz&=tXyZ^>@TLBU%odY6$|HuXsqIc`nVOlX--K_py{nI#}*Qlo&Wsuptb zVb3MUiTJHEqZ=zyW)E2-i(7z8z;*; z>F!8(mSq!rL-D01g#bKHWu^&rs<=PVfs_rDB}ar%XT^yJhdlZXp01FDYBy-}4E%II zw^l?DKfiu%cu4UXl~NBswnR1ji$0eNgF5d4&kji~uKf`+1C8`3CJL$f8*KTxCZ_kw ze8<_Wh2b!kHNt$qcHG;wl_Wtw7HC??96EVY$Fy`$MC4PnR4Fz3p5$f53djpujWyD< zN4p1o4zJN0wV+l$#tU@9(<%g%k138Lzb#5%*R7veoRztI2=9*cLz(0wDtmSDESv8M z>n3X(rGgp_Kd8~rxMJq)+gtgdeOqS}#qA?oI@gb zz3mVl_=8cJHR)fB(ej$DLSkcex3Atx-Tc7rE#l1<3=;Yv5vPAHDAxbsmg|FcOFGTjkRz5aLQV#|Zp(Vs{IMp!FV5Eo-TJ5v?NM+A)l=>w!-GOuL-Za7n&p?FB^0?8 z_-S1-u4W%iO2ZvoP_GCmjpQCu9J@2l$5|%yFVmjN+kM(Rk6twTy{4c2qQ#~9doK2R zEH1^;OMmKG8Pz&n)^JY|lOv-EKY;Eq# z^TJ4zB&u3kX7N%c=4_>ABIsEDtTCli&OkI|D@2a`&PJ$=VxTGjAJl%4D8f&bT zycz60El^^?wdlpbGcoQFbtrhM6&?Y9THl#DVncGk5dnKFZbzFule6puCz>-Zuok1D zc?F;N(;TMdW2QrI931`8RVmH7Ct_!4b`-r-UG7lx-lfv1sUWSnKAmgc?c;x|DbR23 zLE5c>L&df$>UoTKrOc?6Bhwi{rpuG8(O7GwWG0a&9_ej7rf6)lFRQOVK8LTr{6Q#l z8o6iKM0z5s;ICmSEb6ZUnOt3 zVE0TrQr|u#qD!7pWsT_Gvyr@zL6n>TRo;lP-VJE3mV4z+bV*3st5WT#aJPn~LRyX` zItNJ1OuXyEpo==2*FizkHk*A4M`6v+JbzRqjTB$XB)t=p@+pT+cUlSu33kDs^GA2% zRvAOO#~FK+2F%OzBYjV0KQwtYEoRe9YSdX z;5_-}6r)6z&5(LAP3yqtmI&fwCym$)R)_U9hXNbj1f#^)Zgsq$#&)rfl;*oq zBYma=XHt&79-k{bK<->qtP?6+p&D!M)`l`*r*Pjl@(f+9DWX1X~7C=!kQCLBg5|83ISs9&q zHOCioG`jgQrOVKRGn2nsK`C8%)TIdgErF%~)Br=I8cPj13Z15|Py*l$1X^ird>Z06 zmcmPezfRZ0rAG*tZJe=ThG-$sMG3)57VXnwlS-Nebi0zYl69^oM&TnqDNlO8Hm~&58|u%q))8_PRC3F_ z(V9&Ffv?aMr|od4mvJw_xX|r6{&vzD%c=Ut2ukn+SG%P*M<#N zXLS4>oS7>tHN0`Xhmr#AvI;6T$$g*4zOK@nH)+m^{^Z*Gm0+;bpS3PE+ObjWJdmnE z_HSxt69{UAcq7mAQzV6U%g{jG@g}j)AifDr(nRMYZS|$Owv)z(KMJj|+D?_@kCSR; z*?5;&p%oA1EJtM(Zyt&S?8ZhgvU!!%+I+B4h#b#e>o0%yqf1#WLLc$$h@VBT^pk`A zOP*tb@MWHLE()fEcjOo1N!6;WnCnlyCm$OXkgNti6Ss-fwqyGaA!rRX+eI6t%=?qo zl-bPf;barhA8TTy$GI7fr7?0QaJqC}{BLu_gf_4inE1j+Brr#h)BXxK0O@k|+ikKJ zE&h{x`=SqoV6>@!WuBPQ$qTXj#K)l_%zD*w{%R=2Bcg8{R{?)~h^+2#ogLRuK_RDlo-rQC8UddriS5xz0Yi zee!icyP$KI6`2(t$y_&@(@dXo>M&$eRGq_KcWVE4JI9HnGa?M`P7M%9HyW=sS}Km- zSH*?LrH0kBMqkvqnZ8)6o28O+Sm>I7*NbA-@mSSii3Z!}cI%kyaa+XW4tJYh^`mRHSzmUg{((Zie@of&04yJ@`)}z5>5}-}|qSJ3tnw00&*sy|NC7OFP&h zr==;qBVt9dYH_Va+)Ve{#xR&;i{dbqjD5+V^P`q-q zKzEsbm>MgmQM~m1BWfbfO*c`zXzS-7nm$ZZLPnL*e1X?*Ro4%+$Hxfh`k1Z==KR8M`RUdt>QPfidIwfQYM*&6^Cn698;3ra zd?+7!Gr~Pg-P8S;vszq*_b-O+k_ETPDhfSW#NkL$wpqwgaX{3M)>%#m5mG&e1{MSB zMxE^k_SJs*8AT4cl{Vo$rg>@nuufk<|daYV7+X3s*p zlR~ojs-7SjBA+lnM}n^vj{qTm!hW6NIql=*_HwMA(@CrLO|>dSMFTPBQhgBizUlsj zYXni==C)mmt#M_ZqQ8(;meA8*sfd%I1^)*6GL!AwJuoFdacJv7+}tJtCP(I2t2Tm@Ct z*CpMO-EUQGJR*es6Hjk>mRm!%(s3#v$C!EDFkdMTP2jaE0*F5Fc65>vAOMSThb+-N zeX3n&Pty#_;#8IK5C{ZHH~oZS12^o&qa)D|U+^-*JKl&su%D@FR}tsEHv^1k5gW;N zc?Ay>W00Uv+onU=hV=v;i{&35jVp%Q+a=I`uYu+V@~um&BSyN&A%vo1Q;tpndIeaw zz=07&XYkM_onSEm0a6&9``Q9F*Gpc1*s0ojGCS(pN)2J1uhrEZU#u)GvEQ{(_+DUV zYfCf_Q*5AFtd5902z~=LiR2uf%h(1Pr?eRe7`8BqgT1{y zDc3oDE5h$@eTOFsRWM`~l&hfN=*GF__8dpscM85h5rt56qk}R8QF|h2xuZj3F$}!n zza9@59OOrlmXOt=uI&TF-}QVQ?icoh58}}Oy_oEu7gPEkEF}vET|DwV7ov^@AGGGz zinhYe3U(*$?d?VbOUc)Hn2Vc`V^mM5;Q#Bi#t)S6nvhp?&JQOg0XwlJaII$GJC8{K zOgT854EfW+?~dS-9!Evwln5XH=6BDLDV0ak)|uRs5W!1wv@Au=5S4LbmQuB#*vhTi z?XNox+BV}ZjM>-5JE69BcSIg@6Jm0*XM=rK7CX5 z;xQ(dmUEdXe^c(6n(>`J>o?)(uqt7!*?Lkv3)PB@<13UDi*OhThI~pF!Q2ivHYq0ows=9{vFyFg3A|R4QO5<8xJN zdUT~foyh@7zQ21#wOZ3=G`7Un1M}_ZY!3zlvtwon)YWl;nUT#eGk(&Hf}OS5xDNVz z$T}jDmH=Q^lGu-#Noxhb==|rHJpk?tqsWgBrgUc%0n~gd@JEdQ+;wo{k%!Sxn}Os9 zFbe)XzHt5De@1(RNeG-M5*9(BZ#+Wik39I23}A0KrmmsKV_ON`;6OqKxp{cd@4UdQ zrl@s;7zZMoEy1EEG=e}J%n~?Ofj`RtcZ|R$WL+FdF*r%t6b?p~LG4^S$T6r!z|3hA zv|YTMs{P@-39yuhq(v_F_TpeIb!2aUBS#^FZ0uM9)7`3h+s0Agqbu7(@c{~(Df0uT zROgVq$sW1Pm41P<2O1=(e?S;Ud?|AHf>-8#YSjRma2ANMT=-hF+}N{3T}k!$+m*If z;C4Umhe;_9EZq72>EVHlXpGD}MZ)KH(+BumAXIKl$CYr3R)az;08%^Ox}=`IO=L%F zI0>7J0t&?e8-aj_zppp=5c9updA*SHthQ;LMOqr!=^Fv|gfd8*6AIwe&CRnOYzZON zzZ^>(1A&3hmJ7Op51hvWDZNhKJbl^#oUafuimZN~zyH17EZk7y_722yJY~B>v&jd!ZVe`zGn8B3i#LSq)lx}PIbAXykaE%PbaLiy*8eWOS-w}vHu>@AQc<^Ys&LInRxh(q!gdt_#7$;tFrdS>maknM&%IV!KX zngy5ndfq{!v<@Wl9z0hn;I^TUgd>AN3M{`NfP(A;4EzQmRz#6LgFo{Ec?$~;wfilv~!waEk@ZRS^pV4?wZOdu#$q$m2sM`~jySSP;E2aj3nn3tt zvu0pYy0(dBZj1B%vPTmE1^g4hxgi|g{oaktbbxmRvKQIzk6z`t{_=8zuT`PcYtI@% zOLg%8`F-$iGV>9ad6*p4^%7=}WlP5wadJL9k&{Qwdoa6fzGj3H@{Hc_?z{Y_W&ek(FH>_0eO9UM7g(K&= zgWVn?EynbmC)MG=L1`RV`6(bDAF|bpjE+7J5#qoPl4}8sDQRgn^~ojoSL*6;VCpgg z7*4?63mGlF&O4~`koT3Fi%ZJqkiDkktTSku@I9wEXc0=WkMLx%wFmOj5W z_(?&*K#3HYUtP|(-po5BFN494JVu_dwq844CbwQBga0%{0j(>e8DI`-PB=L#Jvqhc zM7%z2pu+8SpPJf?CGsHNSBf)ch;b&EwjoTt~^au!aixas%u}H6ecjbt9U3&8&EB#tbs*@cm7jnXTalG@%E8ZCTv?2rO6<--ln2(;c@TxD}py*I_{n}3pWA>V!bOH{E~ zgKgJ}Yv_{P%avq{vOn@#EfVO)1vxWMPIvLA2RrNj)y+aAelU-mReax+LMOi7)@N=K z@A{}1{+x38gvzU7^OcH7JEdKNC0x=ZQwnG2Iw;F26s5Sq{(nwOld{=D~xbw$AH zs6AAKFMQHHGh-9^^20iDsh#$ssOzX z?V3=4hMwp@N|?%yW2ljt>vFUlgD^?R&SP3tUp!uYX$jTb{=CckgCF|2o^f0|Xe?*8 z4xh~^HNHJ>XVDwoKk~(;d3oWWHKwY2#7q5ZB^imI}PrHLwLqcw+KR3VZ6d78w0OZ5mHc>}2q2MZsr z{RYRE&(@0n4`Xi?7iAZ=@lq1fT{CodiF8QU03uz|EscPHlr%$kioi&B3P^VkUD7aw zv;uK&ntSiMW2Y=cbaT9j>>Nf3+Lo6bp_F6%U-s7J=g(7^+1V=(qeu#$nb6oqVzF@KNHyY%(E5iMqbr$;VbI?5|i8p?@%=>d!Kpm)Xtzd zEmoHZPKtzeU8dDc1KXoLum{565b=1Z=stxhg;~#Q+kfM)LzLjUt*`4QU$a-c{T}zP zYu2EeH*Ro6Gea>Bf>6pgE}L7A8oytvwr>;mnr0c;k%nY!t9rd@_nanm{#$C6)V86l zq*a#%^&-0@^~s4|@G*EVaN@+`k{Gz*Zu`yoOlS`2r4qudYxWksdE!)@US6F#X74&w z^|YLFl=1LN-S3v);lGco1okF*1oGyKbu08{fQmyg!_^75s0l5``Nlff{5w1 zQXEfj;@sbjM_4oev?p!al*g$3vfg=!q}>%`XuXbhoYf9OmVo zV{}Vs&gha)&OJ+}RE$kwBdWJ9s>T&b+cTR}ygF-P)MhjWD6H-V6lcRN|P*)|0X3o?Cv!Wd6~XUKElZapsS3 z5iglQKx+gX)G}`FwIi>WrNNy$NjZ2ch1W;AEbEChJoLSP_{lmHJu@@@`<#m=p13Y` z17u!6R3ADZjF--T3QxN4!4HzD3E1QGdp19JB2CC)5o+wyO949xw>>B&$PjsMTG=e0 zXFg?l%GJ0C8YV3@zR7uYw)@hQsncaJLob5KZU$>s#W>+@wb$jODq7V(=IoG7rC713 z3CbfUOGFW=&YSFKi#=Mz@PTW>4ryeV8Taa}Vct;(vzDse2#%(5zfEb1e={2=#P||~ z_cVq8lzjDs-9Wd2y#llp_OaZ}nCDM*Dv&n?)Jtzr5@VFb=qUwkXK^ZUO{#VR_N#lU zIY_r7YYTlMFtIQ_!@20V@kLm8&wZ z4k&ZRPGI2sNaFH(TGMg8(%5$-{$|CZ(PGMSe8J1*1gD8yI z{9RotiIgP-R1+3H1H`BVJ3kGObH7F!k5EwMEP(2JO;gt$aKvJd2s0dN>((bxMxBih z(l_LDx{kNyzf=sx8a~qQHAv5X`>k1kbLESEwjCOg6|#*e+?B^nKT`Ds_H9{&f) zqelLp8oLsRHkBdY!Z&9vCkt<#_)9*s|4)rw)Gi}ckGhW|w{jutn`M%Y-s>(VtLY@; zsaYR(@5}MWrKa`lT)li<#npJhQT3DN(d$b?&yvQEo<~mVIka2Cm)pKbg^7NY8i}7X zy2vdFQ+%JN8|ZW$H;z_xL?)#Pn}u=I$<1f|%QE((W)s2Pc5XO)4fFlGSiM_Px~cOm z;;#1ZqCPyr+#H;EBrU;%DK@V3-&YK@>M1~@CE$OLfH?qKV%kk0jtIiQuws=UY5fcv z%94FYET_^t+Wl@iV!m|yaG)Yzwz)x9davPB!a{7ZRQu{ToH>xVP+)94Fgz>OD%Eb4 z5e60Wb8Y}dI z6^vdajhl#?Fh3;66;lrzg6nhr$W!52b#`^w?2Rr`)=qPKEFixCG70VR zTEE9P^0~r-e~IpkpRW6`0syOI*xpzM9Eg;&2Yj8blQTNPpRO;(fHvKGOH~}Xt`aT6 z6u#T9{n^t>`9Ne;FS23VKE9)rbL`G>mB#d(-_I%M8Cwq-_SB}P!@m|v&V}~tONAZt z`kA-JMN_@5yTslvFPE*zFFgFG?=5F6kT`jF#~!!|`Yy9RH9*#9uaPqD@WPa*9{XJ; zc{8YkzJ%R{bjd50eUl2j<$X0G2l}qrGqx#HEgodXBBNqOh}gb0Xrs9W@YAQoqx^P^ zyQNq&=rZMcL^DXh+}Cl`?U~x@cnPVTr@RnN1w5s*NNJDC$8jP{K-4(9!xCflC$kvI z&=d$qpxOG0>i8`sY89k?>vj~G4PlfN(dFPif=JNsf(s7PHmfhQv&>2Z zN4W$3z>ySHJ>rR{n+{>rn6K~?eEsd^Wi~O^>3H41%D)AviBwHz`m|j{4|<+- zR_ca>pXBWz1RMCiZ6wVq1jEw*e_i$)g$jVeMxk80La`h}BU zft;VK>?6NyzwJ=_C?`sU%9IL?QwX;K! zI55y)CThymcYU04S*v42$)fP9kfVYh%o@t$sbJvQIuIbQw#+(kt-q~k3ixEE+jrUs zc;)d_q?er}9^ug(BX!I!Im3SzZIB6*Hkp>(zh0mzjuI#8?gO(a`M#WQGE(%{gjjcyy!xMWk^Hz2E&MyHI~w^^b)3S|{@5th=7qJ2MI zOAi|BWLq2_lqjoR)FCn92|wD9SZPkkD;zhf3nhN8V6^OGaeOL0X5z(h$>Ke*apiWo zYfteJ`_h?04|pM&H(GWbp;`aAwayN%hg(<&_?d1KpQx_B!A6rQz`T!cEg>inyHKMQ ze4lwo&s_tgrvqA?rzIV^ffeP>);%EWLBoOm$(n02mSu6lA_hU0H$2JKw>&jZiQqrh za!#^FSBW(x>m1IHlM-l>J|MOKwFiAxHoN7$qr6c6N@n z)cFX-y`%HIN0+?15*a3|Uk8x#N>I#apPuy;bnC`duyyB8~*EE^!)()J|kL4;H&c)E*R$u9e#Cr79hzS zbf35sc%ZrkrYBGQYvIQT{S_|-5|2WLa4c81{x`6gB<-)`8N29vaLsQb@k6eGob)HQC8T6xpl({pfNwAWvO56@aL?{52 zT~t0xUnS+SM4p$NoGm@rKrl+XqyfsmT zN2b_~M%;_8a{1?kP}l352+Iaq-bsy0v}7H>MbEr^FY~l#yGLyxYX^I(647+S#NNio z9jVhlk_`=Sj~jYpbr^;yh3mVq8@f}8yECQz(!VGXrvHF8#i>+dU7&)VhU--)?B3yW z^ZZ+rO?QMESAE)s9fn91RxU5nk#mGkOnyb$#g(BJ_3KYa>edNtS1y9Uc&@dyS+`2UZ)?D0h@5}`?Kdalg^OR*We z1(`9N+`3JYSHfm&Jx#R(nM^60n?WNx3{EfAsJoh*MxDbUa1S&vLw4;q3@VD8 zFm^~6QcDTLii1OpS}W9Uk4W$^wJ0}*!a7%M=2iNisULkKSAT4<537&r?`C5!*s{A3 zlznZEFYdD^lMBbDuZE!n{g2QOqr8-x_p>LIXo`%kAJjZ7SD_6n^msO5!P0?zM8>X94i#aIx^W zU+g~GqmvU{+eDR_GqH~LPwIXL?Gh*m6dqdm4W{67;%#x)cgrfQPhG?~5Esy&2Rj&_ z6MEIKW#q>cL#6%6!$qrPkg+_ILw{gz1)*u(%YG*^nm~hzK6sCoB4mUa){BA)iDzG% zjS&eK{voY=;=e)8taO*sIzI}03~zyQMUhO?xD7V0J-jsL~d-dGrxJxd-=E!3_1T8%0{6D9Z2?IdIqQkz zrN@=QNeLVttv8>T7GrlXZ5NT9UzaM^mwScg77yJy8+L}UhU+HMlAM* zdC?!t(20}CL3AN)o$4y!l#T`4ZB?FG&Ur<(j}9*La*ao>J$O4RuN{+R@zU&?h)0cA zkeAShz81;#@1avmQgKQ6kXagXZ_0?>bEPTMvM~8uNcG%|Y3=72{va6QPCC5|-Jw0; zc0euo^?|%ki1_>kSUFfT+g#-IYj$fXsAF;tQ!H40o=fd3r~ePs{8j?Mq%?Hn`&)0J z)91Hv8BnL)4COm5#XblwFCtVT4)0mH1K`w!3+$$J+2v8CuvehtNBP7~cGx7rcXs1k zk>YT6{7cHQVK){Rs8uoXCBqQ^q~MK`V(PipcO!JW@p0I>!F8&MA(c?u8}rf{RI@4# z?i=`(oLALc3!;{;t38X*n$ePOb?C*XHYbRN2A4P`hvh3#s zzuJ$bkU3Ff3jMlj(Ten-VwlPHCi9z4W2tr?Bvh1$zr4|b-bR0?Z+(kG`9@EmBm17| z&OoUc<2#ob>sK`LjH#{74`3XgdhTx4#yJ{2JY=TOV-tCyQ&zesWJhGYE4(@{II04z zND!LqAgBilM}~MX{ow-1vf*DM6(51H9{5!%G}|k@tSg$-wRm*qxIT{wH!T@hh)pBA z>~p*p(0ilQnsp{_vy!<8p}jvmR3%~K>>qHcxUhfU#wm+Gsz1Hl@2B?dvM2qTT|4l> zt+livruq|m`}V&6B8io8*|8iHr@fr1q=c9f8ew*6i-H$(U;i9oAwI~;Y&0FJY2MrZ zMJ9$<+~p-5Z3b~h$*2`5RdDl_IF$tQCKB^JhJDE2#Qehe&4R7GCvu-L3Qcf$znyV3|*`Q)iZ1^LQE--1KloJD^n*Vbt^rg9{INw7Q z#`3CfwDHexF>i+2bpdOqsBg$34#q<| z|A_iA+#)d|?H`e5{^SQJvEBb#%u2w|=?M@sYWHFX`|T!qjWA~vYwA*dwJoJ$rRxN~ zTp4sJCq`R6%5X9;Z`H}@@ZvDidWWR;hJkc`LOPv08~bn*HK0viK1nJuE}Q2(71T zHM4?QH)BuGn{h|#!f2b3D>O01605DNkbcGPVR$3ATRsjqWA>H}q0!@9+rUZ}?M6i7 zX#eX=N0OPZ0q;>F!kNzB8)_LQ9?_;E2Wa7#uBEsE+kN(zZP4Jt21kZ^5DZ6@B_S_f z*}M+kb6iGbrl7ZH=Y=HIc|s9+vvg@uGT<(}M3J(dJ@WFU@f(%7?GQJRcm(cTE{pa~U~#*}4$Nc<9cj4_M++W~n6b7xNxEDgpn>I= zVKhl`*UM``?MJKgjdh|Eb2aAtn)e~^tTh9U7`o7C8WRYt2lg13mm(Btwzl6(EFqyH zHjmK9qK|qG_eYg?1;P?o)c>d*KE0sM;aZDXDZbfXvt`8@kcQDgB+!??Mq)rS5A}D) zFPD~`Q}FX}Ca_%OPzziq-bt%cM>=rMU6ZxZSv2B{J2t(m*xVf7->RmFrqslEL-SKX z$4ZJPfz4})>mJ4AhhMi#;n)C6+9Y_nZorCaf{|Nh=JN5miZqTAdz3`n7mdQ@*g+IG zsVXbwBm6LEV|;iDRF>w3@Sk@%Js&Gou(Z2LP9W8Cu68;e*3MH$Th0-h3Jc&_ z@Z;u!z2Y>jrU^0k#(}T*+hVLrkr{@;qsQ40O0tucFNgdzsL%^7{nWB#T({>kujN~F z>w42!<0yOAxm)NNzaG}D7AUDnQFG^iwN6b+O&KZ(OZkJe=NBpUQ3HX{xxMDKp@f8X zx4wcpa==VdR98^H_wkz;pN}Zdb2+^=9>zA8CqJ>&)Gcn;l3;PHg_MMZ0>SCvf=i(j zhvDvE1va^+*dm|cW`_s%yuIi|9l`%?!VCSd*%5V* zE|#J?=Fi=X=Orld>59&IXuL`8_!#sjPU5HxozO6p)%bf0CY#3~)Vkme`2ggnXCpoB zM}_hcbN>3_$!m@@8m;hST)epL`nOV!DNM>pkFS$@!>)y#abxzpnu}Q_a`RHRi2^zn zSUe1raNtiaSpQkW`96{4Kx{|}AjshU{0Q*F7~FtNBmdvSLBd>wx3rnc{J!zCRs=bX z3Y=HMBWhDWd^p73KTZ^iKN(BipnzegNRFpmi)AwmRo67q&avv-Wdu3DMeb2KOKUvB+ z%;JG=_Y5KM?;Y}F&XG-Foy*!Fi~P$?w?9;)?=}me3zLl6^<~eV&3DTkyZ*wZQCpVG zT}odOaWVY&;3O?jtzlZfUpJRfauq((@XPuTJGV<+a`@uS805a!gNSf{D}b+s)+5)- z3{rFAg(0kKvMTJY3}gAcao&l}Zt%9+8Ta;%IBm)7tLAX5#8({jjHQWX&~aovj&!|d zD%PIJa=3ZOX@dU?mydH5sB8b$E(*NSKs=ji9Sg&cabrj3==vm$jfe_G8d0mZs{x^@ zR0$JK^;5gsX{5RMpaG*{{m*h)i;BH9+D@K^)QgsMB<329hw)=n*H!^WLj}%_&n3|P z*xd*q*4q+?w30vAXfFx{nC)mrSRaScD7$G)^{u5-Rs0h37`~%C?gL_;Cpt5Z5)i<+ z8+G{d7jv7mCIW`Rg8q!QQRNdzX6y9)G0L9GI1q8U#Zlh(OqF{(xQlPzZEG$0$z^Y9 z+1Iz(D2ZtEbPrG)EBb*&TPh`zqutu!B%^!HtoO6HoI0}+gm_R*P6(H|6nGn~-__AU zoDf&InAw6L7=1Ckyok*x?NuHBD|6Kxd$=uusIV^HeD>XbNrln*Z?WzAQ14`XYmSRX zx#!MeEZ|=fd%?`NdUKCxKpAOj) zM$a$`_gf-zhVY}C& zf>WZ8x~a6Amr?~ebDZgWqYMlb!+agfeg@nc*YiXsdKrjvE6hmEI~+YAL(XJJZ52WMg>0u=2z}d|%gT8W!aej-ok|n@=`DunWG$DK zc-=h(Wngtbvb?nt1944~_PXpj-y5CCn@XzN!rbd4vOlr=odGjgN>dw!ht;8kZ_)<~ z4yUlBE>Y5wA7o6|UXsX>n8Xl3zavHg1mVAfYUxP{2P_4`JnscVuRh$D(^V}Ss>ZIJ zFTjB8&1+KhVEReV=0RPam0dnDt<7$zhupKwI15^yi%xl|w7#qjVNv%e8tbH z6SQ6$%L*UAp@2X!L4Byy+LUn+bPN;P;Or`&E8Dr4!S%=YTEwHbRpHrVYjE;Jz zo;aiUlymEk_g|*)J9VP>XGHG02=C@Wn9Z$G0#=4_fcJc_PNK06?PP&A0S(V`ZIbZa zSMnR$F1-0-{2^0+qELH;!PW*YKNW}q(=6g+MYX~qQk0+m-6w!mrkC#l#~|_ zA{M#$V~P?Wb7ksGf|LsSvGG(4x)gMp;BnNaf5S4b#l*8Wg7P{SSeQG(rM;9eh6@JX z^8sv@npn=4+CNtQ3ZXt7nx+UR)dtlEB}PaTKJ-b+C3yrgzJ}2Ue=$)aUL_&Sw4;t z^`7QoC_KvdG4%zn{E) z`OhHVM-Vx#geR_{=j!?@9o8V%NhXExdM^H4&a#|J;xSTK8IP=f-puv15qHDb^}PI% zdO7vTWte)f)`WFcx4c`0*thEJq1cLVZ^9!kga?j5%0<=I6Q@@>sjJq1_0MxBATe<; zVh$ox<0m;2YRTQ5x*snD(dHwqAs1=QOiKzS;fab0`)1o!rrAz5fJWoinG}jepD0sL zSKHf&VmP5V%sDOc2m2Dl(+?BMPq2>wg27dQi@8ChCp+;zJaK1&V0*qJB~YVW=WkS6fUDa>nE0ukQ$pOoF5$B8)jc5PFQHGfTi-7py+HxL z{!@piT3t=OrZgPH0(Hc4;OOQ^cI#W}fs&(#U(W9R&#< zO>CT3l8M${x5bA3hxdgP=^m|J1{~)X)OGd zkUodm?4Xl` zmCm;M7r*>U(u<8EH0JJiChs5wmN;Bo{v~w%Y-3l)t*L`o1b3vBDoAd>gUll(Dp>oXceUzrc;s#szJScfja36 zc7c-jk#fmO`)mXA!wn!}+WS+ziq<+kFQxC60i`Yh(Kf$iM7HfPYU0zf-N$-3(*Irr zoGxik!uO||670Jfa=lId-4`-iZ7V!IXFHfeF}Z~-@emO%oS*s0k4hO0oJ)_Jy493{n4r$1EaRZ*4U&Tl?XmzcqL z2>S<|36j`|TzJ`b^zB4DZWYtvTkxx&WkMfcFpQP$f)rc*Ue79l;y=tzpi_0L@QbG7 zQng&zL#_1w)d}s=MF2!ZM1YC8vr9XOOjfJnx%sb%L61VF(Sr`!!bu zi>1!!lQxlY&LMUS5ZtrGXs0hYd@(Lq4P~Kf!9PDUoa?eI%NM@i?CB8#glC8NzgX#wrrCz z1ISbkQ*|Jen?6ex7-D;=I`-@B-q&TCfsVV#!*k>4*(-6T^CZ84eFOZ0PtP=?#A3T!F8Qvy5>G5=I6r;`^cD9fUE9 z)eK<3ODcVrpJR?118wbra`r-k&|Z?7A6LBGF_Cb3G}NICB**?wa?Kt#ueH z!cEK8@lWvN?<$cq^yZRZCBnh9m9e?!!J3#9TBe(7ho}tilZp0nywb?vf~e6eZ{-*z zE8FQ?XPnCkc_&+N#pb*XabEG^6V9lgA`d_5bF3ns+>)-#^*f)>0=<>u0g$0M?2?(i zAp^8Ytywf7wIWe?V15Yc*%}5LJB5X}+P$5_Qj#oGqK5VvSNXc*bYjTaGLRN}lxqJ= z$S*Cp_-HwK)6$H+mTn`OGQDRQm*_r4=tZmjp~X;TnkMM`aG4-FA}sEbu8_!HqeE{Y zSThqpJHN!>xqNGrYOZO61_s!M1RnjbtJZ#wD`t-{MVJGY2A** zrqyv4I$HEk4sOo;$hy-i&~f&)PI&uo^EY-cD6~+CivBu8I5sFOg3##2fJ3-3s_JPl zO!(ADa+v~nFwj0ygs%bB<28^P8L%s?4tPPra%c$;`tk2X?HEcf@aPT<5SMLY5dzIl zB9a@KX?|PvCg}}jpTCqe6tApJ_lRlpL&Tp^p5u<84iNenF;E_=d+vn`6_2$Oj_!~? z!%=UGehk*k5^ukPA&>7p^X!D=@+ z=-@55k{R4Y61ZYY#X8{0{)br6lQX+TxesO&ZEBh(zo}#^rVfikCKB1>b3^KAIzZMx z_&+Vcg@P}H*N)Mi+~A{f!5E$VV99MFx}W3!TrvV-8PS>np-`!N`xO8%LEO}Ql+@K# z@HT}5=##fmlOyR9YsT1O;b@DhfvsN~Q7Dl#jRFlvBI9WA{Nh||q(!)FqL<&p@4_t} zdjKlS-DGc~pXE-~_xe;^)@&0@l!*Zb)4|ZmhY?LupLbBBf^J~)nuNTT75^x)EMK?{y;15WC4*@8MQS#67ROu6*^<;>uDRsvL(8+pFg5X(z zXOn#Wp|o@nKBrC*{FV5}CX!KJoG>-Jv9Q|-{m1RpbEtXODW#9o{jvZ}8vqMhY2=@ZcAT)@?YVlN7w6>-glVS0Xx9oq1B&btX5pr* zNFY%AUg)8tkMk&ll7BTsv7;hLlD@JGIa2NJAJl z>1_q%*B(2e1C)d9P)&D=AIAFk_CF&rbM8vzXip_&Kg=cJ&EdTu9?lHKjQEc3WtERx z?%~^nR65!+mbr&(@N#Y4)8qSnn7?%QAW!O~(=cAv9g}xzJ@ON#@k^#OFuJPMRiW@q-la=MBD0^s1i%w)DUi06@e_TQnybg`b+^LF*l2fOdR~oE^S7a#z1)^= zyYcTl;6G?T6asOrY{&|vOP!D9uscOPCiaERDo8HKB47LaNnoj322RMp-j!4DW9@x$ zUtu{sY{|Os4yhTUGv~YpnQ~Rn*go5vP>|}L$JxMyQv<atb|Jc_0`n` z1rQLr0Ni2Y7|*w-RmwX$sa^xH_Z>TGf0epbe=uw1kG?^t(VN_Vi+*n?IvBwPWAJLO zKPo|k=$YKlxi3KZr28F^qd|pq`4OgAvc8CXc*yyuvx-#lKsw$yY`sBCPjUz&;hyNB z9;~x+ogNSEZ+$$4X83AlnhO#Pirp86Q<;%e78$ke&o{{)Nxi9Y)m%r$BpZ>dIX3by zMyK#SfehbX)Ln#n)oQh*z3N>__m}<+J~x3DZ^0jTSV^yKC$8wD{;d4?Ps9LJ6aWMF zRU#b;t)~xPTKy@C905Rq)OQe z3N$y9UNr@^yH4V}>;5aFCKj>9Ag1&kHa@(iH+iX9Wy3n}h#g7&qRaGLYXP67gI?y~ zd_e}LOJ}I$chU37OxWLlt<<$X^k4Q)%i3`U3i>8y!>Ki#dY4j(yt#!+WcU|rPr_^4 z#XIM$wptxbA*~OC-SJfpz{~XH9g&F~xaA0>u3k_5dzkWiDvJQiRPExH|4%g6dw)mp zgt~D)4PTG4RZ_DA7QQ=fWK+o4hhDSa!gFi&jO(>Dg8^wHKZKCc_{!t-$ou=yP+h>z zFDUqz^0sTMh`Qn%mK739M>D~fm)%xUXpAM0Z!u1UCg<%s#<9+V`@|-uB9klmV$X_s zXwa9!@WOS5;^rXdvXH?I#^s@hZrb|gW<03aZPZw-uVe7o+?S>SH|mK7jb7L_rehJ} z=Kn@JPiY|iXLUm~*8uklhe_SAKY5=t+~fnBgcpF@&cdW09f0w1+3<(oO44eA#x9hb z&61Z$D?f+z<$@Z&!h~!;mtB&Jm?`aV$NFv(SEH=X{Xk*EwvLbh&jAlS7Mb($E@EKI zE$d1WsqQ?kJQuX~^&-bHkD&Sr&IiTl@YG(}_aqOdGimFSWNUz4#%NU0?#h@9`Q2np zaQhf7nk!c0`NbTYk4fZ8W(s4sJQVzx;r@5<8R<6=4gP%LsZ_h7FuTfLoK8}r$>MGS zg3<2#S*2uwYP{%u#}1g|pW38oQuB%@xy%-8;{%%9Ans+FJngo6P8yMNl#jB2R?Yb? z>*}ET2eFjs)BK4kQ@YR_;`yx_(%#-vh7{0<82v;^>}P0IVvB2mqB$$OrPexU!xM?*X7iLJYX2MF90S;P9e< z>|k3?>AZ>i70aCpj#4 ztJAnT!iz5SF44M@YWhOeXa?Py_t5MHoIFKtR9Z}HlW^7BapmQ|IihM3XYij@dNCBS z0}`MA1}w_RgHQQ(1&=3o8vajY|5I2Q*u9_73mA&dKBY3slViZ=+YiyuWPc{0?R}hW z);R#7(X?saH=JUFh6xv{*fjTHF?~U5VHk+$Tv1F)seNY=5<(u76gbzCiah1_HX`xy z_FSLsXEsrxQgx%zt@{*lmeHW0ycX`h^y*`Da7n8EPz&5#$`)rw)?HZKK@N*mBtkG9Z$bYv z;%h~e<`Av@`?0ZzajdKRzQ)s2CvJ3zIS?DoX^$}`Ad0EWUV|SY^coh0X+&aYh8?GC zEU!&ij-Dp{W^jZy4>5;GeeS3oqAjS$huVxgyD-N==~n>_WDfQYX84hf!@u$2_n)Ca zsmYBGfv296R}#OmzW-47_-*z9*iZhN9WUDz2#SlVO?}w7>c>6;Jq4x$lbEL;?Kca? zUm5|3Ue-^p|3v*CA(w;uW+F8#&|lH%K6@pE<`k5H{L%4NnB$|o-v{)Qw_zGPRb#?& zyVhY}U2z;fE@%ea4%LW=c5pop@iP^4ZOt5Hv6JxsPEtjQlx8_+4FUIkp?sygfnT0K ziQAEd4EY36N-(qUK-i?sg$eqC?;X7c90VPn1s?EEQ;n3t8hY7n7hG=Ma)ZeOEQ+Jd#=pA)X z<}@Ex>fWI2{q*UG)ljWCf10vX1rsFW`R#&n{ zgDTDw!{;m9O>GilTKG2Jr!!bV+{9*m3lCG}1(PubU;S{O5#FAQviQEezS9ynty+i? zw1&Go_x^3jOYaAd^;4gVnceudB|?W288$zOh)_h_^_D$54+ru-6(p!6wx%_2UQiamgU`6*7)f!gKVL)T% zKW4lXB_)`14W0rNvT(EVFfpddFPK1_=zt1J#M+rv<1O(%UZ}$x{&l*F0CH?ffw<;` zH<8PZA$odiU;>Ao5kDhpi)6;F@thG=uJRcX`Y+oqUp-y6c<*Yheya1?Fj0#Fq3PG7 zO17KD-+l1FY!N?~r#X1Ob(@bw)V)XjO||0utpcLa#v@w8qz`|oHx7dpliS593wT)- z&nb^zMxnRJkjD>(n^);mJh+Qv9#Lcrg|SVQ369ZSdxUH+w2R2`&y36+;hkQ*3})q@fzedKl@f2Jet&0P;Bl%k!IYUmbc>ArmS^pGEZ z{GsXm-FapM7j{{ZUj$y&VeibUeFvMp4`>zmf5<7O6pdo_9sEBieO5F4!qMXWsG0{2 zsnI^BO%T*(&hf9mXbAl3+#4ofXvMnQab#;>GD2N3C2~$B_1FAu;9$h~7&Qp%`&fv5 z=03ka2t9qwP2f+y;BCWrk%YD_i)QlPi)pbeK(`?A?EGK}AiiSe~S zYTII-s#re|COa@lsir@=3npZdPIAe;2{j2)O9!B;bU$aLIPF3omJVov65C65~xhThcadO|yIX z2h9N|9hOFYA*H03QZ+(8i>^{)rA#G#FLtI9J4%#MVI&IdHvqMs#WyMW+vLB(?sx$R zOUrqQfA|mZ8Ik`l?HLH}plZWwXq4epxg+v_!30C+8CuxD+QPlqJFN98M|E<;ypSyr zq1h?F??HEMP(2Hp^Tu;GMA!~}j17l3Xmc=6TJkJax6syJCl| zbd{tmydpTA@jHow8DVgK!@TD=EoNh!0l8X#{$if7?b*1ayO+k++8x5k>&7KqzM7|& zilTpJ^w(%Me4YYwum=S9dnxXdz=pJ2S@|{N#zPM*|$WM>?B;AJi- zeOz#zd1~VUs6WeBx>&8U&@a2>GwSx^yzGl&oRw=4`cuEVjxt#z1H1PcrQi<-}QfK%-dfY z*_pVo6^O`(@uRy{1-JsAUu55-QJ64S_FY%>uh02<9q4nj_tPs&I}|v(ZUU{sI-23P zfXruqe^NkU=dBQ4w(yy!#X`mVJE<+c@kk(X2dH?E%28iq{HcJX4^oJLxVfq<>+6pA z##y_?>pR93-(B$x1UjTrYNe$s@vSWp6Ag+?N=XenAI|dnC)cr1k6TmyObRNp=s8%# zLA`>aI_)|-#C$fjw8nOs!#8kopk|cM66~WS&84TO90x?6lrL149g>n6$7H{`{rG>{ zJIl8y!>-+tJn({$O4D5#>%82_!RB{TPgU2Uzj7LZbBH&WVJdU@Z35@f?xL5r3!Ppi z_3SmGMf`2M7ukP@A~eqSE7N}uG1)98JCd_GjP(d)FJJ(;I?>Nq364w+ee@5jjIECe zyDVvwT7KbJ%-lUpDu57uzB6F2z*6y@D9-aZP;Yae0<@W4+40iFN1!wAzRo4L+V0V0 z^1#J&T!@3_`=N+4HjE0(1KU1cF`=Jcta5?2%BMG$E*fN??hy5n8zBS^7m!0MK#6kn2IdjNtK`4*Xs17o!Sk}>ax;(LFaV~ zK<9mM3*e;qP}X0xbU9RF?trP`bNJ&H`I>YnCpX2Gjo@wS^$bgJWf6l7W!nG`S$Hnb z+hvScy`pNe?ymj3Fb}DR8=jSN8tl@W=aTL($Pzwh=lg`v_L6aDj&_jL;(VCh(L_ey zX#TP`L@0Uv&f&~W=iAf}bU0VT!Q_a&0&!0{#Jd(XP>Ad^oiH{#nW?R-Y~zd%$DW2M zQu1kc*!HnHHsX3x7K+4)=lY@lvQ2|*(XJ%%R2Ve0<3QMP>CbGQ=Y|SPCPKa@W{*Ff zI@#WX4Jyq+V#am1Z7oj0{mpTw`mV*nnsx}2cWYuVH8F)>68!+uZQ~)#kM{}K{dhEq zqer;6tPT6@mkFCbkz09!pK&>xUbVcm(PtI`@)7m7&owpRL?R1uZD{y!7%-`8cRa|+)m_HTV#VK?A!zXWp}xdw7Do-aY*rQKEQ!wmazTZ*A zerA&URNnA|Byr<#E_vLDkMb~K$bCf1cMM?>>DueWJxzmGTWxon&rIwqdCm|X?nUJw zbn;~O-`sKv?AXQ|{k@r+ilGv-2HXh2S8JhDsH^_xcrsrb-hNqEF$wtEiEB`4BdI%! z1D8hVxUntcx18lhgsnWQPTldO&9-x9Bw$8*nWD4Ad&)Tx5F3$aVo zc$dX7^5u_SXHGQ|M9qFqXU{5&^tcUoWl-AMkE8H2>gHqcdg>GGb|me+K%^GAuym*l ziPpC>diKjq-9}nHYrSf?w9r%%@=3_~iHnzghtuBZX=C5_JP?Pf_X$=G3O*U7?#{`Sa*q9oytG5YbQ4|+7rs+>tay4^b~|4?^!vRJr>i=-orKj%>FXC&o2w`q{y!9+f1h2)S=j!3yFxHvnL_nKAE#&K>Cce zF}00VF=Gv+>xoJH!|~q=gZQEXWK{Vt7emrVS9+<)!CO|fvk#tUL|Ot8&RsGXh}s>lybUvb;(6bUFbqiubw12P*1 zT__U5quI#tmW`)m$cj$s_PUcQB+v49wj{N_-`T{=&&o=gXq<~KsBV|_2mb2s#YopO zQfv>}x__L`HkH!vADS)qHAyd|uM8b`*am*tdpNc|b>Sc?7v)p#={w3Xcx-JP*r8<{ z(K>c3*PdUXI1A#;YEaAPee|gHvE9F`{8?#&eh2u@QQR#b-xQU;0Zw4EF9t#QBNYkP`ILAOqAe7;!)uBIaEZgk2Q zNbIaFt5J)@^{B|!WCw8{>2KQH>uM;~L<`5w4xMTaaq*g8OTyIfSsW|myeN2qz4-ag zK7_!mVL`$;quRtm8E7J>{H)i@8%ayYDr6FXg${(#r#k)@I^bD7t4UOXmBSH&jY?1= zr2zON67Xk@1Kb`(QMt9q&ERL&CMKUR4}M7lE{{6aK*WvmLo9(<{*td0UhDqYOTeOn zkHb-Lj?prv`5fP%*;so>YIV@>u-;r(R0N*SOXPPr(|Btb^A0+hJLmD0LB;O{S8j{R z^L~gc`uBq**KP%^sO9gYPoqLd23bdejFul`i2a+4bAEX$O5PD@e*BHoZ2``k7&e;z zZtgk(1r@RobryJ3)n<;{G^WbM+I+UU1Su8yTrRPVcs0p5WqnibzNk*e@#Vq)UO>c0o$_fhwkj^U}_ME*w$ z@D~;aJBs%~=F;SMTt#-gJ1^DM&C{#GfoNEb`zY-m2uX|AGL#S494C0L+d$G)W4!br zwrTGf=()Y7ai~t)pAc;?vyhj9*^!+8xUkh#T$Utb}1nK$qTP_x>jlek!)p3x6Cj7WU{ zt8V0FLq|rY&za)QkWTwsn!6o&8$Z8H$;+zPaEK)_iFNN=pNBa~sifI}XGvZjhFKp) zPiyh#qv(dwV^}A`PFJX4bQ6kq6caLWNn1|j&*J;to701oy3fv+^^^En##4lulahfy zKN~mViD;2ey))e$TX-=>7%v_DH|Kl)Py71R_|EYrS3hGqFdDkDx_bcYNu&Y)v z9db?>FtZxz2VUa0wY{Yoei*IzH}r4A>%S+^tKsdAE3I$GlFxTgW~@Mlk?czV0xdm& za#gp(Pr?vLmZR!A*j-=Wcpk%YcV(HS#MGQ5ZW!CX2q}W1xlJyraCX!CO`@1BESzg_ zRE>}HJi4>VNo(s%Z`GOFGUxNpOnelEm!E6L7P=|n^dPUzFO9HjY@EjwwKGl9BgW+- zug%TIB~L5iXVI++1q1usuUlh&TX_f909H>q`hH^%IEGdwsOjo>d&nECPb z17V64*mpubagd>4zv^9xEqC*txIy8f{eHgl!<1d4(gsoL&5JyHpPwoQ%)~>blNXoI zX30agJbqq#zIrvBljVDWli_=yEc2(6J`&knvCeeE4?Oks<^>$XdG;AjxR2@P+?l}DRmNt|iHTn~Csf@?+Z!_^k^)0D^rDDDM^6f}$?L){ zQJRGJHU3kbNpBGsx!76qTD%0J#CPv&i6k9t!fet-tiUzCMk2perdtrPpvnEJ%nuA3 zoq8K6#E#&v=Nj=08;tHpry1Yxecz?-ahgJ`mWK22W|4n?eXtuI#M4X5LDb%l>bMWS zfH<3iwzjr*0HfZ=qobpfxv`Q;Cq?h8r3&33rPl9ys1 z0BPYhnI$A8Zj%iV!b47d=Ga{XYxx<|B?Wa1ROyXEoEHyoe zmeu$Bsgui<`}TVFSL2wLEg3oNMH+d4+xvNThd@Css~TN9`-6>4t?nfSYb6dE<|bO_ z&BgvM%KF>)W-6<|_;#HHJU|;d0fbc=DAel?Fm*+ydh~YDl_hgIz2+sQFt2t|2%)rU zEbQaz*Xhw@gL=HTt)1SPMn2beZx~_d&@Uw1rsvxuyd&JG-h9sh&8oMHpFJ#+r>vx; z=nyx)U-V3Jzj;WNTEOU=9Dh?eui%9P8X_ShE-t^ep%62CPNr2%)4!5?F(?_Bl@v0!g3>lNyg2}jOX-w7#xnul--l;v+clOYYAEK zX)h;47<%Xi$JY-NmoAcTgcOb0%0gsYLp*@61Gwg15@Th6sp_2D3X1(W!wF7d%iIj> zxjnEvLUFd>E3|6F;9A9x*v~vA z>_@_@Z+?=8>WO~9qE{Q6${T&(PAyU4KW4D!L(mmfO(}n; zt4*2vI-et{^R_AV|Hf{L{aAjkaRyS{E-%Jo&EJ6r-I z{Q35V_Od8`7N?Q^_A*X)>5t6eO|mQvL1VeMJF>lETrvkwhb0T9xu&G~mc3q3lw=ox zN*g`nTA9c94f4itxyG3zqd{K9K3#n}HO*@wcn* z6RScGn-}|LtclXjZ9VcWUU953ysnX2f!nU6pKfza#{}N%3yKM{=X*sUWX~Eyh>@oQ zmcw5m5+tQF)lq(U2DDvQo1V3TBg2yrVJ%%>hK#)1wnrsx3$Km#&ao;Sw9jj?8@!OiL}PFUyRRelBO#gU6@-2Qr8_wnI=%|k zu0lNKjnJ6sfXVcTPQ^zx&n+CmO5n0rvqFKPTdP%>lXE!IqsdUPqYTNO1&nK2s>i^= z@a)#-TK~RJuCv!Gi*1ne|}-FX?Y21O*B@-@A++Ecvos{XAzk+6B9ED%|_c*kUPQ-Ud4t%v>c;# z;`QxLfHMjVKQ%*E8;an**Jytay%Emur zdgSs}LtEFu-nc^%91?RYwbbY->0|5i7eUP+RXI4*I{o{U)>LjD|LDx2FdW5f+%MfW z&jgXBK5F;sL1M$>$dYF;$^ibwSV3nxnQgi!F~M(X28iG{yX*V@Q~V)TKkP^q37P_y zkz`&|J5U%NL~$)zKbV@7PA5h$B-=mtR<-#(lN!FDfA}ZN=rA&Rj+?Z^xec>WQ`)vh zT*BsGYQfE}1nMyl#J>pm2B1Hj7`dezz10_aQ1wpe?ad>mpP}Gbv#;f)K8wE5QJJJX z2qZO+y4uu&4zpjdj+^57V?Fsvh(aXsk)C=}OCM`04IGNX{BWwniT+{^L^!U}la!`#9{o6iin$(&>sI2|@mSkKoMAAv%9%aDeVfp#cJaz1e)w!)}%!o0sKU|n+@h(^yR_XdHsl_!V9=h7{Azt>Uqo=1E!FeI1 z7a#L7nW&qKWBiY`HdD(ibv|Ag`*3&vK`K2?A;!6|q_uThMlnr&dhNGbGhbn=vBy*X zl!keX;K`zo^U5xQ)kHY?ZNZGR5!?kcn^6{)3Ln7sjf&UP&DJi_H{MA4y-MG-ghTew zT<`h3lzoWqUHN#FwPwO6<=l5v17gZCVdE(pCIIhzdV zyu6o`8LL=IBOM^nHk-@9w$y^AW1pV+EInhJohjt{;HRH8@^fmL+(H{HG4r0!&guR8)lZ+_o__HB&%_Z!^89{h?HujJtJ;QhGzYh zuFLaH%?0VNplKDuGG6}s=aJ`(4}q{9xcOSxpIHwd$=oG>%uve(B{gg`x>uMgV*2W= zseSaa$@I}kDIJmQ$aS#27N82E3YzImlsg?VF0_ImbyoLo5Y?YDE!WC78@tQSFomS7 z*sa}EujvbO`-XkrzY|5A2$Pi7#H$W>xxc_=bQ{~Wa5phXr0}kLmdgb+j52l!x%i_` zprm%(y#Ykz6`;-Nu87fY)hm*YYC4yW*=?6A-ntf&;sa{EW>><*H|FIx+Eg+kHXn+{g1!># z5q5`NCO`MEX&Yx2g_x$ec=9vjn?3bl*V&UFt0X&_3-$G7=eZUyq=ehZF|U2$pGh_= zXts!okYxcS_OF_rlQmbKCHwU5Mi|*Hu-FtWnzn7`&**DYi13%q>&5Txj7P~9dqAtQ z>#}pYzfXnx`1WjR{W1DpIneP)_~pNbKKW2xfCd920s>bL^;{;G?`@$~zP#nh^GRfD zH}2fcExo-Cf6@Wh_iDV-pf>Taq@gJ3t^4!*W-#PaqV8Cbr%QrvXs!!?pC370@V>J% zGfhYhtwmi`oSJyss3;US!X;71kFuE*1Shzb>k2eSaXbLF)-kIVzR`=2f8L%6e z#8IfRm(!DyZ&MHYC0M9Iz?#WP)gR_FYMS-PHj>LAZzCGd=yETnmQ{AU`Jd601#UU_mlUEQka1yoZOv}TIK zMT6i|-s_*O5e6W^q|8$%H#SAJp?9Hqp=xYuDeFbIr3XPDIqH1825d5tIt$Yvb`Z~mss zh@p3>&yr?J8au57v&8njNB>W!#CvzUv~ovT56xmXo-4DK#kTFcW${Z z+B34+NU~2wwOz)2qeM&pFc@yCAGa~IeD;)*UFR#snaSq1K$wi1>F2L;9(y$!2_4{g z4_OGo*b7JX!fe3;%_mGi9OgK>v`MUK&~I%O;;wZ z@VQAG9;{A*%{CT2olYWL5}RQ=vxs5z`2@y`rolPv#+&I*yWOHw$e9B72<1mIK)UcC z43K&Tpl}}gHI}$2HXDZ3mw-=isywo zRrLydal)*=xxlsGM<|askEcitCFMoRCC9;rW(q=i4?cBAKpBI{3~P&awp5VpYaHZ+ zZw(iwMV_B{feFr^*E7deWTfse#0=wIu^XxM6E+zlA(q)W>vZT*3i&Lb2sfRK4ycP?+K););7OwuKBuyu!z(@Az2XN(#!&?8r@7} zpyJL=vi1C_AFJbVVc$BRsM~tcq9uwbWck@+O#EH~lB}9^rsi-+dh?6l+u!@OxhCAx ztt~7Nq6>nEM9=rlaB8>z2$wd|x=^}*6t&?WtH^Sc+`mto`6Y%#wibLS>5ROj{PI*H zR{V4$c+0jK+3zN@Oz^w4NJ)u;{M2F=b~t^)<`*YDQ|uEYhA2~u!?>=YWf~yLcuvnr z4o-DuQ2z5>$zrOD6KX145S2NurwzS{X789hGHncW=P>e0t#!1yOTVLzf2|JC>>=?T zgK&853fzZM3Pd#DkN%%Y2J;zb(ibv+f|h8M!2^kEPnA44HXI@?-sD|lyRY<(J%kGK_UGC`a^X`%#PIz70*&qh zh9xj{{B0>gBHo*DE)}!&oYO+Gk7F$FY~Ml7yv`d~p;tFTDHxoEDmfy1FY8r?Z(?)q z4Au$|yk;818#C%0Iw_c$PHCd}>oH!D{FV+W5JGl+oFCPIRuTOXO5(N)`{0lbxS+HM zJJx*@|C0FDlt?Fqsl-{0E4sp|x7H%@5N-K5DB*xV+nx?s4UKC4o!5aoJHP{O|>R7vCGQVh8%Vc zTGNMy^{hBWY(BB43zoRs;AqgD^I8EIlp(sA#{SPLloIV{jTJtCW;)LC z==ie)?jew$K!KKIWd8g<28KF-!WLm^Wwk3Z4#7+Ni{3Ckl|3F&5t-$`j?=c=L)P@p z(#_g`E|=!=Py-QC#@TS4f!n|LfvcM%$+Rt4{7~{hD5~*zNO71J_Jt+S%a~8C(PMYoRk)edk(pt!!MKrxo1+n{V6G*T3?rpcI z$E08C7^NdtwDi#Ln#Vb1-eD->n|^~shUQal#nnffXg^ToJ~8)$Z^aQAVJKJke>^Qf zd-lfF)z$Q#^-=Lne^TbJ6>~-wBR88yQ6}UhY5l3gmS3F%vrYGm7t%5G>5?dwvi^qS zm#Erh`loXnhQmT|4otb`IoiRIsL(GrH6il0KN+rrb~z}15H6(|e@od7#?Z$yPWwZZ zUkk5}m{+nn7c?{*F!EnF?fUM9`d2 zwBEjG3cec@gHJ}L0#G7@A7HonQ+w**SPD@5F$^Ft%Xv);_AY7`=iv8DbZV)*nyun2 zd*vb;Yy?qZ4{#0zor4G2@>)8MI}rq%4Gd@fYiTrktY5w_S7HiW!a2NPQg4~i@}nLa zFd0S_7guW%5MK~IgEl-+`S6*%yt=8gM2`)$rY=I0SW76B_=|gS$KEt!t|R!M+`|;# zw<(xRpBr9wn~%WcawOM=_hb){anh2oofgmF9;Wsh-r*JK7O5IgcgdMVG z>v#AS0=|r&o>Ncat$OF-TV5F=#E4?OukOe*VTlKJhF z@LKgPoR%c0vL|crZL87N88l%=3tF@mGF7HBS8Nj{DSM6WW@7W!IL7-Xa--s%AH89s z3#hvc_IbkBHyl{i;~lBCiRA1%9mETL z!dwNrdDUDO(Y?c8pQFaQbH7TkHeD1=x)XTPBO07{f0-MK`)iGWbh_P5wAl-U#F0g zIup*%W4JR{f4JbbFzc4l!Dr$2CVBIjJd(bOn&p4a`Ka|t8%{>whibQLXy zh1{yslB?+N_nPn2m*yC{4DoipJgtr~-xhz|;@N%jP15L&(#O~KsCBTk8kc@mB#KDGe3W$+KI1O#lXR%7_r@mrvWmwdZ>? zYn@MIYF`%WL0UH3Tr+o~^h6Bv1$H9UgCafAr8Uh3RqQAPH%6}FevIj<$$ivArGB+O z;#lDcWTqWqfjdu|(KQmb^bg-Ya11vPI}oXJ>Ui4_hd08hiSJPhn%0!onwduU{;LZBdC9 zM}f&PQ-ty%@a8QRDwhp|f_$VHN!Xa~q(igQhT9@Yoyf@JF8O*pPAdnyev%Kp5j=0rEnY@L=1f;o>^u66sHQ#D{)I0y@1i2 zzPxeU9s%nAlHaQ94l?{O7mdw!H`vRVDu-D>11zsC`J~>p&O6;2lG@?I*~mGs0Q%dp z(r%rg{;7!jx>uttMZ>+j{8X)TRAl`cK@!0plF6)9Qdxf>4qm1iTYA9%DL--Il?_*h zmMRg91;4C_U^*Cwt-|u1(g?Ltw0y2xZB)z9<(bQHiB2q>qr1c`X*i>(Wa2o#S_wW? z$?P!Mw)+E&20X6G;)9Q)bc`h6!oL~IHj^L)dJ&g*wzZ1#XG#tcuX2n-8&ss+>lVF+c&8rrCcOYLi*Y;ucmTmLTWR-|kwI=ShZ)o~ z^qp<`|*s-_;LKZjx4gkkPuCV!a{OtO@{2GK_nUx;BtHA70~GS`pDI-bb<^@tOa ztYtamsg4LS93QCEKigswq6r5REwHQD0oc`YZo(jRGU@F5{ef{F0kGrDp+s#t<945YsQeGYu1 z%ES`>^uGsaCnFCipZ(84ABOPD0BrBegKVH!I11%%fU+{kaG$pUPpJs0=yQA|+W-AbvqplZaP0 z#WJ_&XN;4PFCL2qo@>De&F291)9Il;I@*s1j-3w;gaLPf9jW^bsU6L%o9AsivRpYp z8Q}RpMECkSouO0bW2iR1Zr>HMP)Y?*^G8}UXL_y&)joisqaeG@m-BYJwNt9OC?_mQ zz?eWoON(qJ*8kRQzSf2aRlE)ca7$BDYEmkIQY-r(wC?ZS@kaG7AI>ts+Wn`LueU!f zAs4>SOHqfP(ObfMlJIL4ez zTe;l|yPs`nPo(xad2<7p6!OuI2H3oQ^7*7%;`JAP!L9A>f6+V&-ip2*7`B6Q*#Vpj z6Mt1K{NTf$O@*uV&!eLa69H2xk2@e2v2crA{g(W`x!OPyoMM^^mBC*za zLr(Peq&}Mglo0<(o*ct7AmX6`Hp_IHfFCMIt;RD%Mw5UhG;(-;_ zJOZy!KLh+)@G@M6Sdi_%+wk$8prO%s<|i4E_X>Ub`MNN}oxBYYf97`pRcrRp%$KW&I7;`UU|~o~oAC zn+N)+y%Qkn zLUC$$Q2MNzS`;3+*8NcbCVJ&68p|3(nazoo3Jr!2%wJ5XI^g*Ze<_qkfZ*=<@BQ&E z;A>rw)NzXd&Nx}{;8#s3pyreV=#3UxhnNA9s7HKIGhP5-miLhWQ5<)t#pAdjL(BsX z&{T!q90u5Qqr6SLP;^!g|KA?WWxyB`B=#}@y#g|7w*%+^1^$7Zeg9le0+oEbsJw!s z@BRm5FqhAp+h@;DM*2{N8Nd@~Z#%Hy`iJ2{8EeiryRo4pk)FYSphoZPF;mBhwqLwO%CeM0E?ZS0s7cHR6#BDJx%hn zQs?vYtiS31V8Zu6uT7pUHw4i>YCazm+eM8lWdPdxy^eQ zXz|=jKIfyTHaZn)d~15MiYcYAo#lU@r-cq6cBv>&wFm5X!HO7 j!N0rl|KKe;`THO!Q2#@w(_%2{6cuGvWy;@v{PMp55QYi( literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_image.py b/lib/matplotlib/tests/test_image.py new file mode 100644 index 000000000000..bc9d48535f0a --- /dev/null +++ b/lib/matplotlib/tests/test_image.py @@ -0,0 +1,31 @@ +import numpy as np + +from matplotlib.testing.decorators import image_comparison, knownfailureif +import matplotlib.pyplot as plt +from nose.tools import assert_raises + +@image_comparison(baseline_images=['image_interps']) +def test_image_interps(): + 'make the basic nearest, bilinear and bicubic interps' + X = np.arange(100) + X = X.reshape(5, 20) + + fig = plt.figure() + ax1 = fig.add_subplot(311) + ax1.imshow(X, interpolation='nearest') + ax1.set_title('three interpolations') + ax1.set_ylabel('nearest') + + ax2 = fig.add_subplot(312) + ax2.imshow(X, interpolation='bilinear') + ax2.set_ylabel('bilinear') + + ax3 = fig.add_subplot(313) + ax3.imshow(X, interpolation='bicubic') + ax3.set_ylabel('bicubic') + + fig.savefig('image_interps') + +if __name__=='__main__': + import nose + nose.runmodule(argv=['-s','--with-doctest'], exit=False) From 5030f23584a4d4e3746b431793f18fc184d6adfb Mon Sep 17 00:00:00 2001 From: John Hunter Date: Tue, 8 Sep 2009 01:53:12 +0000 Subject: [PATCH 0213/1000] applied sf patch 2853659 svn path=/trunk/matplotlib/; revision=7706 --- lib/matplotlib/backends/backend_emf.py | 126 +++++++++++++++++++++++-- 1 file changed, 118 insertions(+), 8 deletions(-) diff --git a/lib/matplotlib/backends/backend_emf.py b/lib/matplotlib/backends/backend_emf.py index 217424e53a47..c4dc1f8cc133 100644 --- a/lib/matplotlib/backends/backend_emf.py +++ b/lib/matplotlib/backends/backend_emf.py @@ -23,6 +23,10 @@ from matplotlib.font_manager import findfont, FontProperties from matplotlib.ft2font import FT2Font, KERNING_UNFITTED, KERNING_DEFAULT, KERNING_UNSCALED +from matplotlib.path import Path +from matplotlib.transforms import Affine2D +from matplotlib.mlab import quad2cubic + # Font handling stuff snarfed from backend_ps, but only using TTF fonts _fontd = {} @@ -81,7 +85,7 @@ def set_linestyle(self): 'dashdot':pyemf.PS_DASHDOT, 'dotted':pyemf.PS_DOT} #style=styles.get(self.gc.get_linestyle('solid')) style=self.gc.get_linestyle('solid') - if debugHandle: print "EMFPen: style=%d" % style + if debugHandle: print "EMFPen: style=%s" % style if style in styles: self.style=styles[style] else: @@ -116,6 +120,28 @@ class RendererEMF(RendererBase): The renderer handles drawing/rendering operations through a pyemf.EMF instance. """ + + fontweights = { + 100 : pyemf.FW_NORMAL, + 200 : pyemf.FW_NORMAL, + 300 : pyemf.FW_NORMAL, + 400 : pyemf.FW_NORMAL, + 500 : pyemf.FW_NORMAL, + 600 : pyemf.FW_BOLD, + 700 : pyemf.FW_BOLD, + 800 : pyemf.FW_BOLD, + 900 : pyemf.FW_BOLD, + 'ultralight' : pyemf.FW_ULTRALIGHT, + 'light' : pyemf.FW_LIGHT, + 'normal' : pyemf.FW_NORMAL, + 'medium' : pyemf.FW_MEDIUM, + 'semibold' : pyemf.FW_SEMIBOLD, + 'bold' : pyemf.FW_BOLD, + 'heavy' : pyemf.FW_HEAVY, + 'ultrabold' : pyemf.FW_ULTRABOLD, + 'black' : pyemf.FW_BLACK, + } + def __init__(self, outfile, width, height, dpi): "Initialize the renderer with a gd image instance" self.outfile = outfile @@ -141,6 +167,8 @@ def __init__(self, outfile, width, height, dpi): # set baseline for text to be bottom left corner self.emf.SetTextAlign( pyemf.TA_BOTTOM|pyemf.TA_LEFT) + self._lastClipRect = None + if debugPrint: print "RendererEMF: (%f,%f) %s dpi=%f" % (self.width,self.height,outfile,dpi) @@ -176,7 +204,65 @@ def draw_arc(self, gcEdge, rgbFace, x, y, width, height, angle1, angle2, rotatio self.emf.Arc(int(x-hw),int(self.height-(y-hh)),int(x+hw),int(self.height-(y+hh)),int(x+math.cos(angle1*math.pi/180.0)*hw),int(self.height-(y+math.sin(angle1*math.pi/180.0)*hh)),int(x+math.cos(angle2*math.pi/180.0)*hw),int(self.height-(y+math.sin(angle2*math.pi/180.0)*hh))) - def draw_image(self, x, y, im, bbox): + def handle_clip_rectangle(self, gc): + new_bounds = gc.get_clip_rectangle() + if new_bounds is not None: + new_bounds = new_bounds.bounds + if self._lastClipRect != new_bounds: + self._lastClipRect = new_bounds + if new_bounds is None: + # use the maximum rectangle to disable clipping + x, y, width, height = (0, 0, self.width, self.height) + else: + x, y, width, height = new_bounds + self.emf.BeginPath() + self.emf.MoveTo(int(x), int(self.height - y)) + self.emf.LineTo(int(x) + int(width), int(self.height - y)) + self.emf.LineTo(int(x) + int(width), int(self.height - y) - int(height)) + self.emf.LineTo(int(x), int(self.height - y) - int(height)) + self.emf.CloseFigure() + self.emf.EndPath() + self.emf.SelectClipPath() + + + def convert_path(self, tpath): + self.emf.BeginPath() + last_points = None + for points, code in tpath.iter_segments(): + if code == Path.MOVETO: + self.emf.MoveTo(*points) + elif code == Path.LINETO: + self.emf.LineTo(*points) + elif code == Path.CURVE3: + points = quad2cubic(*(list(last_points[-2:]) + list(points))) + self.emf.PolyBezierTo(zip(points[2::2], points[3::2])) + elif code == Path.CURVE4: + self.emf.PolyBezierTo(zip(points[::2], points[1::2])) + elif code == Path.CLOSEPOLY: + self.emf.CloseFigure() + last_points = points + self.emf.EndPath() + + + def draw_path(self, gc, path, transform, rgbFace=None): + """ + Draws a :class:`~matplotlib.path.Path` instance using the + given affine transform. + """ + self.handle_clip_rectangle(gc) + gc._rgb = gc._rgb[:3] + self.select_pen(gc) + self.select_brush(rgbFace) + transform = transform + Affine2D().scale(1.0, -1.0).translate(0.0, self.height) + tpath = transform.transform_path(path) + self.convert_path(tpath) + if rgbFace is None: + self.emf.StrokePath() + else: + self.emf.StrokeAndFillPath() + + + def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None): """ Draw the Image instance into the current axes; x is the distance in pixels from the left hand side of the canvas. y is @@ -285,11 +371,17 @@ def draw_text(self, gc, x, y, s, prop, angle, ismath=False): to if 1, and then the actual bounding box will be blotted along with your text. """ - if debugText: print "draw_text: (%f,%f) %d degrees: '%s'" % (x,y,angle,s) - if ismath: - self.draw_math_text(gc,x,y,s,prop,angle) - else: - self.draw_plain_text(gc,x,y,s,prop,angle) + if ismath: s = self.strip_math(s) + self.handle_clip_rectangle(gc) + self.emf.SetTextColor(gc.get_rgb()[:3]) + self.select_font(prop,angle) + if isinstance(s, unicode): + # unicode characters do not seem to work with pyemf + try: + s = s.replace(u'\u2212', '-').encode('iso-8859-1') + except UnicodeEncodeError: + pass + self.emf.TextOut(x,y,s) def draw_plain_text(self, gc, x, y, s, prop, angle): @@ -369,6 +461,22 @@ def get_math_text_width_height(self, s, prop): return w, h + def get_text_width_height_descent(self, s, prop, ismath): + """ + get the width and height in display coords of the string s + with FontPropertry prop + """ + if ismath: s = self.strip_math(s) + font = self._get_font_ttf(prop) + font.set_text(s, 0.0) + w, h = font.get_width_height() + w /= 64.0 # convert from subpixels + h /= 64.0 + d = font.get_descent() + d /= 64.0 + return w, h, d + + def flipy(self): """return true if y small numbers are top for renderer Is used for drawing text (text.py) and images (image.py) only @@ -407,7 +515,9 @@ def get_font_handle(self, prop, angle): handle = self._fontHandle.get(key) if handle is None: handle=self.emf.CreateFont(-size, 0, int(angle)*10, int(angle)*10, - pyemf.FW_NORMAL, 0, 0, 0, + self.fontweights.get(prop.get_weight(), pyemf.FW_NORMAL), + int(prop.get_style() == 'italic'), + 0, 0, pyemf.ANSI_CHARSET, pyemf.OUT_DEFAULT_PRECIS, pyemf.CLIP_DEFAULT_PRECIS, pyemf.DEFAULT_QUALITY, pyemf.DEFAULT_PITCH | pyemf.FF_DONTCARE, face); From f03c62394580da7aa6fd9a055ea2717937b7879f Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 8 Sep 2009 14:30:16 +0000 Subject: [PATCH 0214/1000] Update math_symbol_table directive to new Sphinx extension API svn path=/trunk/matplotlib/; revision=7710 --- doc/sphinxext/math_symbol_table.py | 20 +++++--------------- 1 file changed, 5 insertions(+), 15 deletions(-) diff --git a/doc/sphinxext/math_symbol_table.py b/doc/sphinxext/math_symbol_table.py index 2226aa4acf94..4c4afb1490f6 100644 --- a/doc/sphinxext/math_symbol_table.py +++ b/doc/sphinxext/math_symbol_table.py @@ -1,4 +1,4 @@ -symbols = [ +nsymbols = [ ["Lower-case Greek", 5, r"""\alpha \beta \gamma \chi \delta \epsilon \eta \iota \kappa @@ -128,27 +128,17 @@ def get_n(n, l): state_machine.insert_input(lines, "Symbol table") return [] -try: - from docutils.parsers.rst import Directive -except ImportError: - from docutils.parsers.rst.directives import _directives +def setup(app): def math_symbol_table_directive(name, arguments, options, content, lineno, content_offset, block_text, state, state_machine): return run(state_machine) math_symbol_table_directive.arguments = None math_symbol_table_directive.options = {} math_symbol_table_directive.content = False - _directives['math_symbol_table'] = math_symbol_table_directive -else: - class math_symbol_table_directive(Directive): - has_content = False - def run(self): - return run(self.state_machine) - from docutils.parsers.rst import directives - directives.register_directive('math_symbol_table', - math_symbol_table_directive) + app.add_directive('math_symbol_table', + math_symbol_table_directive) -if __name__ == "__main__": +if __name__ == '__main__': # Do some verification of the tables from matplotlib import _mathtext_data From b010441d34ebe01381a451e8faf304603349a730 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 8 Sep 2009 15:13:33 +0000 Subject: [PATCH 0215/1000] Reverting last change -- seems to have broken things svn path=/trunk/matplotlib/; revision=7711 --- doc/sphinxext/math_symbol_table.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/doc/sphinxext/math_symbol_table.py b/doc/sphinxext/math_symbol_table.py index 4c4afb1490f6..2226aa4acf94 100644 --- a/doc/sphinxext/math_symbol_table.py +++ b/doc/sphinxext/math_symbol_table.py @@ -1,4 +1,4 @@ -nsymbols = [ +symbols = [ ["Lower-case Greek", 5, r"""\alpha \beta \gamma \chi \delta \epsilon \eta \iota \kappa @@ -128,17 +128,27 @@ def get_n(n, l): state_machine.insert_input(lines, "Symbol table") return [] -def setup(app): +try: + from docutils.parsers.rst import Directive +except ImportError: + from docutils.parsers.rst.directives import _directives def math_symbol_table_directive(name, arguments, options, content, lineno, content_offset, block_text, state, state_machine): return run(state_machine) math_symbol_table_directive.arguments = None math_symbol_table_directive.options = {} math_symbol_table_directive.content = False - app.add_directive('math_symbol_table', - math_symbol_table_directive) + _directives['math_symbol_table'] = math_symbol_table_directive +else: + class math_symbol_table_directive(Directive): + has_content = False + def run(self): + return run(self.state_machine) + from docutils.parsers.rst import directives + directives.register_directive('math_symbol_table', + math_symbol_table_directive) -if __name__ == '__main__': +if __name__ == "__main__": # Do some verification of the tables from matplotlib import _mathtext_data From 77a00a7e420b88f6b1f121d36a169bc9e08811b1 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 8 Sep 2009 15:17:20 +0000 Subject: [PATCH 0216/1000] Add an rcParam for hinting, and set it to False when running tests. svn path=/trunk/matplotlib/; revision=7712 --- lib/matplotlib/__init__.py | 2 ++ lib/matplotlib/backends/backend_agg.py | 17 +++++++++++++---- lib/matplotlib/config/mplconfig.py | 2 ++ lib/matplotlib/config/rcsetup.py | 1 + lib/matplotlib/mathtext.py | 5 ++++- lib/matplotlib/rcsetup.py | 1 + lib/matplotlib/text.py | 2 +- matplotlibrc.template | 5 ++++- 8 files changed, 28 insertions(+), 7 deletions(-) diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index c9c2edbb55ea..e69386f46fff 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -893,6 +893,8 @@ def test(verbosity=0): from testing.noseclasses import KnownFailure from nose.plugins.manager import PluginManager use('Agg') # use Agg backend for these tests + rcParams['font.family'] = 'Bitstream Vera Sans' + rcParams['text.hinting'] = False plugins = [] plugins.append( KnownFailure() ) plugins.extend( [plugin() for plugin in nose.plugins.builtin.plugins] ) diff --git a/lib/matplotlib/backends/backend_agg.py b/lib/matplotlib/backends/backend_agg.py index 6b1f1c172aa8..aa277d21afd9 100644 --- a/lib/matplotlib/backends/backend_agg.py +++ b/lib/matplotlib/backends/backend_agg.py @@ -30,7 +30,7 @@ from matplotlib.cbook import is_string_like, maxdict from matplotlib.figure import Figure from matplotlib.font_manager import findfont -from matplotlib.ft2font import FT2Font, LOAD_FORCE_AUTOHINT +from matplotlib.ft2font import FT2Font, LOAD_FORCE_AUTOHINT, LOAD_NO_HINTING from matplotlib.mathtext import MathTextParser from matplotlib.path import Path from matplotlib.transforms import Bbox, BboxBase @@ -69,6 +69,12 @@ def __init__(self, width, height, dpi): if __debug__: verbose.report('RendererAgg.__init__ done', 'debug-annoying') + def _get_hinting_flag(self): + if rcParams['text.hinting']: + return LOAD_FORCE_AUTOHINT + else: + return LOAD_NO_HINTING + def draw_markers(self, *kl, **kw): # for filtering to work with rastrization, methods needs to be wrapped. # maybe there is better way to do it. @@ -132,14 +138,15 @@ def draw_text(self, gc, x, y, s, prop, angle, ismath): if ismath: return self.draw_mathtext(gc, x, y, s, prop, angle) + flags = self._get_hinting_flag() font = self._get_agg_font(prop) if font is None: return None if len(s) == 1 and ord(s) > 127: - font.load_char(ord(s), flags=LOAD_FORCE_AUTOHINT) + font.load_char(ord(s), flags=flags) else: # We pass '0' for angle here, since it will be rotated (in raster # space) in the following call to draw_text_image). - font.set_text(s, 0, flags=LOAD_FORCE_AUTOHINT) + font.set_text(s, 0, flags=flags) font.draw_glyphs_to_bitmap() #print x, y, int(x), int(y), s @@ -168,8 +175,10 @@ def get_text_width_height_descent(self, s, prop, ismath): ox, oy, width, height, descent, fonts, used_characters = \ self.mathtext_parser.parse(s, self.dpi, prop) return width, height, descent + + flags = self._get_hinting_flag() font = self._get_agg_font(prop) - font.set_text(s, 0.0, flags=LOAD_FORCE_AUTOHINT) # the width and height of unrotated string + font.set_text(s, 0.0, flags=flags) # the width and height of unrotated string w, h = font.get_width_height() d = font.get_descent() w /= 64.0 # convert from subpixels diff --git a/lib/matplotlib/config/mplconfig.py b/lib/matplotlib/config/mplconfig.py index 912cfbd38737..af8dbd3808a5 100644 --- a/lib/matplotlib/config/mplconfig.py +++ b/lib/matplotlib/config/mplconfig.py @@ -154,6 +154,7 @@ class font(TConfig): class text(TConfig): color = T.Trait('black',mplT.ColorHandler()) usetex = T.false + hinting = T.true class latex(TConfig): unicode = T.false @@ -338,6 +339,7 @@ def __init__(self, tconfig): 'text.latex.unicode' : (self.tconfig.text.latex, 'unicode'), 'text.latex.preamble' : (self.tconfig.text.latex, 'preamble'), 'text.dvipnghack' : (self.tconfig.text.latex, 'dvipnghack'), + 'text.hinting' : (self.tconfig.text, 'hinting'), 'mathtext.cal' : (self.tconfig.mathtext, 'cal'), 'mathtext.rm' : (self.tconfig.mathtext, 'rm'), diff --git a/lib/matplotlib/config/rcsetup.py b/lib/matplotlib/config/rcsetup.py index 55bb9f0bb10c..29ed0a239ad3 100644 --- a/lib/matplotlib/config/rcsetup.py +++ b/lib/matplotlib/config/rcsetup.py @@ -361,6 +361,7 @@ def __call__(self, s): 'text.fontvariant' : ['normal', str], 'text.fontweight' : ['normal', str], 'text.fontsize' : ['medium', validate_fontsize], + 'text.hinting' : [True, validate_bool], 'mathtext.cal' : ['cursive', validate_font_properties], 'mathtext.rm' : ['serif', validate_font_properties], diff --git a/lib/matplotlib/mathtext.py b/lib/matplotlib/mathtext.py index a505d635584a..6d83dc161502 100644 --- a/lib/matplotlib/mathtext.py +++ b/lib/matplotlib/mathtext.py @@ -222,7 +222,10 @@ def get_results(self, box): self.fonts_object.get_used_characters()) def get_hinting_type(self): - return LOAD_FORCE_AUTOHINT + if rcParams['text.hinting']: + return LOAD_FORCE_AUTOHINT + else: + return LOAD_NO_HINTING def MathtextBackendAgg(): return MathtextBackendBbox(MathtextBackendAggRender()) diff --git a/lib/matplotlib/rcsetup.py b/lib/matplotlib/rcsetup.py index e8ef2afe0651..0a95474a4cd6 100644 --- a/lib/matplotlib/rcsetup.py +++ b/lib/matplotlib/rcsetup.py @@ -404,6 +404,7 @@ def __call__(self, s): 'text.fontvariant' : ['normal', str], 'text.fontweight' : ['normal', str], 'text.fontsize' : ['medium', validate_fontsize], + 'text.hinting' : [True, validate_bool], 'mathtext.cal' : ['cursive', validate_font_properties], 'mathtext.rm' : ['serif', validate_font_properties], diff --git a/lib/matplotlib/text.py b/lib/matplotlib/text.py index 7254956e9017..b10cf0f3e97b 100644 --- a/lib/matplotlib/text.py +++ b/lib/matplotlib/text.py @@ -25,7 +25,7 @@ from matplotlib.path import Path import matplotlib.font_manager as font_manager -from matplotlib.ft2font import FT2Font, KERNING_DEFAULT, LOAD_NO_HINTING +from matplotlib.ft2font import FT2Font def _process_text_args(override, fontdict=None, **kwargs): diff --git a/matplotlibrc.template b/matplotlibrc.template index e932f6deb05f..87def81d0fe4 100644 --- a/matplotlibrc.template +++ b/matplotlibrc.template @@ -167,6 +167,9 @@ backend : %(backend)s # In that case, all text will be sent to TeX for # processing. +#text.hinting : True # If True, text will be hinted, otherwise not. This only + # affects the Agg backend. + # The following settings allow you to select the fonts in math mode. # They map from a TeX font name to a fontconfig font pattern. # These settings are only used if mathtext.fontset is 'custom'. @@ -290,7 +293,7 @@ backend : %(backend)s # A value of 20000 is probably a good # starting point. ### SAVING FIGURES -#path.simplify : False # When True, simplify paths by removing "invisible" +#path.simplify : False # When True, simplify paths by removing "invisible" # points to reduce file size and increase rendering # speed #path.simplify_threshold : 0.1 # The threshold of similarity below which From a12643ceb3b2dca80d6d115f263ca351a3e06bb3 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Tue, 8 Sep 2009 15:23:02 +0000 Subject: [PATCH 0217/1000] add test_image to default suite svn path=/trunk/matplotlib/; revision=7713 --- doc/devel/release_guide.rst | 2 +- lib/matplotlib/__init__.py | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/doc/devel/release_guide.rst b/doc/devel/release_guide.rst index afd0c5c4a562..167fd541422e 100644 --- a/doc/devel/release_guide.rst +++ b/doc/devel/release_guide.rst @@ -122,7 +122,7 @@ Uploading sftp> put matplotlib-0.98.2.tar.gz Uploading matplotlib-0.98.2.tar.gz to /incoming/j/jd/jdh2358/uploads/matplotlib-0.98.2.tar.gz -* go https://sourceforge.net/project/admin/editpackages.php?group_id=80706 and do a +* go https://sourceforge.net/project/admin/explorer.php?group_id=80706 and do a file release. Click on the "Admin" tab to log in as an admin, and then the "File Releases" tab. Go to the bottom and click "add release" and enter the package name but not the version number in diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index e69386f46fff..243946054e75 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -884,6 +884,7 @@ def tk_window_focus(): 'matplotlib.tests.test_axes', 'matplotlib.tests.test_dates', 'matplotlib.tests.test_spines', + 'matplotlib.tests.test_image', ] def test(verbosity=0): From 6292fbbae23e10d8016ea3bccf37eb5b8ae3fcdd Mon Sep 17 00:00:00 2001 From: John Hunter Date: Tue, 8 Sep 2009 15:49:37 +0000 Subject: [PATCH 0218/1000] store old rc params before tests and then update after svn path=/trunk/matplotlib/; revision=7714 --- lib/matplotlib/__init__.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index 243946054e75..488c73299dce 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -893,7 +893,15 @@ def test(verbosity=0): import nose.plugins.builtin from testing.noseclasses import KnownFailure from nose.plugins.manager import PluginManager + + backend = rcParams['backend'] + use('Agg') # use Agg backend for these tests + + # store the old values before overriding + overrides = 'font.family', 'text.hinting' + stored = dict([(k, rcParams[k]) for k in overrides]) + rcParams['font.family'] = 'Bitstream Vera Sans' rcParams['text.hinting'] = False plugins = [] @@ -906,6 +914,11 @@ def test(verbosity=0): success = nose.run( defaultTest=default_test_modules, config=config, ) + # restore the old rc values + rcParams.update(stored) + + # restore the old backend + use(backend) return success test.__test__ = False # nose: this function is not a test From 2dd8752ba9070e349f6312e1022e09651eb81492 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Tue, 8 Sep 2009 15:54:06 +0000 Subject: [PATCH 0219/1000] buildbot: set exit code when running tests svn path=/trunk/matplotlib/; revision=7715 --- test/_buildbot_mac_sage.sh | 2 +- test/_buildbot_test.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/test/_buildbot_mac_sage.sh b/test/_buildbot_mac_sage.sh index d5b89535ae96..63ee5e7fb876 100755 --- a/test/_buildbot_mac_sage.sh +++ b/test/_buildbot_mac_sage.sh @@ -13,4 +13,4 @@ echo ${PYTHONPATH} cd test rm -f failed-diff-*.png -python -c "import matplotlib; matplotlib.test(verbosity=2)" +python -c "import sys, matplotlib; success = matplotlib.test(verbosity=2); sys.exit(not success)" diff --git a/test/_buildbot_test.py b/test/_buildbot_test.py index e3449e2324dc..565b20f8fc5b 100644 --- a/test/_buildbot_test.py +++ b/test/_buildbot_test.py @@ -18,5 +18,5 @@ for fname in previous_test_images: os.unlink(fname) -check_call('%s -c "import matplotlib; matplotlib.test(verbosity=2)"'%TARGET_py, +check_call('%s -c "import sys, matplotlib; success = matplotlib.test(verbosity=2); sys.exit(not success)"'%TARGET_py, cwd='test') From b1daae568470220e341c795b19ef1bdd3c0bbb70 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 8 Sep 2009 16:48:12 +0000 Subject: [PATCH 0220/1000] Update baseline images for hinting turned off. svn path=/trunk/matplotlib/; revision=7716 --- .../test_axes/axhspan_epoch.png | Bin 18857 -> 21053 bytes .../test_axes/axvspan_epoch.png | Bin 13104 -> 13102 bytes .../baseline_images/test_axes/const_xy.png | Bin 30220 -> 32222 bytes .../baseline_images/test_axes/fill_units.png | Bin 58326 -> 60171 bytes .../test_axes/formatter_ticker_001.png | Bin 11818 -> 13235 bytes .../test_axes/offset_points.png | Bin 22680 -> 23797 bytes .../baseline_images/test_axes/polar_axes.png | Bin 62510 -> 64582 bytes .../test_axes/polar_coords.png | Bin 21398 -> 23375 bytes .../baseline_images/test_axes/polar_units.png | Bin 66239 -> 67849 bytes .../test_axes/polar_wrap_180.png | Bin 57986 -> 59613 bytes .../baseline_images/test_axes/single_date.png | Bin 26302 -> 28625 bytes .../test_axes/single_point.png | Bin 22967 -> 26316 bytes .../DateFormatter_fractionalSeconds.png | Bin 17719 -> 18692 bytes .../test_dates/RRuleLocator_bounds.png | Bin 22174 -> 22932 bytes .../test_dates/date_axhline.png | Bin 23948 -> 26858 bytes .../test_dates/date_axhspan.png | Bin 19895 -> 22034 bytes .../test_dates/date_axvline.png | Bin 17021 -> 16184 bytes .../test_dates/date_axvspan.png | Bin 16646 -> 16784 bytes .../baseline_images/test_dates/date_empty.png | Bin 11981 -> 13166 bytes .../test_image/image_interps.png | Bin 67924 -> 70155 bytes .../test_spines/spines_axes_positions.png | Bin 26893 -> 28958 bytes 21 files changed, 0 insertions(+), 0 deletions(-) diff --git a/lib/matplotlib/tests/baseline_images/test_axes/axhspan_epoch.png b/lib/matplotlib/tests/baseline_images/test_axes/axhspan_epoch.png index b793de4cb4c94da44b86f0499a9088c90c800527..eabc6f65d80a0d05210538e6f40579d301652669 100644 GIT binary patch literal 21053 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 UZSRZVGX7IIp?o~$=r33P51VEcKmY&$ literal 18857 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 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/axvspan_epoch.png b/lib/matplotlib/tests/baseline_images/test_axes/axvspan_epoch.png index b6a2fe75b2d9209581f6a2e105e86ad4589f77ed..d0b48083b52c4fdf9b979dd04de8dd6bf90255e8 100644 GIT binary patch literal 13102 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

    !LK+ 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 PzhwEv)QKl7=CAut=SKSV literal 30220 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 iU1t6N!Tg(8ra5?4T>Fz8SybhR_s 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®d1*w=A($^V6iu#P#96cGf#D`fTXKH} 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 OkG|ew-RnAQ_Wlno(aEs@ literal 58326 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

    WJ$>^iaTAeS9GTC0ev!02jwbt)Ga0t8SP$%Sfa zYF72_be|3(&NjTSt1raBu#Z^(`}lxy8TC0ZNd}@_Erg!nb3}(rh2_D@Z!u+`O(& z_xtyuCg@CQ#at_Lzw9#wDsdXIFy^tNw zYl7Uzft#{n9Be{540tpAQ+6yTa?0I+n+phrZm>;*u|%z@ijg^x^2uk zA=_mfhtT?)Y(UT%xw?&TU1y{QE6`Gdu}3w>5o5UZtXMX`MrZE{Th{l>^(r$c#nUDe5Fai7T3Qk z5sd8s4m-y&nrV{?wiW*GkUv-+kx<~WeW5vjq_S zxJ$K0CZ-f;z$F$4PWN@;c+4o5Z(j@S30CBOMQG!lRv%0joz*=#i?$$;rVH zg1HEG7=wXCx2BsB=$QVNSlG#G5>H|g;1f!Q!oXZ5McSF`k((Ee2~I%cd5;p2g5%}L z4n|Hbus^2ZNmoJTPG+X~cojm?K2o_!#Q**`C@(WJ*?y0BA~v0^QYR{3cw|W!x1Su6 zCm(?+z`&v+vc?Cpo{QMIQ(#qWgs{QtLmKBCo}sXSM0xv(ICO}&SfPPG2Gi5ipT=*& z9|*z)5>F0~z;aV@JN4GDLkhPp0xRm?dZf^OJ6Q(F)&njb1DXb&`b2AL5mJVsoU(Uz zeu$qJAfy>EGl8QPprI7R$q9D(d@KzBrqoSMV{yax;EM`@-;v(7&CoUZYGX$8&$j)C zz0S8k$=u#I(9&_Z347zURv>^)>87!WS=9t@_NB8^88~*g!Rk0Kn-a{Ep?>;Wq1-$? zXE2ScCR|*SDwp%<6$y_ZQx-&isB5t5^r(dO$F_h+;MxDBJ4glr5aXHIbizo zNEzGQR8YjswjhOQ9x`U3PuXRDN&IqMm~Fu`rFSV_#4{MHU*Le6#C&}R$0BK0 zk=9NDQQp}z*476lBqYq+5+950*m1`bVkM1UANAZea^%6%UHrhBYJfmLjCgtOz-YIP zJBGvrvfZSJZCAoOg6P{chr}!#a096pS?B?Q?ggIv0OcyPF@0ol{z0AU)^pW(gQH4? zz(qwPhd}Nza_j&j@4=^vC({8mL&-16>TdGU#;Vro@&4@*=3b|ou5j_os$&ad;MnX< z04A+_3M^j27+TkKEIpv_ZrO}LZmfvq)>5Dx6>df$4s*MloN&9fdz9zz2uV{x7(vK7 z(_Y{fVf{IOA2zZ?RF(#0qoL{VUCY5iUOzCj<&MJUI2A)LceS=|wS*K9Wwv{o8etI; z!*K!z$Lud$=tts;&cMsW>U`mWCquWZYiesT_34Kj-sS&}h%Xeeu#s16tgNAKOH6oN zb^fpRzWlG|^nd?|W=bfusAyAZ)#8vTOOA>PDeclaXi>CGw5U*NA?-#IIxSk1(jsk0 zX;(*)7STpY(Wbr6b({BmzmNAn@cHR8KbaXV=k>bp=W;!->w0!dN|@ZRz6F79IJo66 zPbTcSsD=E;VdMEeYHq0Ua7|S&P64bAUA0a+XccBe-Y^oET9|ePDrFCsOZ*c&m)tY= z8Oy)%chX3nta$wACd{`YTjg%nN$+wm(;Aj@@0EBM+9l{azmMQtxO2|+eNE_SAm7-k*dY{c}7g8`WA6zD#f3o=PK)m)QubOW)>4HkC_Ti-R zU$Kuvup(_bVjdkJ6^JY%3(xQ3OYlP9OephI+i-^8CwRyXf#SUyJ3@f&XHXx_(QoWY zB(WIp=H(cAHad_xU?SE^$>=#_l--99LS&-rF*l3JtfqxUd3{H$ShwBLh3W#_uz^N%eX@V#c5$$hwf%tPbU^d*Ovl z#sCVTk_=_1Nfcd&qDTuw7;B{?zv4(<9(5M8fD^vz1EU;;z@E9` zZO$f@JAVH7A&lbQ6Ug9hpLt_On}gR#a%Opf)4TR~*EE~cWOm9Y3ZpHcOsQ^`dPL~6 z{Y+apsPg;N)Nr2fBWy>ahawn|&rCm$Cs+-T)gJ?C@e8OT7Y8S$*IY*Efh>KBG3B+X*x)nJ+OPCgjn!|r*4KNC)M_yL^CNh&Pfan@d0u9!T6c&36(Qf4vdTA zPlGWTT77Y7;11Wg9MPKq)#iF%$j8`m~NV2>ITfR+E;u z(5#e{B5>SA8P>CH3360h1f4(a>@-mx6Tl%H9TfJ-7^O>Bp-PF)5|SYPWAHoq0{2z5 zB=5+S3!#NQcLd<@(xaM%PPrL|0t71|jVuUdzG=m)<8MB_eG{2_)LHLJtQ=g4!*-t zy#5E60`#1aNbGrK2Kq|6+ZAHgUsPOt4BZxqwZux3l(nP-g@{GYZUM(6vZ@Trq3q#> z2eke=W;utuy~kG*l@^Bo(dN`RtT04hzFzRi{Rc~Ez*^vKVUM{x7EcGA@5l94MHv`b zwRN%}M){{+6*T;9rbQx;}04khA z5VQ4AD>dtouxeUbqQNjs)gQ$fw?(lyflUbvTvh37y=baP<^~#;f(Gdg9(85Lgj(g< zQN z&@EUzhI%s*O&Q4Q>!90;B5j@d6ZcOqm=UlN5lw?%-#45O0!~31K**D_sHM3itw7l= z0-QMxxewT52rPRg%h>6CE(F^DLq#R@Vz+j}1W1$NfVUV?@tj%-E6S!DS@H1HfliVq zKL~u@uvXjS{Kll(Q0qISftp~Ga4>bElD~jD2|v+rc;u*J6^6G7sL{TlX*P;8%00Uy zV$A2(-MeySJnFTxI3Yn_01}8GPvp!Uu9-E;G~S2vftw#astD^qp0+j7uK;}9&>wE+SIQh+A3Hoxr z%ZL0LAr6hc=o(YQ=s)22$a-0*O#i5EN>XjSjI+7<>yqf$E49=xdz!huy;I94eDD;k z0ZF!l#Z4lK0YpeJni8Z03m?edfDg=~*bhE9Gbfp_?ts2GZ3@VNrr{Ejyus6IgVV#{ zdr5V`dgm6fBPi)~hD9D2lNPJ9tE=YaOMiS&p|^AnF0N$Gxlo;?jK;Q;ino$F42L?k zi@G5=OQQAXAgF=;^;>|@rJ7AFxDubevJO0Z;m&F;Y&y7HKLhpOf9PkC~f$C!O}d;|Q`p<&@+GXn6=zP=ssjcv%1NM6sb{78K5rZ~~uh zT$kv}{{dCKsEv&cy8S@L1jcL5_0iFjULGEr0&}EcAt?;8ETcrI5r{FaP|VW_$ssZ> zMQwWnYr)c}3piz4_Hoz(?D!Rs3=WJWUn?c&CBZfA=Xt}&=a#F{lJD$_F5%O|Zw-cK zD(3U)@n_6169I6EjN;<#OeC@qX=#!qzXI*Tz=cMmrM&@Yk?g`y)9?HpB#kKo#$ghR zx!69~t_TCA_`&UJaL&B;MyhC|c0-MJjj_F!Q&M7eFX){lE>mG|FpHC=jRhO%5Xn$* z1miR{HG~*3pyII3;c+!}X<8zmmHZayS`~EgKa(-93%_wgC;uJFxIwhrJ)wdbDpLe$ zf0N37IDTgY#^czZbpy0@8hF8I^knx8MLn3V%tnnj(Y>^2lxgJ5yaUZNkYF=TVG6}J-)SJ49x00fwNm|bO+&DETJ<_D*)biz&vPDoF;FXZ6X-|y-I$g4LAulh_ z7SpQeh=_eIMe%3>4g$$>!+M~ck{+*eG=DwMIwNPI$V3$yhb<_xOrM;)&zSoiX>;t>;SpqXDm6%@W9E_^#kH##Q%-l)f|EhmrIDhv~y|)&}3mqIA z$zaZKoAdHMF8E(WVaQKc+>jv>vYY{!FAbQl*7B^y>0Wl{@YcGrhsAlz47pk(aQ6{M zrMgr(yVLsk&A6mIIVJviL#=rw616Sjz z9oN}-w{QKJ5Hu&yaBbaXerJA#k*eLnd~^j}`frK6*Atx2pA(i+wilNgse2+a^wN1h z{fW@pn6<;7=dNT+bsbezYEs|)dUT`Cp})pm=1L75OAQJ~u7`#FX1Ob)9vAo1z(63n z>FV=d0NC!o8ASObd#1Z=6VQj}=!TCbYjM$~W9?rSx^=+zng`^x>ho__^$NljMBv6^ zPbFK4=j2N8b^VmdV<-uaE8m(9`2U4M2m|F)1=Q(4X~$Mj?5pru(H^kkN&gD}-n_XYHlewNPT!iQy z;7Q#CTP|XTMPs?PNrfADmhAV_awnepV~OT)hZw(SKKsPU_=>6H6%Hm8${e(h0EV{e6{B{%g31jZTN_b+ zfiV)NxnG5NBN9;+azg+_VdP&y-2QuE?iSC<`cOrO2DYPPMLE<8;Wb+75qUn#C`5dK zDqjP2JCR3Gd{>Ei!SDs5I^z5A`Icbv>Ej{me8DUoyBrp4JBPZMECiOyN?-NNb`B&B zVSloDtuH_$xf9+#>p_jh;=s%Eix>%RcsLin?Q~_t`TW^}Cv#kn&UDAV^^t9Ol^*Aq z$_Qo-3P#Ymwk8pU?kAKb7`v^uZ+UPDGqDYujxx_+P>Sz8`k|D#bVT_c8KmrjcmyHz z)0ZznfNXmJIf+-2?h%|OA%9h%i$p##laG`YmDQ#wSNk{5$+wX_&t_e0>SAt4T8wuUTZKRWz#)3g(jdOC^uF&==lpk~eA4Kg0K-GD6!fvM2vs3_B zs0Ictx~WGt(RX50dWlZojJ+$CdAp&}Q@*nX|F7ax#Z@AK!z1{J@ex^3MPmIKkDDoq z`TE@gD(>|n3(DZ};`pGrGRZuv6TeeeYA!!dAj3ZIj(YXiE6hQxt8@eaQ3Zl)LVO5R zr)0_W1sC2L#M`lNl_hJ|Ng5)I<5r(ER2e(I)&t26l+G&9+$j=!zsDVeH5izV{k-By zQ(UJCL^J>xw}$lhH<7zoBgA;4TvM)goMWIdReBiPYV4uQG$WLI4yD$b^Ci@jurAh74k#bVb4 ze>5{NryqfBa^ieDewk*tUSpF`jm_ur;-Pdm>*#Jx6LTER`q13SdN#|hqMT?$cnn!_2%YL^R8V}?dFqn~WU^q0^I)Lh#R+)ev z3_%J^68No!fO#OrU7`mH`B|x|CA7XxXir&$IXF4}(ehT{T_NxVLjD9`$%?wM66P(W zoyTSFTa-9sF4KygmfY|-$h%O^Br#RiYM)Qm&7=*#1Gg`>-KI6tQK{47%j9z=QT9L; zFATZ~cOK}b74G^4kTtWed_qM)tdsQhqnj^@T^E);!@o+$8xUI{Vm6V{b4ls@fq{zB zOTt$Zsi4KyJ3XypPd%@|i;})Ban^C`PH|1mes%k+`TbRlq|Ol#VQDO8AcH>>WPSt4 z?4VlZs&e-~bXi2i4b1rQXXUjnDps)c*7 zoVgNtGq=-RXm02M?l2nPzV*@g5+1377IzBaPD>eP1|g@`j)FhJPnbdAg3;9n#_Adn zsX5?71*RL>M~iiVB4qjtdUEZSHw?FWh^VI#_pY~}a{3?^JJf*-W13{)S|Ir7P`7EK z1##vIoy^E9zd1l2W9qy0Y#bEg>4F~vR3!{^`99ADpd(F#ZpM!+_hqG@P(El;<{b=g zx@XPJYw^>o5bWh)a7dH@82d;*T0LX%6Opk3gUV*K`Sl6A`B6p?H6rogf>e|!aVWW| zLaW)>u=eZfyu5{Opr8Cd(KVdsnX)TAHaa@mY@0h+CVW6wAeQ)@(pyY6Oa_o9U}@f! zQnZ)u7GR`YqZd++waqi5f$aAJ{rw?_6z$GGvZ`0QGS&yL$maXxq`If4GA`$G0N_OI zj^FHOxAVB7S_^K_icCii(^z=LZ?g z7?bbxnSWB^2>j!L;X^*OC702xV3NID^|^=Ae6f`Zu`ianC|$W@*IH_PbDG3LoKc6E z`nTiBZMbTcjBKqO3~3Ez7UBS}I$SvIERdn~L)Igc`*cUz8HqQ{)u5p_gOGyDUjeL{ z#u6=OA%LY^&w&*8|0EBC#^NCyAHQw-U{dQ&xRD@A{)WL#6nB+^nW}6mAh`W3mypO3 zfp~%M8o~Y+y{8aNJ!mYV;^It{0;jGJps#dT$qk5AP{tFldFY;!^;niEr({nwGUVD2 zvGm!}Np8rQg>*K9jjPKdOk^o_TSWCn&VDEfMkaXi{=G>;%@%2CHjLCZC^^NK1Zp-; zgC(OBceDHZnq!a$;_iNgF$v&DGso7ilNvu_+867VddVX}xLqlRT0^{rrDElEKk9}9HTdNYjz%hbZ zqdYR-%#nK-l)mQ& zxXiefr=+IZOn?7Gc5xAMIBaG=p^K&DZV8bX%1P&30tQ>jNR3@gxSyL`&n<+jwwX9L zz(SZAujM89L(Z_xApw`h0#u6VDJi);eCueIC_Khq^P7vwXHE$2y5I-)uNCI6;`zUb zbu>%JSjWEA#A6b-N_Yi%PiLdn4CConK&FB(jVc5*gQGH!doO;fm!#SO^;`LU%#X@C zAN1q>6Lk?Y0}*d3iWd+7A!%*=8`t7?!fy*Gr1f= z8;I40Zd`rvZ*}A4KVmGvLECV`dAn%kJ6r0Q$e&s{$?I?7V&EfHA9G_OH90=EkpDBd z8TOqHK4e#H-S zA8OF|Sz6w+9xnO2J)6ej4YOsBf-b^GX&C94Z{K=x5gd*eU0tO|7fj*0QQ5`_p2OQv zz<}fNoB_T09xY%c`jzKcYfm}{7U3q4%{&eoq2;(gdyM5035J!G>Iy#QuOD+w8p~#l z@>W+guJVd}%_CSQuWjqCH^5)|wxED?j2Q9!}Gih>$d#BGO=CYV`ZJ?V?gwEbdu zdo)1QLjHanOyHc4#cm{XrPmFp z^NuIhn~pIVTR64kK}wE2g1igM6T-v&h#~_NGUCaCD6mp^#i`c`vfW~ldwPLLleY{$ z6tCl6*y=-$7k_phb785*Bab0Bx6L;tZUq`0t91^7J55|k`}mJPJ(dHK4ZeSkV<@_% zWUUx{E=;BSi|q&UN>Nnp^q!W7@sZ@H5+lZXFvJT{7~_^8+(n|camfMv?gy(n*{D$w#0{|WyU#6!UlaN4+3|`dL)!FV0ZJ9!Qgi@K0tk=Tty&6LulzY{44_jgp z4gT&b1nJ`{HZUjTjC;n`wD@!(h?Y4jZFIMD>gH~7AG{Dd<>5N}7ig)-2eR@7E!imG z#3wV%vww*hP@NsRqs)b=WVj9J3A`vafO?e9&(wc=4Qi_;G)o`{#9DjbIdT>GlRHgk zT*WZ7*DJ6#LD9hP;O{MnXu|&0+uww_J;Mk}1WFzR>VZIF+>FW)ItfayU`Q#_I8J0B zE}#u!NPzt@c-S?81VCaOk_!t9%QKXdeZG_=xhfoKqGks>Zfu9$VdDNs&ydx+`^VmY zF7x&Q=0{7wKrPXZ7P=~1P(R}JXqbOyN?hi1v2O)xz%NB^=iUe|O%JQub+Y3=C z8icxvp`=|P-_&L>2+}j+I{4h;n2kfeDORs(mPyI@tAc9UH-#T>Sk^lUEg-F*aATg} zyCe2~gzyQorsdUTre$F2Vq3BFn&;9FzM(}#MP7xD3P6)QBpe=Ab?B2aEy@Kj`Z5N6 zBCAacrPCGsh98kEun9i0*#X>pq;G}dv*V$TPhM-k`a5mGUdwxsM)dwGTMJVLu+wQ1 zx)h}%3$_s1eqx=_WS=ko^DA`PDLZd>;|5vU*lgxu(JOBF_WE)UG?e^~N`*SI3%mE9 z)VU?CiY9t3H}`MAMv8irc7?AJ40mX{w+wbw{n9ImqzbVb0etqIidYwRubRxxYT6TBfmFLUm6EIpj-g1`nD;jGC<&)^;;i=FtjrwVASVev^F~ zj+oPN(1d_n`u&iP0GdO#vh8%J&|J8tOpoMux=Nzfj!&9*pMwA*BNKEOPWEtDad!F*A(?J(SMk#lZbx zNmIAm3z<=BrZfy19qV2Go}J-~6&Xl&X&&#(E*6{Mtqc<&#CK^<5dFA~d-*`gW`03I zc42?-T=VEfs+f<}TnnRnoBmXE5z`6^Ac7Ub{_}ngjTyHYJDbs&f+bMRezxE2%{_@# zrzvY`BoK}Tzs5JT0Dgg|i`>tDQS$uPx2u7Tp*>i}z12+OhU@G1WiKrMdBnnUfj=@O zmFzvIzr(qA7qP#luNM{aik}2cSQpP^Mrw>S29PEaRTw(Y$h!s-TJtF2YJNa%aeOAk z9r2=n{oNNY1wiGHGRnG!LV#B`^0&VWMj?A6=o`i&#OV^(8gR{h+A9H24t34(+%99R za}N~&7LCcuk7{9jNWxf4x&a%|o5smmoRRvWQ=z8ct0EzICW-28Fy1&Dy9B=WMx#7(%6>fKkuzGGKvl~20eg| zl8xE?zLX5G4b*ziu))x_a|UI+E)Y2VOyjjQmJ;k$Y?GOCo1 zm`GjaVESdL*}GhF+qU)Kw*vCfICSWmddCll5WzR(Ax>w=?h4>&qhpyKHMYvoAGf!AGoA*a!M?#9hanKfMdOc7eND4vFdtXzjsKA*g$$`?daSU2u4|-tE(RrZ~SU zw(JHLn%!%)k3jK+BTAf{P>F;6xgWlg_eTXdIm>}Y1%z3wn^P%Gs6Dfc>Ce6K-0&zB zUV#r52)rW^oMJ>Q8rZ4*%q=pG7@Clj1}q!DSKKI<+F(8o4B4;3ZO8s!4I&%`17P}v z#*A1pp-0^e&F?#{>bD#2I?5RXbipPT1?-zay9oPg9=jp?eCy-NK6clk^m3b?owdf4 z3jG&gp1YcCv{*Oq{HgPvr7?pDJ9L)F!Bcbt{2^Z z*M%oXMI9dJ0>MIhTWpvGpA7*?>CLuO3@;eyH@O_nZ0}jm6;P1GZ;2ktpF?bF?l0v# zr%(KnN#_`Hmufl=9RZpO}pkeIGwC8g~^W0?52~0(`xF^RfG&- zq_0U>Dv?fst-o@Whm8}ex=emH4rwM;`n#{&fr^NAab~ zw`Pqf^taf~@Q8vQ;Xi)}X#C(op)42GRNJTj|NbNVfZs95=L0tAu}E0?W!c)k=+3lf z=^UkoPu8#?&6U1|!vPg&YIXhsOu3q1yIQy83x3{Vux6=XE-_$ZdGN!?@NlMRBG(KlMU_W_#bqgxUadpTr&{Stbs**HX`D|719)G9Yi zOKbmNUmLS(&2y1lmyN}T)byzUG7LHsV7-^~`0=r#?P@QX{Htr7hZWcAHluSq^aeep zS%--?N6e~!f2zsjl%6|(ib(Ows0L-4ncKwVn+lZSvFOi!UlsVz*Wx1`G4|sy`6KLv zxQJ97IJuRhhfrc;^Tuh`yr2hXY?jgf?BD5rE9k*Fe-6Iu8gwk2(DPmZ39S`UXuSsU zwGn~LzaC8rcwX6qSa4r6`g45z4N!Epf}kKO-&Qp&pT$2?J)7|PUXjnIHlb{V@0(1% zF9fm&m?&CL*Z%rT`a8b!a{T|tLH_jXx%}TBa5(@vfX&Jh+){4)2DQQ#IV)-Fl?3i`fuPTNxtFN;L94X6Q|FwhyQ}sUx|S4H(Wbq;e}z_ zE~7tu&u~wjFl--oTKD*Q|CI6G0PnVe)H!yOp+vgu#@Cs8M+gr5k4|KnX0NqA_Oh6^ zrcc>AGgW#QhTa7yI`%YYTULkIM~-;AX~QzKK!TfK`~fZ2Vwno_--#B{Oo|_ zF$@d4vSvMo-HO5ZFzi?UeHeD^`&DZ&?9|CHxcc4yy^Eugh+*;W&FOmVk7pEWx{6#f zLV3&iyyXQCPTx~Y>PrEii*?6M`}YUUd7J5rjVJ!($6=9(}}Ya%@1{M`cJ$XO1Gtiu-{6ObhAuz zlAK*J>}qq+CR0)0E~lqzquGUw;%@h7`tnQ(KmYBzfnsOYR1;2Iwdb17;-_`Eh@)PE z)rC#k!n5?yP|c}&B?2>6Rb`+9!#<=3ti2+mIn!ZJ_%xe`p@?I*_ZVC*5!qcyVyn_JQH92>%lWgp4PB}{EAf{*ErTE@>ddPbNR*j`B#6l zIijR5P$pjfVwb@kKJ3`kj(vs?va@A>_~8fV91lww8JRO0P*yLuYp>0^eZkc9q>qo! zOSkS~n%j6+QFKH^kxRR~FYEn18RqAk;&H$J`fGx$0G$B!TLv)}O^mivs-ymda>S$n=asOa8P zIw*EsH)S@iCV*uQU+k9`xr#w^Ul*rTic>MCRa$}5XlGk3$r^s{J9qBXZO^@^TAl~@ z;OB47u_{qp{Q4%@`=sTKUO#%T1?$*f?}Tqbw@`hk`XNc##jdl!L78TxKK$sAf&$6R zCg32&^umQ*El&)iLzd?C7G}mxNEg%cy#)X-N#3# zi)ahe!vdRj%SNo-v>P1?@9{2W-@bsMCxUmzJ3c(rNhYq@;n}CLd#KW$(D#C~=9GX& z|1F&);u_2Ec(1$i)mWm@Q+@er9vy*wKX3gHApIL4u1Rap>X+Vy_@=mWR+Yx#!-vz& z@@y3Csw1wpJZZpBWMyZ^JU4kt-K0>l{lbL{gs-pH)xNm=#*S4vYxJEmAc%ntUuU=m zt3qiWD$C@FK_paG_2UE^q2Ps?*b7;vZUj2ONQN<4n*eoIb4HvV#rDd*GbMA)Jg9gTDAubJe4*0@6k?vBIj}XZYj6INb7Fq7vTdP7_qO+&x%Q z%wDB*``Wl>*dd`&gsYjEnTg6Srm4g;XU^C!&2!kV*NL~9+g1ey+>MV{c~^m9FSNc& zO{?F%cTey1>C-tJLzjVp0iTH_HYrqOo7VK%6zCO%fqQ1u-0}&b*&Z+B`Xpr;=qzbc zNrG@_wfTO$3GhozBTiVjR9-Ci<#vyLe0(OMbgEHjIxv&UnG>8qNvYtNqcSF@Q}xl!)DWi_IHJ-2Ozl^hLZt%_wsI9awe0|~ZOHM8L{ z!m9FHaf@HSG1!J3({YZWT zBGzT5kH`vo7SuJGM@gfIVwkTk{2s7@KyOx`7ByzC07-N56ntjQE;DO>C46H{R$i5Q zXfLe9o*q1#!@gZUlty%~0E8xd{$&rfB4BEzk0T+W-CQp4A7Vn92MfkynL z^?A$gJo@yLCkZxz?~*_8VV3)v+Jzcr_E|lA`SPU=?sWw;KJIK3+_Y~sB8>-*{f9LE z@21fI6r)YYa{!}>6R)Ig{6GKFQA)5!P2EU~(|Slw&W-ULG2I>etga2E`cY@AW-B}V z=)oC}9vzS}NZd~0Hh9>=rV?OE@#=>M{!r!2u+>{5F8X#JTpkKtmPYsrbkZeV zABsvY`tN}HrBh4#g9rO;f;nw!BhNAz0MyaY5DFVBQNx&gCtb^12<0i*1hH!n6O&}z zG1Gnj{{0RuD9)<^73=;Lq?R^J+Br4UM56PSXSs6`5m$T5eBdZozQeD>!s34jYrPCl zfk@St&O&@Fhi~;ay71uutXYkfK%8yI@@vHu{l9)PFZXq;C*yE^0E|z>_5$2$0^9-; z9{Tp%=S5XcITaNZjg@&-^UflHUmgKNJI_!=99ruYK*)Z!65SsNJU9E)2jrmzvzphn@293gugztW(e@YX>Je zr8li(@jcfeiD{+7g8}$DXE&v4sD=_RZq=Ip5D@{SRGFq4oMamB5PS46hPkS)IVE~y z^WGis78KpOUJ8wxJT;1KOx38pd{cBcKe=LaiEC$pP0g=&i?j|JY>*?ukT;Ac+z5+C+rT*^321n@IAzZe$n zm^3)06W02$wA8;)yrkSI2mNJ1EOe2*0tr-MkC=60{`)9ZAPtyT2KpEztH_o4jtkus z@jR6pI#WtuGQPgq=J81q!yfEcncef70%g$?nD^8BQu9H;)Dh=3NL5z`C{2eciTfws zOHVPp5Co$Et!x~sCDtQ&)QSKje+>fXH72mnb%<^Xet+fE`3o0npn{yUjo~KheiI@$ zMSab6gLa72#mm*vmt#GGBu#UzEtu_5yJXT|zC1ENGcGJ+mK!6JTPiVZ4_ZU~?=pWv zSmq63_XtIMYPEa$_-=TnOEKa&ZO6uxz06utldWpt^p`oNI8V@pmK`}W-i==QPEift zY@g6q*7DHoREWYDHg*WgZsVp+_AmqzV4|yiaQwQ2L^`xPLW6R9_1oK$Q|$wuuX5%$ z425h|$FTLc;kwRNYyeLGe^&AQ_tAf!JbSh7>ab%|nkbM`Kd1xUJex|;9{8J| z7$(b2JkQOI!>0vErG?B7o5O(ZJ=UR!)Gf8;Ii`T&7Qo3n{}WF3%(mr)D1Wn6L=bUZ z26u=|f*VL0X|k);m@!J}Wo7Ek)1bdj!em>qG}Eo<-1Rb?J9${*1_#-fdH% zCSN{QAUB~k`BsvN#6D0iYXRm~O3w$VkeljufzGQezc;$2txj zn(MD?E%##ys(W8Gxc~h@7!b{d`jXwtzMY?Ck$J)A&YfEvF{4DKr>Db5N+$*R0+K(6 zBZV|wIBYR#T11+;_;;6%p<@p!^@tB8$Fj&dh7IUgegF{9)O0s63q&LDB_w#XEE%S# zDQeGu$xs7EC43o9T!;3CKVWDHt>={&6F44ed1;|`FFvLDs?sX#w;5{fSK7m8&#o4d z&5N9Jo?RWS@;;Lw9}A+4euDf(yOGxCRz*X9kPNJf#Idj&$(jM425FkFs9m6_COIWF zZ3BJ{)VU#~XW~f_{H3Xa{b)w8WUr! zdz6s8%9$vSkg4S7;-DdJAsD^@YTYY2G|O2c(BO?Q%=((Iy0Qtxe7nK=`{({vFt~I2j#Lfkz0TP==J^r> zi9n`%x37o;M}9bSCYiVywr3(h0BYht9@77MN6p}z*R~HI8`88iCVs(bKpkw*TD9TmUyT8% zY!AwkZ;X)g;cvEyiEP>26tU)P;GgC-qDddvMbi>e<% z%O9oXWO=dBxw{G!d2y7o>=H75*Tg6iI9iQcNiVIx5RKgj{~1-S1Pd*$*S9-|*7p|! z?SK;cEg-mmi?Z!R4+{$mNdquryT!@j7ye$fRef4e@O@@hRtDH=oGxL0#n9!&z=rx6 zd_$5l8$efeR`39$!cVr5SPNf7lGC2Lb-Z|ZU%E2{kb38?U3y^2A@NvGFPZnz%`&g4 z&oD1@v$%Fp_d3V&wx`DAL9w5H{;QScfGoM`W_`GA_rbrz+=dAm5QY(Z8)?fb31ES& zE(m^{+1Hc<=UNcI_QaTt2hCC3Q9;}6> z{Oejk5Lgu4qG{GbJ~(Z`Wej}?#fSAd_(gaI;gkB$F+755%Na1COi?IIyig z79hWvT3VJF;+OB`1s$v#@U#FsvjCvWAywVyJ#;?b`QfK{@!;um>BF77Ia;H}-JomI z;B3k!)H&#j1zZs@I-{f9Us3n|eF3aW4Q|m1N?RgltW&8Qtm=YI@}>J;_qXZ?HxX;1 zc3I3$^cIGPhmSqWhTg3%z;u+ZS14(IaMb|$6o(-d*g?vICuMEto;y}uf zYxl{pBM%4a67XOyH5zGi`?G;A))mMSVMHr{Lc#MU6?g?Tm4%KCXwfP#D=l`Bd5c46 zmB{ori8EY%q`zLFYK}1mhwd$J8C3jweSjF}2U}I|cU3(MbEk{{sm_tv#G)pJjT7lkG3~tyJ zGzp>)Mv_zc*WWi4f~%%g&K*ofuVv};w$P5u%Ctf^4Ze>*Q{zOFVJ;g3zLJ$60(zGN z2)ACvzT;i$vuOa)EAKYPqVNfIUa?l>&N!H5hTkh}X}_gJPXU?oipKa$6JMD3R0k7} zgj3ZaCXI zDz4^GBOPA~KhB8-PdB@5+zwTTJo$$pi|E$IiDuxN(v)fIHVYyHQW54*xruQ={V_;d z6wOp|Xjb_k1xVe$f5YkReUEofaT}B3A3nq{0Zp&axfC@TB;K#qi)@ zGzr}l3%qLW({=$wX`(LDR7*?M8r4U$EscM4+AHMQhg)WoGQ5Tw2@oo&ktAvEP;#t~ zK$0&A6T4uja7mAJGD5GA9NzXbE%%}@sQ>sJ4!pJj4|)n{>(5|tDt7C3pR!3Z3vLSX zf|?Odunh^AX3=qtF!!8HzD;euRcHexgM?JJEstZ10xnYU^Ojpvxxgd9|B{D0F^og! zO%U&8!^@+>H!a9I)tviu-B3l91J_P~hSU=R%MW2z@lc_6f z6ZWSoTXM z%K|K8CL6?_TGUpzX?{Jn+zt)Fo-@*hlyCDFmyX|QY%F$pi|Yn(Lo=Qll%GrXHegW_ z5;nx~qLV3isUL1lRgGk3rCXJ_1L*sqIhcVw7$nTp?6DOAF@`?qQS;aVtrub$BY*Hr z>3?j?!hYsLdOD4o5_W)rilFpE%hEw1qh>g$QpxvjJZD+t!Q>(#ky|nOUTyqk%Os^Q zc(!-07Prh#pQn{DCdygvU7tH0w{Y}%{9KZqV&f;*gsSW*lFou zLyGtUQ!!G~C+33KDQ?{xZb==v^7huV%*-gKmM3lIWOW~B?}?tHTQ$aBM9lSXcvs+1 z=WOlu@wBuah(NFa8E%mwjO(_PtDthW;ILu~oyLmvbO~h2n-@7>Kr8Q_ZZSKZSA}2t z9~7?7h06WpacGeTwZU^rRJ1=C%aJAreJ>$FNr=yYMMHpKNN1qMCUl9jIPOZ(#Je15 zSUUO}d8O;nGW1EV5OHV}3z_@u3caxt%!~^#9KG!9`mNv@j6Jx%^*s_GT;KhAuyc;hEQH!SssZDCGV}A-6_8jO zHlE_iqs)`3jZNATcoPkv3EbmA4(O=ZR;yu9O5RdQ;^f%9N>Zpxfc8P=vA*hy2j6wL zKja##7j`6na&mGkLNe|xpfg$+a{S7nfxB2MfmWLR;K2i$z}-EzL5do1;HQXw-EJia zcF!Eu=A5M~v09&-n4Ud*i#|JSo0eE?u!TFcz*GPF+v-%WP3^a)Y)Y?Pj;&m~c5Np} z3+($m$^&leYy~6%-i$G#6&fu8N0@Y`bjr08#X;Q3)@|3_UH~??&*7(Acti+RSi}c3 z(#$wu1|{B6&LN6HQx?=wHbmE9RNPbS5F98=`^N{M;G?x1BfTc zTI`T9&5i(y0)DxPfZ-|oOjdx|U!8RCJ`L1n;#NYGY$@-5l(0mz6?RM=;pQSIFSK{e zczj8=R>aFd1Slq(4*GPgiZSR442VE2$5(2m|#L-#X+A?Lh1nuC|nm8z^n#$Z4VQD3vz%Rpa`d{9B>~w zml=(P@ELH3-{5UZ{Mih2;H&{aP&}e^yttczLJ;f3gI>^zD9fBYCa|3-q*5dQ7R74N z90Z@~VvST?bjU=2n6WEa!3rUhcgRP&n5!PRuUd0yoeAC8)}ztbO&l;75|jH8NcqET zVUJkiV};;v8?|P8P#;(>Q|Wb?(#S?z{L zFiU~Ov42qrx}5A7J=eePwHACV`wn^W0PtkVKgrcdZ3pq10n>CezvM|>-D(&dcU#2Q zC_q&Gq zom#MORzjn|-TT||py;6*(&V(7aOSNR6+*dnsCBMnJWBzTn2S?Qr0ZMN55Y?_V}cdA z2Us*IgQTsVTQ-t8H$~=&pcx#E?7-bCh1&bPnzUB71ck0pSP{hz37>viM+N3k&@k1I zs3<8R0Yam#{SpG8ox67rdeFVcL2=({3lSn0YmH04g(2wxnu7ZjdD}7Oj(u47Z4@O$ zF`5;93bq}39zReiBN2c^HY}sUX7(sVGf}{?9`pxf|0CN5NL@9U8!pxf4i@Ox#G<9Y zud8Ds=@pR*$fOE^Q}oVO6$WBdHYuR)vZ2vXqZO(I(c}Z}eKq8eO1QxXAfgD_&>w&N z(Y_MQg#30JA}}29abD#_3lSGAhc)PgVXpe%3kjp>8Fy-^7S5B{9_wqzks^m29X&nH zLT;CUk=lL)j=W%$6}pLAysQbb8>k`{%r0F-Kqym3DkfT1mgr#@HvS=@YWi_R1d8|CefsSuW%mVG+HTNO z>v-A;bv1CgDf2>{;R-8&dKamwsUbjCjf&iAkf5XRqWU*uq=BDNbFB)Eg_M>PY$}`0WZU)r`WkI^9$s*V_j5d72lww z0>KtLBF?w!MXCjK{h%QYdSphN`e9(Bc5`1pv*(zkA=}R@S&Wx0Mp^lIFE&3v0a6~d zD6iaRW}CyNjyu%FyUompE>Dqta>s#Z^Yf#FzaOHvC1`jrUV80Dh4`!xKfl*teI(M? z=e$59NrxWJEt=>puZ0+a?Wnd&CAR_+2(jM_V4NW>I2QNeL@S^X8x7OQE=A)ynuzIX zbpy!BQx0i!7LUG`q5=#G`HPy+`ME_T+_Dv#aoVo$54ZDkBn>u=JEoIbWg^N3a4d{u{QUL zHN=llRk|e++AsRWg3u>BLE$aWm4q&om{<4{dcfl$j2E?2;dKZDrq|gLVdB&SOMwx- zNj?G@J;<#Fh2k>mB)JgB5Sm?>AI+XD+f@6Gu$;Sm zFD@o(5q)XUEnQomol~Y|Wo8z@n623jO`#Csar7(-@j1de{bGxNH{*empg|vv?2vbI zU7TZE96x@%7`o`951P$)X&!;Pci9N!!YNCwg94G^J@xwIcyy0pRiC zXc@?vZHaCz+302vM`Yhu;ya6bCEHzZOW=E<696>S4mcniI#51MxKb4llmO{;7t6dm z8OEw~?~9yBCg literal 11818 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Ͷ^91U!JC9$l=Zd^9m*HOu&__}Lde|P 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 MJJ#l?wdbn;1FhaS)&Kwi diff --git a/lib/matplotlib/tests/baseline_images/test_axes/polar_coords.png b/lib/matplotlib/tests/baseline_images/test_axes/polar_coords.png index f8ee049aa8aa21cf4898875817109e49ff9becaa..ecaaff962b9fdf47665b5383ad6f2bff4934c7cd 100644 GIT binary patch literal 23375 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 literal 21398 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 FEX9-uLP$tVO!q3 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 MyK-VVqWa$d4`=YWrT_o{ diff --git a/lib/matplotlib/tests/baseline_images/test_axes/polar_units.png b/lib/matplotlib/tests/baseline_images/test_axes/polar_units.png index 8cbbf44eaeffc6dda1f66476a090f3591a3e67f8..fa6f192de52294e3cc7d8266e64945c7f794b70d 100644 GIT binary patch literal 67849 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

    5tI5_ieSwCzDcCBJmsCRwPc21oLzTgacy>Yu%0 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’d}MoGR7=BW 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 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/single_point.png b/lib/matplotlib/tests/baseline_images/test_axes/single_point.png index bf78f285396d412f2305541a8c801675218bad92..fe85f49765d19380be408016c88af6958b0b6873 100644 GIT binary patch literal 26316 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

    gYbm+f%^9IPb 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

    PH1=1nGh>eLk4hp&~5EuxQBC5cx2p`nS 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 literal 22967 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 diff --git a/lib/matplotlib/tests/baseline_images/test_dates/DateFormatter_fractionalSeconds.png b/lib/matplotlib/tests/baseline_images/test_dates/DateFormatter_fractionalSeconds.png index 7b3444183d6fa784728212a1814f736e3fd11ead..388f746895c20a09c272456d1551a5919311b1ca 100644 GIT binary patch literal 18692 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 H`kwz6MGy!~ literal 17719 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 literal 22174 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 diff --git a/lib/matplotlib/tests/baseline_images/test_dates/date_axhline.png b/lib/matplotlib/tests/baseline_images/test_dates/date_axhline.png index 9c73cfcaf84366c195538571bc709adfc4124e7f..fcf5538cbace6540c8415f7ce2cdfe000f03e813 100644 GIT binary patch literal 26858 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


    nOEV+{~v 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 literal 19895 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 C%8ok# literal 17021 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 diff --git a/lib/matplotlib/tests/baseline_images/test_dates/date_axvspan.png b/lib/matplotlib/tests/baseline_images/test_dates/date_axvspan.png index 47ebd008bc1ef96b534293421ff3325f42a39130..1367f42edaa12c3aebff52ae0f4ebda80c791789 100644 GIT binary patch literal 16784 zcmeHvcT|&Wx-S-VV*$a!mM%p^DN2=&ib|295}K5)f(Qtq_XImC0s;ckRX`w=Kp=F8 zZj@e>7U?QYdar?Sp4U0&-Z?XK&-v%ByY9U+v)0~WL-OVQ-tv2X<@x5RzV5}nyEt|+ zFfi=Z)KI^|z_5*vfnlrhZ#&>OF&_7w;AOk(SxtlA;D3I<&VGJ=X*`Mt^bg;eUJ8^Y-%0bpRhd^obKmc zZ45oKhh(K9mDF7AK2*}x+;G^!HBLTpK1OQfc?#h;jEUh7wHL%~=!ccn*LTtD$;Vr_ z!pr;Lcm0O`^X4%=^z!`8UG(y=KmKo>1g;9^Z_^%AJtCI=8{{}8?<*zl<41L3Wy^nB ztI{T zLys)?`){5XQ+4b)9ewip{d~t>)3NppVN1W+M?F5{StP4kHm1FM7Y*;gHQp0v4~nv! zJ$rVrf;JT{*Y9`roo@Vbe*Q>n^EQ$tel_LNtCMFE{N^+}%e?b4&5ExKH^vH|FwA@r zWr^>M&D{c*pj5HG2+VOCy;3|7tZ20~(JARQ^NqKBQy@f%e{;3jfAHIf2W;Hj4k4Rk zMwGDLQqTIS-qP~J?C{Zc+afGY4}Xrlg>OF%Z2vK--EYaspMh~P(OdZHuq*Vq1R*K=Veyb zr$Ir=(>yiWVA zbz!u*F6X+$nnKn2-T7tw_oC!K&pq32F|1a9g3T*>n;22!n{|T9hRNzAwz@W2>QM{X z-ah?mYA{j2T>tgt)hADs)_x|D@Ebn9l)X{GTYoS*bmfOO#>yFSHrLmOzkbbU+esSo zj@rF@_kPw;!z@$H>R|5jm|3m1tZP)_e0+UGVSc{BvuAZe3MJuf+2$K3TQ;X2|^<1~T&u^7*H86OdZ`*1T%*zt`@#DvNyiiZ# z_AZr2Pri<~k^3KOS8M(>N=r^wfA;KIPt{b}ysn6-=*z`%YWGdu)T=HoE`uG{un}o# z$68PQ+BEN3U+jK$>gMA(6`X0s>M$oOt4YC~=(y9)XVuktd?!vZF*8T93S6k^#!|$D zgoHeDy?#6uwu052d%umPCKg*Ea_ZD6N&LE(ywkV44X;jB+BENk1)GuCRl~SG|o&$rK}H0oL7fg z(CYIV*gM)+UOGF1M!B*Zu6BT(ee)+yQc_Y-Kp?5h>&lg|!I2SdJRTiN&H6~O6qw__ zC$?sGb_Ak;Sr{xMe^?xs@xQMm^FLZ*EML=?a-YSph!aL@3K!J!3@|wEt(cCiYr=4b z=N74!JA0T+?!AU}IwWe$xlj1bHU_6+IF}Iv)l{wiiuiT9;DXvmdRN4Npc@R6p-Nv3 zz5IS|3mWwwdlyQ7RO~PqE?)Uu;Uvth3H$)43`t+$K+g$Omf?L|d zfPl@PF4or8Ve#=|mbk@;)A72+-yd^Y&3yad(kMgyU1KlI#ENk6U9>$1&D2cvBgiocO0DC?vK*&aOvXC0PHfPY3#&O~>;z$`F97v?l@-xwh%lN=Q?k~L8#j_2x(gf! zYHMqMxG7jS#>ntQ>1b%Yn69Ad>c*Y^E?a@^SJBkan9;I;&++YZVk_Cn$jHdX%WLV- zBV%Z6{L{J9CJ|?NNX%5wvmaOZ{IJx8v9@#p_#?3R9)*A_+x;@`u^)EHjh_4?*? zI{EF}w_Qc{4c}+V#!yk+wv+kgn{xqmX_u1(m6Xij;Pc(AdLDZJ{?=7m|0e!}zi(UG z%PgO)>{3}&w|mg1swy9| zB^Ljc2l;mGT75p_V!n3hTMT;{&FhH~Pc^pHT zW3Pgyme$%@qPe0soLkYuK+)S=J=wg}gP)(|I?}{( z2@&D#%)6fK#H}r`rnZX6%gZ|sbar;OS)fUe*}z$g+kZB9@Xh)TLOomY{{mqZ+C5QruvMc!@{<{9snfb}i4<9~|{`j!(3s`OMOTASQ3iR>mpv510g7OjFSxs<5V%QO8YDF79f21Fbf*7q?E zZv8PZAS5Sev}^b7l%gWz7&)w?GL^uA1{28X85JmM2+u@6KyJh=BUNJRkg`R3D*kf_5_w`yLBT(xQ^VAwc0eLq+O`Aab(T99xw58IB+XrOu5 zZZ*aTT`RZ~I@+4b`4`yr2iVQ=-^6QbYlruh`)cdz25)C%to7fdS&sG;=PAuMNJ+X5 zUka&Lh}RwME+qOPD(f+6I{Gy?2~ILA9M6*rh@>-YR?747B&VjQWhqk>XWNID~p7dv1e|#WdG6atv z1t#h+E}IY+Ckn)|BhzHSxpTSCS8t3;lmKZE35Z(efQt z7+mVcvj3vswG}uT;;!iaZ9yee4_yr65ON>yaOc$4(TQklYpeG<3gao_0w52IjvkdY zymIA7lC&!Kfqg7!)IYx@wO5(nWG~r+H8YFjI_;$9SUM?NIQ#PDfoLUf(w&~7+53!E zEy8)GktynuZtp_DF+wqA_WO&uH@ zEDEx*vC*!4yf+0$TjIas{(E*>TFs=&#@b>yfLskMSx=Sf>fnA>R$mh|qa%-DA(fYV z1hTFbMurMptP2y;PJaDb?Lr8TSaEUjT#svW=Q8K18xN%&d%jMN8M3IXyq0$8GT_0l zTwfgw*RyI)P@b#e#MXdVOVLYIVP9W62-lstS_NBd`_7&9_ZfFveSUrBS9MKaJMsb4 zSl!I`%1N3@BxW+hkZji;_9>9Peq*^`LPSJlX=BHp-}yGzsFVg}Cb-V~W_>krJ{1)U z7gyJmoE&|00KMmjm#n?a|AXO^fHQ>m^q6&)`xbJk_!%SM7Z-0bKur6+#AP*cP|NoP z1qIDINIEgnp+|LM+MM{|Z+s`6ng3;${L?u`zuX(yJ74)+hZ{nF{J3FD&5qy0tzhtH zWu?UEDI{%8$aWFZw?C_`Esl?*B*RX*yE*V%4P!%`{8gaYf+tRB&&|&djix3>f;g=O z!XvSE3J%|%-%qMN-phFu&}!j^DcXFSm(`TMQv4~&DJh!MedX35>`8vBF13w~5l}>G zrJ9vozl2CR|4_e-v29BWHI5wm^zql%CH*)2x`h|_94bwXwnVw$=K6@Lkf7kl?$BR4 z{o{a#oy*4A|mE$1VU=iVS^DY-ZDVv;E%uK)LtKk zz}s?1eD2Y1cAq1N@$Gwc8jzwkTv!OXH(pj&$+%Ks-=&Grkpy2|3)~_m9Rxa660x{@ zj|KR6PIED*r=_LIPI0)NRw9;suMDV1ju==q#hHK4jWeqe45rjKG`wtRxKx-M7RJV# zvN{UXdmj|YzWT|MD!|p|(jJm^z18fGPjhqi67{rc3O2-lx!2QW;_E385TTJ`*R%o; zi7C;$|AQfamxA%Uk2u}G^F0vN@Z@AcUZFKxxa{Y5I-IplO=xc3ym_y*vq&9WE2syQ}p+mADeD!7lMZdy=(yS+R-3Z(CR)$c0A zO7LSIB>~u0Y)~n5GMBu|$H{2`y08~7_~I4Z!vrn{*FaeaQb9)AdrPP7A0PNm6<<7h z=@lRR>E+L#w~Og(fMM#Omk7!U)+Rrk zPB-~-!j)!Rk$yOR+87BCP&Q!}y=8MyYy70-y4@%3FZ zePFsE`?RiKe*<2L_WW?;Wc^Hum6esog$q?7DjiFc-Q@=nk^b%X11|z!!1%#1s|ZHh zYrB%}S!CP%%d+@qnuO<-)Gh11fNfSyaq@_6fkzt-+E>fVYlSfiPWg+2Ck$&qg&(CY zO@_aE^*eIp7Jh!I)VG6adavrdeQ@iorZ^GMd0`O|LaVE*a|^9{+NrwngK#3)&9b$l z!~t3PufDq!3J$~-qmB%)B| zC)-CM_RDUz#7ZIp8lkJ6YlbT^%%}oQYiVsA0@@@A z@XNG|V5;-<>C>>7nByiUCcqiToI3&Ov@P7k&lSso0iMBlgUI68e8r=mBy;b4i;h#p`>SAQ<#mAk`ojYgG&jat<_X5b-U)kZ;uYVU(w(#*Oc^MU@ z-Cu#T=lct^!n;tAz|YVB@6Lo}W?7li>c+IcL~n_E_`PjAJB%;D_4qzJ9kyWMVy^Zk z8V>=miaWMXcII95S)LLL;*bfOn3xDOz4f=gL)s7=U8f;QDJdZ-saA)~QAqR=s3 zP)KO?*cZKRmLKN+j;3y$W#&~81uEw<)+S<7;+78Z_}ShBhHzI6pz1YnL@;`UgoUde zloS=Oamd~|HrZXs9!jWmI)DDW(Q2!mVDc*H;WPW_*WU_C>24q zvHJ5NlcdX_#?#>7$Z;aY;+;kUy-hzP3Cq!71nX z@_Oat+SEk+@kIPuI&L$ASYZl(!LE(Ml^O8&w*ENdY}J_*ZK8&ol}D6%n=TY*wLN8g5RM0DIU4h*J%O zazdw1f31Itj>6_Al*WLm00&Xi&@d7Lj`~(TRWZafk}ihOf072Og2EkpOKLCj;sg;6 z2JrZ3T)A=uXbXqNlsTx@ieM+rtzyI{H6-hM5&t03`X4#SjvrhbUoP^lDx7@}wDhn1 zhkC$RtJS$7L|2fTXOrMPe7_#QIus>&{m<>*bG5?OKrJ9k(~6eECS)4tp0&WQTAyov z@4MCECM#rA>X8yGng1xc`j1FUZr{l5T{RK^9UBI>nLeMm`SSB;{Z-KXs=k?)6uirL zR$(2)PNRzxFkyEoU{~hYwI2tR4=r%$E(sDA77lD3eJNw#Vdm8N@uNC`Np`^m*ecc_ zXf0}g85N3uYgBl3)*m`>piS*8T#|2QO1|Yjy#DG1aDr4;H$h2cFNbuREYIP?w*7b& zSh_2hFCSrLWsM?dKB)l{MB+rA2)Mo^Fl#NVi*9F^rKF@>F)q^KVorVdsD0KwbGL%? zk5_lP^6UPqWN-fI{%S#q>D{pY`gEFQKwJ7i|GfFHsBuGP9n6f?)0zxdZ`n(<@?4BGYCU;i2z z@z1kqt{}xXCY}oZTOu9@HVUMJ@=%6_B)ao#^rDr03;sR7m5@VlR+bEDFS1{4niDF5 z*>a%XAXA5wmj{JX>-Oz5<%Fmxn|}NoYdLJ68M3MM?%%(kY+WBYVlFN&t~*89q@TFN z3|GRAwWI_R1-45gXZwFyKc>YG9XwdvJJO^${qoO0&zey1<;uf8nb)x87$DDOnR3nFq<>?I6Z*;M(E+ z83n*xiX;$-=T=JLW>8Ut(4jl3rQ8_k(-lL*qsVDACEIz6e2=(_Ddcyb+FX`9c<>+_ z7uTJUh2^q);`$wVf>} z2%lIC@ukYf!c}>%nb$oY-3~4ri&UCIONdL>fJxr1T651{A zLl62lao(Pf|IIZ)GxMg@>8&oTV0;Q5Ir5zp>G0+4`Ms&>CNL(F)AzF|-oMjbprhb1 zaV$iYUL7`g%9h5^r3KF_HKSFaKM(9h21=4^hL)xxQBSzL? zjLP_t9E^NQZ9rUPG$Er8Nj*zPDPXBq^z~Iq-=#YyqOj=$>irZ4e?IDhse^>W#z>z!by-SE3dcQi zkz2t{V{@sH(mC!0X$(l&tGJ2WY6A?ptgNS+DFgKGNdCD1=B`ptEVrCvoX2Dr2GEDy z!s`rX!(Ng7$$b2A*MvgGF2CigXSb{#1~-rfC2?qk2+4cpMy@oEg9eONjy-X+WdxphUU> ze>62QNr!NZ&f1uo;G+dDz907&59mSxHl2DwUHxa`=DLk<*frp~rjaQus_QukD!8s{ zk&KMAw9i<|h9PZXGzqAtem%+UYtHpCHw8>P<>>hOx*s=$R`8L^02V6z(_Oeapqr~r z!EZ<(IdVo1+9mqBH*C2j%!>4}6|1)p4tssuqBu{)FP?A!quH|JaX+5s0KZT4osw5} z9ez$AOm&g9yUF&cpq_lzSDbl;-PqyC!9+3LlkVSW(^tbkHrqd)6rw^vbEJ$1+Ks`$ zZ4zJ@V2UigQuP8zkpc4n%_D&T%|_(}g18Au9b5E$hXcfXJPK|#QLMca-GzG7rPC_h zC;zxRJTx>~YT6+je=X zcX7U1wXoVu@myh#OP~r^O@uL3@8$x?EV9f?3(VC)-?&Zn6cffQ6F;JW7+bz*SiaO{ zpYf|bhf+7@0=`R7U|=g8-jX09#J5z)6LMd!)LCw>8R=ZQlwar|4jPa;o?WV2=+Hf! zWR;*i`*AVTj8ds&yvg~DM z?ofpWDV199f;{RhG*qQSia{`4wC&K5>rF<71G0{_<9*)69nk3Y@#+4>!P;=s%a^bF z|7mVvk-crlp3l&FvU+|gPu060%xVIChC@t3f(meGJn-X(8;A;1GqZ_#f!!lh$wr2T zV?b2$!R#)vY3Aw8w+)B&1cb^BIl1CfO`mX&OGwB*bLPz2+Bh-8uHE;Pyu3-Q95x&E z#>gluo3rpJr4i`4!6Ce=*+4q*l5{Ac&?-|r3(^6QTJJ;mWb zFX?^;BVR^Z+Q4(FC!J8?uM@X1jgE9X9Q+MXg&6YjWnf8U$d47EVNDriO?l-63-PJi ztLdhL$6Wh5w_a~jq*1VZ4W6o)58$7z&sV6hF!tp^!@=rICCku2h-xHE`_pI7z#7}f z$|?_+K>8fDFhG!yU%fopEew~B06u4ud*c!64wCZN+6l8E2!c^%<=ZxBhl}|7)tF{g zgMq1a6}yhq!MQk2wx`O5QLhfe1zA~bzvjGY%P`VY zSBFB#2e%CQjR+*pEm_y(6651M9fymGPAj@nv(1HI7DVgAphN32h6!RK+tzoQmo7b5 zf_;6(#Kcy5`O(~kix;73NhmikFmMPG?ibDjRhr0FJ9x161hI@CxE|cqk5;NP(4C)~ z{$I}2qj1dtRiDEuenqH519$`D)iueTtaFMGM?p&OlCx913$n|-hLyk2{ zy%DBomoJ$jnHeo*QwKIovi~Ms#j={8AN2EFpYL=n^kfJsD43#7DbV3_f9{sh$h*~O zHB=XY>=)?hivl$7(CC}D_Q)ETn{$DiBNf_Y@23F~6P>1PRv<#ql6&*wK=-rVSp&c_ zYRkOmtro}Hk*$nob|lf?LIrvq<-O;Um0*QYP&P^>Cg$!wV|I+F+T_X453WHtd==ss z%EK}2!92>xM@L8TawF!)@>H9=M~2Cw^$C^h&K0!Ind__f*dySWK_;3HUQpNTGuwim zJo!8`<5Uh&;-ubX=u%7q6SAuU=ezMUDa3$0MoWQ=s}&6R(M0-!Fglx=nW6&Gt*xzS zYj#0jN6@opEwFZz?HN(so=vdT$>#$PtwF&{C(wk=vMba5Y2Ez>?G35M36i|v)>i0Q zTc^ak0*v_pklKRB1!3Q$_NCg_0h7}z8-r1OzCt*YfX&?u%kyFqb=uY zi{m!Dy|V>@-qS;agFm5e5utUX9Xdk$RY-scwv(-?Asqyawv?o#K|5`_Jg~MKzMvee zVi_SJ^zo6U82YydEDK%s#P%}}cBB)cm%n|g5N~SA^PWcq24!gkLZ{xa#4T={Tes}M z;DM9WLFZ@{PV{?=ntW6i+pfYryh}+rTuZ;{4HJ+tJ3EV)>Q6W17Apd%U6?AJ?f{mM zVYf)V5x~s7Zr4=$s=+2?)dyb7M(F;QO`fX42VNwmK?jZz`0N=_8b3oZRCXVG2@Bt) za>^6V6Ty^xmG!`Z)m?$Y3k$IZd@g;Ag);!Y3{e`$Z8_v^=c^^Louu=a3~UcH zGG%=E^2Mhgx9qKaQ^(q()FTUU6heZz`ZAkoGdyq^#}LRQnISF7lC|$>z&EZa5bfHT za)6Nee0#qIAvBN+Tkryznhi^P zWAUQXU~2VDsRGf{(bRN4aW#O2x1*oFRETDYwmiLT(gzy}=t(buK!=4QG$pE9g3eC^ zs57i5Ej0Vn^SX`Bn|J3=Ox&SF&*Me&gezj^#pQ^^;nGCTT{U{20X*{I0%!>eXQ5Bo z4s6oL4FwO8H9y#EyUPo=Tg|OLHV;82l@6cIoV5jI^`C`(K((x5aY^-iRl3O zgO*ByUAw2X`DVAJWFn5<2%apIpEi6WNEYxuGd7-vsSYaprmjpdnUTk=`XImc+IaG3 z%3!>dO>m!6<=zr#t);OQ!YU)&aDX5U`q>OI<^Cz@fwdEB(|G9oEwpa#JA(RsmwtXZ zhrv;@oN(A~_r+`=)9H5YC2rQVdQ19Sr~((n$=>PRyP`n3*@CZ2h7jEpqW#6VsPJWI zZEfdtEIKn?zHFgLvFD~Nv}nW9HpR*{k9eCCnfzZ(Lt}yTv11xophmsWfQ?Rgtc?9T zXuwWe!bU|z*uv>+9x2nVo%m5NKkYKN=2Jl{25#~Z`k8N=m_&PwwP}{RkG~^~d02;_ zE(&mx(HLUF!(BgA`;5eU!XEre7h}ZU=`jmgtyZO9uB@zt#)PbPk0R8>i(nHSLQIB= zyvJ!S*pNoF@FGb5e?n2nhd25F7xY~W|FgcXbiIp!IRS!W z(VG(deY}ByiIR3NPbk3lXG0v-3X0htQp|GFO*eV(W^+UG*oMBo{%c6zTcPcu)jps_ zLWnrNk?%Eo!yUdEWC@^h0r4x@XVDID2+6N*;n_8Xd3g7LEPl$Tp|PZX#~QdLx&Jamp*>HPDOIq^eAi-=o=er=cb+T?k_I5j&>s)jxo^H<@7goLuE&y zP4ErWrdIsMTIWRtv&1SEUKKM=>D%AP0(?>P74!MbIt`u#)iQdY-@J}F^gIIlwX86M z%_p4TbrwoDroH@0wk4%6)wOTPO2yM8+_f)a5F?}7zhQP+ZL6`ZZ8{8UtSX3eQtlEaQd4d_9^U>2cDwL{rOIO*0&vNkm~PTPO< z5~vNkg^ShM((~`{ZJVqYOi+GTU;_A8LyoFG@?(K${9)T@gL(2HrNwp(I_E?dz_z}o9MPXtCKwd)#u8C`}f_}S7v>H^+S7T8cfm`*xRYC z-k*xg$zn?#ej_4zsf#DQX8s5Y4la=Rg!53rv{Nm78*Nq6drXt#l7x{+v=Zn}6d^CFM8I?~iWS8iGAghCp`3#z-U1Jz}Q^vVHd)_!ZJ0t8BGtK`T7so|ANw14IL56zU z1zn?sLuQFqO7xWh4sPzr$dUd{dZ8?s2Hea6Fb%o6xobdc+cf%O8rExt6N`E)!2W|t zO#`&O4GV0yP@P;B>J3M1%;|JK4A(SOm)oI}l(LZ?raCMpD%u9d+<3hNB@-eZq|T{d zx0~DP==;aBA zPf)Y+;o%L_QV$12n1JWfKAQX2`Arp^#kkK6)&iK}45}07N(#0K>m}stsbc|5K@H!& zb08N|S`ft{a;TDGt{EGF{;PG!;=lPB8S-Ingab7lf?HZt?Bn3;YJenaX`R0h)*H`qnh(F zCWa7c-I@3{LEg2hZv_uN7CN3V!LGg&$jg8p0%=9X?#VGx`m0Xzn^;B9?8lEEj{*C% z6D1Z(W*BZfzHe<}O2OlhjP4(CkN4wZWqpH44e$|~d7uCK054&!QrNw3tt6nZV-_w5 zN;wN2`cQ$MD132nbFU#p>*KIk?qCbatetz<*JW7b2)(o|(EGPyZ9yG3#<)X)QMg&P z2M5h+?yxy!JOn>nBQjwdJyjz+7qusBC?il67b|g_E7ht5?iAD-RqCOxVlFPbi#)+q>=NmXD?bo*@Dx0So*KK))Sqb23bSOkCU@|FOaw zpLXrtwTrM+I|FlXzkXa+PkHgB?CsC*CufF$3?UMZj*8yzU=!c#AX-{tOGb~<@Y#Ez z0Qky)m2vgzReR}J2}yq_Cl>O#Ut^>DK{Ifu`u`d04Mf;rU_@_5!J|1YJpAf_YRf11 zaU$r3X}EW@%AZqWeP)!tSJUE0^Tzitx{llfHgOwTw4nCY((8KBfbvh$_~%g>8*sJI z8BwN<|AhDJ!)|(Cq)Pznt%zXg@Q1nZdT|A{r`Xk|&>F!jWY4ap_k%Kq{OPMBgt7Ri zP2}tTKi>p^^YVembI6=z^%R{-WO~pFz+fPNBM#4_6jp;>mQ(fV(35&SkX|`x;X8G2C)*DoBf~?YwM)LnCKDD2w<^d)d$ek?su1m|~cbtDnkpEeno zCOU(l0A<2F(Z08;*$0nAyum#RY>HPLUtgWakjLg8LkWe9U?S+D{eziCx>QOJva0 zOH2!(I;mT>?YOP4|3Vhp4^fE%qJ^f6s$n4+TMOeY#P;*(dt*$hGjGoAn6v+L@oA|& zPk(_!EMn+j5hZ~QBD0qCAW*=!$(MvG-z|FfT>JxLH*e!qVmFsy; zHFFJuyTe3DSY|`%{T%C9qKSSEQCUlaTGsAZkH|3aCOG&T?L@rw=I_lBb<|W!yXarsjcad%qiUY zdJ@^Db_-g6Sv4OyEZ;52enVN=mgSg|P0s0HB^kL;6zN59N?c0Ea4 z?e3?)gK7MldlR`pP=kUw<+8hK6SCQ$bG`$NkM4ZiBwJfsz%Q9EzXXJ;-*NOfpn2Xc zogj;g6-a=?<8XFDB0#->T~3aZO2vgh>08kT|DcA(10A!4RiKYsZo1Tu@BPmk>)vLJ zF&N+*=N_n1A=+b)3fcO@X4kG=3lT;ZUy#ZG_5_ZHKJ-i56$%{6t_%Xxq6FZ`9P$C+ z?Hv`kx|bpxhYyd+4)29(z6R}TUyY7Hk4X;80|_W4V)Z0{ToDj2XtL0Dfd3-;$cW;4G^bwKEQkPt!>2L_S0CiZhIe9biXne3HPwL67R-`cdBTaGJjHD2?&)>l?#^FT|Lq zm}O<2h?m$uR2Sda79^7Y=(YA||L-lLYdiB#IOwo3x9}}U_jDJ#4fI|8Jg=-W}AAtCj{ z!?#R~jgQUG&s+QZs}4Cf`sWs__>S8m$hK0Vv4( zh+V?sBebdSP?l5iTiFN9IX6H504po6D*ib8Kh2Lc-?Xt2F3Aqe9^X+mcTtvVgT-YzI67d}ePbuHnupg+yX&#Pe{^8S zHv{t2)z)fygCR6pk}WDOzSQ)g;;EsLQ9XnV^&K6Chq<}MV4_vILOu6)nkAOQ92Aqw zQ}PQt`_}Gc6UpTZ!fG5&c)Z2Yqett&I-PdQh#eanBPc=G2a^tDxemfet2yni%4$F znhd)ASIcZJ;;;J0PX8Jz(Q=?8s{n6d<%(PCpmq&+EM53d1BJX^+J%jQK|??d{kRp9 x+yC2tl;Mkn=a08=p#NWh|0f3ge|V7n3>D`4p7^JU<4_8(d0tmN`|Kb0{|%F083q6V literal 16646 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 diff --git a/lib/matplotlib/tests/baseline_images/test_dates/date_empty.png b/lib/matplotlib/tests/baseline_images/test_dates/date_empty.png index 6f551f9830fb9b5932690d775e1b3a45198ca0e2..d00f093c8eeea7138bb20aaf3023fbab6a1282bc 100644 GIT binary patch literal 13166 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 Hb?JWra0RY@ literal 11981 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�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 literal 67924 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 diff --git a/lib/matplotlib/tests/baseline_images/test_spines/spines_axes_positions.png b/lib/matplotlib/tests/baseline_images/test_spines/spines_axes_positions.png index 5d865d8e014fcef70e3c164e6294a7b69d11826b..9fdbf6b2e2e0a42c7fe97e80bfb290685faafacf 100644 GIT binary patch literal 28958 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 z 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 Gi~j>naH72c literal 26893 zcmdqJg;$krw?4W+5XBcTKm;ijq(Kyr22r|OT9NJs$z`G-9ZDmx=#cJERFsrOHwXxe zPH8yv;r;gh?LE$KoIl`v<8}Dq;(68`^PcmX*SzNaR#jPsgqWHbg+h_Y$v#j=p-wTN zQ1}neoQ8jibARp#e-XGy%4wc~|M{FTeFHzAb(Gb0L7~VVBY*I+#51i>CP%;LPb^KDSw@_; z20ujwuS+XoMawU_n=+hRKRGGhKj`APu$eGUzuhQ{e*R@QX=cN(&U4q(CE10m@sA+o zc>5nm0UCT53W|A^hZgx8y`6$a{&u7$K7;(7`4Nr$_5br96YLN7w$|6yx?Y~Wq$uN* z&4HRAVPQZ`Wcc{_^b{Bhck>hkwVU6ey%x%DhKEx5V|SG-~GQ@mX=xg`1s_PFJ~|(`>4x=(s4RE442!@OiiUJyyvpQrpx8%R}{3o z=Pvy8=~gh+9qGZr!Kd5bo10skoA;7eMz+pX(Ki@3J91JL7Z>x|j|lYU>+8UmQHyvw zj)?}4(f7T%aKm-jt|HrKcRfctKhA4&?xRD)Vfn9>{$|u4+qZ-}GCCUb_7XFjh={?nXV2ERxBJ`gj^`24c}m#y<^A+>qO(Ti~h-|M%r8W_^5BZc0;@*^kN2netz>^X#w+n z`MD()oz~qMN^xSo)u;ct66Ue;j_S_l&Qxfw^GwS;yxh7c>tmhwHk+83kwOfInzeO~ zb#IQ=1Yc@uYE)cYPLim1j>)$`y<*e1W1dqai2_cNYinx}>2KbgsoR^+jl1>uxpjX* z{=mRMZF7a)@Zah?n{!?F$Ni7%ytd{sSM4kB-5qs}WMt*!R3Z~uMRz2L=Gu=|v%)%1 zQBmoAdh|@M%o-yVbU7RL?rEpX`m|h`?V$Sp_DcWZ_ITm`a*YZOhuiB;K8oVDaQcUu zSN7ax4%G(_UP`~a@)693R@6(=*#EGsufQ-jgjV=Zjrffl_w)5Dv}I-A(0MQNB#Qa! zZTxB1I6gXzPD(0JOOvMX3{K4`p_sLZSP0^-S6vya(<(3!bXyrStQd8V$98w~`5*ak z>X$1n^yO>77ct`cjs3N9wevT-Rm71|QVTeyfW4PGjElh+DT8gQAv?F}i;t?9K%oqJ zI}(Ly>+9=7;_a({t~HT~lkXf9J!xJ)S{beJ5I#6Kpz#=Wdp|Y(Gjex%xYR201_MK5 z7wnQxKm0WHY0x$VX5G2AP}uOtu(PGb`DH+Wa7#4%tbo_1WqtF2Ex!yL3F3BdQ7XiQ znyXx9*L}H|nVZ!zm1$+7*|cc%E9~31t1dAs3(WUqPn{tlaWgeDn=z#4xBbv$ULyEC zgf@QV2n@PUt={KpK)bn%;)h!we;vGUZEI`WA0z*>iR<1yvM(8=;g4^>KueprvUha2 zPYY%nf<~j7KffT_C@6#z_KSn*Fg8KRtwjwZPa*U0;fE*V^}f4FHl0bLAt@;gG7la+ z7%Tf0L`k`K=p;ZB0xL(cLxn#4R< zyAksI#fy#6{#2=RTZ@AlV3%DmO=6MGo@@=RkCLxy8;A%9EE~~y#luVT3JUCMV>a!p z{S8N26ztk<9(IGpWIgA-xxNzaAjSs5vl9~i6<;v|lcbKvt>X(_Dn#xApREpD_7UhpuYB<`ndA0!F ziLhX%o~q6jr(RTSoC7YQN2 zHu&mYLwgwn~_Qw9jU*^a~@-{WkJOyWZywf-RWA`_{)ze6@&OJ)78JFAcFMk>|7 zFUl(__JGGMwd&3=5%pi*8u7ufZVNWRs3bFS6o1J4cV1k)cyXPs!hK1vZhOp|THLP| zqENv@2E0Z?p6};S-+qD33(}D0KP*Ze*tQ?3EK#mn8^YdxKzFUva%*7JAFKD ze1D4mIP1a&d2o*8YB-C(R+f%cC{te2xZ+o;*F? zhHyANJDX{d^i&$6BbQ_0sC_?JMxn5Vqod=;*{4xbujxd+vXm2ryk-+UN*_19mRuPu zw~L2~G3o|25|Pqmy?ggh-FgfA?(#m2j_=9$cP0&ge?~HwK|IIrFDWi|Jvw;0ySq#A z@SOA7Zz<9J#gbj(A@Dj|dkclFw-p-RHP#RTukDqbf}7i5{UG#m9X%g44i}gn&~K_VM+l1=!%? zx;W6qX7vcJ+Wu9mOICsXA-Lj$MAz0|t5g$E21e|t75)Oq^H1sPXY*D)J#hoi5K5(0&Y zruF=8k_I$6O*G;)!-=4QeRqojH*w+o`3YFkkTn0}qY!Yvv!mO9T!aCiOul*Z#!)jz zlXWE_7S59}zx{}3@5(t;C3}36+85(0Jk-P&1UQ%54cA^^MWJmTll)(EiU0cN#{>ji zHgIeM0|T*k6{83e)XLY>GOTv(0*GRm*PIOC3;-nY*|Tcj0x5cn%@i(UAZxiIjrXiI zj^8d008$1L#h93+V8Ml4{=6G1v&n>s7_Jpjav7)wkkUp)M5I=X`{@T!a%%%t?}4y; zTRf2(QX8o!#Fq{F0OD!_vh(TpJKWOgEilwau#7eYgXt%L`Fw+~@JJ%K35=3aPEb$~ z>`X^hHB4PYqm@?}UP9b_=8Qq#N^1b4R^CH3xA~qf@HvG$0{{S7IXE~9ePkox%U;3j%!)BD1vsR=-~|fzgg$@%EaWz? z2@~xHRHP7Ay?D4kj@`sz^K{kCGswvq`D|{A9+qy+)@{q{1p442qLR3l#vOcZ$2d6k z80+>6T&IH7GnLgV?A2Gs`o{54D8-NH#+kZ<_13-N@uQ4>BX1?{+EvLSy6!Bs8+POM zb&XpiW%RG|$(+i&GxNXj_*QR@dSKh{Dl`QsoFbAZp_XN$`pT-KoTJscS9$EmdQ;kK zMbv7T-wLO0_46Vtzcw|WJT;FbwV*ojS=JJ65)>*$HV^NaLOkROM&3(&!Sv!r5Mwz1 zP9YxYegNr=@Wu^hW*L`1ZEAqkDX6LSE;|Lyj0oa-bujw&;Yq&QIflb*XT%Q~mEsr= z*Fu@t>7|MW(`%L^jt(qr9!zH@r(e6D-f(PKy`_y)@h{G>he--tA|&8i2);Y^3zF5I zG8-MRHo5HV>|HTu5?Ucmz#u}9$&Hm=yZ@R6k~WAiaiZSkfC|&sSSK=i)MLMt*G*9TUiS zITSxXZ`CWejkV>EhlDo6tTkq4KcU^c8;p=q&b`JE{(GOCjaykMgh+s-sNmIm5VM7> z3L?KG?n;aIvxb9`7LUF>WWM<(H|fJ7f9%ADia9 zQ1O`M$|hGf7;yH7=Y&z=d^YLdgE30+>4fLfw-yZHF!sIqv58Zc59DLYb9!RK*)lV{ z2mU1LGVvMJmf{i&rEwJGx5Q)>?y2+L&0CrLWe(hS@@`}F%HH=@}w)O?DWZ1s&2R_ms$d|EECl1+)4z-sZyBuj3X@#=|V~ab8_ieR%bHzsAn2Z6Vu$O zvezu0UMaxJDrY^cE#xx!Uf)q_IS)ptLT&X(FF=>wtQm;+R}l7#8U4H+yih*w5k&5+)B?b zz1i@H>zqa$W!7dw;R{*X?R)i_h4xBH5LsQXgTc(h(ohU6^=a26`*U$VWN=%wgx@<$ z9HE^TR$QEy_}Opw+sQAsAipTGolw@h+!l+yPZp~@Rc&9_%XaN}+aKFRrf-oBqa%L} zbjRdWXnqsnxUbH9f2S*TzsGDMHdP8cREC`j)zAD2&i#N6?C5K?8@5|TK}FQeH^o!P zHSG8A^c_!Jw2opXY(l}0epggu@8T%?){>1K_kO7V2jwZh)HKWunRH6y(hPIazaLJf z84c5HO%QyNzjcN*=1=GQg9BJxl{6Xs06ww9(w@p9*Oj`HZPocq&N0!zWf+l~nw}h^;dDWlbopq-%ryi4csDWG_Bi!IBWz(qoHD_`A;5;y&^mwD^Uw{q zTmz%=xjV+fX~04&@F*BzT~{99J<}2L8HghV+v0Uj$MKG(-8+RiJe38np4GnJ=+aLExH8aoZHblrB(M$R>47`HJT2y z61nb71=4`cfhT>*Feh(Si3zRxLv61mKG?~0?R*%r(cMu--}Sd{zYmy`KOo>P$*9^SiCP4 zTW2}l*$kI_TuRDf@Tu`+5SL*P0;B=FCNJIUza}5s3X#a?csOKRs6cp(P)_DQ`3ipc zijFU@ur1M8;T2g5whziLY}PvcpF?3FTWJpcVz4?eyk>@MqnT;ujf zW@#v+d%|mXM|P#&=FmWV@5jk2kl#52>RN$IC{s%_C2LPby{|5I9~Y$R=cj6_wjQ+ zl7*U;6aUa3gpdE;ZFxix3Awbw?wXE{p8$aKKK}9&e;a`od%2r?3&%B=>FK$Fvyl{s zb6!lReLIncBZI^hoqBcN8 zMyCm*dFE~8B?rLCYw{_ukC5H8++s>#x~)FntKc&h4Yn!GS@cj z>yPx}#K+^FYxTsd1vIJ6J()}z^XVQUS#a>blL%+sfSvfvNW>_Y=zd;LX*RFpqpod) zuK|h@VYl}-acQs?0^E%9qx46Q>;zW#7O>AwWpu;YwYdklTV6Q^&Ic~PBJb3KUm>KU zaRN@M5fKqE`TQK?hYM$NG0J8T<-pYY* zZXtd)>Sg<9f~QwvVq!8fl;W)+*MK}(?&CI%fTIM$-+m9JFLa(Uf&vA0dt9Mn+^D!8 z($n_{tTXo8#gIodMFmk}UXx%x-LmRsLmZTZ+%3X$_F&|Bgg&c4tmH`A)%f8_F$J|3uKKyGE0U8$QdKI6RpM(LH8_PrcfI$5>f zspv)w0^@+H{uM~U&M0SPCES}ojGwPtA~D;U{GRcD0?;WS4KtAZ4Jc-;jO#DC< zvY#kmS%CO@=flZj$RE$^mb1CyuOELAJo9$rb=S($%p@;)Fqwmuaa(7BKkPhC^$`)a zLk<27U@~BpW);I5iQ7*5OBL)~T*`=Txx1I==oA*XFAZ4%17;2ENG$hh%yRvHUU-<( zRC>KH28}{6MPu)$Gqm3+EH3Od9CPwnT?aSJ>zWmL>I-IR$c$4qS*Ul2;vDQQf5xNF zobRqOk2(dAUwR^R)3yn( z#pypIm6*X{>)eN|z(oM@v3X5@_WtrEo-UaG6OXY-jvn*XL0}kiOn{rJEQMDT)&q|i z;j_~p$nJUc)aIpa3wgI33^#f;hLj6KrbM!t8n9O)2cmzUZ zXpOt8GF0A9eK@h|Ox~QOrv50!O-}P{nvE!RDXda zq1EC;)@z^RS|Ds05WzAs2@ZNS?X0(EL^h6!uDyi%6ZY%dj7T`6tq=@ua~T#(i-U)@ z#(stA*R0QAU`KUJ(hX})9A6cD0Tmz<@4vEz_0~dXMZW#|s2)t6a1I}ZW`|_Z%m+g4 zvP^ddyk3KVKo*ct8pHnISY+)OiO(4Pcy?;h=M{E);EB3w7?>h5Y6-A%LV$qDoO-g` zV>bNfL{wf8V>db#oSYC)4DJK)&N~IUq9dQ*XG;Vps$P>-1pc_{a1vNp7;d#pe(Lj+ zRZo*PFKKkq%3%zqVfEb%-`wa#9-SD4->}|wCJlVy@{Wcznw|OZa0Qv}$p`Ze{*lyo z`4jQS7z7650wF7hL>P&yp4{-2yYuY0g+k2d7fQ^}Dm<43abE}_IPxN%a77C58BZj$ z!sMiSt~Sh7|K)20YjuC>NCdR-FXp*$yc=3-8@q{Bh#)&Ao_qk9&Z1NA92O6S-dO7+ zlU9tqKI)a*Q<#inT;+fK7@KmhFQ%4~3jrzUZCFd(-=)YuZQ(|q_f8Vpg zA4SAiSH;NB3yj7)=m}pWp)wIVTdP&)r5;Mx$MR;>UI-H9u~+!`nL>UBaXk0E{!lHL zS~o@k2Vz*0j!{5POk)jLo90UGjom$YfWYv)VQWlZ^Fm=fL~FDMe7jXgQW@zp?{&Fs zYc23@Hk?0njOE6C;CRBzU%<@XXo^a@fg6% zNOp$DAtr`wXR`0jrNJjBgL?+gf4Hk6Xv{m|^%0%u52B_xu2z%2^m#T!1Y(KC0mBC3KW(3ec}90eS*4CIp(b zj6jkaOf5$%9H)#=USO?dHE;`exQ%g{MQpecaHML6Gnp3@b$*(|Zm|qyscHG1*7`3k zK%aJ3H=K4@2a7axiXzyHx@8tQ1uT-IS;ZKe==vMChkq~%C)Ne$f#r_)F$dF4`5V%* zczE!SI(Mz3N*$6*P2Zl3hYQBjMnwOxyCBI2>v}Q8bGc5(dQctGL`7sDTwpLa!I5o` zMV=;$dHw?MXP`q**74E^SdlzEA%U4mABPQbUzQpeEmL>yd-BWQSs;9wy~2O4KIMM_V;5vT8QUD+1bM96E>Xvieo6ahE7 z!uQUPJ(UT36Q)0C#4?j=vNe4%i zJG|eqIE9kHA#-75lx;Y?NkVTV)ad~QULd-ZfB_Np+6-eH3=}L}`10!9{I8EM)Ya8D zfwQv#5*Gm`LLSR`Q1XdUmhi0oyM&Pr9*Cesp|R5-DiC=w$_19wQ&Ff{VvZBBfcmT3 z-lmlt7K)P;^z_Dy&C1DQhEO5sf#BMcp>$PF9T-V+I=TX&cv<-P%3LMCqz&5kvHbY; zv2X8YdGu-2#2yc$KhUkK(6(GH015x%EnAA3uKlbmo2p)NOkj{QaS}D1}H4 zmfozYs;Q|ve%d_RKk-XcU{VxtGDm$YdQxBE7-IlaWkD%~upl5HKq10?c?7p8>!|VU z8H7mPh4}wCoNXDr&u+tY`g_06^$&U7h1xZ6^@IhpMy)@7IJz@d7ELx`jQzsR+ixT8 zYrC2Hyg`Nkkw%V@q1SYH?s$AcLf-WBv`;@&+Z04KoG5coeREpKSKnUlYuIY0_ee}7 zIpG^7suKind}~(d6lEqPFgQHQ%3_g{lA5Xc4~&YjE|{2jlqlqu1I(Wd@Qs)~uT>v7 z8MMOkaA56*k!%mWZ$f;zK*1m(Dw;`jHyy{g%V*sqJ6z$w?I`N8B=dOTKAPQX+$hI* zoSG0~dw&T2a~tytg_SyH(SuK}8|@k0)BU+R+)#928IPq0ZaD6aMM&IThk{?fRA1mG zLTveM$frv>)9(kI9Cu$e3CDKr!Wh4UE-wvjZSA~=9|_N0wgg@~BJaXGVf*X5LP{wKS{)=%*)&RilOLmdH@bJ#`3E zGW4;Cr`R_kIa4sWzoOtVrdzJRBDU3|A>_H5!f5k&_h5Ge5duK%ZE3v07>oc)&G6rD z2l3kWwvN1f;P-b_Y2i0y=7B9oWCF+l`||bQ8$R+Zz3LEUVv-L0nvq|X=Ry+1N$>~7v_#d{q0!|zuBP3w@ zi_64zitA_IKQ)$RqqE>BDSZ!ELP6x=y6tpQ+PrKQ^j$Wc4z>xGS$Qg|6YppQrX0Rf zAIWbQk>u6lda*I@+Wou|$KO*YA*fDOLiIX8tKO_@ZY%aeXCG>q;-PYmLK<%8S^a&v*~)WCS>I2$yI#(wFtYC}H zPR{Ti3qxfN)tx-U!qX&h;2f1MT)@_C7hj=8p?{~KCjuAUt%i7U;W7vb1P}Ma!;m}I z`<^^J1P`b7=3)-_^Km+;z`nv{O-$fsm(2h9FjOppnlD1H^cK9@?%6YS+dMwAwJ(Gx z^D>0dvx*w-9k^UhKJ{&DIuiRc5}TO}kq}7ERCJ2$9rK5?SO1~0go)A3_eKttm6T5t zqEN3O)~UYd(sfAP+pg#kM5&52y@ry+Ln04&@HuQ`52dke0BO+<4NJCBUHZf$WoaT* z3JZMOd|D{Npf6W7!w%O)adUtBD!aDEfqZ-mK6ac7b4$Gw)cMTjj_rrCD~BbWCxH*( zu4>~Zt}iC_)M-F+m6>~6n7(}7ccdtZ$1Ds#W`9fBEbpQ5)G_j4O3Mpt&6qM9488ve z`s#<^BnFH&t)NNWQ+&szz0L3(Z8ILg;0-eHNwSX#rBCW)ABD)%Q-ozyO$$j zsS?7{I*lkB5LTQiW^00uhp$N@l@r3mjzM~apo%g$Mvl6;j_!WiR74_;* z#?+REmVh%r8c=4&g2p0j=BS6uO@IIw3BN7~(qK!i5XM^e4UQK*OD)txjVI{*6`4z0 zD%!KEM-#WdqU%E%RhGrV${-;x3nqg?m9Q`v*$?q%yW3^oCjxiSsSP8&(f5w3ue={1 z6g%-7N?~tpU>D-3e>XJ{q_hFuS?W;;OfUjzJ~Rz0bH^lbK*_482#j(JP982qSl|-D z38*%*-E+-Wpv1-K!(3}$w3`PDa6M#56thE+pSh|;ZO`8&Y{QXR9TonB2<#1%MM^AA z;1(76d2YTZuQltcd-CIPjA)OuB++zUZ|;Dj84JSy{R#>N>5RB8876UY*npKgu31n{ zQrC+^1|>jG`1PFcQB_p;mk1 z!=X7cstzfg?UU2C0dxKFJs2!xxoqcPq{@Yw&pOJw zFE1PF*HRB2ST2uL>G&G>_|yVdLwqQ!qT(UxJTdRJUG7J9o*w)TjB5%YN`eKfr@dje z7JIi`U?GTThKkLCGL#c@pytKO!vlpsH3%nA{Hvayq6DG{v?_w*Wnp1q#ewIdWM2`h zA0PGg{8*d9IL{~o-IKDYCQb&_tC$_cFuOcR)(!dt+$C?CLGg z=mJB`d@tf;5rUeGl9HLvj*ZXSR7mdU*7B%6=vx6xDc3K^$;svDmSn(JYNyUBsHh+? zMX%ISEsp1z`s6IL=w24WVHCIkhpG1A`ON1K`U+`@qcyT_xdJ6X`G|xB5&7uq>LLnS z^NxgUlB@iPQ10msDk#%xnV6)4-YXNdWO5P6qJjKnu0wc56Oq$AX(mO;K*05pHa?yX#)_x_F@hK=NGeI@N2I{-sTpb-m5e%|jKFeQ?U*F>!Xn9t;amgCc5Q5LB zvL#iv+K>gW8&-Djl+~C>w^aehf5WUx-A<@9v4dYjXBU25%a$fN8I>>CiK>2uys&%a z>~ELG_^lQ0-F^L?6a^`&^@U2j+Ix$XPc$S=!xyK?2|N*aX{POMKLX9DMJe9~Xe2gm|{hbyHf%MOv?R00|HBlwgRAH|6p0 z)EoT3i&xTlj9e?TwfgVpzD|Dn^KN^YQ!B?*hy=Yrag{ya$S&9x-pUGZW#rQuDha^p zpff$EFW5Y|!}{~&rQi`?d~H^MeO(#?V4T9MSpXyX-i!pSMi*5Hk*~WO*paHf4neU4 zO}x+xSJ{`wIH7oncstCCiX1wVH4~fWgb!C>a#0!XOL^f+m(xz6L>--dT2MT_l29EMUJ1cp;>39P&O z3S{E&J?LV`{Uso66r1o-o~Mc5#Mc}whPFfl3{%yHWrxyrQvl-lC-zh&Mn+;du?2>T z4frCXO=Jo)t@<|rgIC^xrxawvtox#dD()r{Na*Hh%FXu%A#rLs6#w^kNav?b7ZyXo z;lf+{oI42yi@%+W1;!bS1gY4cgY@VM%keSlHN}&VjJA=%b9!?2ta{L8^*S%u4#(Hd zGwCw)WgP_nCgfRcuQdCW1MA5yR*Sj1lV$%!2J)ksT zKug1zm3pL5fR6Zxu8f^&#k~6`!x(R@K!X{V5&sapj-xnyU1S)8)B{}4c;87{gJy>nsNCJaoTJRU6pEL^vOUH=>O|E2 z2@Dxb>-WV=m=Ic!vLMrBFB!~J3ww1A^7@m-OI4FF7=Xgjdt*Q`5^ExRSy0Z0Fpt0^ z@?iYmUm_yXuiA%s{RIew7S7UAupUoBY_euaF#K7hE!MBuC;iQ{`d?}!kY z68Ff@Q^GKK9g_H>zXT+oM_&Zx{oa}klzdM1;7vsZm*tuXZc*1p<|>LMyWB3H5SMTk zALS?oPey%UDYIooj{MuF2z!*JmIgeH60|L_UB52rGTXt~_vHV=9yu%W)}lj0x6Zw* za>3+rAl~^0te!~-U9@&VX@;uA{Af+Z@2RP+`P{;JM7s}>hMa-|0}Kee*z*4;i6q1- z`luu29yaz4b~YJ7t&ouiyf6zam~Ov|P~}gW(~(o=6au<2kWFiXgkB5YzFxo$7;CiJ zO#{JLT*IV!AX(f4IoTHU0{qN;BXxVF;kX`YMF0_9HlUJ-^n?VOR{;U+EG)91H8R_m z!sAML>XNO;2jVDX<#y<$B@7fLpZBB%Y)6H%>y}!EL$3!gOUFL_L?qOR-qLQYb~iAT zX7X6J9`>!Whg`-JX;w#);=nSyxK4_fOBqSv2 z7k~tbNC!cw(OMD2a1O^hflxvbsRlpwDrfBCAmT$#p40%)o*juJFSz!<(N<(Le$sUo zS+BWkHl`FPc?Id$D0BD7UeuZn-fNeK?x~gxu&1;{4BQRrUW0MC6yjw8CC3#$T0-o3a z1VnG|rV*wfz>s}6IedwtBzY)`3@RvSM zgQJ0^;R?!1qXc;RYo`kJEr~cjh3b<+^s;?FmsRWKzTDpsA|{HxwwLo47j4^P?=X*V z0qKHt9JR;sv9A|_yb=5He!zO-Zg^y58Yq6V0KO8FkZ_iapmX28EpqkXv5%!^PKx6Y^XJVSn0+{Hy@B;doaWK|Q}J z$-{$<<3mbc00XoXVq`N_?!b#fkr#tz9LR}(Ye1DbF9{&ZXB&yafUS@LzhcuVC%vht zSn6Jdhi(OeD*xeQJ3YK8&}X1Lvp-w`E&$>npqmM6^Um@<-^~?BGes@{-mTSa4pFyc zfvlE=<=Q=egWFVKXNbfjT2(WRqtz9)tOvg84~An3m{vb6@5zcW=U*pzX_#B&9Ex zzK3U#f<~d%AIRu8kR*bB<07i#B0YC+F7v2&Art~Hg9S(=#XFR{e|~(Iqfr>>c1{D! zV7~!dC#W8`^W(f{JgaCe*F`HN-@Ow$N=b z+QTv1bf0Y;gyls`BB^2`XL~%7n_w@)MDy9pEFVL?5wSYeENZ^IJNHgF0M$6ZU8%iI zjgBLX%e%T(fqG_pc@7w1)mAJU{F-3 zsrA_l!XPUfeD~9XuLA7_L>JVhkzJ$-S67Ea?g+x@{1S1mZ76w-y@S_Prg|@jAMMC= z5a5j@0>PKL*sqeK`WfbS2VOf72;g0}RJNrJc;Ch{y_!Cu{U@uB;Jhs%Z_cF__$747 zblCtLlR<8!031aing09J>Rt0}7Yjh)%WQWv^eV$j#3z6zM4?UI21l!FK!yhcQdM`E z)l2*E;xw2yvVY$|Bd1x$md1b<4h)JEa*MF;0T_#zOd#-g)VCUiE=~VNIC}DaXbX$K zTe3q_0M*z~7etH%a%tc;G#@=mLHbE6KCoL%O-(^NtHzv+mzNh6Gm*h~*fnfd8a77@ zd<#p#jwc**>Td)F&kAuU39AJ_Mdh}GsnDB*G;u)-lBT9+)S`P0bZ`c4(Llo(Xt&2f z)eb!nx?c%L59Q0ijV1nx6__KrEme;o;$l z0MYu8CA3LWi+Ys;O~Oo{oJ)29Oc)CXM_%3(zI`(iN2EhzfD6shx|4XOF*?tHl~&l? z?mAv2F=#~6IG~CK{k8Ms4gU2DFHV!FdwEs!g8(US7Wx961!&AJTyXU6>gr1_F^_G> zo0tbpr*v@oO(j_8Be0#&V&E2_$xH^X;i?5G(zvoTQdRP>v%B`G%kJJ@4$u+v-I<~8 zivw!&x_BO1`Eh*jefC`6CXrS`$isAsS6ohZ`AcMQ7PM?k{|n|+{+@!sn~k*Xg7OzC zgji_GEVCQthuJGySy`DyP&vxne+@-0g#!z`%7Vd?eB+BJ9DEqP4HV*k{`@JgtlZ(j z37pa|Z)jpH1bT#W;c3JEvM`_h$WHZ!l(aP4?c29kRsdRPRM?MdHu(7l(+X>|>lD;3 z_oGBUpCWshnb!ObYN7z(Q*HrYRbhY8JFBr5Df9zCB6LrM;I7dvIrbU)qK%V%*5!(l z?s|OoL|U)XXrSMyW#32c)$7+ehBfYb0J7iGpYvpc^z5ee-s*i^@ZI$F8IX%PR+aMN zYF5(UUIMR849X2Nc*Gj|o|wE8p_eHNS{VTh?e6c-8g?4)Bdx|Z9Z#O%bB1+Je1=8A z{{Dv04PY!IK!00i^nkoP;j`#S@ad0?h(LfoEMMN&&e;DWk}5U9 zr<)8BPTyZH8Jj~n($043*Yte*`Yf=4JYZWgcl3s!W=g==&E;q_4&EUMFVH{vb;| zOR*6RM)q4=rU9jtOUFF@Vu(mAI5_9vYi)S9t1$6g4 z8my9*dqEHZuX4kffgQ$CF~^uU^86Z zwkC&!PjTfOG47td%SPW;)3UyWwT&7dy4VP}{2A2RQ`)YpE)7dAjW1;uhcRAzoq zLtcsRoH5?O+H#Hg{WnRXcFcHwAQnZbJ_;3MOBB3O_cv~dQDR44F5J35rr=TY(?+e6 zH%D`GgYKP)c~}|$WhTh7quJZ%h-Uv>|D^_ARIIBcv(&ey)Gi)*_URJe&xL5Zr(fMK zPGG?SqmnCU>9QpW?~o9nYt+@#K@;FS1B2%ZhEc7){UPhJ+!(a@3wc6 z_@5Cdx|$9B1K4iN@ln6~MTX7%hu02wZgdx(H#iwk^|2pr$VQNg*73e`aZfQuGas4t z(aBu2O0$4?E`^o-o43R(F}JsP2h=R>SvSrro;)FEU!?KNN~pR=TCJU7VEn` z2$Bpsh+vJgK+Ft0gks&n%%&C44%yxw*|Hagt2V$g~phyiVE;GN%7RU*jPzEGBU`V6hH zA8WobH%Q8s7#pJzym64B!_9i9+vg$v#8p;S^|u$XFUW>qSX9Wc9H{TcK=skc>nE%R zZ-S^z2A>#I%xWu_c>nYC_bHz42V*`Odq>_d+KKlu=KSuD_9&iHfpJXej8@BqhyQsb zi6V?lIN0Ftm-qy@5p}>OqzB*?5If=4QU##scYX{z$Rhgn=e~yu*5-0ec_ivHJChWf zp62{eulvQ6N5~pB*bHexXVAOns7fD;&N!UT+L}2L2g8SxM`zbQsD(kN$tfb+OuXkR zdU3JOduu9Sdp;u{7XbgsdR@|Mh5{^NV&iv^`Q$EV#Q+G8PI%-%EC!>T*v8AzTm*|m zXY6k$Epg>gA`3Al1CaB;xr$1%hXodih;0A(Vr>n^R}VcFsLDU!=B_&MBG6)Ju*7^j z7r1+y0(i?R39^8EbfK}*>))?p$;1bgPZ8Af*|hzf1^mo{EWN?jT$=hvNo*@O91nte zN~18S7gO_og4!1?@~{?0Ue2)kgVn>TDzNcq3m~oZKX}na_VUDJ+v%<+Q-GF8RSb;}EF5eY37RN>x(S$EA62CD6pG$q)^bOMR znJN{;cJrn*v^-bPvYVQknIXk0kfUniuo#L97d}G9IUGWv-Uq>MXU7vdMU@~*A$kkZ z?U6L-J{=CZd=Wx1qJ=f2IUhLKVKeCSilYx^PA{I*l-67P49aou61ZkIR{JzCIJn(qDFY5>)Xi1c6%b}?R@fgcH&}LEXJTZ`0+LLx*0V@Hh9euA zTj!t?@Q8%^CS2W+>vy;}Q}st61a3Gegw2}ogPx!$4q3rZ=1^`5X`XVr%w_Ol)(aZx z5<#RYSXEUO6H&!}<3>~Xw5h4-&X!yK-aLEr)SAFlbLjTM!pnGizn#hFHedqEvA4|< zpkGZ-mYi<6a*8w)?m#GiLjDl?T3trnLR|Jrml&m?_>zF!Pl1E$MW&F2JA3x(U3*s% zy3h@1jvNfR$SZc(RceGKi}i7;`&!~N}Thg;L(NlD9|B6Jo|X)8}7p#A=y z6AEsaKyubpF2m~SDyV;XAR!*1PcWt*e>%|&UyuaGYKE&)yVlbQxpQFLZ$JOlgUM?` zLPCtv8+)5P-HO`z#fcA)#X8#U^tXoc?7{IDGMeT|-}X#6K`k-Sa7D%Vp@zD;D`?M< zX7D4D*CL=bBL{1SUj3nvi>@pTmtpY~km6GKb*XiOLg?pZwAx-C_)>GfGP zGSSVj>o;z=!Bqh{z!7>KA8y;p5X5@nYrYXF;H>qit)O2gTNpQ1PBe8jhhLXfVXBdsQd(`@fL;+ zOeQeJ#tFwk%Ly(v;`4tzRzw+4aQ~0AMuuV+$j&59>?Bic20ncR=UBh{=jyPUPpS$% zB3H(#dl+y3`gmW+aRP1L_TeK4dJ-FuTX7;{#lETtOvV63Pt6CtT3jnmBp?XbT!_zq z`QaIY^9w9%p^|(*{WpOKhNf18zA; zkPfCc6IOmW0KOjZd^#ZEfso&q`i;5E?AS%O6JlTgjzMrfv`5RUsC2prZ%0l8RW7>G zc4wK8_!2lT#F2nX<7rn}*yLOzp4B(vlAH6+osEl|{=;S%3}&XvZ+Y7%X*Cgc4N;gv z<(X%8fE;Bb!2#DJ1tYf*f%9Jg^FT`Im${Ad;Cc=fxOrxh`Lb99w41rX>N1B zfOV@k06HH^Z*Ub%FO7hz^{C!Z?cn0Onb+5)0ui#A(!hUr<~@^~$B0va@IA?gp>(2} za96>ob1NsCTI$Qc%cHq)ZN(fIKsO`_cFpIm08slV2}1Js#{=NNkz5eT)){dS9D3m& zc-Vznx8qY{fSo( zAjS6Ot2ey{Aa(?@+?P>6v|Ak=?5=y&A#NzWRo}-0B*}=g9{Tk7#h)R`6<2iNT&aJo?x`bLAP)x^$=Jv{Y13~ox(qJ_(?BBEkrvq33g)Heko ztkiqk9UV&K|ZXQ59otNF)eRmmk1Ywe#(n9P5-p9pedJMFUkJVvv3yKp@ zJCbR9!k2}PBQa<{ALcRGhAT^Eb~6hXAzFk?S%TMu!=hhL=K|+JFvR8aAsM|GN3&C@ z+k*DrJR*Z%(Ddq430i#3n(`%Hv_FUbO*4ylyUdN zxrYad|EFD(?GDFpXJk>?aDf^k3mPo37!LWJ(+T-Ll<>OY{sygmO7VFS*SRpDpArgZ z-vk9|yuHY@ZU8FgWCTwE0Lj%UG@30Wqq;qoNU5?Okg)lw04wiK4b>Q|(HcP{=NoC{5+CQ{$YHLuANCj1Oa%e--h&D(SW*5bmXvha@g z!xzU|W>H5z8_5*3Te5R-5ze(H#7;%=YuSjeI*za`Y)+z|=6RX6-X(VPHxC+H^RcYU zh9~$=eI42t0+@SPc3J}3HF`jzu=kRv|g^;%m%bTeX53gv`Knb*R@ zG{$69EOWKs*(>U-e-Wd6x>e!t56%JNQ_P~$>Y&M}ro7Yw$FQcqBWIZ^Z{9LjRZi@- z&DBCYz~soccWxoWQ+>F`-<1_Iuh5hU9!b%0${Tn$v;N#zBI%%~rrxEMp5=|HN+5fHVzFW)XiGP``aTv6 zZcfkupE6*$PDqe+(h`IE(U1g0+Xk3EuPaQPUlag?Eu{LtT|x`{dOsRbp^H$%!Ln|_ zyhmF9d?&rb8M!xB(Ma>Fed~x?Z`l;5HGf@Bi|EG$dcHmSL3%C-hckrp?&I$~|N zRPSgX_JN_V5BQwSJ6C0b-k|5-Oz;xzR4Y}b^-m3*1%kEBuOV5jQPPCbV(Ug1llX;< z`)1d-xC^2!*->Z(d{=fhLLwVD8Jd0iJd?Dd!9e?n2ER5QjcWPE?JZeW{+$B7W99eJ zYD*K8=s@V@tMkRxi|r9(LKhqCBXGj|MX&>*SFg|^H<$Rf)M$y{fCm17IaaIc)B!02 zKnfuwQ&6;?=wDs*YfAi_0(VOs-!o&`R$>K(Ee1b0H+UB;y~m>Pq61gbfkao$6?S3L zaFZ^Yrg-?yuTQFPZ1k&7K+`_n3i}k7>r`E+a}h9tAhtnDqF`TmMA^hX2z~Jh&H$}l zg4ugq0S3g)-TdL4Bw$M;vE_^_4sYeh~9>k;-m#TPTg8uV2*Wwfr>VfnHx~QG6 z)9@KX0Rb=XxmzzDHs;#@rn*q@b##p5LPm})fFaWC6M|C2RffGn*pI&&VJqz}5_LE? z+!yg)6<3@{CG+}rddvV76EDu5E?U{#`?9<9k!MHkVh<{iaA^`FvU1>YIpxzvZN+%% zA*o0+n4aPtmu9^q1YJl-h>+^nz_xAedJ>+0_@wo|Oq&{ra&5ut5}D(g7>Y-l!h^x; zoSVw--zK5}KOwAgBOjv(HbZz>krn7DESS6_5=GVC9PXhsP%GXJ1O+0zTS&Ou9YkrU z7cYT6g)Ub4sQ9ZsWOs7=$#WAYQ_uMcle9secij==f7HZ26)9BhNq*?JqQq* zY)=iTg)eE*=YHgA1UY?V_{fN{eh~OXr|zE=C_K8&Tq~GQ*|DAv_234@V=p3)eJ%fC zA4eexv~A?wyY9EO72EFW>KjBo4Ud!^-zIFcY$ggr@BZxU5C=1`Zp8|cPtnuhR5g!^B`lYS6`Y|9#PyYw3ZrPz zhH*5!@xaP)3tnX9>zMzw5}_9chte6hja!W`9LPOaJkot5JdhG5*ilG9on>(;N&KykX^ z=)(fS(FOh(56}$ks=NsFs;CE%N#_C$7gu;Z2{ZUmO>%nb{HQwQOnx75ye!kHLO$bv zR)_M>e1skNAc30puQ?aZH!pOzVpa>=wSuI82GeAZi|;PMyZJmWA89hD`pA8xGuj0x zCb+JQD>Lu9XK*$iDe~%Cy4%FiFdW_g`>Nk5LDSzkNSSC#xuDUPa>}he)UN$ON5j*< z<^bk!7VUQp;c@Tu4?BeYcd*38e115x?NC92{3txFE@clOivOAIkWH(wJql>w(RD}?F>#R^GWJsOMNpB}AxxS~_ zg4s;+J;6wRjxyO}imr{YYVF^s@n;_Q^%8f+ug)`0M46}#-?3G|9?t}+)mYOKZI<%{ zEl5%$BrQP4ke9c-^aRL4wAGP0{Ej?_KRwZ<3i92WGh)!NothbgKhPYAlv$?vMna<^ z4nTR(jS?}0#}@%2)1x_!gI$F$D~ztlp?W7T<83y<;!{}_hjH{@X0z*k(8qZoNUTeE zEE{zrBu&GkC1~fr>y?EmG0RHczkfdhjq`ZF8uj{gl^7zlV7zWb*RKsWyJd69)+fAu)tN5)X;^x`2pI?+!R)wkP&wicNtKa3IE>Cp^;W>Wfq^0!& zU6^yK5s*qBfui!5U~{CX#mJMuRKoe9maRAG0@IX8Om-k{GcEIuA@3~~CWH++EtzPi z+9!aVXPB%RPC41B1#)8Iz{=-WWYogy&VG;n+(M4yHCVd|=+Kl@RS#W_SHE}c$wCrr zfD#pH3ZEwC%`dghDX~3~G`xqz2*Z`9h(Cn45BZu2n7L?Z^>In-34eq^Y(41z-HNNb zNOg54Hl@%`m8kXcN9&UU+ptBKoRK!RzTn7Tmg4;T?~3Z`uY9Gc2>IRPHw*moN0Mh5 zEjBnx1NvW@@cynY@^<2hQ)9XFArlQl=$~PO{ddP6Z)wEr^iKA*{;?vL97YwoKW4@n zYa&r*G$!rF)W;&`Oy49HaL{Eb@@iwnf?&`+cFQa!82JYM@`Ev`4-1PE=?3LHPA_AH zVNaxfT)w5t`<~_YDz56Y#1D|%cq?m`QS`arU7Gs3T~i7DJ>si;S4!>OcL{n)1df1Q z!Xg_dJO1FRT{68Be6p)Qy@Drhv0=N#=XQ$>3rN!{u*H>-a;zxib2HC38^#uE6fqZ+ z!B0W58ozbLGo|A!LYq-T_Q=ygFapl6I#QOzegMMJr0DbB?`1lQ15&a@h(|^ug$yB3 z+uW}8Z!3}pZw>oe6Bnm*1R3r}>#9rLRbLL7=rIHA>0(0;pY(z9xYS8=4Og_gPz-XN zO)o-3Vfw`)@80Vnbf@Z1Ugfanj47d9R#JSj9T)wCO-`kR2AL^rbab)67ZvB>hng7s z^bIw2r!;naDwcc7ZCG+N$p+ z9bF)`7p!@0EScm~x2?~6*~Vj^mrC@Ic^a>%i6qh`IW|Lc`ggj~nTc@+%(W6UYA>H+ z8e&NSTCo7d6tXN9OGnKA$t64>WlBPE4*~^D{4pBr3yRxQQu%hWL8;hU0pq8a}*YO-@YC6ywkro z7ZVyUq9dKi=Kp5P>vyRW+_U!LT^$NMFKw zK`My~6KF8Fhj<>J^xIu@s&GD*jwK-)$EiV+)kz4*3ic)O*n#qQ360aO&V?_9?(>uJ zW~tq$e=UIGCWb8i&iyiM$e7`#J6XRQNf?Ea!neg%)z%$@d92jG6>10C+;m%kVQfEf zV{{QT)5zE8-}}h1UIyHiqd{-HGfwye2gt*=Iq={v5xjS}`FcHnmY1lw19m{f&BZ7? zFJ2Y?QAm~6Ll%+OGsF~Tns08?51=TKF!CJ%dcD2fLMOoEDdxiZ1}}5I8R8W;ST*{} zQe~ttt&q6`R|Sb8tenjeq6pb|crvnVs_sj~VeVCk z_51gpU#C!Qcxb9e&ZT1~P&N+*!A=7*&R>7oX*T)Y8Wl_ao%4x_;rY&Kf3CR($NrK0 zeXg%+$u&tWRw2l){?Y?xxCyBtlLf6#>Ir_O2X%rA{O@TT&poW%9!ibR!)m1rWMw&s zL%H+tdBO?rAx?DMae54vbo}MQGkFCkxmL3Rv~A?Zb89|CrkliGUKW!SaB$}-{gtXu zZN!&jF?19gaJh)^1Lxbnm->MeEsEtR!zSAl=U=TW`abHxNj0dr79IuIG(1{mOTS&3 zP-Fc=MoH6>Ul$)4fu;dWJwGYx)-CtjL&-Vi*V+mq1IM-7aap`AC&zlf(#Fi3>qoPnUQsLdn;t6%no}4hAOd-6NHi$VK7`)35c0*oYCZ|| zt!A&W06OL4;N@>lQab>fu*5bBrCn?+C9(8T1kpixe)|l486Qm9LNmuvJ8VUHJ$TETs-E7~! zOUE1>7LC{tq!q;8kPY4YeF)MX2bt(NM1o4Mc+lWG zH$jm=)J>cpCnh2|Kmjvh!JI_Ugv!J?3cU=lq>O_&R`7UrWbqhssc?9;^y;Z$KLBYCTxki;-n7oa`(_F$d3ZiodGg?{DY* zU4yl1a4jw}!ii_-UDP!nH4QI&ZzwaU?2V1fm?tcpL1p9(`=hyl+bT1j@~5TE;?5x~ zrAFy$(;VB<=o>dOIUJ6`+gXstsK}dyTk4O}1IBafRRvj^j~~aizcjhQJ&2NK>(;=M z=)~#aY5kb3x*tDhrb#N)id2V6c7K0qLi*@h0WyPo@$0&*p~x|U({J2n%+Zm>08*YHVC z2cM5<*6uz({n$;}NKCcyntpSy(VdSlv;#CL2}_GC%e=6Gz{5z02Lfr+;B)1_nJ)0O zg8`Z(=zemneD>U86o@9}ja?&2fX456=uZ-MAQGFRK2gS01F6XM9$I-=hiIu2BgjXv)i?N(BP>Vh;4xG;Q>G)HG=B4~hSF&cSg)EdD3_`z~R zLxrCeYUF5w=!KvpI3&f$$%5aK{R&4bInZ%l|JOI!w2(3ng&rcW@Z;J_x4bKYn X6}iPOyjxX4=2lPFc<&t@yWoEVCTX-G From d548e135d15c3af36ba7bd43d00f2b09c635f38e Mon Sep 17 00:00:00 2001 From: John Hunter Date: Tue, 8 Sep 2009 17:24:07 +0000 Subject: [PATCH 0221/1000] add remaining two unhinted baseline images svn path=/trunk/matplotlib/; revision=7718 --- .../test_axes/formatter_ticker_002.png | Bin 24905 -> 26499 bytes .../test_axes/polar_wrap_360.png | Bin 58384 -> 60003 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_002.png b/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_002.png index 7109a2e04a57eba11a4291e4aa455b43d8ffb701..263d613624ca05e0b96c0b2e153dff947499be8f 100644 GIT binary patch literal 26499 zcmeFZcTg1H(>}ULlxP4!ke~ueR-)vfC<_X@k|hWT2qGvTSwIj_khJ71ut-vZh~y+m z$pR82OU^l`Uk`piZ+>sxzi!>Cd#R#iot>F8=k)1*`st_V?Oo+t6r}W|C=`kUt#AW_ zLgBNZP{%Y$h~R&s?L3~rKLj>%XjKyUaUps120kBurl4hmLQxqYzj$fVsb(k?3krQh zR@EVPZott&ZM>>DvUFq~$Q`K)2Lvah3&6`kKz zUB1c7x?8ZgE}?SU($bO_%ZkQQ!PBfYjeFJTU%Sndb@M(?_N!U7#SXR>AC^D88vt7n>J-N1vgK=bhrAukuhvR&1BQaLxBg^&7d}~H? zzw`al@26sef}TxnO z`ivJ-!Lt#$&!0b2zPLka-u50Z|4FyW!QQsKZU$o0G~_I|+EP`RqlKQ_j1hhsV5Xz3 zO^GcwJn+pRd)lb?&Lq+DlGM1~U zq^Yl2!i<$39_+^24?3!*W5y$yHQ?;pCqv~gKRzf3h_Nhw+o3GZGiRNI#lxW<6j&Np zy5qe&CyFh8G0U{NMM~olAtWv?K2$U}H+Ox~ZDxOSDAlMwpnlH*S-y`yLN0YAUiZmq ze4|JdbWCEo=JX>|)BD+ak|s@&c$M};FNrH@^1v>JS$Ws7V-Q-6Qvb;2#P;K<1Dkynkr@h0C`7W&cJ%_^-QQtBePviffy z%D4WIiP_CLOudW=h=XxYPfz1gQ#;^tE|Uibn-!}wnc1HoRvpVKU1>O0Utd>uEGRa% z$?b5{jajVR4OTx(S4mDz?$s!#MizNxw(B|YucI0#Z{`?-y9=irG#*d+Zh%8A-?FG{? z%5%CSl`2ysoBit5;GP~$%ZmLC1&KRgfax_HA$X65D__m^7o8^g_U-lY(~(yUj$OTa zwg2VjK&;EkkNQ2+16!Z9!7}GO$5j(77V9vRo{B15Y2bYs!^>|E)S^6&6&Ah)fdllgz& zN6y##yCYt--?A?3sF9SQkXgn(_(D?r!jrFpyaYRCN{ozM>|L3&K^sfqj(M8SS#}l5 zlB6lqqbNms#gtOeg2e4WK;qz<%f{Kgl?Ve3ntgH>IH}#OC!cI*!)rF%N1*lfc;m<` z;`bgQw7#$Tl3^a!+y)14(Z+OZJ$vLE*?G~k z3uWC)_s-3^gI`R)y<0E+USInAclU~Yiefvj$jF>b&ax(3xE*K6SBqC)pC;a6D4gL` zxI+>CTgZi)PaGKu=Y4CN5w}BHB61ST+-PBnh0>1UlN@%)a;TbE^q>m*kHv{q-4P+w z4YZplXAXXZJR2rGA_RZ5PS%2(`vH-F>9m;5HrrL@!~D&UPtKnn&is1z=#DeE4{{wJo*nMDB@=(t zInJZ~S~si`bpfmfGggU5Cq&9yLT)$b?zlRv;^vW|R-JX5xQIL(#;WLL-01OALOtts zm8U@sNt%x6T*lh{qsO5B#n1n+=Stxp--r2`USuOwZdY7FRsSB!m)fT;wx?1rroVcO z$pOWwMq0wj_?8g?8}f0?Zsd0SR==q;G^i{qU<+2?63oFz#*)VGEW9>%9K4>2)LDYy zmGSBAHAH=g4c%FK}sO;lPpfJ5I(4TJ+?kCHNvM z77|02T}HGyNT#K=)WFr2e!8aSwQiKMD#SnV)Z@NfSuB#0`)#=pcE^viKtTFaaWGra zQ{g5(8EZqCZ~n`$9fy`!`F`=;Spjd?{T;^j=U*)c6gxiL(JHWHyb~>Wo`=UDhhx=q zS(X>GU(n%hy#q!m*i(8I?EI|2aDe!5tDART3(PQ07=L$ZhGy=C`QQ0Qdt1vAoBcMZ z8tM}%fFXV$am1T~L9^UNbjW3uf`UPK%)VlmQQvKU{T}n=!S15z{?0nLPGL}Qo@t&* zGrjg#3v`0i%brq4n_y|gzdVkJAv?`pDNjqd>s-1)e>=f)>+;hE9aQ>*0$vDdDbAY< zIu0XVgnBj`y{4H zUH#1R^0H%q$m2G5z$*f72YZH@_pq!S(PLwktF6~9EKZ0Gx-zgUzy6&M)?8bQvL;7n zFhez64%RrpLHB=Q#HX9ZUwDL4KmNrzm!aBE&f+C#*?-NXCH4mdsix`F z1lO7;_KSlQGQTp^R^u|&Km9&}6vp?|&#OpZea1lJgTiH-%!iDD zB10}A5UV9z7x!{%Z-kYd9g}?1U!wlhsZ$CH3fH_d z*kJ#~hjDp2GATvK8D5aspo?{}?op$$fEm0UCnnUId#Hm}tFK2{Q!~F@I|&fwQbE5p z8DGVobz)uTK}F1&0;{3;#eRtElyTCrSB>i0AU+#qsUaS>q3Lx!GgUcnA&cgC#`Dpf zOtH@%QYgJ*TaM??pPyG#6>}i#I@uH_9`V4cENnKbB%tDOe=(G6EIcMRHy6cv>C&X= zzo3BgR4Hr(tsIA|HMLb!KbI=;WjB*?K2$W!_}>i>i+W&L9es3 zfOaI&hbhTwsGOWhB2wz*PL9*M`Ki;V-}?KHZ}eFO_J@SAqDiYt9ox#pKk8E@->iBs zD@zjG@CbGG+A|h$`vn4zoGS+32w(^@w{MdJMiYTeeL+$(E;2IGC8Wj3&=A4g<<5t$ z#W7BcgJr#?jsj>jT4KHPK1#=NJnVLi@Tax{Ys3}C43vyi5qp+NW)%?)x}2WrrYhkK zV>RY?2h=?JW)fLQ_#s_4{grlaG^bk%yaYMD;G18W8u#-|?f_u0Z^~DM>-bSgxyMTy z%&I$VXiarfHAEoS5rpg9z<`6%`3c_%GZ(k3tbDb!(%4q&n3G+M zM}+pn?N@mC9*e2BUzIHIJESfBjhJ_ZEnjziN;JCl_~(TwCstNEDO-!9@GO?p-~Z6{ zmW4%*-}bw+SDw-|+7zBlZ=ZS-J+}iiOK{Ihh!tUSeteOB)MP9^ zmpVa6GX=A+;9&z;NSL)%1>@_$IPsC~$wYgr%aiqOq;K8Uk-(h(wD0}>ONHZS3bzau zl)cMeQZSQ7AQ2XadAwr_R=_VXG9EFqP;#D~eJ+Fb2$ZBW*bh}P+ROBPZNnW0=Q`Qq zO%-eq?9c2!faK#tI1UF~s4-EboI@8gC(s9@60_u$p_IJ|R*LW~8@xq)YQdg(^lI{ZEQ#Yw29o;XuG--?QZ@%shp5PT66F}+H^ozo)>Wmadh151Ui*7ua4floKE-u!f|%o3I%nrBc;!zcc8WP3 z5p_IJiqxOJDqeCa+pS8VwUQ$hg01b`(PE|(Jorq2#0>{>M$&4Z>*Ec`9i@++oUN_= zrR?zIe!7M*&ssl&&db$4NeM@@b;{(xWonSI>l2w}8NCD@r#g8FXZqtKY{7YcWA4?# zexjB@ni^R+kEcO3IWwp3--SjoyONYSRfY2`t#!zr;Lw+v%fKZaAyLPobH(v+V5jQmRh92v#Be(G&%l>9g5ih0ojaE+If6Ottjrdh$I~(lT<#_BINt2AR^+ ztL8OemI;qm<^rn-EhJ^IZJsO{{`<)n%fLn6MV48IUDH&mO&PP|H zN$%Him}VbWsmmhiyvmi|5zyS^LaN6TNyw@!#*?o%*hkrhdQGd@;n(^|zA zQ3)Z?d9mvC@w<5@Jz?k(0R#inB&ub4#5FCJP>I=lk3A}!{*aT2Rir#xl#|~ZJfsg! z(hHN@2^@}{b~tcMQ|Fm$z+r2Vt!wKM&gWC-KeAat72cy;elDwo7e<2pada$pW6{Tl z*}IXC>cF|`*jB>fs}R8X{OM!XXZ66mMq%68&Yro=&n(QnB{q#i?kRP&n)MGC_2>ji zvWnPyx{ZFEau_>V?W3w`{1yMR-Mls=MBf$$O5O$rPVTL?w%XqTtZ@IsZG)dl@{qxM zLE72zQ7i9%g>{z`ydg7xFKXiF1?3GMERQ3cw->c)}=v*_z_^M&I~m_GTuV> zl7(VFz=n`1d$@GZ4^TgjhMr@}n*^{7PRkNI*`e}h`|HoTv~mmy$Y1qIv!3`xVKj?*o%d&evt z599@YBGz6CO4bm3(ez?bI-9oHlqk%You|jN;)i zhc=L=F>Mq>w0=IH-)-H$a z3~aS2z3ES{W7lik6eF_uW|Z~_<*Ao1Q_u^(hr2W-NLPG+63&X2pJYCC_v7^t8G0R| z=dn5Dv)V!iTh{i9J2eXr4~6?G=@!}sxGN?xeVtJ@H0IiW%+b)VvUC&OOY+$mFX1cT z+5JZpM^8+74%P?1Uh-hr5!^EW*u*y+TDE&MMCIXcL5ER_YrAtfTp^0g-IkYSybd3< zUpOLmJnK2n8T9%k`%AZLy4Td)Fz-wYp460+J9hl|@mst)SXRb73Wni$=iveS^XKv6 zU!GBxmIPRN3IJRfkY5v`;qmcI7@-s&;9-EsB6_&HF~8mNwC}4wa4OV=*6IfJ%o1+b z5bg{3f_ltnNR4lbie7P*AZH@~l|i^Fsa-&czy`vXs8ZW$3^0ds8ELjlXFeX=o6)F9 z(kZe=z?ygj7At3AF?SNKcG$7JySZozmVAp5kiBpB@BFq>(X|DN`QL;#lH|;oM|3iz zcav{YWR>rjn>0s--s3zl`#h%<%&ftp?_ARY&A6MYHN3 z!HNzJ{!hs$k#0~z|2B6zUDyv4KOiSPhY`X-r&%79No#yF5QCNQ`|R;x-E}I-nt~x$ zCCIG?d5DLgE5O@gWzL&YYo;lG37nnHMYkzUz+P06YbVIga6eoct^!7L8FHAA z$VdeX3vRfI^P_|uR`dlSnrLCK-9;ZjN8^eBN5J`fPQBfN_rGGfO9?LgB7+VWN9+8J z+TP0oSfg-9_BsNthX|HE-CEpc21-O=AF*?AyiJXFB6a7=F2$O4e7M)b2Co0}<0-e9>eUi4JURKHhbJ$`W^*7aJ6{i4bG%&*Rm zS|LDfGA{r242ec49adXdn99$_;7{7->G%nlTKB>Lv>xa7o+&3# z!VO)Y+7j`sauSvVSp&FP!qHq@78PCETRp+R@H(Ji$Xi42m3IEOtlOA-SB}ma&CDL& zne}`-5hq5-rIT+?W2c7oJ&KWDyj)~htcURnk*6Mk(v%w;X?l`#4XiXmNEjsj)e!b< z{nyg4XIp_)PR#atH^6J$A47zkN&MdQI{4ywUdoLHFBNI8)Oe4hFo&-FVeA0@sfI`I z+(*mx@rWz7m&uu#xbwKu*YXfxc)?^y3RXU=n3Pk^!|jlP$+>Cid>9)73NSaCVu%My zs(03}I0=%|6VSL^x)3IMbR_q8nYgBUftJ9vecP?Q)#0yP5F3TJRiIu#6Z1dh321{O z6zba_z}S}0)o*)R=b3Cy=fca)vr?=_lPo{yFXFK;0fS#2^>k#udKFMrI_`+E@vYe$ zf^~VeJO8YfCMcRz(uq!rb^M62i3eZehqkm-w zSZaUd%;_A;bME!bK1zHPb^;0FvON z<;9OSN8tXh!Pe44fvS((nuRCg9lkA{{}*iZaoNynTi48ECpk|gMH0s81(wi$v~B*> zGb35bldM-6YLNBae0Rk~fzt_@70ywq13ITQ0CX%I9GcS^9*ZYfX-*?I3cDw6|4nkU zl0u|Xbh6Tyrs|PRwGZykSRftHmhbHckAJ)6Bqnhv0q%QzPZNV7*h;>M#qmGt6Q1fk zZdrbox0nPQl4zw5CwAR^1ti(ae0*zd_mD-xu^JoJ5ZYF z(+YRIcy-B{vEK|}U*j;GBDCzvA@`2*2ibD!~qRO;;&l)(u zhS5Hz#A8=B7Kd7q!UhyS9!PDEod)`W0jW;Z(&{$>t_c)#t$A~@roMi4(0MV}W!t*g zZeDS9qWMQt(>s}UEUukb;55@qYI-3LN#|kxLl4vVtFWZo*oE}rg~2s8h*=C`DA$V4^}x^d%*Xqwp`p|bVO+PsBK^KVB@S*EFFSwpwq6n_K)SFyRF6p*n{Gp2`y`*cE*MOyjb@ z-p&2s>s(td@OVI%qQNTD^~#*CYVe_b&lD8_-=kxD5=eH)V)IO@T3vyM!KzBYUiq1# zL~A$KQx#`F_yhJz56}Wg#x~WK82fUgx8GsZAGNkPlmIo=&%mi)Hv)*@{Ct__{L_aLU=q`YD zLJixd9ewFPAw15M@&mERzU7~{+ESEqN-dkCk=UB!QepRJ&i$Oc7b(pfe}Bn^Wm-K4 zgOlnP(Z1?O*ac8VmAA)YIT_Cbz;Ued@is^VG09XX6ptFRX9lOv!QoAXHjV(igEPd2 z5xVVN6ttk5GdcKiNtPC;osaCOC8Var3Dnp1(YmGGq3eeSRh!+qv;cRgr4U3T|M<|= zVauR!Z)LcGmfQVsoB7)I7;+-E3Oxl_BG`*8@qx(J3>O`eoi`kNgH@eC2!?5b`2jLd zqAHadVe`1vXLjsITUarTn zqU)#1Ha!NK3aor4Qf`_x+DAs4MTl4ojXOCRR1{`5Z z(hA_9TA&YRbd1LhG|P5kl+&$oNmtir)uZJ z>h%M1fppbqNpa2InUclfAD28?Fy$^VN-P4w6~p4h6E(6QiVhUNFsLP^yVeGGVnbF3 zlfL}#MLWnWCT~5(swQn2X<@0?|5dYl0ssJm@nAuW=ZJ^oFdv`z_9VLs_yhGbw_`~d z#pQ0_28IetS>Fnb%{{YKlfr#F;Hn{bbgE8u{y=UPhulo{N3&OiJ|%m2g6*l>36%Ez zC&9>Z-w@dAOF!g-&+|a8z!Ivd1iC8#0=fO%#S=Y?jyH?qK7wyK?nQR*62g4z?olA zfP$<9zzyz{DFDzNbB86_sXmdO=DnR+WMNdPkB(gwIDIqVb>X$15?UyqLT0HfB?@o} zEnkb|32fi~)Iv$ZWts4Z-6U?DQ^YFLA}e}#zK{62ccq$!Y_0FoqFc35AVBx@FUa$e zHkUdAQ@!s*CrM94;X!&}0!XeIR*mD2-6Cc9ucuw)%F>KdhZ2SJ;OWsR3DPrc=#%SJ z#6VA443L6Z?eEBLuOJrd8=6MOGTWVP3OpK!MMB_b(Is22OfF3kYb*Hg#RXB9mE)b6 zh#$cz_+_BlAz&P=L{tRD#5ngnf#+0RDP6vqlTcs&a_Ns>+b4!27L=8P{N8DqL6_A# z@ooo*@Q7(=ZMqstZOZQ|%2?BHKotUD0pL#HI_&tNath#|)r-UY*mqwVuC3ly*Selu zqiSAxtSvR{Ut>~ox)Uza#-#l(B6O+H7;3^Gn^sAY(12UY%9K#sG;E0#o$Jl>S#6b0 z0Ko9`y{u<)Kpe<`;27enf!^pSf9c#H-hshzY|a<7m57wCpZW5H*lp)DQn3L0R`gBN z^4op?i1Sk=$FON?KN*`Q%`}XZEMsdR$5~wvhE|zT~ z1y~^TQXE$&9+{Zjd~c2RE$!E#lV$>-9?t#htN@TrV1^voY18hAhy}DiJ`>F`0*)(> z5ERBqo%3)HfP(g;z+M<5HY5bf(e{sfKeM3#8v|@S_q-oKgu`5J{Zw~0bF1X$ITSqB zpRNa1Y(Q8*e5BR#$Eu#fr2sd5u$oXsuzD%sb+pit9iFNkV=_ahpJEjkj{(@hZ&XK) z0(cNH8UC@qU&qkU@Y=IsnP7>*SWz2b>`VcP_X9&yFZdNA-rnNj0pEkK79*YaRU~ao zwen0{R+~kTU&4R~f2)ezTAyD7#}{{ZA4`3_w|8k$x;n=IBAMGhSHFW1;@p;(_kX|j zi++%!=R7Zj(3?=N?D_hXK}$>P9NfFDyK2#|VK%!$8R(O#&h*m|qel_Q=ELlIxw8kd z0-NcSh>7FOD3ShW_zc1p4*}T7tEaMhjsKGaLOtpdgA^^6hI7As`C^!+iM=pd ziRZBQyl@TE^Oa(v*>f`9^GH8|rKU(?cSj21bA1JThJgh}^^{+sJo)D2#jQsD137bZ zPQJ3WQ+~93A3!_@sxR7W|6tfNOEHDO=%7FtSfcqP0{3TSd$O(Ys>Irfy#@QK%{wtj z(C3K0(agFwbg)r?6c$;55PtMM$k46Sdb}YxIJhd|VC@npyhvnV0=7YIH$7A#4M>yn z(}RK*k%i%!EstXjRYrt&;ty58KtZ;3u{HPgYXT@e2h0{Jw7>mb!OY}L9`A4rv|W(i z@>WPd=9}(t=f9Aaw>k-e_{z6D687gzCANk=K`+LIXd@~`R!(11=El~G&wuGaJ%+?4 zew4UEABw*Q_zE!Vi0PKwfPM`hp>}V%%t3AXS~`e1mU~UB&IJlR@o1@UOT3$oIWh{a zDg0s2khT|lFryYj<#FSU5r{?(N!`HINp%P_({x;xYxhzZg36%~c#IY4G( z;N%OL_p!d!^~~2jiI%>R1%(nMxSDSTvC{ab9cO{`(FkVTNAmEOhW>bo?#vBAtHD^{ zS+6=QJsbq0S=ged@=11CU0dSyqOCuEi0ln-3KkI2Q+8+R`qY8?F9KwT{s6&qL8b>j zOg@5F7o-|_F((u`f7&g)1_qA7(%q)z6%E(JHkNA*okB>#*4#A($>|V%BGld6fK`>4 zRL|DCTA-cLVrFgy zAKwDIR}&ZL_}eUX89XW?qbuLvcz{sLqLZ;9lhGiZxe8F+#c1@;9|T|jXGBe7_7WoK z*QaE{r(-3~S{5I#^Y^rArGSWxF{2T}BLG@)(HQ3Z%aiVaK&hQKc`agokoW9Fi6w{Kwy*1`;-g4b6CF1OTv_0L0K?xrr-KSY(gHu&D)B$DByp2o)z`w z8r82rei70`S_Co3n;vkUG zjJ8d@^jS@?;Ri2F+W$%iOEB9_9MUx8OeJRb`l?aoL@p~wJKV={sfxI_#NH|~o3Fv2 zgf0Ec_aDdE!>P_5ON}Rm8tq{Lwh;8*8cF!yq0~{$D~nC~J@X6d(oJz>Wln@Kr14JX zNPKJHzjRvx!vU%?kYdf5ls~@+yGxd~20#L73_w@KC@2F?L=T5&4wiWiG>wiT@dM|M z9C_Px+hOhA<4zL0dGPFH@s32wqHG9`**R2PI|q1d1hN9%5;=3u|4^nyV_YE(;P9RA zqa_Ha^G|ef)GVdD>Cf*1h>90L4t2^ztIxuK!9ekFS7w!`XEPxin)3&sOiXBR9`Vkm zk4dwKKY{e&Id2L9I48*yfS>OLW>>no$>sgcf3ML($|HeXjB$ypW)Qd4 z+(1I^4rBnhQ^X-8 zQ4mBx{^hVJ8F>ZoFXM^zMe+){9CNjtknNY7vXd=AvE(8HAW(peO&Wl${9W}kd&_}s zIp-~Uk3rcFq*D3j1{&;Wq~^oQA@^_9S}|r&BIrW)(r^k+qsarw=7`V8N~7oD!JGg9 zTuwD0&9S)eHW%g4oHxm60YX=?t{PN(WQQn&6b+62W&|mPZ`EKKs1Bbs3(2PbQ>bM{ zBlGp9ISL;L>^lE{Qo)3;SXMmb$oIM5gfDk0*SoKSK$3O!{B@Ww*8NLvJc^i;4x74# zlT1D3l07;(R{EDGZ%JTT$49eop~diys*GRF3D;+d8Au0@GC^E5LU`6sA7z3bDKGS$ zju+d$`n#a%k5&c5ppy0L4&d61)}2Z+bSM)prYgK=_MddJ%fz! z1Td2^R^BCx-Z7RQovM$!Tfhw3a{>OhpZq5i1W8GZ)jtAGm|k1tsKLj72{>g7F0v6G z)$O1zg6t>P3*rp%uJj0p{mGL``t|Z?;!S_Zw!tVN6`Yoa#4&{Z%HtCtkL1z-1sf8w zFw=;{W%x+H2?XStEtH#}zL=p-0o*s_20&q}PVnfG4ipoXM1lvPk|syEKH#-eLSTCs ztKTFdXCTthJL^*M_@u-^A>_`uKaYrSV4~KhQz1CywEy}Z3~H{sxrRrUw*!fw>W96p zi{x~uJ27(WGdUJ#$&qpqD+dO4BBy{!E2a9^odt1+l^-l`Liv~xs|({H3X=Q%#q2bK zKGZT)LG4cIMK565at;EX{LPz0Kp%Yoo-1^7Ab|QgRFxWM%C|1)*fRo8wD*Vh=sA1G zcr?8_%be|@LM9LXFENYxsv!aB|4KIpow@bPW3zNi+CirX5^=vG4EoTli@R{@!q)B( zl%TdIr9tBWsVWLX5^_n!Wcg1mkYguLpSJ0o{lBJPRk_V()u-CIh@E@fv z^;AqsN=jTFGpvlEF=TvY)V7jRyW}5KsLET!xDcP*u5wm}(x^3F5(2*utj!8w)6Z?A z(1h{5rR4*}$n6#gkQD9%CHAyhaTr9B`o-d`1*gO8C#Z}Ehy&>e74Cq>C8j!0Dk%lv z(SWmcbGtptsY;^P4owd(lax&24$c2f-S|Np*Uo+ElIE`&kZ7AUKa9VXsg5i*=baDA zaSgz{ubxx-hd;%*XIC6VSL}`Rfktu#AOf@40W?zNK_>#D%4~Hzuz^~6sFei}W@&n5 zVtoZxt@f6HE>XAQnxr6&ICf}(ewAJB!6f-`u=JsE=B0QNJD~{H^vg7BcuP>(e(UE) zmY&pJg~GVUiQ8jiVj2PV12ZELvbYE7+|Bv`#;9x04PT8K85yCKm0Rp3*x0-PY2O3l z{zA4EC)wxE!_%ptkG?i}Zfnb^@L>8R+_NqAY|6=?e0X=GApjk3OrW5V>1o_Y@Sq z4UnoIV|5b!p8b;1^V=A=!%n?Ad`spGIY9WVb-!UIx^(7u2(<=g;tYTMht! zZZLJ1PU@Vp7zZQ_==Qf@;hsnpe+UskAECJV|Bm9Yi?KMl-U2En*K3iB&!#kgMW zjhF-0*8>k1sS9b8K?I9@SdoqAkt*kBGPDL*j%X*vRECNNXZe3#2SiA%` zrhYqP@Js2o%NixPwz5MhqzF*(Ew7bG7U!~kv^cd8n{jP(J$L{`8pEGe5kjQg8~{!a z#MMxK<)F4IJvld-`)`^^4{NA2QUj^NkyL)j^gG|P&&r1@%N?kupVi2cXhE3_a|1LZ zp&VBp$}H`JcE4Mf2%<>?QcU+9sPk_t7P6fq;n6104SY=icmr)5jCTW*`=gm+!oH^N zTYJhCBcj_eXP^KKC$Zzd!5IdJpRpB(h6UlLENq09WkSf5VtN1o_^R3ozdMV_{XsF} z?6Nm+^;fQi#bH6#pZ**F_ZMB^Pf3Gk&xTik$Ee0gVUyS6m!&q8_TB;npE>+e?O! z!O9o~!K5DeZjY?`Xdzh=$0gY`)uYwNAiDnaHrKtYkq=#)g{t-fQj|O&WFhf9JqL*x zp@GuguqQj%0Z`Q3NE=oGykYwej)*0J`o0i*}UH|&HZwpj%qqZouM=X$SLo{I$}4lx4v8LHS}ct3uCyx__sg`BA2 zhOnxZ32-mLzyvGi{)4tbs`#JKHb!flzZAof|L8bq=$e-4#HhWgeEt%_tYI(gWN;Xh zp>mdIf|lgt4OM??ub77-iy20a9C`E~C6U*9bne37k&1uVG3O1L!-KYuS~(H*lL^4y zAQP;*0`rm7@53yYt+(`_!8Vo@h-F{QKZ3}~1ZM6}F_DjvsbY&^Ji$TQ9DDrb4ncw5 z{(3efA%D3*bo)<08cE;(qayM!yG)!av$$#Z+QBwn5}n~2GxIZAyr(VSny{PkCKnn< zYn=*L^4AU(HX9d65f1kkzAt>=%qS!(Y9horWqb@P<{O5)fabi_-{3FLdctdWdz5@~ z+Ch_|INOJWf0#9GepEQbOp;3eJlx zg_xPu0flmJ@L@dh-b4KPxAM`GG;A+sO@`Lr1hBgxN1)B+y$AnIr$x!>>C_Z=l-ahm zSsROr1|bTy)R%*QOjSlWW`98)>LOH($B)0JLZOBkNmyhEu@RT{N0~91>g|EjinCql z)k&qQs`xB&6zaXj2^n|N3s-+0umV{Z%H*o)8yMlVxnZjYUBpUFO;a__$@$@#fQbN7CezN7q3!eMavZom>A3Y9^5OyN9K zYCiz$!zCo727;-s<1j5NFUW>GZP^w~kr5k;@_|}Ab`}=+p*1cFU*)=vXQGBkEd6jEoFXs4Z_9@Wp+0g^(8VPMi>c87ZOd7+{fzp;0 z%?r+p=!-WM!pD(eRfcJnI^>?=)0-0v4-cP6G%qE_!_fhIHq%#-4RkhQib79+fBC-c z>gq~LN{Ufb^li+|Gi_DGLd&VIi$C-y+1$I&X0w8O83Ec%+$;Q)f}wDF;WcDC3>RFU zqOIJfO&o1FDdQUy7M6mCPxKhNFm^zG`wPgqQ=iDl$nJxUG;Wo@+#MSoO$O0!=!^8F z6Gk{H=}`9DISGdOkKPK}UM^t*+wdCsxF!cH{unfdzW)Bdfb4kz>Im9vd^|jN02bQN z&%&@RgkwN<8LMXn9YMZt-rR+sqAtqKYfh>&-73)GmTqswabC9g&=qkjGWUA$IBE)? zkFJ5nWGcQjQtj(MS^(#TpU@+e54g5I7fgNz8db2YwKX+UK=@;{wWBX;N`U;St~xsNZ)2uOAoi>(hholQP_m*cZLorJkOi`JkVMU7l_;*@DHrf6vk!C$1ssykXnQ zAX9YBR>5iPq*(|1uABZ#wc4U-VR zkt9zB4a#L78(+taO(o^m98yx z4VFK%vqxL56bf=_*!GV3s$^4@>7CgWNoSn&LGaOegUET{Oa<*eh6bN+j=H!%LWQNe zcMi4$&sHv(T3wVtyC;<*h)?p(jNB@RdvcN3fU-9vCeUl8Gn>YMYvj|#N^Qyb2844r zc7(xTR3-NoX!Yi6jzff*enpJq)y2IgFxz^D*qM7O1e@$f@74}>+wZINGGEyGajCs* z)2Wyfu8JHAiRG5RshE5djZggBUXp|v{+k9Lk3jDtp9-jRIk=mc#H4m_Yv;&h+^;{n z8w)cW9jRwdDOtc88qRe)%=KMbpa1*h&qR-raONvT;I#7Q3VumGm-}7#^S~nTJp?}R zBkmq2WbT^H4{*JhVZ9U2Ex8f7Z#H2+aO4nBcd6mjxY%=MzXdrYbauvRr=<^rp=zIQ za_8^Kf1WYusd5gv7*&+~I@oWwX+^h6^C8|Fi8^fBhcnZg>ygtNJ)GwgI;aL5G~qM9`osoDwfNU&2)FeG)PJ zQbs%iOXGL@I{`UY%({8a#ud$eoZ5YAhYWC^gymTbj&;|vp80@<;_QX_zDpG6rjDj- zSef8NXi2}$Zk~j8K9-X4v-Iew{vp=GQ&RUVT(#dHcN;voQq`}+A*>!P8iK5n`(ZsLNkdHlS0Xl&G^hY_FZo2<@+5r0*`})*so!Wkwi1s}W8`D%j8v7kh4ce=`Mq^S^fC zd;UM0-IqI6q|uv$TojC)FBZ7jSQV(GZzF!DGR%mWfcIVS8Sb1Rz3w4>?P67W{@26E za}NbDp13AzePgEM7QJY@YuPP158I)aM|KoSVJG983mwWY_m=Aw@7z&?_fV|2U8kDP z$jsvW`5RpSljdllhL#p}2tqV8G;I3%L)KYa4P)cz#nOwCtM61xz559LYQ3cZA4&0{$IzNQ0#}wA5eqM(+ ze^{oK+EShiDt?hS^ox^I@pnPs(W0%$qBuZ2cM0i@U7zl_MNGxi34#9$)HxZYTr^dr z_ig`g;4|E(41*~j!(hP?yI$pP4?rb zjz1c(@h{b9dhV^Phm~*Nbed*Mze!OL4#t9d#xVG8YkQkRM5NnT!mX(_d$?;nQ2)no zm(%RG+n|s*F9=lO70_mW-1^3s_aYO)qFXtFFN+1uuu!H-*9SNJzCr81W3LnE&z~n8 zv=njUW@W`yzW6uPrI_A55hLmR6;yv3zp-(#(tO~#A+fOCoo{alYhQHTjL|y<*Hq*H z#07ob7zc+!AI=rZSP!)~IXPFLN2y4nzzANH5-=+N$v-gA{_IeJRf3C)OD7aLUKuXN^7D|k{Wk(|zHm($c^NQO$UpRPr>JG(z~}bzPbVCP9_(ACqeHB>;f+wJN}5snAi1rbotX|5>0kI%67Ro% zS3qN+k!KAQgpWZk5#ShZ{NposYJOE!m3E2Ur=+B$&LSIAH0JKzpox~aOz0*HH;YSE zQBslO;L*CUK6|M-j!V~GH_G)mT>pL32^rrL^z<2w;&$KR`5_wulKDlyqR0@uizgpm ziW8ClKZ36&bAdW0v3QsEgGs=+NlCcI&qxAzH}Qmw;&2^5-YoIu(jw!Gi zqHPlYH{c~ z-6Ec{JeqRyB5un8(DD%oL+OYfQy{dR#;!$FC_L>`OjSn5h#)Ro*AAZ-8BhBNuO>}f zHC3NVfzyuJbS-U)J4!_ZKqV@a0y%Rz>5GvM#Mx9XWCJyvNqwjWbmdX>9F8Mlp}CuH z9-jqAP?wnrkoiDaUPmF{92Wln_(#`x-uD;y>mEZV*6$nxPe^Z$;p5YsJedeDlxpbi zE~v>yiu9kf@@_&lIn$Gy40f!T&jeGqBs>Rgcw%DOP*86Nr%lbkkO|5O&FkLe_mKQK zIQU*tccj>h4AAl-1#~k=g6Savc3PWC1g(a3*5EFPvwJ$&RIjbo&`3U)SBd>erSY#n z?{<*@pWgK`Dx6P0tFu#eez5F8eIRo;NTiTmTDI1%RGS5F@<{!ll8{x;?4|=HqTip5 z{h%K+5h@74WHeh>i!br+)lT}x7bacGntCg+GxD!Lk2lam2Og-^e@SlkUzDyml)nBH z-po-v;?3{{1VV=06@Md*Jt-Fm#qZv@@fu`78oWY?*9ybK!-XRGeO%t({9YZ@4R-X9 zc9sM%NoHKU6%eZ72;Y&?r{V?#^tEmd26>?wgJ zI5W_P#PcT0B_a>U<@D#B>)+>uKe-PlzkK}2O{IZxRGUU&15S#QvthZ&Sj*SX?>=A)HuQhb^n1G3R#)$X2gG17IstK#&gxj| zQ>QS)zu}!qvrsfqef;=wt}NnZ7T{GGJTc85;DB>+sAA(0Z!?09kdC-`cwrSDZhf{} zWyp2+Q~BPC(tzvkJezAXuv@c}32t3b+={J(moo@L<7^5Jclq+=sRCLg!BXW{JGfx$ z=H`}4^@B-~h>GbWyaDQyURm+?C6H-+fLEJ{`mfLTX$Z&Mfj46WFOitgI9c^vDNCB{i9tTkmd2{oOXc4O{ zsAQUfDk|fCY5?+D5+2=RRhXUoP>37YafLy-`z9&s<6|O0lcg1&0-b*5pkPw22kLB= z8p+p!qfnOMCN%gyP(_oSMZSF+1nc zldTEeaEzLkHg&W<5IXzK%?FC};e94}5tFmjb$w2lAdr1cfv!?RM#i1VWvS}ar{xdj zv9P3E>K`vJ^?>x{6FfT2F8yFaX*WF>#65rujNRAH)b=@j2Bv{g z!Xc;9DBO6ue0PCsqlv(3_U)sJt1UoX@|oiLy;!Eoa!@rAMtG-CcfZr@rw;%-;3D@cTwemK z6>r$>Y@|YZ>g?I+srzV$2l_|@QfkGm6=^_9O(4Sb)m?nL{~fw_4HuwD0XH-2FU*B@ zQ-4q{g--*In){?I_tMXwKM7qEG{cSe_V#@DH+vYIv2k%v!O5C%H}V6j6#`8fKLEYD zp`js{wV$_Yvo^oRKQcBJ-T9e#owx(&+56C3(*amy74($UC4+rCBa{R|*0y_F&+kJg za0keE;l*Q5-d$w})CKCbY6);U@>%}={zCA?@G`af9+*piV=WUB6V^Wcn1b50-_<(A z5}~F_E1Jr=UQK5Nvu9)uPJApjqb;N(RVC(0R#6@Fz7MUzGu*(dVc5ko%Si3cs;xKpwA`dow3#gAh^rx+E(*u*+I9%mtZE_Lx=lA7bYG5PjlBE4t2hVXKTAGC-&@F zg(bC{++rUg45PME4H`u#m$Xe68kb_M2BWs9O_mac+MzAC!AQs@gH=dF)X1fB$vrAD za=)DS+n#67bIu><@6+@2Ogv9Bzu))w{eC|0=l#5&cUacElbv7S7si2O8RC<3-XpRq zX3qVN-f!u9_r|&-n~Elc<84kJt0a}d1zTcDrR_N{{#SkE@&pyrzZ08ft(=S9pyk|e zEmF2IQ)nkVy|w+K&^}dj^bnx7l(e)M^s_~A<@IT}KqZBQgxCm|c)zQH+hY&NSLl(o zw6rWSj@|_R-ZHn*DbVH;biC;ZVv0t`4_uZM=cxgl-hu*axQl_PqvC+V*Nzx-H3cxO zBUCmDU?|ygcm|W{_Mk||-nQ71n>%mv<)+8GZET`8Z`tBfDXAJs2ntqZA=^GqEPtHB zAMHucDzWkLxrFqt48rseUcbW~_UPKO+&hLkyr4eu(m&k2}Wdh%|v;^qpwU1~* zgomMXG^Zu^uxL3A!WuHIcG*{$rxs~C@=N)H2L>Q@NooO~+JsY>K^RpW4n79?ZjwVz z$X;la->wfH>88`oOV!A29$%5+Lts^h_unDc=rP)V=`Wmcr-3EhXZJ>g4u$~)=my?x z&L|eu+57GKs~~;M!#q5l7zF8q-v2g1)b);Ld}^*3>h~1P)G@HkTEkTDca~@s0DvSS zTxzUYvlT80^;kPT34u|dp+78W;;=TZnfC0k=9#9!(O}?Re!D${*?C|BXp`Mn!otHF zuy>`4^&$<&yM3@kCE>cje24IC3)S%P&z7hJL4v>79rN}P!|3g>P$`89B#pcocu_VL zb0oPycer`K`Ed)h(w3O|dy38P_tG;z4Qi1nsg24noTgvPu#=QRLqhuTBz3wb znWTyrNd5v+7Q)8soIqDdqMqk_yQ-?Gu|S(tv|Vg{IlY>W6_HxH6kQ51ZM+PUvNQAB zz;MhQt=jmv(%xEHc8f;<+8hROYrp{B(THK-;y2jT$oMgehF%#^JQZeq>@9H?;9oeW ziEY8toz#f2&W6)|f-AU$w5otL14;09Y%ok2YB(t9Vmw&8LHL0M@3BrqI5 z1R{nII0y*JDNdkK2ClgVKPByvp;Pns%g(P2WLYb2@JK}-VVs(N*^Y`r3t)}tbc+V~ z>H65%F8-~4xcA230HA}z|K0H6{tG8aw7RwsAO|&?m!M6HkBW=i&U749A|AL>5&HBQsJ+l&^aD-n1L zs){@X@dR{Bum$_BN;VGpMQ6nlB$2-`>P!>bQ0il8nQe*uQLOfMyuZDNM+U^+F8u~F zc1bGcExGPj05O#O%lQ^GcfdFd#dM9Hm>PBW10japMD^_rhYabvv|}H8e1O`aiO++~ zs=Ikvs>ST1_SWWt6St60`X=Y!-%d`pkK=WV9zCjug6V4og*4>ALZvK=b~Qkv20(B2 z>+(e@!w{TXL@DaKtx7uYR-7Ktbg#O>ShgNo3pS%_5f~c6CT-XdFyY zV=-J%u0&-&vbtgP6zB#V$zbd_mR(VF*D4^Oh`CNxwSwS)wd>Z^%;0?MB9jZsi`lgsJ6pjLx+a}5f^ zozBiTFc%Q#-d-XE_CtkQrJKbc{mvDseJAGOYO&pG;fz>=r&x=l;E8A2b8-jMZt#L` zW%2a;`v4p{9xZnlL^>q#h|Cc``;NEzU&rWB9O}tfNbci0Iu3}*4iJ~7TUg7en0b)l zDNL$t%V9O?kb(6$#PaL7wK%i~tI6j-fYP9+=15K)$^k4PfWz8VtIA+URN>A*nSy%x z#MHSBm9gHXvyJ+!#+vMVINxM0{r$SqSI*pz&m+c>wYx_9FyYIzdj3X)SpUA^tm~Trc-$YyR=&mmLik!5dx&KOB#Gsj8UYaHV|fwrxeGzuduwT)Vb%Pr7~Wo9WvK z`@MLNpW+?trY;XbgqRFtJ_ffChJ!VT&C0%fM{8itZ@(=Ee9o^w|JW{%M}|z2ab1jd zHPF|Fm_72VNzG2g?Kx73w}g4PX&o!H#PlG z{ubmF{a_i35Kg2`cV>}y7}@qO;>kHg2Gw7g=h9Vpp}aarS@0h}s@+_;NpAg#&aGGs zL7Ce4@;=Bs_khcYO1w8K9K9o{v&4n5o8jg1k{EQ3mgMAYz|42?h?u9@= zswC8YsN}V%)S|Nc&oGNdU?=r>$LTX?&gf&9sC|ZqJ_?!_6#gZ&mbFw>d%_x%lae%m zZLJ1jIuB<8yB#L~7~iFz}&%0kyE_CPV1rqX}HH zVZgllmugc|ql^|wQ#3C~uh4Nrh$w=ycEdeSrxYe|mjfUq=y}W8v+N^Bk~et0N<{_k zQgHkStmsorOvuU0@9mhu)Yh?zFu5tnP2@nw1`Y`wkWzIdj0CexG(Pr#R2E|tFdZ>| z|I-IT@MrK#&jJh^1lbzB24Q;(F3a}Nq1)s+fF;-wg`S0}!s^VTSqf#zXXHBqm|#6; zDzZyZ`VeJAZ(Twb{4=R5-6k<$XWUynGa@2(uxYG?l<1WvSTs6_S{KW!>vn?%z-ZKv zd^=G5`(gDVq2FP7}5@(f-lR=H>s}lybWi`zO=upb^$PT>l z`QpXLV9r1F`n-xh&KnKpY8IB3;?9bTJ$?R%k3Js*Fq@m3i>Uj?;Mi?7-pS1r1OF>eB*pJs`p6hDNgXLBIPQ%u2qhP3qP}|qK*Afb( z|II$Iic^EG^L!9kgyJ$ZbU@yI43-786+8!-DOoP4@>4#7yCOhFPDLdPT*VeNRR|V@ z9hWvUysPtLak1$nni$ybNdcvke`uoR)U(&iOJMtfR4g|o!Lw+6)xGvUNJ$Ox5`MI& z+kovMH4fVY5IHO?%qPfe-&HVaZ*xVLhq|k;4AkE|3-J!YYORn!6SxNthEW`bek>?M zBJuw!SX*6vN0d^2AMDEa^5tkt9!#`q|pr$}L~s zD}TS|s#C6SALClnqtc0)t4>}TSK=uYhX@wA5(V(uI?e@&ARvwbP`to+9<=DMjj%T0 zihnbc0wz(IoR}~w-%^4ZP`Q(j8(~~F_|;~6fpZ#i`}SS^NKFtHem!Q-$^;GwVfQfZi1)HW=Cy> zfEUE24j3(o^nihAeuw+U?t!NJ@9w>fzIH8Tq8&47XbAd*FRW`8)vPj}*WBUi7 ziI#V;LQ04vP7Rv4LjoY?r&AH;09lXM5H%dBFbMjEH+3FK#u%E@)YaXMuaGz+9z-eW z0EYQFGU!JTjaoEX>oCW|!y_&53yS*cg_P8<5i&e+e?J2J^y%}iTw&rF9*x&`KZuCo z(9MFkVWYlVeVO|@z>tZF3Hd*9(E9by2ui~*Vlkp(+?(go@{CM3AHkPzRMyqi0euoi z4qvQb1(s3FT4@&43`9c}3L+yT3unh(*5Wdi5J}f#Jr8CN(Qs-WK71I9qTG0Y7WQZ_ zh8lEyp~pW;_E78!d3iT7<$R5UNcR(8yVPDqMMV!|jt5x_D9#F^*ag8Aizul!*vCoT z-G>Z3n(KQu51oPJ53N5^2b!C;nx5i;q{OXt795zhK$O+Qj>m5JevHj0C*FStA5h5ZoE6Pj>WekbSkh;vXs7#sXS%j$26`?ZKCCOaoSrU~gbLOGU z^E~^leRY4I;ds8!@xK4P?;pSWIPOEWoqL~qo$Fldvp(x{?(my8l#Y`zlA%zj<7nk; z7!-<#9fcy)BRvZL^3pxX5q=zTkw5K3jqRCdq{kUAv5Shv%J}UtuTgU@8QQK2b8AZ(-B3YC+IS~iBtbK8g@XdUaNb8-t(Br5q z)9R$<@dmb~WmCU(I)zY*(cFOj*`XR|?xPe8S7Uj#8^3=)BP!bHWtr%9YJIlH^7F%E zYg0eR8Lb=Pq4SzeZD!Ki^|34i9!+r`m2iY@yy8 z77I=$da!o9Q%?0!DjB{m)uDjsB=Q$K`=qI!N`*~fN{d9X8N-Ni-vZi!x&2`9Y zGVx4?26%6T_|a(jETdBF!Tzp@^Ka!F@auJD?)y9ID6J1#88xLUvApxr)w0Qc8>eLt zw#G;4_}~fec}%OMCX;;Zd+&Y`AX4V=UYn|Q2-r0&bDuZ(ZCaieK8O51%*y21F!B^d z+g~5=hDM*ggZdSfmBnx3GcP*iziTIEKTy(II^SRX$-3j*_gFrqZ`j>{ZC>3RimN6j zCJ$V^yu5r`4+oN38oq>|ymGj=8a2Vg8RNgdbHS$becq2pJXPn2w_no!w*4q%8WrTL zPPQV-)7W#zlr3QI0^HT(%lBKtfpbbXZcvuH&%e2mC_&uvlt~;}=;hXcgXcQg2J@Rc zHeDYG^6q@2c`0gJ)LJ?>H&;1H?sBj_srl(%^Vuw!Wv%x&YkS5m|MTuutbZShiOvm= zcu8FNw`TF&*G7aE%r%#_QupfNcZ(siOgLdXA?|tj^#IN=ArcLk$)5Fz=L$P_M z`1NW&-u+QB9w`}7=#K;v9j?2mgbNl&4U6vo>X-QO?HdOlA9)~OZUt7P<#I6mZ&BTo z;1@3lTXcJ6$F`xSEb;o)--L@h-L+_2bZ+(Tfr=>iFr>CdE$ur`U z5)e=7$6gFvo9TL-TYbPtdhVe{qC{+lW;zy&{k-z$$CdrH4yxJNKa-Qslas4k^M44I zKhZVu3V|p5{GiSE{e^()j~4=7Tccq-+8?x@Nz)?}PU5_a(y#K}rZ(POjdsc#2dlmV zt17t)?I$-iHRY*3y7F(A=9;1amos<&13unULMCe228DVBR?nVS!X(Y3t8-Z@JM+kq zP#Yul|KrHo&e2=Na=FxyOb zh(+Xs@RM~p+y|$x!n@)2<0a{BIs@T%cNfEm$ww+yKj-lNbM0`Yj;bw_{?dKY^T`x! zen*0j%AwB-(H=9s4tJcEHSwb>^9ZYu@*E3ie}vn4;rDFiPYfp-)BfW}@GFPViRMx9 z>IZ46quqwb+3IU4AHn0WeX<7xl|FSEvb7x=3h6hZu{7@5;Xl;Q!%T1m_l_6Xk=ylM zO_Yd!#l&A|yTxtdj!ZH}>kRc)|L{mre-MX`=DQlVp3_oq>i^#GYw_@BZC$xA%C-XQ zwsotXmL+QSqbFc~Torr143eil=!8(o1k#&6L_cR25SaUpjUu=PA>i2jW1*B=XQzIi zWw42TMV@UCVywM#F;E%2iDQ1~c$DFK2|U167VPuQsFcpn<;JB#42j{ctb%oSIY z=po;e6PleaYsJ7oFDLD+uJD4yG_*eiX=*wvVn!({cc~~T~COEF(+iU z*n1n!N-`a#2rOR=wTL`c&b$Ab1(|DoVX}V^hr-C4$3a~=Lw@wEo;6Fr*3R|6s5oB@KmN+4a8Kp;T6kV&d+Nu(m-4JNPe?I}hjwU$ajA|(N>Z>bf5ltVd`MM@STf;o ziAZXl)^(9Gqbim)Zg2P;+%LY+o@K!EY{C80b5>QZ)+esPpdWt+-QXnDO#hr+{5i*X zDX#iz7$vf*cO?waaV+8vLrpagh^*Uj#~{<;-o3l%yS3!U3VXXXm`Vo1)Y0=vo@dfj z<0hVnw4^u;SKaT;8;xERwe9Ag>CRRyb^fEQs`^$l{f6)1{-)wSco&xDyT@>?XwTJh z_qG%QSPXUX(=s%Q?ZnY;v)vc$2QIrW44`Mbvk8>9e+^G$8y2sm%kGD}v|I^0+#f!? z+w%Gf1>>bh=;!C0rqkk9Iy7Wi)?{2JThhE%CtiEcWT+*}B>sG>Bmxs)6t(#h$s!r? zrxaPCPs&G$1VLtrD~RGd;Pj509OMT&_edgQT^s zjrE?|FDpH!RG|ja8w^@G%C?Eb^yfwZ)>Zz*^~6A?(bt#@4V47AZDeX79Ux2-Uf?g6Z@zB++$< z!BHP{vb}2>1dPjQ182H2=`Y76B~@)!z_5#kMHGx;6z5)gOrfq^X?vsCtDRAD`YPp5 zNRmi=r#E(`)-`tPB48``-}grGLS!B>N>hp5NQ&b`t6VR4uT`Lud&-z+L)VmWa&F#f zZ~3VgoL6_2^d5}^dCMv*nE57Et|Y{-~tK%t$YaCF7uD3CQcEN)%S}6 zkU8GX-JcpbeM%_Qe}81iC-wfXyv)ApZ_m$*c&+^Qi?kakxq!2w2_yK;E_T1ShECV0 z)??VOVeZ$bE2~W+RNm@;4k-+pe*EBb6ciG2Sls^ngi$mCvKH&DO4v*JRt=OThX*6$ z11`bZIW|3%~(+j%3!@wNmhGG)Cp8~1HcYnR7>GhT8kgZwT-F#S! z?|j1&PJaCKiE4WmVhC5z=1{Of;fO{+kX&%kf>Kr(6&)J@lZ}T_xm7z6J*EMEi)4CX zV+9>I#>XBD-5dK7{(EwAQM$^kmhgpu;aAZfBTZ&5RdBl)yMD8gtM4^QRAR}38Y?&D z6E1@7gt`8l$O1f=clXCB|Gi};l(Vxlz&FB??|ivOQmi}P`9gw3UXMl6JW4~Q7T}hQiL!?@~@a@G(xU%aiff6jAyJ+I|hc5Iu)AdZ9Y;MCMegVUx-=kq{ z?_v&jz}JFymX)^Z*n%phXS#x?J5p6*^D;5~=v(cW@YGB0hw(VCnc$?y6c1voeZPma!%zgi^7v5+ON{lAGq( zgojo(;bxtfA)}6ig74TD5m^${k`Yh|Mt*L++B`}4)T~vrFeq$8 zi%YMgH?6VFMG|Ix1TxSP8Q3l(bHE^2No!v%-8&3P<>e(vCtPIsC!%^wPcBrm304UA zHt%H@k9<3y>bsrCr+LQdva|6x%>kkYRwj3Cm23Dn$M$Z_3%gq7 zC5%8UUnmzge>kd8-++X94AvlzeahSS!0Uwk!4e6#vBcbmm?^wXxDo^mgN{wC&(u0K z5c~KH_!W;T{Jc#9X_hCvDS^ni{PPFxr8b4OT(+1sae2jOh`n%}dDbTfoXL&+ue^3= z10{JmhX&7{*&|lhh3Z-jI-1VWh zJ*_P>Zd73upVVRkKYmQ{aOlk^O7c5pUv>sz8s$~kf5R^At+u^;TC0%%_ibPAPB2;hB$RNcIC%An$@MA)TZAG4 zD{z-%lc_YMiM2E3-Nh=_Xw+Vlo=;+Mzl#~gV??K^Pp#}{&+2u}gfg+8C&{U}IQIb; zj7JXj&j!nH|5ko)!cw(=YRHr5Yh=jD8>HnIr`s41j5GG7J?&<(AO$nS{d4h&EOYk- z>rWz!iFwkWPjs-Q^j`m@m_um5Arq?)#rIfp7`IePkqg%;3=2plJSZnTDOf2K!aiSU zcxW8!`WwG6^(l7!K{dC^#c=OF`z+S_ZJw5)J^XtmzIZrP(0C*>Hz-w?=;+l9%xzsR zy5snLalw4`-c$z(H2ya7;{ICN|>lCGOn=pT?$#!-q1x z{b$9+8T{{V-Mom$FSK0GNcZ*^Yxg4eeB&=u+n3air2aO?`xKc@Hkkx$u;^#huG01u zKbKN}TOb!Q7+`DOCLHiO&+Nlru|!y44@e2)iGN?Z=YM_#cV(BkAD36M&ly#~BR#tO zJzvkUW6By~cYlm@>5e8?rkK~~@jd^H-(bA*$^MLUcZQ0E27E>Mjmgwsg&N1wO5&GU z(X2<%b4l*~t+TMfn#FH7F>ss8%zel8nj>3NLItpLp>3V92eIm${~EQCyMC`WI{zDj z5?vn_IfUJ=8}X&1)Gd-b(C?1=LMuhf`F=(rT5G>xAMiGA8~B|3olXiJ}CmACYH@V z(4;cuw!-BZA-!=q|;)@M)4`tSL(iQn%Pj+EZe zGx470ij-WqjDoyeUpkreqw(2UuccZND$isBqN6v{ROmi_{HUyc+<8dfGEosgMglmD zwD%hKXG=in5e6o#1O7fIq;g6K5B4lCuQq}C$4uMZt{xb2()?OnHZFHxZdVm@nlJ2G z0C<(2>@NWYw%RMP`N02$1{spe1qd{{(;zz%L~gd@8ZS&>;?umuK^KdoWDnVf+`l!Q zp8Ov2=>r$2l6|4jCt*UVF$$2LR^4BM$M z2F^9W`xCs^%D_Bu0s7_)P52zkS2xa{#VbNkz$$PO2JG9mt$VJj$6q9d{Aap%20Zl3 zb61zE=CudsDi4c+xww@oAL18z_uf5hLW2J5yAXS0AUb)k1?rkSXi{U4W^8WPf(&WDWGDSKnTjn|y0rZk7`^st`d*)aW0>ua5=X zwDOr;C=Y;qWkdD$1k*%QLLC4pmzr4($@xoyRa@rgZoF3Z_dggKCqKn+1|XfJ5)4ci zHCR5H-@q=-Qnf>NuZ5zFU6yH^KZD^P5=38Le-EZc$bSBO7;r`4KfOhEOsKjrDob!> zBeyQ?ik+EE@PVfYLGt{DM7ZQ)g-dd-?#DZ5fG8EM2q&`i?R+xAiGWe+ap>nI3uUv) z8XDRJ9Q?N7yM|jJi`^|I}fff|3Bj`aGYB{IRIA6 z6D4ndAuZW7xjf4sFHSYnLsibp;|1@Ja4H|$&cwIe+hnlLXUylThZnT$b)E+c+>lBFN|#@BRz;6 zJ7buMX=fzXN28&2fX>_`iNVlN#^?% zR8)Fn(Gtv6y6mv6hW=aeDIZ1&Q)K;xfQbuyG!HD3kDq%H$3vvA?>Juw=9sp^&;G*n zY;LN)2-GeHg=A%{Fa%GqVAQ_-Q;xB_R_tBe`y+HS0|U?EB}0$~t;h?3;Lzj2;S($p zNBE2itpL?xBd`d25n>PNXX`f9eLC4eS6l!qN6JF_;iMBq5CfUEyI5y7c`%7Wu1T%^ z#BnCbTevZNW=aKov`|W7(-o9$IGX4&@=PfOiYUJ4TCa^lb+Md^gFcILae_Yu#t%Q zwX*#8F6ikL%MmH722;sWgc_fg!TtU%>j#(an*^``7I2$2TeF%PWKxMCE$2nw#^be! zfzab^87D8gIq9B@$pFV;X@wH5#007Ick_J1jpg(R{q4v6~FcIfROC$ zJTjA6m!pEI5JoO3eDv|ii&OHJ@LeXZ*kF{}zoeA~*bqAwj;tC>X9HVZTAX~ff9(P5 zuU~CAG&pgD60+7>?-M0Q4|YdClLrqr4SSO(`Osi!59{^u=r-5De<^{P37Q*0VDT==}ik@45>d<67PxJt_$N|AB|Y!Ts^ zBP>lgV#_bx*$7g|Wo7nY<~O167`EGr)>=cLQq1p(rUyC3x4U>fr&7(*GO-7t>>2Th z8}p#|mx$J;2;xjB(-V)XzBux{8LS-feApb2w0v#_VetSVllbTO3vwsW>vm}Lt&w6z zVEh_)*4t8vjJ&vv90>qMReGP6;Z%%5CV{=Cb82njxTJfHNNY{AII_{S(JEq9!yHfs z8dfsqRG#W93fWob5T}=L2e?5NhK!=o;v|HPSv<_D#vgFtW!3R@goDQjSyGj&!@fiU z21gPjPYDF&DD@YGQlUqYHH*2rvO1cPo?@fj*b*9N5)^)N^b1g+YFI+V_%vT8lSzEM z*Jg;t2Y}wFwb8}Wsvz+dsBlTH?#g!{yKnjKv z_xS;^yUGD^4xEVD!QS>IyS|tRIzG%hwbLy!yZ4V$u{IUi^;3F7eQi74n|~Iluoynw zNbmKT3qBij+*$%?m7`ze{@QGM1*H$WGYz@)PD`K%5Tw z$boB)g|kG<$8g^w3vg%)XL*w34$PX*ePDOJgHA%FL6~BB20`J~@ucFI4T?LrbX%drk3j z8Ha17wmmuO0O-XB9El+Ri|86T)%)jW8O^JpOVz4tyf0aA=0VfZu zdNQT7&r#LcNEY(JGCBNK`(_>BfD$sPhzEQXqIJvMky4pMW`9i+Iz>gWF!_^00|0Ri zrV0U>^6P)Z)hy4=-ABPyorke1Sen|+VTF6=fUyuRmHJz|MaNiCu!jI{7SaEB=U9KS z!|>!5xD3JN@h2i=l|?{D`mTIC&u>)XxR?)E`hwHgHE0Xf@ua`TNGYmf#}Fd!tF_FzFefoHEjA)N(s%e)DQiQQq6 z#Hc4vQf8gTpSnwPa*4ru8WdR7{t&8Gv$5e7A9Otlebuq$2DWs+-HoOMkuWS*@U#fv zE1>L7hF{w-F)VY{Idi(;Us?d`APV-8o{~B2rKb1`!Ky-)m$K3!Zcqd1 zu!Lmt+Z0J3!I}oY=DaE3} z%xf@$4suO<>dI!}TO{=3xPi_+pA@*}s#in-&6p&wudr9P5juhQ-oGhcIYSVo0OrE4 zLULB$6E>Zs?jixJ>I@=B|K=Jpq%(pu&%1N1GlR%ukl1ghMv1NVZd?dNijY=hBz0dE z3m_68Hq(>M4txQEa2txj)Oo~W@SP```p+Rq^*U+sAJr?A#K=tF7T~K_w^`sPYThUc z`<6gb-@sEXO1Bq`ruyih>|pgoEtC+c>~v^j$&lO))$qUiPwB5|)Fjw0Lo7g(j2EMU zRO`shJzAbH`G@!w`Nj-!MpfE*bl4Y%I7qW^Dk{v*)=o47b!etgYv=$_rF|4371}wr z8e~&E7R?d{kDW}hP*O$%WrmKBt+G6eZYRjnC$j682h!g+yVRf44P)Cp1$op_1YA*tE96tv<6`3Q*^PU9)^ zA%M_uUl6*GEBn6{3aL)x_<{G3ONjs>s&+?;t3!@6nGH!n?G`C1h%C-B!V~di_%0E+ zE-<@F9;JK;{6oA2)OA=al2I|3t?Ba&7mo;*arcf}jLMfB`omi&zCtd2_L*dvYA3GR zqXF1>^mq^^4L|HT{#xHhEj4xd`H98rnY^R8bGNpz2g!!hH}RLA=2nN^Yff>owCduW@1xNCNJV((zXt4{#HkFNj?j8_d9eYZF$SnqE|2m(6Y<-@J&1EKAQCjaU5DZC%UU9zRQXLgg~ewN#^$iOl00Fdw2|z)5(^GsIZnq4lb^_ z51i=Rk20^Y6CI@(0g~h#6yJ%G9@yk$(-8$Mtt6hFPjRzF(Ehh$=MtGZKW!wg@% zbOjDnx<&-0rO^r2ThW}vW4wU_F0Il7K8uym*ORf?^xd5=w*L8s7?_qfuG8(Wp`!?F z+FnYJ-}aw4BbR1Tgh~UP(}6>ul-U{y=GNjzk3PC)HgLIQgix=5)Wnw>%8(boVmYm& zN*IH>K+G`Fn%tUTne+{^nHpqlGO2qzYtxGE)kt%)LtXr5jV&&%L#fsI4tn26qVpIRq{MnK| z?!vWufMFqsWCEgnQ$ofLh{Np5BWeIs9_82kykdWcLU*MFT4C0P2K2C#~$2ykxi)Dkdv+*B~}?u((IAmC64y3sJ3 zOH!8u8A#2DI2vXg)tzm)I`^p+16+c6WzW{~_^&cIzTl(BCFX3?)n9%66K7f_?u&{M zGEK70DGjYYSkHyL`uruM?%QF`j6m>ior0ILYyjavpD-Rt4iOuZ^*D1ls3%KbVYtfg zv9vF$V!hi?E5|5dV8BSQVo4r>06@5?wI)e#L)s>dfBo~j#{J`ml zPsxQIuFu{clJeYhf}l6u_C*_&aqI0-XiY_Yuhhvg`UbR8$-&O-^gyWy5SA9bdAHSG zUw#HHOIq(iU^pLLJM&kVB;D}lO1KF&qCJdFe!g$%@PG}d#HDSnIQ(Ww`qFhGONrI% zp`m?g2sBp#m~@#}>iYZ3$nLM5q>@@f0k$Ac0ZkA>WhF`bT=dzvFIc^|VqWS2%kX~b z)2~+v2?=-Z-8=PTA9fdz$Uci9)MrQbR!0XtMuANRyYQMkKd*5QsJdNdq(P?K#Tg09 zJy`Bxxjxf{OHX&{*0-GhM5e<@16wQv;n}`bg1V_`GCAM|$h9`F3}xwypb+QXKN=17 z3rKS0@xmvcNbMY>?Z8b|Q5#z56ich>EW;#uJ6eh+#K3pnOVC)2yS-zi*lKNcX zwaNe{AtIr~!A|noB(m;&PYr$VzR5n&uW7;#&8b*XLE;@C_gZaT<9djBB_LEob||k6 zU=4xdnm=)MLIKBAUtB#rfMkgI8J>yyc(0k!zGO6%ut65~eNM?3nLm(ywA1@ZQ1IH9 z&x^4J>^UI?A7}-pdve);qx4||O@#)Kn=(C#pvP%?B_3sZxYIM>yV_h}*Z<<;-S11F zNGKyO!^N+E=c_%DiGDs3aBzMq=ryS3AXm|-tKjmE(OsB&t|60ZKUn5E*ZU0WONu~; zs_jsKt}z7#m+rMDHN$>lbBC7@^qsV`Gnfj$zi0t9%8?w?6y?Mm8cl&-m z&V1($@iJb_juELvvp%(qmCfcL3?j1KdrW);a$wViaPX0PZ-zp$`(-)$?o|qD&uTR6 zdZxARj>!GGhINkwG|0;=2DfGI<7V&)?0qO zP1$&`(P1@Iaiw_3n=fFuf7lb~dT!&gwV{T22NGvAhMnfYWD>di1tD!R0N;HD7a%9R zIX^+v2yW_GvwB!bt)`+vR_?JVxB#4_px>%`-si5&T>0G%=*IR+z2H;9jkxL^x>bTNej-q5`fcdvrH&Xn$Zamvz6(14 z`UL*+DUauETxgPFA8{y}yE5w{=!AXT+lVjtDq}wbqQf2em>--JKLFcOm+`-cpxsd!yUs1N+T@iesX*=AYF+P#m6a{>1MJ~wZXTi zZeE^8?lXbu&8GtTrIe-JqYwuk<1nlkbGI)!cUCk>^ z0a-*7kbLzC&9725*sR*vdzB#_+(tTroIEl>3gIqabh($8+|XB8dt_C{51NUPWXO@n zkcin+gc^!k69Oj+WLGZ!F#*V9p7<=+!^{K>M_L0Y-NiKUC>$I41Tba9t>FNwgao7} z^YQup`)aX0vZ%g@gzdsPng=|ZDGsJk^8kMn%0$5mkl75%1oOu4v5xCqawCn6q++Kk zmaij|b3!J^a3Z|s;W5X_M8~;&Kq+ly&|C+y4dJ;kjW2|#bc$#CL`hjnOOdCHK~E5) z3`9}*dFTZI_o{0e0`LW?xzw<@F#zYd6TUmvdC$FutH9gxTzM|pF~UM}(#ZneSA=Z6 zG!lIC?NO*BTqc19yIJK6^bMAl1@K`6HcBR_uW&S{JgB7s%Oyt-#myaHWO3$2ev%YS zN2_;@mnK1cml_88FCenS1nc%S3xS-avO+KHe_Z@CW+%gR`-Kv`CDh?$NRSrKS|IKo6W(w+obr|t4)ovJENlcSsqcKq{M=v8C)sU?*a;r{K?={jg7O2}k-bI#}b{Mernn<}v-PIXIj97 zB2kj0Jf4b~v@Wz3-*D$dhrX3IkR8dh3?)a579_fU`(RbU2LPTyteC0*c%4%bX}P1v|4k(oV+0PY;`vI9 zxc04+#pQih=*KRU)In{GVW40Sv)bEQ2A&N8TngTM|CVwz&%v~}0)}&}C0^RBuG7@0 zo%`k3as}^Upn_x$isjR7uMP*ssNax8<@pCU=({Oa*HLI-($ufDi^irG50M5gfh8{poM>tF_^(g%0 z`HK!iQeU5(R^X($g0p?6{^~m9nT=4YKpHNUwkkiLQ-Vf~ApX)d`lEuj>*BQ~p>aBVq%Iz{xB4R4N*9jXsIywj%zkTER$jC)( z9ChquP$?_2L)RC=@@ zb_D7Bd@|Fl&CCT&P>%@+Z6FK_w-E4L)6qF4RJlgO=C^jMb8#@&RF+rkeO_yRQo2 zm6+Wd(4_&@Y+v1@3;4LAqJpqtlR49Lc6T z?=hnve+cq9?m>l>dM%s=5vwoe3mTU#L0z{DRmV!E={{K?kc1-lnivq05D}yTt9rO9 zdst_g?DsWG|I?cdDcrR@3zC6=fF-Ae(xn#3B~v~lRZszqpUA3%oq;hszqYsMyRy2v z`RgnW>cWcUuS|FD+-XbKU;|dQ9y}}_l=RSuv@ZDZVyqkbYuN@%>9WMno9TtbAk)(> zV$Ot>l_y0ECZW|IpAvAUDZ|2KgzqyzQU?+|uR-Z4BeE~C)wy)UVP@zE9*0UgyxIeL z;7A4U!3*duR3VSE{vlhy!=XxeZRl5xK$>1MgG`7H|H?LxmEYW%MbyBCByW{S{;Giy zi3NzVac!WaNR*K4cvnlN3yB)vZo^%>M{*6r4XOc?O0!uV264go&E-#u6CgJtgeD!& zhySUMgDwj{gr$fGXt${c_1lxnBwsp~Q#}L`9`iAu=uAd$wjP0iA)u(X5~sHH#wKX! zU}K&@oQ_cEq-k1wZy?%RzlU$P1>JRrOy>;wnD-P^v96Lpxr^B$a;hp2oxvP>kx`us zgS95C&}^uuU+S}6TI;x(Z;m8foF0%TT6g}c<961ATM}M*<7pp@BVD2Pb6>)29Ur;+`NUWV+8Qz*JiKHx72V6JIVuYzHrsvklS7B3tO zyVJr9>?ibb!&u35%6O+efL3&k2TMw%sJ|L{VK}n#W3-^d>>JkXV=1IxPL^W^Rg`(n_PwXt2y)8EK4_DR(av@KKpqu|XtZ`gv^-RK zyMfYkL%(GD++X$+8^i4@t4V{()U7M*k?$|MSuF#a>Sl3ZRG=1twdN`Xs?0}F&!qSc z+Vh`w8{{+~4tc`;R*x505wJ)eJ#211F2Rl@J1rv$b_~t;*0A)Xpby#{l1wJv$Ijh& zcv6D`x|!IRDY%N=o)ZD6rc+opdbIJ|1HN2Pguo?!0KUu z2<#^ua{Gch!v%*4QtgcyE(`an2}?@${xX6L+6Ti3{}+iI+%*fRGL@T;PsvTT)H44! zG>rb%Lis4h>>o57{gQ04l4Ntx5}*`1ANEDe)ggZ-px1J%f=26tudt=5AUrs_{SbVa zEASsY3{vMHNZ92I7r~ivy&yx2a1pVT-(1MMcU)@6>cq9bjcqt(0T8x6<0(_{sE+!} z8huM*)!B{Nzt3u>d_)@t?2z{cMX1Ts|Lo4dQp4c@o=D$A={xs6F9xv9%|Cm^L{W`@ zlqa;kBZ!`nswEKm?aKShfDBQ5z-$TTz6_)~?KoZ{2kp$$r{#LazcL|sf=33hhB-7( zPo9I*3!n2FpbWk`+l`McuCCy47p%5d%-k|_jDy>ry|P8@5MGNqQy={=k(`EX$Z3(0 ze~ILP;bA;_g6H~wfyB|ziJD*Ht%Ugro0p^i-}f1S-UNZ2{Mt{Yo8@8yZuD!@Cw={Y z-NjEt%NLfD^xsP4ka+b2dSMA7mLOL827ORNt2eWL{R79%OrsPZn{7FAYn}t*9gbo)JS8Px1~SdL9esY@B@2i> zgf|=rINXQZ(|XUt@dI@@4z@bkn(jW|hq`pXHyX-%VbJUW-F7ppkZ+?Yk=(efCW20G z63%C(;P4V@nvX=7N6BGSfk;)4h=B0o|2~j?-vaWXa+D|q@?C+$a8d|4{R&VmbY7Ja z>QE_4`^eXYI?iN3hlhgM3R&Q9KTysLVs?FBb{DHPfRd!zDnSs?{$a7lq?2~fHfzIh zn6~^S_9o6!V;4208iCDQ)O7jH1-IHS5jWrLc>QhANLbW%u4tgCA7}mU%>?e5VJU|J z@0C9G_nH>ZRbMb!k4E|~vQ0YMrxTGLovayM_m%P_9bVmMmGNagh$tQ&ra3(=%t}qo zf&TveJMZ(In^pG*xI@BJ7poooN=7#30gUD3z!}||LQ-}vVc#uB<0@bM=jYUUolV@` zi-LlJn7^(zKn~YEx1Q?T*is~;oM$LLUA2pAQkzb&526FN@rQ1*(> z&L6SQpU;17NtRuFV>3WPfMWo9?2^lb8ZaBGK)#kw?~RO@-LnDOhQ6mdQjM7 zq6xg3L$+SYmkiBr<4EmH+`?d5@etOg%h^pEg&Ha5o?;8!obOKuiB;+QGn-dYrQtXn zXMY3Gq>l^FojD^9u$gk4gpxU$GbAi5&gQ8jiv^BL6?f}xR=S>mso?rTa}Eg#b@ldT zzDiQ);0M8^)`0xB1s1U0r01;?6^o3o9`tXE@_`%`(EoT1I+7Te@{c!0mwzpfw+B^7e{w57lxw75adNyWwa+rds;GNNmP2Cooyef#n^mUZ>`=_-09jUgjcwEgix6S zBo{haUgY$Gou5OvTQ+F*dku zS_oV_^gSrOWEH)BLl;Jke?`m4{B`-tJfa|##WBU{UzTaIdvYIin!R_ret&yN1vmXz zLrKb8C}5c7QM5BkV%@@Qdt!Ob74a$50@RIKD)fSS!Ag@Y7`^zIXB_+6t$#;-g;9x7 zvM*>(rX>fwm}q_;O7TqU(HM-nQJZW0{!&X)Y?7zE_iyTqTW4p9j-EV;pJmGzO45O( z3+>-y+aFP5>~jh{^E-2s@8p-1U4*H84-420F_iSe%>0CM(<#HxXL>{~BOu^2_+?;b z9uZ;johNXtaxGmJT~*ai!loRs_ck*VStUt!M@gk9mHd2+e9*dgR4@ttX@7_bj@X|S z(s(JUYt!4tDAAq$$z+k5d2Z%A42h0H5f;O_Jd9S%T9Zh(t<=YlI1*Mz{EKgi5|Z*3 z3>Z!SiOVkTlJ>&%6*ceNkFx19Le>aHCXbQ}aT^KjEGxWpJLuB=_;u@vTetA0Mk#Ux zrhG1SSAQv{Zquz+=8E3gbD56S#r4~}xZQ=ZC8zD{9+UlfER^L@Ea9uiC~M+<;5BRK zP5`cU0hWnubmgvf6GMhJ-?s)O>+8Sn|4R$dSFYG#TlOV(}d(_2o~ z6Kd9LR^J|1m%{DoXe8OWi~SGuA@t0&$$hw`u(P5%Ypsi4w1~&1e{Kr;t%P5?^T>50 zYpu_=d(y|#y9{wI)Sk{^!gVj! zI6?Gcg+=8;ow*aAz5zC2^Cl}g3-tE@R z;+&m~lD)A6k8-qxAzU|JN3;6t&Gcx@4E!pa{h3ZRN(9k)koxL~)>pmUMXTPMeZ?9E zpROBJ4S2sYMocG5NctM6XV@1Cp~%|D#B#YUF3fy@Ya?n$PQ;WliD$L0JbDxz$(%1U zZc$6fBiz;%3-hn}Mas^t8Ageo??VUdJdcTHzk5&R!iB#pmIJGqP~vY4!PjO$Pr~Cy zU%tZ5;^B)AI&SzCbL4^*!)*SE>rPLwyrcY9Nwwo0+TZ{0;6DUlZ&BS`l~!2?zxa`- zOzlb1pzFp*zokR4T1IbWzxUII>Vvz-IZmEa{%1#`{=fl=Epx8 z8Jc*baWhD=m)z|yLI;zmp4U(js^)*n$mO*xP6n^3Xhw2`%Y8IxZLI_2T0qOVb4dT{ zBob8|MfScwqR}sIVU!Uxik@hRr8&t(WzG**BEn5sZt+jHp!avsRMHUp4cWLa-)BIK zjp71Fihw<36AN3Qz0kJ(jbi(A4V6=mGx^~1RmCsWrf+W!2M9@T#CMh#cNS&4E~Q*D zL*d63gEI57@OAG+>DhTVKVMudUz+T}vk|a%;4ob3z2dGm)2$v6Rcx~8w3Gq`3w~5u zFp3b3F-f}Qkkpx%x=y%SXq&b<92XRfkAA3uV+1%-Xp#VQiIG=OfV11_=hRR0b?O zmjP`gTR6DbSK{>crMN>5d^v&p%9YYaHxOuPr{73~u7+486x%9j^iOCHWc2pxrKP1^ z$=G>S?xgTiL@DA)Oe9-e(fwyb{)Qh+2LF1Lu@kj7M|ZAiEBluy(eR1W4~`TDhLDmN&&Gq==D_LbXp9jqM{;n1+Ozox@SQqoG(azE1Zx3QLDfs zcWv$yBn51BH9n>VmRpeEPGsul>Ri1V2&wU|I4c`lF0|!rpc$!{lWkgEB><&DdU`rY z%F;on<_G6m@9Jze8Go@@8+y<@y&HIny(`d>iF z8Q>|d&eN&;MOvj#+U{cU(dc}OH1NjmY-0@Ka=bi{009@Jr=+llE$_jHBwFao#3Utm zU-Y~P`4N}qG>&^Az@?!v4IwSvNIPS!6GAy2DMbOxmj-S0LHjI?WSNX+)gM(BtIl-@)tv?^JUNC}4Y2D12As0Nn_5yAct0H%Zs&E*Vf$n0HB3&uTjauGo z@QScBxQYs?@?~hTL06=%j@+1unmYB#6N<3qu`Ge(uf))!qwVF3Du?T)kdcviiHe~* z5-krOu22Av1PUg0aO;iYV_HT=8;`Kepl$%3{}vA6CfEWBh782dT`$`-nXVzQ?&O|z zLsIlruNoe`kVj9SY6JMVt&7X0?7e18XuxK|Z z^4IELuqt;I7ZRG8TY2tk!Z59;lrY#K_L2YtkPNK zATGe8B2>y9QuaSa01&@2bx(TxuE!QQy)AG|rDd4H=lMYF*}xc!Fe+7u{jD;5$C@KKlE|V=7DpI2505PUiz6l9>4T z_i#K7&IW0hLDAb;>ElreXNv2+qd*s7vpiP+Qq1lph-2S_LFcz<_O$Qd-bvxQ!(_h4Rp zf`T`&ov8{WEYjXu7GIy-GBSECCDrH;>;2w$OP~Y=35+;W>H75xYy6<@HpFiG$^p&alK9AQ8wY|~r z0120+JRiPiROm1~w6PBLR4gnKA`TX+-gC|$62E-8q{cWBNT_u|BKkjqzmZ1+i-*|g&e^*QlQs;1}gh3P+i!9lAOz+ z+-dx}G#rOCsPZlK-dwO_ih=;Hqw@mv7v~<=WBRxdAoa&2ZHR!U3FO+M(ApNYZodX! zMf$lgSUzv!&{vQF(UlVo`LAbfx}(r-R;NG1Fh4(krakR3=s!Lr`|qG33*-VTunz4k z8{new=|{_8Aha0yOh7c}{BX6YU4M}_fS&to@P{rc**&vYwoh)!y;5fL-%8!tT+9Vt zA`>!*L5X83bZ6F9ehAqjxaq?8_^%(L>*P9*8KTn(>8&D-BB^BYvfh%9<5*5{EWo0Gy2j$SP z>pqg!VE^$73*RIlAczPL{|UxUyy^9;ztkn2)pLY^n3(t*JQdKLKzD#8+zytFe{B)% zbdXch?{pRo%^M7CKsp9ED{E@nm7%FL-VoITXW1Oex>5YAWBh5 zX?C?$R%pZ9L(2Voj9da@_hS?km*AUKrs_5}AG{!?JgGOo0AB;*a~_0#rJAQ_$uV+r z5%>p@SKH%D z>o0y)`IW=JUtp1N6&@NIx(5bV%yDb*XRrVv_y;f0B{hSd4(`SK+m;_XXVxrF!cxi#UG>?b&3@G8fn$0D5{QZ48vX7Q$u z6Dnqk3J<>kk$nOfn~)sPWai}S@!#8A7{n7y9iZ3g01em0%wNA+lB5mapvEHouDH#_ z)b+v&H31iCCjpS?w}Ho;(yhK?2Zzs}KS#XQ)c0O#Q=m#vV)N^SBPDGh=U;!fI+!oC zP4FA}j8}M1pFc@MV-8?l<&#>vgwxo=<;_iT2yH^k1|IWh zIgF;}Q}7JUcWOM&NnnkW=Wkp(^|=1^Wv9>fzF@Vl=K1jeS?LkK12ce7O!W5c+Y`V6 z7v%$jds)6v_5;d`jd!zr9r>CDmx(hevP~)t!0q8z;s!l^eJgGxNoBwnGiXbT;1I3N zua9YVO&uMYkWVzdz00Z~TV2fTPf$Cy_+TW`4=RVyy7=7O+=cQ*nZ(OZZyF01dZXSP zIeK)+^~T+)Z&)tX0*eO9=0wTj-iBz&&3amA-ut(}EwZPktYEM9i=8@gA_bgh2E=PR zAjq?ho2G^N_W<6z1fMLU$#v^VqP4N6~CnqO2 zC+9VwVLLz@;JUqX*AEVwc!OjY@|50h(Yp)1ROmAQ{W9aN#yHs*2?_dBecxT@V$KmN zpN46@{)b2=^VYjv1)p3qG{L_re7rB`N1TvtI}VM1RSFgfEr^?BWMmj~^EV*rONFDo zw54AMec-D`j{66j)w<^9=HcC?7N&$mM56F5A_0>My=0gCVLe*vgfp@CmIy%6?0 zsi9eVbKos}*=XidtBfXW`@Q}BF8Cy0eSQ6Ov-mK-b2hTp{)fB6l17e6adGM3;Aq~R z$q#A`H>}6RDz09E@8#Tqx>gOeeedAo0An-GMmF%0j2G`bLY6lshE_dZSdL!Eq_e=f z!^rrhYL-Ev3WS6%*@I;&-8hUOtSche_~rK8Y^Amu5Tt=yX|;l2QMTG5>2|Q^g$Aajhf`mJZ+T?}s{Mcmvx9{~)f14L zA)?O0$8dT8%KVv~ofSS0DH6hsz%Dg2a~6`WkhC`FdH+6;Y4d-`$=DGu{@&Qw1{ui% z0m_hT#1j`I8=6a;#(&SwX2J}6y+O&O3ickVgwdCxg7aGNp51o~6BlT;nXcW&Vm4pyM5 z{q;iMpAfu%eo%4g(rrQhUPi0~YpxeA*$c3W^QN?ly4LWN1xH0g!)>4g@YCzqF~itZ z$M2dj`-PfXTJ2`&uyntpH`>X*xXbUQHJEo}XfLz)O4tyzZ3B(^f5P6-8J)^rqfGHYqhFo6@9``q-9mnhKCCAzR!@%}jI4LgH z<>gpXa?^;(wdDUA+$w~`SJyXNRf%ZSio49#2$eqIH+}fkJ_PCL#?!6oN6OFqf)1)w z3?@p<5KRu@+5J8~t_vt(fL_~ZL`LCk2c{NI%6rV^H5m82Uwf`cd{tK{6!xKXQ&v1H z@t(xS-KpEE3-m{aIXry#WDBcjns3vEImRr47p8HbJ>hw*Nwc{?j6DHilLpEn1&L7G zRT0o7iB$3N@w;0q80L!1*$<})ycq8{pP%M3yXM-o7cYpTtA6$w1AnC+vI7jXJG;EP z^eLiaY*JEE*IW*|XMCrA%D~KA3Q})1DwXBQZfoyW|VMu zqgbs3ObJ;9+{WTC!98^YxEx&|S?-<~CDhsU$lJ(`Au=YveR~R8W5EpT-ZwEiVzk$% zLRBjn>LrhI^YT)lvYHB5mWFQsWSD(N!`;}&hn?3&#TO&RB|{A#p#lLWFm;pR?+JJb z2?7^)Kf)*c?27--!EG|vV6@kXA(`g3nlC63vc<&-EyPjnqT zaxHMvi;&RJRPeCL=-sX#?y77JaFgpy`h9gxT?aBJJK>@X>O1jT zbo}%Uvv3zA9`<0{NLa+C`*&58R+S?oaD*N7!e7V5EkmL?1QSpiCk^$c@1O30=S+x+ ziTSOkC$hQe6UrtHFg{gYTUF~0^&b(0I@~l4evWb?$g03iT3UMvDDh-45)u==4bIL? zj*v79k{;Xha&rerBtW=FezOsAw;^B@@;Y27z1K2Wi?scDzv5SlP=5x5vRFK69ik@vzZnt}fU-^_eM zIj{=PeKQ65U^rZnF|#igq^YJARyYXV2TdPT?0*ra|CV%3!;}ZS=L7Nw5V3ivNQA)w z1+G&I; zgAaT?&$*;;o1i~#{hpH-Y(aLF%HZL$-uW1ztK|A}LeM?Oz z+ZZn8XYyo|BLzr){SYWg)d6!A{@=C&hv0bH0M3B4ICt5%9=xxuZCp)=ybXS6SibdS zfP9ETY4s!zm?-f13_Q(RZ5nzXt}q{{mj{lY#RTg#Vs_;W@=GlmjR&Jby*?4A5Oo}?>8_PZl^DbdUs*%GRkca zoC`fP+)m46zJNrmqC74amedh2j6#6}5NOQ|;GH&&wvPY?h&`#GP!WlVvfkc&48~N1 zP2Z~_Ua2j71h!FCWg!{;8Ng0+W!P$a`7B3KNoo7rNzpW;y1JSbsj6=QE`Vr`X z-YuHPho~S^oRPslvqYUzpiNFLa9sC0pQ9qxzbXlT@k=A}`r2As#QK`f*;WNgA&UAG z+Y6dB8sYq8Ah!u(C1)H34ImcGmh1UP6O{0hMMw2lW*<57!oEYhB zE+Y9RfPPL(sh<<9`b}D(@bv8s^EtVYsLmoLj6xl5SehP2+GGV=Kg)@>f1=zLLowmY|yY2T@R>k z?RYjrP6X_c6s-zfE4et~zBuqMXt>Vu18YT2J?Jn35mR>_y$JYzr(1CTAP3MIVgY8Z z2n08-sT*a3Fv7wP!M#626K)p7Jx`#yM2n}pe*Kp)IS0h$T^LpaRvkbO@^jJvg3p&U zgkwmt1q1n#Qu-~MjF*5#E0-_-^=A2}Y(VQc|59e5T<9>O75+yVKbJRbQ zu3tY&hMWk$Vh}Mg=+KO@G)Nzoo2Z!fFesNeT`Unqb>(*7-7dSQ$VGC$O=_*Nwa@c0{XV0E-QK=Kx)z!7| z9P0il8_4lSuvQv#R!5nUjtSJAuuE}MQxlRQ@k!+Rh$g^vNWcgXp&1&sA@2WFwK^v| zo3JFnQi$RtwoCdYcDJ{*BcMGd|094OxWmzv62&P|vx|NFl<>qB+OJkGBLVO59tsJA guXZi?f4&?S?H{X^d1jyTAZxbTd)TsYx5vdl0BglxOaK4? diff --git a/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_360.png b/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_360.png index 8a478d51eb2773f2cd2adb20edb8edaed134bcba..82d95237567a85abb00d06d159afbfc24f77e2fc 100644 GIT binary patch literal 60003 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�cVBx&)!IrcS@D*P5fM-WU)Sn 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 From e339daa2cb72a88f785fb4c5025f88a3a3442f9e Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Tue, 8 Sep 2009 17:38:14 +0000 Subject: [PATCH 0222/1000] testing: add a TODO list svn path=/trunk/matplotlib/; revision=7719 --- test/TODO | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 50 insertions(+) create mode 100644 test/TODO diff --git a/test/TODO b/test/TODO new file mode 100644 index 000000000000..022545022d01 --- /dev/null +++ b/test/TODO @@ -0,0 +1,50 @@ +Here are a collection of notes about things we want to accomplish with +the testing infrastructure. + +matplotlib.testing.image_comparison decorator +============================================= + +Collect all the failures in the image_comparison() decorator and raise +one failure that describes all the failed images. Right now the loop +that iterates over the images raises an exception on the first +failure, which clearly breaks out of the loop. + +Put image comparison results into more hierarchical view to facilitate +knowing which test module creates which image. (Also, revive John's +move_good.py script to deal with new image locations.) + +Misc testing stuff +================== + +Recreate John's move_good.py script once the better hierarchy of test +result images is established. + +Buildbot infrastructure +======================= + +Put "actual" images online from buildbots, even without failure. + +Get a Windows XP 32-bit build slave. + +Build nightly binaries for win32 and Mac OS X. + +Build nightly source tarballs. + +Build nightly docs and put online somewhere. + +A note about the hack that is the failed image gathering mechanism +================================================================== + +The trouble with the current actual/baseline/diff result gathering +mechanism is that it uses the filesystem as a means for communication +withing the nose test running process in addition to communication +with the buildbot process through hard-coded assumptions about paths +and filenames. If the only concern was within nose, we could +presumably re-work some the old MplNoseTester plugin to handle the new +case, but given the buildbot consideration it gets more difficult to +get these frameworks talking through supported API calls. Thus, +although the hardcoded path and filename stuff is a hack, it will +require some serious nose and buildbot learning to figure out how to +do it the "right" way. So I'm all for sticking with the hack right +now, and making a bit nicer by doing things like having a better +directory hierarchy layout for the actual result images. From d634fc928007e2f9c7a92d2d06c1cfbd95ae6b4d Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Tue, 8 Sep 2009 17:42:47 +0000 Subject: [PATCH 0223/1000] testing: add TODO point svn path=/trunk/matplotlib/; revision=7720 --- test/TODO | 3 +++ 1 file changed, 3 insertions(+) diff --git a/test/TODO b/test/TODO index 022545022d01..fa0adf253b60 100644 --- a/test/TODO +++ b/test/TODO @@ -16,6 +16,9 @@ move_good.py script to deal with new image locations.) Misc testing stuff ================== +Make ImageComparisonFailure cause nose to report "fail" (rather than +"error"). + Recreate John's move_good.py script once the better hierarchy of test result images is established. From 5f2282264d5d68001b0e6da2a2c0a93e8374c517 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Tue, 8 Sep 2009 17:42:58 +0000 Subject: [PATCH 0224/1000] AxesGrid: implemented axisline style svn path=/trunk/matplotlib/; revision=7721 --- CHANGELOG | 3 + examples/axes_grid/demo_axisline_style.py | 21 +++ lib/mpl_toolkits/axes_grid/axisline_style.py | 148 +++++++++++++++++++ lib/mpl_toolkits/axes_grid/axislines.py | 67 ++++++++- 4 files changed, 231 insertions(+), 8 deletions(-) create mode 100644 examples/axes_grid/demo_axisline_style.py create mode 100644 lib/mpl_toolkits/axes_grid/axisline_style.py diff --git a/CHANGELOG b/CHANGELOG index 63915ce20cde..a98b596bc463 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2009-09-07 AxesGrid : implemented axisline style. + Added a demo examples/axes_grid/demo_axisline_style.py- JJL + 2009-09-04 Make the textpath class as a separate moduel (textpath.py). Add support for mathtext and tex.- JJL diff --git a/examples/axes_grid/demo_axisline_style.py b/examples/axes_grid/demo_axisline_style.py new file mode 100644 index 000000000000..99cd064d4329 --- /dev/null +++ b/examples/axes_grid/demo_axisline_style.py @@ -0,0 +1,21 @@ + +from mpl_toolkits.axes_grid.axislines import SubplotZero +import matplotlib.pyplot as plt +import numpy as np + +if __name__ == "__main__": + fig = plt.figure(1) + ax = SubplotZero(fig, 111) + fig.add_subplot(ax) + + for direction in ["xzero", "yzero"]: + ax.axis[direction].set_axisline_style("->") + ax.axis[direction].set_visible(True) + + for direction in ["left", "right", "bottom", "top"]: + ax.axis[direction].set_visible(False) + + x = np.linspace(-0.5, 1., 100) + ax.plot(x, np.sin(x*np.pi)) + + plt.show() diff --git a/lib/mpl_toolkits/axes_grid/axisline_style.py b/lib/mpl_toolkits/axes_grid/axisline_style.py new file mode 100644 index 000000000000..268adba89f85 --- /dev/null +++ b/lib/mpl_toolkits/axes_grid/axisline_style.py @@ -0,0 +1,148 @@ +from matplotlib.patches import _Style, FancyArrowPatch +from matplotlib.transforms import IdentityTransform +from matplotlib.path import Path +import numpy as np + +class AxislineStyle(_Style): + """ + :class:`AxislineStyle` is a container class which defines style classes + for AxisArtists. + + An instance of any axisline style class is an callable object, + whose call signature is :: + + __call__(self, axis_artist, path, transform) + + When called, this should return a mpl artist with following + methods implemented. :: + + def set_path(self, path): + # set the path for axisline. + + def set_line_mutation_scale(self, scale): + # set the scale + + def draw(self, renderer): + # draw + + + """ + + _style_list = {} + + + class _Base(object): + # The derived classes are required to be able to be initialized + # w/o arguments, i.e., all its argument (except self) must have + # the default values. + + def __init__(self): + """ + initializtion. + """ + super(AxislineStyle._Base, self).__init__() + + + + + def __call__(self, axis_artist, transform): + """ + Given the AxisArtist instance, and transform for the path + (set_path method), return the mpl artist for drawing the axis line. + """ + + return self.new_line(axis_artist, transform) + + + class SimpleArrow(_Base): + """ + A simple arrow. + """ + + + class ArrowAxisline(FancyArrowPatch): + """ + The artist class that will be returend for SimpleArrow style. + """ + def __init__(self, axis_artist, line_path, transform, + line_mutation_scale): + self._axis_artist = axis_artist + self._line_transform = transform + self._line_path = line_path + self._line_mutation_scale = line_mutation_scale + + FancyArrowPatch.__init__(self, + path=self._line_path, + arrowstyle="->", + arrow_transmuter=None, + patchA=None, + patchB=None, + shrinkA=0., + shrinkB=0., + mutation_scale=line_mutation_scale, + mutation_aspect=None, + transform=IdentityTransform(), + ) + + def set_line_mutation_scale(self, scale): + self.set_mutation_scale(scale*self._line_mutation_scale) + + def _extend_path(self, path, mutation_size=10): + """ + Extend the path to make a room for drawing arrow. + """ + from matplotlib.bezier import get_cos_sin + + x0, y0 = path.vertices[-2] + x1, y1 = path.vertices[-1] + cost, sint = get_cos_sin(x0, y0, x1, y1) + + d = mutation_size * 1. + x2, y2 = x1 + cost*d, y1+sint*d + + if path.codes is None: + _path = Path(np.concatenate([path.vertices, [[x2, y2]]])) + else: + _path = Path(np.concatenate([path.vertices, [[x2, y2]]]), + np.concatenate([path.codes, [Path.LINETO]])) + + return _path + + def set_path(self, path): + self._line_path = path + + def draw(self, renderer): + """ + Draw the axis line. + 1) transform the path to the display cooridnate. + 2) extend the path to make a room for arrow + 3) update the path of the FancyArrowPatch. + 4) draw + """ + path_in_disp = self._line_transform.transform_path(self._line_path) + mutation_size = self.get_mutation_scale() #line_mutation_scale() + extented_path = self._extend_path(path_in_disp, + mutation_size=mutation_size) + + self._path_original = extented_path + FancyArrowPatch.draw(self, renderer) + + + def __init__(self, size=1): + """ + *size* + size of the arrow as a fraction of the ticklabel size. + """ + + self.size = size + super(AxislineStyle.SimpleArrow, self).__init__() + + def new_line(self, axis_artist, transform): + + linepath = Path([(0,0), (0, 1)]) + axisline = self.ArrowAxisline(axis_artist, linepath, transform, + line_mutation_scale=self.size) + return axisline + + + _style_list["->"] = SimpleArrow diff --git a/lib/mpl_toolkits/axes_grid/axislines.py b/lib/mpl_toolkits/axes_grid/axislines.py index b9bcc9090a53..a8842292d1dd 100644 --- a/lib/mpl_toolkits/axes_grid/axislines.py +++ b/lib/mpl_toolkits/axes_grid/axislines.py @@ -63,7 +63,7 @@ import matplotlib.lines as mlines - +from axisline_style import AxislineStyle class BezierPath(mlines.Line2D): @@ -184,6 +184,8 @@ def __init__(self, label_direction): """ self.label_direction = label_direction + self.delta1, self.delta2 = 0.00001, 0.00001 + def update_lim(self, axes): pass @@ -463,8 +465,8 @@ def _f(locs, labels): # check if the tick point is inside axes c2 = tr2ax.transform_point(c) - delta=0.00001 - if 0. -delta<= c2[self.nth_coord] <= 1.+delta: + #delta=0.00001 + if 0. -self.delta1<= c2[self.nth_coord] <= 1.+self.delta2: yield c, angle, l return _f(majorLocs, majorLabels), _f(minorLocs, minorLabels) @@ -551,7 +553,8 @@ def _f(locs, labels): c[self.nth_coord] = x c1, c2 = tr2ax.transform_point(c) if 0. <= c1 <= 1. and 0. <= c2 <= 1.: - yield c, angle, l + if 0. - self.delta1 <= [c1, c2][self.nth_coord] <= 1. + self.delta2: + yield c, angle, l return _f(majorLocs, majorLabels), _f(minorLocs, minorLabels) @@ -964,6 +967,8 @@ def __init__(self, axes, if minor_tick_pad is None: self.minor_tick_pad = rcParams['%s.minor.pad'%axis_name] + self._axisline_style = None + self._init_line() self._init_ticks() self._init_offsetText(self._axis_artist_helper.label_direction) @@ -973,6 +978,7 @@ def __init__(self, axes, self._rotate_label_along_line = False + def set_rotate_label_along_line(self, b): self._rotate_label_along_line = b @@ -986,16 +992,61 @@ def get_helper(self): return self._axis_artist_helper + def set_axisline_style(self, axisline_style=None, **kw): + """ + Set the axisline style. + + *axislin_style* can be a string with axisline style name with optional + comma-separated attributes. Alternatively, the attrs can + be provided as keywords. + + set_arrowstyle("->,size=1.5") + set_arrowstyle("->", size=1.5) + + Old attrs simply are forgotten. + + Without argument (or with arrowstyle=None), return + available styles as a list of strings. + """ + + if axisline_style==None: + return AxislineStyle.pprint_styles() + + if isinstance(axisline_style, AxislineStyle._Base): + self._axisline_style = axisline_style + else: + self._axisline_style = AxislineStyle(axisline_style, **kw) + + + self._init_line() + + + def get_axisline_style(self): + """ + return the current axisline style. + """ + return self._axisline_style + def _init_line(self): + """ + Initialize the *line* artist that is responsible to draw the axis line. + """ tran = self._axis_artist_helper.get_line_transform(self.axes) \ + self.offset_transform - self.line = BezierPath(self._axis_artist_helper.get_line(self.axes), - color=rcParams['axes.edgecolor'], - linewidth=rcParams['axes.linewidth'], - transform=tran) + + axisline_style = self.get_axisline_style() + if axisline_style is None: + self.line = BezierPath(self._axis_artist_helper.get_line(self.axes), + color=rcParams['axes.edgecolor'], + linewidth=rcParams['axes.linewidth'], + transform=tran) + else: + self.line = axisline_style(self, transform=tran) def _draw_line(self, renderer): self.line.set_path(self._axis_artist_helper.get_line(self.axes)) + if self.get_axisline_style() is not None: + self.line.set_line_mutation_scale(self.major_ticklabels.get_size()) self.line.draw(renderer) From 8584bec6b6c360fd5e56f85c0b33b20826b2be87 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Tue, 8 Sep 2009 17:43:04 +0000 Subject: [PATCH 0225/1000] axes_grid: add grid support for rectlinear axes svn path=/trunk/matplotlib/; revision=7722 --- lib/mpl_toolkits/axes_grid/axislines.py | 62 ++++++++++++++++++++++--- 1 file changed, 56 insertions(+), 6 deletions(-) diff --git a/lib/mpl_toolkits/axes_grid/axislines.py b/lib/mpl_toolkits/axes_grid/axislines.py index a8842292d1dd..9d8b1b187ab1 100644 --- a/lib/mpl_toolkits/axes_grid/axislines.py +++ b/lib/mpl_toolkits/axes_grid/axislines.py @@ -648,6 +648,35 @@ def new_floating_axis(self, nth_coord, value, return axisline + def get_gridlines(self): + """ + return list of gridline coordinates in data coordinates. + """ + + gridlines = [] + + locs = [] + y1, y2 = self.axes.get_ylim() + if self.axes.xaxis._gridOnMajor: + locs.extend(self.axes.xaxis.major.locator()) + if self.axes.xaxis._gridOnMinor: + locs.extend(self.axes.xaxis.minor.locator()) + + for x in locs: + gridlines.append([[x, x], [y1, y2]]) + + + x1, x2 = self.axes.get_xlim() + locs = [] + if self.axes.yaxis._gridOnMajor: + locs.extend(self.axes.yaxis.major.locator()) + if self.axes.yaxis._gridOnMinor: + locs.extend(self.axes.yaxis.minor.locator()) + + for y in locs: + gridlines.append([[x1, x2], [y, y]]) + + return gridlines from matplotlib.lines import Line2D @@ -1313,13 +1342,13 @@ def __init__(self, *kl, **kw): helper = kw.pop("grid_helper", None) + self._axisline_on = True + if helper: self._grid_helper = helper else: self._grid_helper = GridHelperRectlinear(self) - self._axisline_on = True - super(Axes, self).__init__(*kl, **kw) self.toggle_axisline(True) @@ -1371,15 +1400,24 @@ def _init_gridlines(self, grid_helper=None): if grid_helper is None: grid_helper = self.get_grid_helper() gridlines.set_grid_helper(grid_helper) - gridlines.set_clip_on(True) + + self.axes._set_artist_props(gridlines) + # gridlines.set_clip_path(self.axes.patch) + # set_clip_path need to be defered after Axes.cla is completed. + # It is done inside the cla. self.gridlines = gridlines def cla(self): # gridlines need to b created before cla() since cla calls grid() - self._init_gridlines() + self._init_gridlines() super(Axes, self).cla() + + # the clip_path should be set after Axes.cla() since that's + # when a patch is created. + self.gridlines.set_clip_path(self.axes.patch) + self._init_axis_artists() def get_grid_helper(self): @@ -1387,13 +1425,25 @@ def get_grid_helper(self): def grid(self, b=None, **kwargs): + """ + Toggel the gridlines, and optionally set the properties of the lines. + """ + # their are some discrepancy between the behavior of grid in + # axes_grid and the original mpl's grid, because axes_grid + # explicitly set the visibility of the gridlines. + + super(Axes, self).grid(b, **kwargs) if not self._axisline_on: - super(Axes, self).grid(b, **kwargs) return if b is None: - b = not self.gridlines.get_visible() + if self.axes.xaxis._gridOnMinor or self.axes.xaxis._gridOnMajor or \ + self.axes.yaxis._gridOnMinor or self.axes.yaxis._gridOnMajor: + b=True + else: + b=False + self.gridlines.set_visible(b) if len(kwargs): From 8ee66511ce3322faae5313b6da3f296d109de9f8 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Tue, 8 Sep 2009 18:16:38 +0000 Subject: [PATCH 0226/1000] update the formatter baselines svn path=/trunk/matplotlib/; revision=7723 --- .../test_axes/formatter_ticker_003.png | Bin 25110 -> 26681 bytes .../test_axes/formatter_ticker_004.png | Bin 33382 -> 35201 bytes .../test_axes/formatter_ticker_005.png | Bin 33337 -> 35262 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_003.png b/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_003.png index a9d0c0bb24a3fc5942425207f2016f3aca9e2a85..0eecc1771946152222622567ea99d2dd0076b1f9 100644 GIT binary patch literal 26681 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

    ByyxQT$_=;+ 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

    News

    Please donate to support matplotlib development.

    - -

    matplotlib 0.99 is available for download. See what's new and tips on available for testing. Please report any problems on the tracker and mailing list. +

    + +

    matplotlib 0.99.0 is available for download. See what's new and tips on installing

    diff --git a/make.osx b/make.osx index a739ba52e32a..501c7820e46a 100644 --- a/make.osx +++ b/make.osx @@ -1,7 +1,6 @@ # build mpl into a local install dir with # PREFIX=/Users/jdhunter/dev make -f make.osx fetch deps mpl_install -MPLVERSION=0.99.1 PYVERSION=2.6 PYTHON=python${PYVERSION} ZLIBVERSION=1.2.3 @@ -92,6 +91,7 @@ binaries: cp release/osx/data/setup.cfg release/osx/data/ReadMe.txt . &&\ export CFLAGS=${CFLAGS} &&\ export LDFLAGS=${LDFLAGS} &&\ + rm -f ${PREFIX}/lib/*.dylib &&\ /Library/Frameworks/Python.framework/Versions/${PYVERSION}/bin/bdist_mpkg --readme=ReadMe.txt &&\ hdiutil create -srcdir dist/matplotlib-${MPLVERSION}-py${PYVERSION}-macosx10.5.mpkg dist/matplotlib-${MPLVERSION}-py${PYVERSION}-macosx10.5.dmg &&\ ${PYTHON} setupegg.py bdist_egg diff --git a/src/_backend_agg.cpp b/src/_backend_agg.cpp index a9afed565559..d51a4ddf5a4a 100644 --- a/src/_backend_agg.cpp +++ b/src/_backend_agg.cpp @@ -608,6 +608,14 @@ RendererAgg::draw_markers(const Py::Tuple& args) { x = (double)(int)x; y = (double)(int)y; + // if x or y is close to the width or height, the filled + // region could be inside the boundary even if the center is + // out. But at some point we need to cull these points + // because they can create segfaults of they overflow; eg + // https://sourceforge.net/tracker/?func=detail&aid=2865490&group_id=80706&atid=560720 + if (fabs(x)>(2*width)) continue; + if (fabs(y)>(2*height)) continue; + pixfmt_amask_type pfa(pixFmt, alphaMask); amask_ren_type r(pfa); amask_aa_renderer_type ren(r); @@ -629,6 +637,14 @@ RendererAgg::draw_markers(const Py::Tuple& args) { x = (double)(int)x; y = (double)(int)y; + // if x or y is close to the width or height, the filled + // region could be inside the boundary even if the center is + // out. But at some point we need to cull these points + // because they can create segfaults of they overflow; eg + // https://sourceforge.net/tracker/?func=detail&aid=2865490&group_id=80706&atid=560720 + if (fabs(x)>(2*width)) continue; + if (fabs(y)>(2*height)) continue; + if (face.first) { rendererAA.color(face.second); sa.init(fillCache, fillSize, x, y); From 608f702c1e98e843637e29cffbaa0b6c30507178 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Thu, 24 Sep 2009 17:05:51 +0000 Subject: [PATCH 0286/1000] Merged revisions 7822 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7822 | mdboom | 2009-09-24 13:03:13 -0400 (Thu, 24 Sep 2009) | 2 lines Clip markers in draw_marker outside of the image rectangle with an extra border to accomodate the size of the marker. ........ svn path=/trunk/matplotlib/; revision=7823 --- src/_backend_agg.cpp | 30 ++++++++++++++++++------------ 1 file changed, 18 insertions(+), 12 deletions(-) diff --git a/src/_backend_agg.cpp b/src/_backend_agg.cpp index d51a4ddf5a4a..ccaf1976dbe3 100644 --- a/src/_backend_agg.cpp +++ b/src/_backend_agg.cpp @@ -600,6 +600,12 @@ RendererAgg::draw_markers(const Py::Tuple& args) { agg::serialized_scanlines_adaptor_aa8 sa; agg::serialized_scanlines_adaptor_aa8::embedded_scanline sl; + agg::rect_d clipping_rect( + -(scanlines.min_x() + 1.0), + -(scanlines.min_y() + 1.0), + width + scanlines.max_x() + 1.0, + height + scanlines.max_y() + 1.0); + if (has_clippath) { while (path_curve.vertex(&x, &y) != agg::path_cmd_stop) { if (MPL_notisfinite64(x) || MPL_notisfinite64(y)) { @@ -608,13 +614,13 @@ RendererAgg::draw_markers(const Py::Tuple& args) { x = (double)(int)x; y = (double)(int)y; - // if x or y is close to the width or height, the filled - // region could be inside the boundary even if the center is - // out. But at some point we need to cull these points + // Cull points outside the boundary of the image. Values + // that are too large may overflow and create segfaults. // because they can create segfaults of they overflow; eg - // https://sourceforge.net/tracker/?func=detail&aid=2865490&group_id=80706&atid=560720 - if (fabs(x)>(2*width)) continue; - if (fabs(y)>(2*height)) continue; + // http://sourceforge.net/tracker/?func=detail&aid=2865490&group_id=80706&atid=560720 + if (!clipping_rect.hit_test(x, y)) { + continue; + } pixfmt_amask_type pfa(pixFmt, alphaMask); amask_ren_type r(pfa); @@ -637,13 +643,13 @@ RendererAgg::draw_markers(const Py::Tuple& args) { x = (double)(int)x; y = (double)(int)y; - // if x or y is close to the width or height, the filled - // region could be inside the boundary even if the center is - // out. But at some point we need to cull these points + // Cull points outside the boundary of the image. Values + // that are too large may overflow and create segfaults. // because they can create segfaults of they overflow; eg - // https://sourceforge.net/tracker/?func=detail&aid=2865490&group_id=80706&atid=560720 - if (fabs(x)>(2*width)) continue; - if (fabs(y)>(2*height)) continue; + // http://sourceforge.net/tracker/?func=detail&aid=2865490&group_id=80706&atid=560720 + if (!clipping_rect.hit_test(x, y)) { + continue; + } if (face.first) { rendererAA.color(face.second); From cbb519c40809299cc2539f3fa323d0b18825b364 Mon Sep 17 00:00:00 2001 From: James Evans Date: Thu, 24 Sep 2009 20:47:11 +0000 Subject: [PATCH 0287/1000] Fixed a comparison in update_patch_limits that compared data with being equall to zero. This will fail with unitized data. svn path=/trunk/matplotlib/; revision=7824 --- lib/matplotlib/axes.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index 755b2940decd..c622abee7d9d 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -1444,8 +1444,9 @@ def _update_patch_limits(self, patch): # scaling. We'll ignore rects with zero height or width in # the auto-scaling + # cannot check for '==0' since unitized data may not compare to zero if (isinstance(patch, mpatches.Rectangle) and - (patch.get_width()==0 or patch.get_height()==0)): + ((not patch.get_width()) or (notpatch.get_height()))): return vertices = patch.get_path().vertices if vertices.size > 0: From 73408643148dbc6e9016706839f86ac45d9323e8 Mon Sep 17 00:00:00 2001 From: James Evans Date: Thu, 24 Sep 2009 21:16:07 +0000 Subject: [PATCH 0288/1000] Fixed a typo. svn path=/trunk/matplotlib/; revision=7825 --- lib/matplotlib/axes.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index c622abee7d9d..2e94764357de 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -1446,7 +1446,7 @@ def _update_patch_limits(self, patch): # cannot check for '==0' since unitized data may not compare to zero if (isinstance(patch, mpatches.Rectangle) and - ((not patch.get_width()) or (notpatch.get_height()))): + ((not patch.get_width()) or (not patch.get_height()))): return vertices = patch.get_path().vertices if vertices.size > 0: From 59df05512206c3f556b6124c975527a28c976370 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Sat, 26 Sep 2009 00:00:48 +0000 Subject: [PATCH 0289/1000] Merged revisions 7827 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7827 | efiring | 2009-09-25 13:56:14 -1000 (Fri, 25 Sep 2009) | 2 lines Fix bug in quiver handling of masked U, V ........ svn path=/trunk/matplotlib/; revision=7828 --- lib/matplotlib/quiver.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/quiver.py b/lib/matplotlib/quiver.py index c309c0415da2..64991d672613 100644 --- a/lib/matplotlib/quiver.py +++ b/lib/matplotlib/quiver.py @@ -518,6 +518,11 @@ def _make_verts(self, U, V): xy = (X+Y*1j) * np.exp(1j*theta)*self.width xy = xy[:,:,np.newaxis] XY = np.concatenate((xy.real, xy.imag), axis=2) + if self.Umask is not ma.nomask: + XY = ma.array(XY) + XY[self.Umask] = ma.masked + # This might be handled more efficiently with nans, given + # that nans will end up in the paths anyway. return XY @@ -575,10 +580,7 @@ def _h_arrows(self, length): tooshort = np.repeat(tooshort, 8, 1) np.putmask(X, tooshort, X1) np.putmask(Y, tooshort, Y1) - if self.Umask is not ma.nomask: - mask = np.repeat(self.Umask[:,np.newaxis], 8, 1) - X = ma.array(X, mask=mask, copy=False) - Y = ma.array(Y, mask=mask, copy=False) + # Mask handling is deferred to the caller, _make_verts. return X, Y quiver_doc = _quiver_doc From ea1b2d7743ca62fe1e93837a2409b49ac7efb680 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Sun, 27 Sep 2009 12:41:23 +0000 Subject: [PATCH 0290/1000] Add a savefig.extension rcparam in preparation for pdf tests svn path=/trunk/matplotlib/; revision=7829 --- CHANGELOG | 3 +++ doc/api/api_changes.rst | 52 +++++++++++++++++++++------------------ lib/matplotlib/figure.py | 11 ++++++++- lib/matplotlib/rcsetup.py | 1 + matplotlibrc.template | 1 + 5 files changed, 43 insertions(+), 25 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 055da2e38162..b118736743bc 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2009-09-27 Add a savefig.extension rcparam to control the default + filename extension used by savefig. - JKS + =============================================== 2009-09-21 Tagged for release 0.99.1 diff --git a/doc/api/api_changes.rst b/doc/api/api_changes.rst index a441bfa8809a..c15dfb52a287 100644 --- a/doc/api/api_changes.rst +++ b/doc/api/api_changes.rst @@ -7,6 +7,9 @@ This chapter is a log of changes to matplotlib that affect the outward-facing API. If updating matplotlib breaks your scripts, this list may help describe what changes may be necessary in your code. +Changes beyond 0.99.x +===================== + * You can now print several figures to one pdf file. See the docstrings of the class :class:`matplotlib.backends.backend_pdf.PdfPages` for more information. @@ -18,42 +21,43 @@ list may help describe what changes may be necessary in your code. .. _configobj: http://www.voidspace.org.uk/python/configobj.html .. _`enthought.traits`: http://code.enthought.com/projects/traits -Changes beyond 0.99.x -===================== +* The new rc parameter ``savefig.extension`` sets the filename extension + that is used by :meth:`matplotlib.figure.Figure.savefig` if its *fname* + argument lacks an extension. -In an effort to simplify the backend API, all clipping rectangles -and paths are now passed in using GraphicsContext objects, even -on collections and images. Therefore:: +* In an effort to simplify the backend API, all clipping rectangles + and paths are now passed in using GraphicsContext objects, even + on collections and images. Therefore:: - draw_path_collection(self, master_transform, cliprect, clippath, - clippath_trans, paths, all_transforms, offsets, - offsetTrans, facecolors, edgecolors, linewidths, - linestyles, antialiaseds, urls) + draw_path_collection(self, master_transform, cliprect, clippath, + clippath_trans, paths, all_transforms, offsets, + offsetTrans, facecolors, edgecolors, linewidths, + linestyles, antialiaseds, urls) - # is now + # is now - draw_path_collection(self, gc, master_transform, paths, all_transforms, - offsets, offsetTrans, facecolors, edgecolors, - linewidths, linestyles, antialiaseds, urls) + draw_path_collection(self, gc, master_transform, paths, all_transforms, + offsets, offsetTrans, facecolors, edgecolors, + linewidths, linestyles, antialiaseds, urls) - draw_quad_mesh(self, master_transform, cliprect, clippath, - clippath_trans, meshWidth, meshHeight, coordinates, - offsets, offsetTrans, facecolors, antialiased, - showedges) + draw_quad_mesh(self, master_transform, cliprect, clippath, + clippath_trans, meshWidth, meshHeight, coordinates, + offsets, offsetTrans, facecolors, antialiased, + showedges) - # is now + # is now - draw_quad_mesh(self, gc, master_transform, meshWidth, meshHeight, - coordinates, offsets, offsetTrans, facecolors, - antialiased, showedges) + draw_quad_mesh(self, gc, master_transform, meshWidth, meshHeight, + coordinates, offsets, offsetTrans, facecolors, + antialiased, showedges) - draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None) + draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None) - # is now + # is now - draw_image(self, gc, x, y, im) + draw_image(self, gc, x, y, im) Changes in 0.99 ====================== diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index 4f7adeed9223..3ce71840aaf4 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -986,7 +986,11 @@ def savefig(self, *args, **kwargs): :class:`~matplotlib.backends.backend_pdf.PdfPages`. If *format* is *None* and *fname* is a string, the output - format is deduced from the extension of the filename. + format is deduced from the extension of the filename. If + the filename has no extension, the value of the rc parameter + ``savefig.extension`` is used. If that value is 'auto', + the backend determines the extension. + If *fname* is not a string, remember to specify *format* to ensure that the correct backend is used. @@ -1033,6 +1037,11 @@ def savefig(self, *args, **kwargs): if key not in kwargs: kwargs[key] = rcParams['savefig.%s'%key] + extension = rcParams['savefig.extension'] + if args and '.' not in args[0] and extension != 'auto': + fname = args[0] + '.' + extension + args = (fname,) + args[1:] + transparent = kwargs.pop('transparent', False) if transparent: original_figure_alpha = self.patch.get_alpha() diff --git a/lib/matplotlib/rcsetup.py b/lib/matplotlib/rcsetup.py index 0a95474a4cd6..01aeaba4dfb7 100644 --- a/lib/matplotlib/rcsetup.py +++ b/lib/matplotlib/rcsetup.py @@ -511,6 +511,7 @@ def __call__(self, s): 'savefig.facecolor' : ['w', validate_color], # facecolor; white 'savefig.edgecolor' : ['w', validate_color], # edgecolor; white 'savefig.orientation' : ['portrait', validate_orientation], # edgecolor; white + 'savefig.extension' : ['auto', str], # what to add to extensionless filenames 'cairo.format' : ['png', validate_cairo_format], 'tk.window_focus' : [False, validate_bool], # Maintain shell focus for TkAgg diff --git a/matplotlibrc.template b/matplotlibrc.template index 87def81d0fe4..576e9914de94 100644 --- a/matplotlibrc.template +++ b/matplotlibrc.template @@ -306,6 +306,7 @@ backend : %(backend)s #savefig.dpi : 100 # figure dots per inch #savefig.facecolor : white # figure facecolor when saving #savefig.edgecolor : white # figure edgecolor when saving +#savefig.extension : auto # what extension to use for savefig('foo'), or 'auto' #cairo.format : png # png, ps, pdf, svg From 8c60d5cc752edcce1c1beaf40c3712c1fd0ac3d4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Sun, 27 Sep 2009 19:06:37 +0000 Subject: [PATCH 0291/1000] Beginnings of a capability to test the pdf backend. svn path=/trunk/matplotlib/; revision=7830 --- CHANGELOG | 2 + lib/matplotlib/testing/compare.py | 38 +++++++- lib/matplotlib/testing/decorators.py | 83 ++++++++++-------- .../test_axes/axhspan_epoch.pdf | Bin 0 -> 8380 bytes .../test_axes/axvspan_epoch.pdf | Bin 0 -> 8387 bytes .../baseline_images/test_axes/const_xy.pdf | Bin 0 -> 8371 bytes .../baseline_images/test_axes/fill_units.pdf | Bin 0 -> 12724 bytes .../test_axes/formatter_ticker_001.pdf | Bin 0 -> 7174 bytes .../test_axes/formatter_ticker_002.pdf | Bin 0 -> 9398 bytes .../test_axes/formatter_ticker_003.pdf | Bin 0 -> 9397 bytes .../test_axes/formatter_ticker_004.pdf | Bin 0 -> 8330 bytes .../test_axes/formatter_ticker_005.pdf | Bin 0 -> 8331 bytes .../test_axes/hexbin_extent.pdf | Bin 0 -> 283020 bytes .../test_axes/nonfinite_limits.pdf | Bin 0 -> 6077 bytes .../test_axes/offset_points.pdf | Bin 0 -> 8266 bytes .../baseline_images/test_axes/polar_axes.pdf | Bin 0 -> 16951 bytes .../test_axes/polar_coords.pdf | Bin 0 -> 7014 bytes .../baseline_images/test_axes/polar_units.pdf | Bin 0 -> 14256 bytes .../test_axes/polar_wrap_180.pdf | Bin 0 -> 12119 bytes .../test_axes/polar_wrap_360.pdf | Bin 0 -> 12145 bytes .../baseline_images/test_axes/shaped_data.pdf | Bin 0 -> 9256 bytes .../baseline_images/test_axes/single_date.pdf | Bin 0 -> 10203 bytes .../test_axes/single_point.pdf | Bin 0 -> 7011 bytes .../DateFormatter_fractionalSeconds.pdf | Bin 0 -> 5696 bytes .../test_dates/RRuleLocator_bounds.pdf | Bin 0 -> 6798 bytes .../test_dates/date_axhline.pdf | Bin 0 -> 8878 bytes .../test_dates/date_axhspan.pdf | Bin 0 -> 7008 bytes .../test_dates/date_axvline.pdf | Bin 0 -> 6570 bytes .../test_dates/date_axvspan.pdf | Bin 0 -> 7346 bytes .../baseline_images/test_dates/date_empty.pdf | Bin 0 -> 7004 bytes .../test_image/image_interps.pdf | Bin 0 -> 116976 bytes .../test_simplification/clipping.pdf | Bin 0 -> 1295 bytes .../test_simplification/clipping_diamond.pdf | Bin 0 -> 1268 bytes .../test_simplification/overflow.pdf | Bin 0 -> 1246 bytes .../test_simplification/simplify_curve.pdf | Bin 0 -> 1235 bytes .../test_spines/spines_axes_positions.pdf | Bin 0 -> 10809 bytes 36 files changed, 87 insertions(+), 36 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/axhspan_epoch.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/axvspan_epoch.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/const_xy.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/fill_units.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_001.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_002.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_003.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_004.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_005.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/hexbin_extent.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/nonfinite_limits.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/offset_points.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/polar_axes.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/polar_coords.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/polar_units.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_180.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_360.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/shaped_data.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/single_date.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/single_point.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_dates/DateFormatter_fractionalSeconds.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_dates/RRuleLocator_bounds.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_dates/date_axhline.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_dates/date_axhspan.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_dates/date_axvline.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_dates/date_axvspan.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_dates/date_empty.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_image/image_interps.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_simplification/clipping.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_simplification/clipping_diamond.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_simplification/overflow.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_simplification/simplify_curve.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_spines/spines_axes_positions.pdf diff --git a/CHANGELOG b/CHANGELOG index b118736743bc..82687d3113e2 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +2009-09-27 Beginnings of a capability to test the pdf backend. - JKS + 2009-09-27 Add a savefig.extension rcparam to control the default filename extension used by savefig. - JKS diff --git a/lib/matplotlib/testing/compare.py b/lib/matplotlib/testing/compare.py index e4ae8108783e..71f67c3f4fe5 100644 --- a/lib/matplotlib/testing/compare.py +++ b/lib/matplotlib/testing/compare.py @@ -8,6 +8,7 @@ import os import numpy as np import shutil +import subprocess #======================================================================= @@ -73,6 +74,33 @@ def compare_float( expected, actual, relTol = None, absTol = None ): return None #----------------------------------------------------------------------- +# A dictionary that maps filename extensions to functions that map +# parameters old and new to a list that can be passed to Popen to +# convert files with that extension to png format. +converter = { 'pdf': lambda old, new: \ + ['gs', '-q', '-sDEVICE=png16m', '-dNOPAUSE', '-dBATCH', + '-sOutputFile=' + new, old], + } +def convert(filename): + '''Convert the named file into a png file. + Returns the name of the created file. + ''' + base, extension = filename.rsplit('.', 1) + if extension not in converter: + raise KeyError, "Don't know how to convert %s files to png" % extension + newname = base + '_' + extension + '.png' + cmd = converter[extension](filename, newname) + pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = pipe.communicate() + if not os.path.exists(newname): + msg = "Conversion command failed:\n%s\n" % ' '.join(cmd) + if stdout: + msg += "Standard output:\n%s\n" % stdout + if stderr: + msg += "Standard error:\n%s\n" % stderr + raise IOError, msg + return newname + def compare_images( expected, actual, tol, in_decorator=False ): '''Compare two image files - not the greatest, but fast and good enough. @@ -99,7 +127,15 @@ def compare_images( expected, actual, tol, in_decorator=False ): "be installed. To run tests without using PIL, then use " \ "the '--without-tag=PIL' command-line option.\n" \ "Importing PIL failed with the following error:\n%s" % e - return msg + if in_decorator: + raise NotImplementedError, e + else: + return msg + + # Convert the image to png + extension = expected.split('.')[-1] + if extension != 'png': + expected, actual = convert(expected), convert(actual) # open the image files and remove the alpha channel (if it exists) expectedImage = Image.open( expected ).convert("RGB") diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index 6363663b8c8a..f95c832ac17a 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -2,6 +2,7 @@ KnownFailureDidNotFailTest, ImageComparisonFailure import os, sys import nose +import matplotlib import matplotlib.tests from matplotlib.testing.compare import compare_images @@ -48,42 +49,54 @@ def image_comparison(baseline_images=None): raise ValueError('baseline_images must be specified') def compare_images_decorator(func): def decorated_compare_images(*args,**kwargs): - result = func(*args,**kwargs) - extension = '.png' # TODO: test more backends - for fname in baseline_images: - # FIXME: place "actual", or current images, images in - # a more reasonable location than the current - # directory. Also, perhaps put them in sub-directory - # according to the name of the test module like the - # baseline images. - actual = fname + extension - # compute filename for baseline image - module_name = func.__module__ - if module_name=='__main__': - # FIXME: this won't work for nested packages in matplotlib.tests - import warnings - warnings.warn('test module run as script. guessing baseline image locations') - script_name = sys.argv[0] - basedir = os.path.abspath(os.path.dirname(script_name)) - subdir = os.path.splitext(os.path.split(script_name)[1])[0] - else: - mods = module_name.split('.') - assert mods.pop(0)=='matplotlib' - assert mods.pop(0)=='tests' - subdir = os.path.join(*mods) - basedir = os.path.dirname(matplotlib.tests.__file__) - baseline_dir = os.path.join(basedir,'baseline_images',subdir) - expected = os.path.join(baseline_dir,fname) + extension + # compute baseline image directory + module_name = func.__module__ + if module_name=='__main__': + # FIXME: this won't work for nested packages in matplotlib.tests + import warnings + warnings.warn('test module run as script. guessing baseline image locations') + script_name = sys.argv[0] + basedir = os.path.abspath(os.path.dirname(script_name)) + subdir = os.path.splitext(os.path.split(script_name)[1])[0] + else: + mods = module_name.split('.') + assert mods.pop(0)=='matplotlib' + assert mods.pop(0)=='tests' + subdir = os.path.join(*mods) + basedir = os.path.dirname(matplotlib.tests.__file__) + baseline_dir = os.path.join(basedir,'baseline_images',subdir) + result_dir = os.path.join(basedir,'current_images',subdir) + if not os.path.exists(result_dir): + try: + # make the current_images directory first + os.mkdir(os.path.join(basedir,'current_images')) + except OSError: + pass # probably exists already + os.mkdir(result_dir) - # compare the images - tol=1e-3 # default tolerance - err = compare_images( expected, actual, tol, - in_decorator=True ) - if err: - raise ImageComparisonFailure( - 'images not close: %(actual)s vs. %(expected)s ' - '(RMS %(rms).3f)'%err) - return result + for extension in ['png', 'pdf']: + # set the default format of savefig + matplotlib.rc('savefig', extension=extension) + # change to the result directory for the duration of the test + old_dir = os.getcwd() + os.chdir(result_dir) + try: + last_result = func(*args,**kwargs) # actually call the test function + finally: + os.chdir(old_dir) + for fname in baseline_images: + actual = os.path.join(result_dir, fname) + '.' + extension + expected = os.path.join(baseline_dir,fname) + '.' + extension + + # compare the images + tol=1e-3 # default tolerance + err = compare_images( expected, actual, tol, + in_decorator=True ) + if err: + raise ImageComparisonFailure( + 'images not close: %(actual)s vs. %(expected)s ' + '(RMS %(rms).3f)'%err) + return last_result return nose.tools.make_decorator(func)(decorated_compare_images) return compare_images_decorator diff --git a/lib/matplotlib/tests/baseline_images/test_axes/axhspan_epoch.pdf b/lib/matplotlib/tests/baseline_images/test_axes/axhspan_epoch.pdf new file mode 100644 index 0000000000000000000000000000000000000000..eb8ac63cbc11ebe34613e0b0dad466688903f529 GIT binary patch literal 8380 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/axvspan_epoch.pdf b/lib/matplotlib/tests/baseline_images/test_axes/axvspan_epoch.pdf new file mode 100644 index 0000000000000000000000000000000000000000..7606b96eed2855fda3f5a5371923cc92a1f4d346 GIT binary patch literal 8387 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 J7+D!3{s&FG{e=Jk literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/fill_units.pdf b/lib/matplotlib/tests/baseline_images/test_axes/fill_units.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a60540d19b8af3a2ac01f95bf279edf6a4056d90 GIT binary patch literal 12724 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 D@{L(1 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_001.pdf b/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_001.pdf new file mode 100644 index 0000000000000000000000000000000000000000..768de59f6ca971d606217117351a162100796dbb GIT binary patch literal 7174 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_002.pdf b/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_002.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ca1e9c46db2b6e7e0838039b506b69a64ccfecc1 GIT binary patch literal 9398 zcmb_?2|Sct)VPvpC_7o|eUL57?3;a$>`UlPWia*zV=N^iA%zg4q@*NTZP_Z4?1`wf zC?!fLsc4b!K7&I3@89qHedBlBXU@I%+;h)4_nhnp;_c%GAuT9wRDTEy23SEF8VD-Q1s;f*GeMV5r7%2vXnGU| z6_V3a!JtrN6d6OrpfPwfN&$tHMWJNn5l9QVk4u0vl@7`6qA+~DeHh*zPLQvQE969R z_5yUl5GE;~`6JNEC}saZnj+-RVEC#ak$)yD`@1UBs0{fze39qyWpD1}Np)sGBqr}* zBMb(WPJ;;WS0*>k)>H0mph&XCD`^ zh6$DC#&Czwu=1G7^k)Fo?Lq`+Mx`|;bfLJS$9Er6q@X44l{`;aA=SF3-|(V#OB^m! zvZnvz1gZ4sj*c|_EmM9+k!I^;Prpcca76U8f(Cb!XMyZG|J&oKJvFMu-XYGF74;uz z?&^6%_bCqVSR+>{UY7icN?#@zR*d?_|K&^=QBY^&sTlX?bD+owF^qe~@wWaei`4fU0XQ8) zYC;dYsJ4z_hU<^B8n0c}m*B4*uCo79AT)T#@`3$hnn$S5;IA{9dzW+R?%ZK>`xo!% z-FS^nq2IE5wmQFf-+ba%u;l?O@vDh?Hfx)k3I+vMymT!HP)$KIrqad5j>6@wTc^kyGbdvEAu@sJ|>&s)5 z%KCC08!z6M+?YIUeVQG0lM@?=Yx>pX+Dx5Vs^;)L0hx+EuybEs%D>sSxerCIJH@i@gzN#>SgQeVTM@0k0aL0sHgyN#)r3#j40Z}15w;ZU z|0ZF6Cg$DdS9{guBpgCe210y&*6mseMGluf?a=wU=DKL%ZEa7Zfg)M8#{qlHm1)AQ zJlrnjHWOx+L&Nv6H-|Q_Qs*n}wI2ypJ$~(-=n2wL*aw4$O>vjqCBho)WZz3WKC_n5 z=W{VDwWl5K${NX*%k_`;7l8)54@Fz`JJ}WN<5KleM0P7Sq_l8i49=Tok%Ak-;*Wpc zojMRaxy*aaUv&{>z>aw-f+vvX$sLO&SfebiqL%aJ=0+p>4bl+u(GFS~2UDBb_?wp% zwJ5ekC`xfArim--ayp}SIeDLTbah(kvK2x@6&)<}3BII7c$phG{>yn{u*7-H=vx}m zS4ePGjw^hQxNuwHW0qO#g|R6wMXZsTkfRscBO*d6I9B3ebxQ=Ye6Q(S++HH)=|`3B z^}gn1%Fm89?{~YMR&8f&A~oXlehUUey8P>TMM zXXP(hy}2p3EnImpwbV>CKKZniK(9}VRPQ^%&4H%gq6M8Qr?WYlOO+3*WNbJSNb&O= zO_Pv372u4opEztL8Cd`N*G1HO%MHmLZtTzfWO7W?wzHDUcjsTV-AF#Dv7`O&fk8%o zgmcxS($D-JFU!B~>}A&oojS7idwGxM-4O@Lzomv*YRJLh@bjf+Q5mm`=6bKrCd}bD zsTh(KWSIK&milG`-zbTHHIx74OFvj`%ylir=hY?yZFSCD!cniVciM!bwC^1_tCjgh zgeN07`iTMUZJ_VHs#|_^$JbWolD#r$&FVCY;{N%$(*sBh1|7;J<7Rc&NF42TLfnK!w)| z=qj^_rYs*?L@jf(v;QKDT|gOcWlYyab3DCe?Hh3~{Z?oeqtJ8Y)};fo3Rji1bd-@> zJB-6RrJtUw?X&x5T>6@h#*yLUEmn2oLPY{?N>?_u@m^O#tgz%)pTNipN_Mt&zEugP z9MfRE!eb^c6wH2%AvNuoR(YK|KpHZ@F9H~OjY=F8bs93xCd z!T(zb{epmJP9ujPWMBT6{j7rg`VIW*v4(~88${cKJ&AV7^={HKB0SG!u9+5BzkZfl zd>|uThppc}yo*s(@m<`+{`J)ZqZ=tgU6H0)_zMSIixZq(YJ_exO}*TPWie*X8xS2=!+9gfH?AJK(a%X1sy;|P zd0dfem%DW3o`k6C`lLXAv#HIrCE78wov6z3MHMg5f9*w)+~^ zRlGWT!-rm9>zLeDqbF9jw~KY1gh=OV+PawHi^f4mLkIVi#GY*k@38iC5H*X-^9a2V z>iM!#tlzjRR&JH}Z{(w@3;P zjCf+mMJ^Jm%tLy;82r{lUX4Sz45I5QsF=Q)H055p-&Ct(oG0~$MPl* zY?jL9QydW3jhbxu)ap|Du0*`xWc>0&k^(J#8$a7ebe)uc)l#BY^5q(a{_Nel$XBZe zE@#>lmRa6a$yX61uLof0C(F-}R z0u#L_B9Gp^+0-RiW=8liD7}__e^~Y^lTW6n1ERHF_sj30ulhRbS2?D2^?KE+v)&wi z4Loscv@6Xn@AG^Avu8@B_T<15F1v)FQB@PK%GXGA zUc2tAQh29y>>E-zc3)_`C;!e^L&b!T19&5@H`zDq-{86=t)+_57DA`UI#B>(n>eq7c>#tYat)J`rs_0=*7mlyf zmD4P3*<~}$xHT+}k~_AB4_($H8+Rm}JLOYVKhCYiVqN^VXs}Dqq2{Lnrk0hv^gs^v zLcrlA%X_cgS)5kezxwDlawOh{vXS!VrG>uUHRkGN-^P8jFKLVJzV({uA*`Z$V_&Cc ze|e*gz)ivY6X_PhPQ8=vE2@MTNJ)hz_7_K}T>kgQU*_-}bCkh3Ui2}N5$>wOy4;S< zPN>yBVY4>KR6y~vU@Nv^*p^tRQUrMiOY^_F%c8fUTR5@RF(>X?YGNIIeI6p2?O(@7 z@5C$*?^j59xQcP+;hl<>mjwe~1BtrGPcQQ-f|%UgEAMe+KDT23M_Nt#p}Y}HA|hO zY?1Qh`r%;w^pQXRJyD#hP=Olx+$Ous=Egcs1@_6R)@pql(E>FdKHpnUbtf~2`iMOp zaX8_`^lPjZkx~|0$gggNSbedc++y;Y81!& zjQzYVIgf{q8owEOv2v(PTO|}q5%cO>w!inJkHkbSQsh7Yhxx`zX%+A6=psaNY_A<5 zc+2HOUrUl>hrDyqk55y-x8J*N)W&|UM=X62_LiDPVab?zu0!3*n8pT@**5tyt#cnu z=~)+gMxO86cA~{5AAw{oMW-C&x*)ANn0ydx6843@{gvgX8{VF7{SqU}gxm>x`p$~z z$Mp8&PS?!E8<7pgHul-J&vSG~qvZIxS(IKzu=U;)pBfd;t9f)aie4MyvfOcVCr#_F zZo7!#R&8F&k0imjXDzOH_kNIr>^d(-Wiy-(u1;f-zge(4Ha)NVbj*R&h2*duLzzrFT#<1RURLB-1+O7VBOOY?B? z-M%-B`V@S3cXy9qasOvM_Z+?Toe8|^a)otoG6k=m|9P?Xns^qsOo&hMk(8E}yaR%r zfqU{w+nm>R24(&D{&Sf!OSZ@&3SDyg30^Pf#RAJpzd97xdpw))$CDGOxFh~onx5WT zt)(hR5nZ8`U*)p7++i?zOX2OlO)-N4rr$IibAPV+lKA@V`fiB|>xXF}YdMRalvW;*Y4Pd!eaSv;pPe`_Vel>(akYv1`;6h3tzIS}uvo z+ca$1t4b(mXQTTS-9ImWT;Te%{U50ZT{d}MyV6XR|5W*9)!GAs{RhnjVxtBk*0@TJ z%Cb6zeC>9!vqR?diaa!mVYgb*;Z5U1;q(g!BgG!u)#EkIH+9!EYTr6kGeIC_AdPnK zWXt9`BK&JjTX(~?WZew{pF&Hj4@!B5^Jbe5OYu-4oc{PohLwiQmO~#{3?#%u^X)KI z!b#np(XCS=+q*X+R&Lq)&nW|6nMfnjm`e`gfmO+aTR)z?9%FZQ-V?rvB9@wLlIH6{ zKdy2$IQV)YxsEHsWL!_lr55cIgEl|&HLnOMQ{lr{_fVo^R%CH0Mq7`r%*b)Xml;^a zpB&1$O4}I_(Z9#K;LAAsM)SZxKlRpTkiF6{NF{?2p{Uj`^jpr>#5k!F-# z;4)pugE9R&Z%d_9tSK~qB`cp@6dD2v7XnNv47vyNvR)a5f&&!z`~3up2|5&iDzjkl z|0ZMS;lgkSwSwu&3(`8kiNP$)z(oTrsL!}l=%AqD3`Q^u8nbnqX{rVubbkgs1VT+S zq%&PRP(qV%kP-$<07U>22_j?2&~^k;p9bm!a4ADg4T042aCN1E(gR$I*am?b1Jd7@ z;tY%r4#4At?~j3DiT-pa(Pn;RPYRA>=N=9|}SS!`w|*Nq+MP zJOa{$GPApx*Pz+k-MO9xRvcVFVeXcxl>d+cgtTT*ci93p!4(rXQ18MZkoJbt+~RS7 zuW2q|>CUkTCfWawIhay{nW_Yu!~tRIQhaB~5<%vNGy+vN4`*$fn>Q6+Tzi^lSTA6o zv)h`DfZHGf3iW>hi2p4eESd!2fVOZ16hs2I0|YDqLB^vXB5)BHA|AqmHw+l?fKRv| z9*-rUr(1Ay3da8zAZGiqU@QzUjak5B(ZEDt0RS5&kN_bv2_h1~cVMJ=us9J0;1e)p zJOThjz!M-m9uOg5AtJC`ct^nsSN3a>ps%y3dDnraN!lZyBf z!EgHTC>Y5!CO`@P{+kNS6bgl4_RSC=6Ufjkz=kkw1F#*;2d1onUBEUm2blH%+r%s| zZDqzLV0)MgFkj5?fCg+Ev%uUr3J>HCc!h0X5g?O*{$RTRfn+Ys+Qe)N3kB#M!EE8@ zIl$EQbU!@iH^6oQYZY#{|8@>@gCzxG7PG8?&tAV_8{8MxS)sxlQ~-r2(=m|mTE z2MxY49Wq#pSsM3(fWDa%f$N4a)8%5|lY#b`*l8b+nF)v95N0La<20? z0H!w0?4SNQk^K*Hj`aQ@=iKA`LC(2j`GcJG%<%6fbbSIqxB-#O*uw=5o#33n41#Ds z9XqCfNbzTGFrDg(07sFC08VY@1AG=9?AjIjjf0~*{DEkHa0IZG`8X0DR_g*B4%93E z!ogx&I1c#8zi_~Z{e>d~ZO)&I!oUW%0EYwhx`j9_2p9`+Xz&Y>g*YM#IH?8W2qfUZ z7UFQQEyABaav`C?xm|!mW58Kih$8@BvJgi?{e{Dz;X?y|{;Yw)fuOVyhllNd!8r2Y zdc&grUKfi4fpfuJED813K0uiGYrjCff31td{5=byK+%iz; T4CVhG$daNELMVx()mFBmMAk%9 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_005.pdf b/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_005.pdf new file mode 100644 index 0000000000000000000000000000000000000000..ea0e9254e68b42b19d6f1a0f99b4d426794af813 GIT binary patch literal 8331 zcmb_?2|QG7)VN4Al%2G_7miz8w&3K;xG3}&Mo3T@70xcEEMn2_vlD$B>4!SeQSf_z+DAt$P{ z7oZDJ5K@fU7+7VDvR?pQ5prj-d{oisKZ}+9T$SlGmfQ@vC^O`;GjsB!IkO-YM0TJE zi$!D7ArgFxNaJipV?p*nMO}TMHZ6z+p$&Hfb+xBPovG0f+6kfcf>>LuSg?x3Ndi{x zR2L7r8$_NYug{>fAOdpz$4uCnhSdQWG&;)izt{mwjYg>dy^YWlu(-!sZdhogY7KioZ!TP-=VKj2?1-b!Z2l zBt#MJq439Ft;`XZ(HE({pruo=QlO#ps{PaN>aSG0yFYCFw(XZB_B1=kw@h?S%iJ%-mqi+dA+Ca`fTNlWmNY3lxX+J zd|mtY@@>td`vu<^nz{(vM|qK?N=uG$@}Oc{!q}g^xcaTHZ!oDrbo6ZfPx{bEqaE#u z$#8Dgnp4(=#%{;@>s^D%f&CFr)r+J1I^=_msyRc`TAjiQl3v&EEaSAUu6tAL%9ok? zj8o=Be8;Qz4>pnYXpU0!0pIJkM@j2;7aK_3%Zc0T?e}Y~>FY903yD(G(^T7_YZfP- zr9J<lHl9kUJVhm| zi$ciGMe%2{gZQj9(=PZXlZ#5sTesyL3p|C&Ebcn0DPxvwQJb?Z=QEpqc702Bo0^$j z`be0zszasl{_QKp-FCh((<|h|9TT)FJszjNSQ}K|a-^-aHbW}J_^-rn zGflQ{j)~h8OJ8~adYEyGB*VwsTCn>3bqZH%Mbc6I?Y!T$?mf5cecWxDaB)I?)a6!Q zG}HFx)t48F0vi1d7uFuQQLe{1Jn zby*3A5RAU4V3$?n=HmqpS4aNV{<8As>iqj!o`$^z8`Yot2b(F=#p?O_TuQ9JnpzAD zKEam_Y+bG)c%#E^C{*oCUjOQ|Dg$93^q5K~-VVXFlzT?+qGX;yvo8 zwtzF>guEETk%HV6cj1( zw7f1HU9#7tkFb}Fd-+kdb-j;SvGS|awfo)fCzRV-pANi(-q~sp8hH3pn5#=jfkFMr z_;}UN+60;B5&{}hz=?`}2QuWYT6UMo+V4|-7k|T4Ejl(;O1Og&C)Lp}vNgcOd-dgJ z)zmcZ+8fG8RFgJb2%!3U4kt)Rp7(bqKKgphR5IYv+h12O?=3dOHo0-N`O2i5B<$p% zlrNvgz-}%7gD%m%^QIKfCcs$m31Pmt7rPn?ff}tomNku30(cAi03mW|p@9 zO7A!VakkaWOQUtLyzezQ#kd{E6+==24dP$k)!3@{ z8a#K!4t3%mG>9G2dVDZrbMj|#{-mIY7y9(R0H4RVEAUYicCm*$e6s#c`r`1sE17E} z|Kr_p!%^C|46Q|ct#>tZ_I#1^g$y-X_?buR`L^ta`y6lFZ6_R z4Z6ZlnGiY@HFaX0>Qdt@#xO<4Kl$dzZ1I0m-I`2MN@^XtIB2|=&rT-EqFe41s6qTRPAfB@^n~j8kOx4niJ~zrgTk@ zQA?y|eM2wD;YZ?L3kWvzi1uHC;Xxvtncj$&Mob+n_shFhKH-lO?}nzZ@;!&{UOl)` zAy;X$wlaEqlTlc+^vleOF5ADxr1P{lofte*XZdhUv_QB)>H3xiftyOGr4~XOUvV2n zB%2$W`&5Idr#Eq2=QouT4dOb*w(NSxuAn&61LbOKaP0!8Vpj8SxOc|rn2AB0hT%_z z?#~(V1Xh@gg5S3gW{$9DdNsEQWLNT>D?>qU{RSb8NP~Rl9kR`l_LH`;kKCkX#QED~ z@=OZL-@b}3JeZWI&DmqOuZ2}`>-$<`ySKRqhvliFEeA|eh&cyc3y(XyR0NIPH;z0M zQ6Xr4HZ*?urPC+=eYIRFYl}(1;Qf4i(gz9M^lx~@xObwEfl)FzLoN_1k z=$#%OifH)}+PO1|yu00{OM{OeDu0q(kV&n4mhx=$7nh!WNcsX^fDg`#%5}s!yEeus zmILC}9ZT6SweM$_deWI~%!xrlqA@ApboThctx{QnioL>nFymDt^)5I1i`HH~7tMZD zQn;>5{*zsJ%Q?Bux+2}8&v`iJtNwKdI#={wOSaB0wy0FSq$;A4)m!uZ($LRh#hNmy z!#Gawr<9c>pY9vfD53Ovo4~_AbWdJ9m6P5XaMJthfm4-bH7z2=rlcS5q*rn64@+Ba zJYtgSAF=suk6bWw`Ilke($USiH*YV`@aFES;*VOXRcd)s*{|V|Ay-HI^@>2X=OG1{OkP~pZQVOBMaCO zK3Oluj&qV99(U6mW1dS`A{ZemgX(czhLVeLNZ_|o7Bg1ls$*|V@IgtYEMq$#%3HJm zQ~0F6D5jKII|xY{<`@EoD^@>Zb3#m{_E8Bj1GWcs-TRmK?AyL<^XdyKT-Rg{E39Cv z>{}tT0Au(aWigB?m|2WXqO}CeA#RQjw#n6SCUpPbKa}ocB+~hcrKkR#;$?(S)-(a@OL^@Uk;2yO`Im0NJI~4JDc_%pUHNVspoT!fW>vHLAdbwp~>m_nw^U$8!Bf zn^cYYZYbZ)ljOPTFFjCm21-%*kd~C6*Z92C(Py>H-}^+#j(r}{tBI_R{aMQK+TjnS zKPK(<59up26A$tfX9g@4(5ZG@?s-ep#I8{N{7KU#ofBadLrPs~v7es>!Z`j^@?MdOW-1&u}Q_X$y zK9q)*yC^OCrP7GEgUg<;tSe@l&Ohrlu>*KTjq0vu&7P8KYvD4HOJ@_!#hg0E-Iv}L zWuYY%YPepXpz-=W9($9{f7(%o;CO{$C?nQ#8}D*IGVOSU)>-RSfhNL=*F@^^Rf9I< zeANQTJ4jlnvyx4BX{*@DddKvry!ew3nd`Grv79>`pY^Y?IJRFQ?&)&Yg{Kd0)xEjg z`z3&^gC2R4eJd!G_q|c>{l3f)#l6?G|El|BtQKe}b?0N2kbo;6r)AQ)n0QqUr_h_5 zC(hFpzW%6g7#-&kk#&$?zPf34Ix>NY7)-X9J|FQ54dJzh;v6TPfX z$=qU_TwDE+M}cenc73^?_3F#&{DMArU+Rn}4|I{+n@S2Ee){^iU;b^3h~02c(VCMc zMPJG2&aWD8-+%kbk)3HTI^Tf!#h!IkX2&1Vq(q<`!~H&Kzd&93^MO-F-2<`ytNVh_?m?lKj_bGCSNM8>YWx*fQpUmuq6d;yLR+TQEcRZcNX?}D(!pY zV3@MYczS=Q&-HLe5Y&_$XXSTK)T~%mpmuAzJ zt}}c{R)~*H=}kCiN7>qmVX^Fc&vFkjD?(h@9k({qH&^O3iW_X#5}^Kw5$Ve?zwX`f zK^C%YzH%sy<#c340-IdfxxM|%r9rMw_*>g! zq6P4SjpDxB1-vvh`qM3NMHb?GCT@F&+i;enjeu-ZRa=dYTZ8sS#|=G(iM>8j9Vsuh zc(9**uP2y!k0r|4#C+sbt69QvXS_W&x*_C^VwA(n0ppDy8$B+r6}nos-f8@Rrnk{q zheryB^@Ou;%W{W3(-QLCYxi)>C0#eLaLH3Cp%!;(eqO=*j|VX$L6v)2+eHd{KIyur z>#lD;E}$Ws|FAn*B=_RaEA@G6Q}|>;7=guu&iZllVXWwXWUe_F$^5gr@CCY4R z;tM!*u_sNH*`+`)s&oa2H{Fmd$E9I1uIFXr3;tOHZGGiqb}OV^Q@d@YWb} zOrA9cN3y_>2<%QmhrkO!D)*82T27(bB?X%=F^f}c{2am1#MZxjMfrT**jYyh(D>7( z`8hK^d|05liJj~cqD`s0K~qlKgEjf8Vnbt6t*CTAB}>L`DjkJ}8;T}W7SjW1`YB^D z@V){6eqVv6q&C%$hBO}k-(+k(Tv+a)=Q!EHMO*nhv5*EY+|2dqFOq0lrBH+L39Awy^?gmwa*R4jz1fdNc-L1=FXy&Fh`fzUy) zJd^#^-%^2N2-=uBr4MfMygl6?nt8m0T?MyZ5&aN1{D;;M+KNTnZ37$w_gdXRryPeu z+ZjyCNdy&sN($JXGhzTC`~L|56KW9RJm5P5FozD+XNoKtWO%e8=+ApNYth}jX)trG zNtt0!06nMGn%)8S5DA0%zW~(#mJS}P0ug|>2qX-of>(h^coK?2#6V<_6mVoBga=1i z7>Gbl_&JP^Ct)W?&<6te{{^V&=Xih%159HYh{ejzUBMfJj6VL?i+tBs@e0(MblCl7s=*@CZN00|32!GFT7Oq^MB9I5`K8h%$IG z3Lar0V5MLnfn5l%B?84KX#iZn7rDk0fFV>6Ad)G_NFf7x!8{3z0}4*^B>=ue&~<>T zBm9gAMipQzctijP}z$45baT;tuAOkQgVk{z9gBWF6ICw-N4dz6EZ!oZlV6kD< z;1K}g7nt27pomjG`%P-{0th%s0tYk(%ZRX4Kyp|jI1HxUH9Z2Cp{4~vC=kd13AAlt z@!>f5O&`XBCy`(Rl;Hc{RA8Yn7!>ksiU5T~fu;ctgvl6y<6t%*wgzzl$HWXk;sK6{ zX+UCSDkk7~m^gz1==9$}*ZzoU>5 zzMcVyuP2|wIKKgo3)rjhh;+x{cS|JSPrqbRA*3B{i6qsj4`v{*PJN4-%-l#14Pbad zNYe{k!C4uHd`&`u#0y-Fe7W+5a8ng-D!&8YBM*>-j+-hoNW#ZWeLO>wJPzTDLh?UI zW5|*q2szCHUT|puCPii^vny~WayL~?@RRKSWWSj?T^~fyq!fRi&nVG?)X$r-PCeH7Pd;#5nYR{8 z0{LYQUo2(5zBn96^KXlEHuj eAGx;j2nHK>>I)i`$wH!>3`9UlOY52Gqy7g##hV)d literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/hexbin_extent.pdf b/lib/matplotlib/tests/baseline_images/test_axes/hexbin_extent.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d2a5dc791f45d5367188975074779204a18d2dba GIT binary patch literal 283020 zcmeFac|6qX`#(MyGNc%aP_`LMO}0uo$r1{qNZTmKu2e#_AnP1N6ebN7k#kh16lsx@ zZ7d-U?OH7%l{&T*nauaPUo&Irob&#?AK%~S``_=cbI!|a?)$p0>$+DpaAd9Rc&{~@NQtgGzjzFW-5NLgo7u)mkGj=9@@Hy^*9$~yLLJG}yxm%s}S z%ErcGUcR2_Mg1v1Fc0u@+rP`t*TQYTm$IhCPx`vLhPsCO%k}m2m+2cU(p{pVtE-_U zreh!A=Xt=xD?nLuuiJiqAHV%RyWExiJ$ER(yLs$^ap4tgD8K1%=xOU}2OjjLD0}bU z@BfpI&g74^19xcqdhOSmBA4M5xoCFoyS+U2E3d$0hlT9l?-k&yY=Hg~lg4AC*M8;g zutbYBuxziO{mMGldtte&dH*!${nJ|cXJsABp#5t%?ng^p#vNdzx0~lK-<`_Kxx=sV z^WCq!6#Mr{HR(-NtU0{l<-0#nSx=Yy6RxI_f|Yd~yaN3W1bBd|(Gnbx-UHxeuHwaX z)_HmEa$D^e1mdC}FI#S)ymW~^$Tejy^as8X*X;6v#VYHp@d1e~ygd9oVGdg_-<|ut zmGzMEFk=Sp2h;5p3(ClQz0P+}@2!mY-*(sdMk#+dl6uLpI5Od?r}#q=ViW%1oI@to zi#MDZC_9%f>>_t})e(;*zcp5S5;B}ZkFV#j+ajFDM|C(E&%xkp<(OZ4q6~5o1G~@9d(YqM=Vp5r-pw;tZK^@*~EZBgWf$J2>50Jr|0a zdmiA9T{xZ1?>`NG9@sa^W|tV1yF4m2 z$}~1^)6VZnD%!r|c-vX$_04@cJuQ#MmVG=h#{T?mbaYvG@$t4S=f8%AZZ^FC)*Nwm zeapb;(Dl7NE3SsUY^t)eyU-9eesdLr^L>^Rr|r?$C-Hrpq}=}6M-6QjE!Te@`9Au- zyDz1sU7H;q5;D5-&Vr80)~3pRdu7XD!Oh`XF@a;-(x11T9iNr&l1lykVCl0}FZcX@ zFgWD<`0lgob5Gw2RBYLD^J~k6mOc~FG`p=;w=QR9WjS-cU(ep%lh#{KDS4MQ)cfdV zm6D0UH^+NxJ8i}nh8e#u7t@L0R3~LzsT+3bjVQ0x4*0IJuPj0HTsE%&+eqPzS3_qM)kmws+N8$SM-8F5{^&#rHFL>cYRmxjmpTz=8L z|NFTh&b?y!ThyCL7rsW6_g?z4@B4C5Q&{$TVH_2#3YhDWvKZ3hpmTvfg*tn0dm6X&O(Z*>|iaV}rD4VTh9_LYwJ zA*=|FWNK{Bh2|qlyM2R#zlDydy^DQOYjm|Q_Cm{r=1{5YgGI4A7cTTfaAa+dvPb<366FRF&q!oKnr#VD_q$+ny@8D;4Us2iPZ=oSg8uv>+_6|ML%8HQMK9*iP zOuaJnD6p*1addlCOUs2vsMnl2+>RLvz-*+__j3s{JRv<>keq;hjyG>{Uzr2Dgkq?LX*e*t%xLYv1#C z$3!o@eEm2`?c7I?1uciFUjF$hNGEFSN=MJ5v7qH0`%5o`H1|BT^}qAGe4j>Y*wVz_ zv{k_Fn245sf2S*?3Ux`o~njNUL`gDVU_V`mM<%5b^UqJT22Bj zyL_opkHo8{Hu+XxliHOM7hdjt8gv=tY2F>7e(mmZ1%F4`JFmZtk01Qy%l2!{7m@~I zs~SFi*KEL8Z-x7?1kt!1Csxg8CkMD~~T^#_!eervq2c_};Sn_{0) zYFK0Ex7{NFcLWyr8T*$nEqNVzyhzE}w`gnU+E>_U0vnJ&-s$)x5>zsS_5Epo=lkFi z!oc95Vv*nOpgWJ`{Z{jol2&r!C0OXC#JeErH{Br@4%~xjN{lk^o{_}XtkCKkS$jtE zm5zkp*PPCEacM6zpQ1MpURc%|t;sb`Ga6%0)lg^K<&&{W`=~v!Sp%}`d@mv~eS=D6 zzbtN3x_Z*R=lJ>znvJ3po{mYlJgV=kPf}b2d zR;1$W`_;K~Z(JdF$1uJgTp6(^sC4Dt=DwEgSBu&r3cm*zw+57U4=p*mOKIq(S3^th z$wPGV-pl*$2+#L3FL~u#aQCI8PLV?1fPuwxv{C#Xf0`RqB7qdb9@)AZwEU`~xI=>@ zCWhIrO(MUjqHi>0XSbh(Ur{#9oz}a!#V~8#64o%Yw`9CASZPRhe2!9+$pF*8J72JEouF$gu6$!hCh|=Detd3yC`Ds$mrwn z0B673P30WVv7wOCj!F&bCAYtB_;~R7;PAKhFjwoByI=X5!iLH(dU<(3y}FmLn~0ts zqkZEFChv+N+_xy)KT^Igu8TNUEces2%*Kulj^dipIs@|lhz4M=a%36`>yv|B@uHa~i@y*hROwI#QYp2$i zhI3WwtE{cI4C<^N{5uH6IwB2;FTtaO16A7y7ouWVrjd4Vpnb&ni-p%^B1oh1alLC^e z0<(INYZb%Cf~GIX(K?2w>duv@UqdH5t^=tl^;HDwmO+Pg1$d7K$+!P-v-bRo#3___ ztG8*rB!wnrJi$}-@7$UgJ@>R5p@*)r@B0Zi>u~+Lv2<}}duS!&RJj3(!g{4kl9pq7 z3ibVZ&XpkVjHB)te`;S49mtYgDnl_d|Ky=fqYn`#o+jJ6(ird+FLos~MLa!W7DG;4 zN2@G$wQ_!1fWLMVJ>M~mlAWGSps^mLErzfJou!pqJyGiMQ(J~nsRR3{sNR4DiyP%!opx8zZxQGUw~hOlZ<&AKu5-Xl3te9nNf+bSup73rNx#FM2d2sDn$& zW62jSX^eaw1&W(bC7Rcs`uBN-&Gn<)>ZNQ?=~{sM>=>VP!vOq7^_lz3(U#(REFNAs z?s_j;Ww$0xf2aivpRN$=DOkl&OV@Xc1Dj0UAlR=rn6oB+jW(nrD^+;=tN!l_%y#RX z3ZjSxwh?rEXxzE<{(Y{t0{m=+*y=qW1VIFwIjSFi*k71j-_{T&WdOJC5idmFhCr>JB2>Cl(iPMmn^FJwb?iQsbM;PR}pyMFnx*Ok+v)`@NLrh^|;NvB@FbUYS~e_~;^X3%R#VT!2r@px1F^k{s{%}fs>QBixf zK0{}T^qyF<;kbdSR80XXflcZDHJW@;gQg$AG`R$SP?xB`EY4JhU}j6BR|!+s3_AQ- zK&t&sCHMe~(fHRVMQLWcKZ}u4vRRrE4?))X`z)${p{sS7;9QEC8jH~;1QB#5HNaM$ zz6J(9Kly`AODOevyR4jlE+Ab$ys{Sls7}*o6hVB3NzIm35;@zjlZ==b1WEi<9HkO<&9a{k5OFn4I ze1~X^*$^iaJgbQKuf|8is)%2tC|a-&tFS@bSi~<6&>%)G1)h)}NKkb(_~P-O=7V$c zo*LXo@A_!|hYA06f#ZuU`h_+YMAvA4I@nwg?V`hCoV+!xM`2~?;t6=_eF#F*%>Gb# zT5cf2fBMW6J)NQ@T4gLaEDOG;e~MHQ7c7EZsH;FR1DkSp3^7!(ZfrzMlKUGM`MJmt zqOgMsAbP^47^RaTkMzc#5=EKW5Loz6_rkXaK4TY!OgM9%gAYQqiVt`> zBz74E(LLgmPpu$I!^Z=jf{x%63(+UAQWC<28$^}$w928r0@7L1LP~u*W}Ws*I$0Dl zc%Fq_V1h1oCV%O807nO?zr z!t^|cP>zC+&s2x_SNr_41M;kfXGJ^(kqBd=%)A>nlU$KXVDXjkJ>{z;*DVTpAVe)< zC<>laj9Cv~Kq3mB!qom#E-d0xA|<{hZ4OiU7B*0x<-hAT3xcP_q-w!9pjtb*H(W(= z?FiOQw)Bpulw7uy0%uK#jF1|jg*!%n(SSIMTnhdKjus7{t7rCO(y_Fk}fWe;;MwXlkMc@aD%X|mR{%<2b&fh`sXvds^}`Cr(d9$ zxL+m5m`;Wxl^f<@+7uLi4Q4)Aes6LB*!)umfV_vROYBWdSdL#+@BD}F6V8`7MeJ8# zcF~r0eS17ODD2{VR)G@V0MUm|4n}dN^%8+u{cI`esxOWByfhQixWdy|_&Jr_MH3}m zj!*Vnwzr2CO`0vMGOs@ERQxh&hGN^YI*-)VRylRe4#o>tGln7DHjzC8)EKN~IM~zsuy?T}mY)uy zea^LStjfT{;tB>FzGd!I5kF4^P;Mgg?pG{PnuyucQx+r%L>4;t6UoaqCcKv`HDuFR zvdW7gq@HOBs6F3z{+58k*n4|D_+w9#8@biA1au;n!RKUJ0tzu`Q6rY$k=_c&TF?cl zgPo?WwOdUgqd@{aET|whPRp!hVV7+;hYtvr;aH=iEF_ia1A;yk0lxf{?Ey;0&=8Zl z|0=HUIxvUlFc^1#@S{Z+#-n z%ua`sDMY1GJk{pKmMUcDWR%Cgg&0aFYfi*a@z`vbTpnU5&)u*XDvl*$KJW>KY#13C z3)|C=L6gcwCm1?>DA0Lg;zMyrg<+yALDe5=mR|sQh7$VneKC|~x^i9RK78b|Aa%e7 zM_(-P6_REF$)utChe?0PLCG{?zRn_UMldZ0oo*ps4muG=v7-<-FPw;tPP&shs5d`T z;qJ7xx?Yu%%Vj2w4oNmI|BK~)OegX`@mse$W=|X#c#6j6udbQC%dlh-3&So7t!~!F zK61qT-^Ec5xjF7)lB+eG{N*qO$r^AI%XbQ1{Ir8>5-d07M&Su>$K=934xF~wmc!M} zI;R6l8z@+8Yq@Z%M`vU(AY7|}q}}&PQJmS;!HYpek4OBo@fK-HJr^fK7>mfoc6&LCx|R;~UFjL^M%FVvV3CcFH%cuM)OLxh{@et4i8; z0Dc8SiD!E*6G%n5u4(->QR^-64^&#f*(}hG)Q8f7aJH+qDY3<5UUrv8930VcVokE9 z=mRQ{nxT;FDJYZ*UcXev)C?Y=FQ_TYDH6QI{yvoD#IxH&C!fLzBpVB2k@TUgVbA*l zV(#K-a7NlPQ!^hpU`5im32LImE0SJ}Bgl(Qye({xivP3h2i=4iK^;HiY~XNt^tFK4 zH_`0W8&_fl#NG;$g588xOVjzR$Ly}}i!9n?N zQe$UGQ`RVwW3Of;BT$H8>l%q_6S0Dt-kOmphZfOHZzEfeS1dI(yGFh9dJ#_8MF&<1 zX)1qg{wguK?Qz0^0%#O0RN;g{Hz?Slr!q^8Om3Q-5YZgiVJ@J#VhfJ!;${#@Zx__m z(}^SzWg;0$3WLUFg1o8IVliXTktlEk5VrR(!`(v(3Z_NEO#A;*dhz7!b2u^i-AW)q zh7NyC;(TMm!1wJzg%GEa3c;{4OChBP#d2oZzp>5{Or7bAEM)Ec3`hRu@Wd!BAeZ5C zzRE#aNKi26h>(4M0nWPQk~U7b=0?)!{OtB#a-;*4XF!wU$xxoL*UyKeyQ!HTau%+M zFc*T5_wO#mQ!cqjgmkI`N5%>tLDY4*a@|Jj;ymg9*4NX`wxnG(Sr402UBxi#Y#F=Z0Q(`%#;Fy85?*sf z2F{D@_e9h_fU=sgb-8K$M-ffOV>n@Wg36OPVL0M%f(W%6JWbt{)q&Ss6#Tn-Bz>TW z9G@^Zl9&>KvoW@bq^rUob}m}Inyx2h<@`FDbUh)t3u**MP9*1baR|56lRy>e@K_<+ zB2Xw*Q98TbUoiD#D0|z2JgMw18jif=J1$kzJ(8H83Y*~s&I>=jBwONWa;_^>49>c1 zInpTPT2HMN85A$F4o5!$JqLNI@gH|+8LCswmKCO+EZM9^WkCt!iSei)`FcWbS2{)b z$cfxM$Z{RUdOXR&-%mK&gkP zWSZ)2p4n4`C2AaWHK-krJA=S;N5WVj2cwMG? zE|rx*iMd(lfa%V>rUHnXLb`nkOt*4ez7R3vSoHY(BG!~f&UQhLLWzr2D#hNuh#yub` zOqyH)GFBrQ-OSPG%Vek>8F|t0o5Co^i81me>K$}tC&qwP`&hy9i(=iiG9t!^?24sS z6j=#NsU0l|6tDAp!>a#vP7@Y)(%a1-iUK1S)xc<=UM-)Xom%r=QOK=yU24ZQPpzOB zN1E6#Cvv-9<&mUim<%O#eJX2fBqauf*)jg`K3_X#plzf~W5;_?Ts(^D0KY@)Ijrn| z$xhFbL61lWphq{DZK)(?rJjiEsi6#SiZBb)Fe~Oy2mRash0+c&E05IM3~oN)rlqOQ zq>nDgw3eH@cNwNNY@B>-9LgG=lVzMZSpZs+kIQvk&#W9m3gEd1N%sf$AW>OPd3Zu2 zWx0GSGjBDSu#;AmG9m(>c8y<+~z6EdXbFT z6_#ZtgxM8SKF^7f^0UPz&FupIBmk z^*1^6lQv-f#oIIRyxztsadOANWT|RT^&R8o&mw)l=s%O&?skn4y6$J%J*hpvmsy0> zIc$5e#T=8@=^2GPn_ntznj2zr!LFLR>1Rq{~uR8JEJZA8do_63jhp zM<cba@layAGH<5>fS|xHU02<#F;fj?bb>ZbxTA zMoFG4!DA0P{XHg5oOaL{c-{pT8e>n@N=p3^xO)@6=|-R*R;u}{03SAauw;}JxDv*G zJVG)(xfS23=VV=3N*@7k_}PUce=$*-J%{*WA~hzmu4i6Sms{d6qHN~ob8aCM+KR(Ym8 zH0C*01*S>2%IJaW8)*mVY z=<3FecV#$P5#ZSpyQo7?v8pO|&4a3{=z4K#RTWNgF~U^ISKQkgUiG-X*v(pq1=OHXuF8a5m4KtVM1hPRP^Q#y_ABvCbB_u z0OYCD3SrE{cDz(6+GbRqOWg(`A|C=_jjeN;5lasho}uPqOWn zP1cPuHVZD;t9u$UpM5C&hIQU$tcC!6sFw@WC!i~DyZpJ z_{Mrc&s&mSX;tz?k9EZ02<-TU45auOXG! z9+>Zul74p7*Y9b{oOFe9x<)hrYuhb2A40ejh;;UOjY zSX!li1TOxg@jVI2iJz~W#aSnQG8r8FqBgH>?4pJVJ!DV~jl7D{c}K8bDe117_kmqS z(ZWgX31lPvLZ<$CHA5!5u3`IeP>P4PA$^FvcFngfcD|%qcctLq>r&M%#&6x#E@~L) zKTHc*qh=U>VV+s(oq6?-4b%pf@2W{`r=3a(8h%!1b(bj@tSH+rm8RoLGI`q>_E=WV zY*kcBO6#zgZ2h$xGd@@+WS@n_&Si~0R7D~!Vt8ywDk=Hh3aKndb%o0&v{<~QyH8I_ zT9Gs?YwapSsmCXzk$xAYD2fMXpG_A1uuCaWMJhvwgyd0IHDvaK@Nt;%D)bN{jC@%` ziQzFY>#_7~OkWEi(i(LQjAnmGj@zrq@OXZ_%H_lJs4iNf&~UY>z1>)PLR5RGUUEv=<0XRi1M>sBlGZ9D+kU?ud&JAs zevOEy=Uy+8X#k}H1jk`3#nFd^P1l69EMlwGK2+E@nqx93v=w~gn@|rm0txtWZQ?rc zjSF80Yab=CH(h-{2(duVYI%zXV@-L?B`oLk=s zd742uhsWpO@e}FMx@*<&_>B-+YBkt46z!zawa06g+1tJ9j7zY+dM@Pc0<_SNQXbon zm6TkmO__6QOVzOFsx{vnnjfmw(&aB|yxWJjRDW#0${fwLWT@_1DhztB(<+|g^(MsR zp4!>j@`H8H^cNV;eNcD#bdaJ{iuKZ0Hq{=#=?u>_3ZP^~g$&MLYwY=L=9BAva__g7 z-uWwT?Xe|qY64jE*RJ?&p~Ok4zx7zrUzft3NL|_{?!NY5jGvz4iMOKf4V3MvR!0+XDdFFy(j#(aY&< zmh;*2iu%I>^OLsT>WR~`xZBCPtEjebmqnx0#(jykYtAbsomy;|BSl$bpxP-H|Jo{1 z?LxHN1FJYS`Fj6q88J0^f`4MQFR3Eskzc|9tva+*??X~++>H3;swVI6)@>a;;oFru zqIy)+*J4NUvGmo>7Ha2?r93+pZ4h8{aNt>;XQ$rvnl-j=+Bqq=?^-#@r|hZTH2CJ) zgV|4m5_eygvb0*3BYN(x=m%B0ydn8!oT|J011lS~^Zs)mSXp?G4yvgnWH79a4D_!B zHTt+oZIp}mv2fNSCb`rxws*}j{EkbGJ6k#DLG)$AnB#G0>2uTuTuIlwe4_>wT64pE zLiBIN*|m5ZnrtWS9-uMruVyVs6Wg zr(KDH!rsJ%g%W8GVt-S8nK586TKBqao!}g~^3Jel6!rB|H8(P9qP245G-K$iv|HTU zQdO1a#KalL$~>q&uG$;E5rDPN3W8QXtJ+OrlwIHgx-+ot(uTI;QO`i_0f1+ zSN8F-ixhQTOn_=~j$A=BCO|dOP~@Pg-o|*%^IkG)sdes3L6;AA`PNjEbjQEUdcM|5 zbW0elPkhPO?SNd%4V4*iFNKy zYxD}^C`?Tx*LJ;gqKUsN6h6zeuuw{fQ#4=dskAR{PSLQ+kvKg=^DkO*s>Xvk-Rw2- zt39vHZuR+o_D<-pGgWlU+GDj6;>|quwAbpX#nrl#B*nhmeswh7)Rlcy;k@P!9Cs~B zIdc8KaMv>1P{i3(@6i!#EunSpve;mAqz_k&Bp$v%QU9D=b33EPVnL2v1^PviyWniO z^7dA(qo-C{=q=u<=XQkhrGD&cTVRX(Z?ohg+SL~(5PpLBf0a9BE^|li$eg0jQUMhs z5{EWEsI6A{=5078y23)KUqtw@lW&{mK&;{~8rkXl%w-+)vb8M#vR8=C;I0m0Fyr=8iJS znj4Ak)#8pHD-{ab0*l;p#O1Q~NuR92%VMtlY_*KgHm)ms3v~L0Nru_Z&1p`e)vYDW zEfguPw0XWec@fNh_`*lEyyW`gj5ehWF`6P5vt5%Ky2m^&Mh+w`6oJmIuXHW-evM{tS_M1J3dFPGE=XCR(=L3=r)%kkl@DhwT$7kw(^T>t z)U!zaXym|3lft<*cqyibtDau8rbsjr@1~s8>f=$O_KkQqg2)^-Q}E`JUhD_qkpnSG zyAs?hXEbORq`xzh5i;VcpdZ({HM|h!c+PSVr>O6jtof_UwPtUa)hylduAUbQ#^e+! z`Ps%@BF}po$B;VxQVRs`_OUaz%SbPyIYiaqC357_qp;PtH7YBWelK$A`zWrzLRU;e zJX<8n%-ZpxxSVTf$J&=Uu|ced1okaaSqr86f|$?DeIS_VGU|A%);(6Zfn1PI1Hl$@ z7k?24i}wM+;EX|7xW*n9&$fTlS6rU(di?HCgPIfP-CVom&gHnOhT)s9Yts$}nQ+uL zNXjl>6O=wKAU-lfBSD6J_K&B;g>ib`xZUw{EEXq3UmRvNms%_?rnhY@+Qt+%G!~NC zvG@f&kId|+iJRhXCW?pKz21FFwrk`s@da0Rxk~O0-}1&x;1^95H(mW(M12v%@koWl z1nN9be}S0VK8cICvgJEO$}jk~DVYDFSk4l^TVpAa!#r8(u{cQJ@gH^aNCJjIoL)a} z_v=!#8`tdP43yZ()EiPOMppUk@d!xnTvF|NOXa7!ZG&P-Hr^1?34FS8U6fQGVg-&FYx}Y}TPozs@~p_LQ+9ZrjfACh~gb(veleS(Xdk zuh4`VNAJv2eQfCiq3%uVuSGT8cm+8t&F+Mv7B|qiOh5A#B&(`pIp-1A{ zUF=GiN67*fvW2fL|5AAwukE?=x$uplz983-_ri^Rp(^3J_jIx!=e~MAr##t3Qy})_ zjRSgaAmeW;LZW(}q2h5P>*wipbvVo%&0JXC5%s=X4rcSN!!c%hYlx(LBF!tz)D(I# zDr=-%swec8J!iJ}*FWbKrV=btANC!pI5jxa@lupXG}Ak-IKtc+H9-xLZncUj!H z?ps$?qW~J|hM%=32YwHUovHjL`O`A8{`@4fS5@~7YC!+?LnfPEmxa-kO+jIuLtTiiMk zR9Ds4@6lDBT4&-ly}l$LX;{@&l*e|4sY2_D!f=PB}#1)}OZKFa9m=QstF+R8`2RKO1H|>(O5zHa&o#UenI`pdRwK4OgNgo{% zaWwPP(u-q@oOJn6@tH1}KGdS0Jzop|qJD$t$_;TwPICo6u~*JdZj~1tTF%}AOP-zb zDN!pYbCtycZON2R_wx61;?BkS?A(y@DO$BKa})l>=<=U*OP%m<*_kuF z*UpPN=sxE`lfLR~*<;|RvOg)8?!&)5G+)X@u12l!F@h{DNcp)-ZOg+Kma7E=$JfA2 zYEdJCa|bdDQ@|BTgDW?OXPTeav4uabjumy)OvyT4SQzB9H5&xclKS+*FVHo_F+QXB ztD$G)#?iWSVU}Co=meUQ_YpQNbQVkzRtH6Tn35TU8z+k54ysEB-)^+HwWz#7;QbZ& zlb=T&EpNPIxv|um~7#U^Rk&>vP3YMU3O-d$ z9Vmnvb&xLipos|zIS&eHS)p8N2!FDiInOlvjg^PR%3qEev9%X&>Dp#<9+tcyw&d!j z8mam^2ZuS1HhHS$UfpT%6F2zDG8k>!zApWo%w3iXw6}vz`uttL-MLzK0%sSAX3tFS$EHMrHFkJ89G-}0t1gV`sJs5FHOo%sun3TwlvqC*4y@WNQzda$o zt8mIz)7kSN3ZdW53*96hQ0(%PIQEmS><3fx-;X1tQ}<8);g!dKLGZVOT~+7j4OHH# zJC4EMUe5X~^_M2#hdXCA#;hEyd^#V&-?~@&k1Iqpw;{wrkgIlk3V~vT5DRGo6;S;t zjX?FduBhT<5NFU76>)o_Vt2N#xC%FV=VrX6FYwlUpMq-ac{7?KI{d_(;L_18DMR6~ zr{JC>gh5IDYFagW{A~q7p^Q|peU}f;IA1g4=+7?}d+I5Tgb>2=Zd^%vFyrlNrBf9j z)BrCKSUej#e_S+gBgnNGjlCT)JYMbyuw7K z&I}MAlK4O~0J0IVP8W)3likdKWI#KJ)EDbnsTYUjaXtK_nbit#AGns*;ApjI3l#H&%>5bB3+|?yM_I$@NKpJZEGxb*)Rv^3w6wVyty# z)y)>~!dhMiNh?gu>XD(c@qtl*)!2X;%9hY%w+S=ULYC7-kp3h#?;^9RXfm=0c8_x3 zz7SjMbGR(3oE-zLWas>?n~uT#$^pVi?3V}jWq1jbk>~f3YwEI`D!{O|m|@e~*~`N% z_5)n$n60j?em#DRdcPv!sfGcDj1H`01{g#p{k|i@hyWht@fbwa_|u z{~12eO?qjnfnnvs^oBF-Y}xS0{Q%nOYbPlg%!_Y%Y?+}Lb@I~M$7|pH_S@cNiR*RC z`NQQh@YPLBOG5>a-uU^i51q>E>H3ih5*D=F-! z?h1M<(Sh(AU#?a(q`4LwMaX5lQdS2X=8PrOX6Q&{S9e2b6G%0hKyUc0CSvG~)+Rt| z0DuEf5>N2L>4G%$_7%)zC``2cETw}gG6l)ybv_JyTHQx;&G z6@DI3RlN+D<$oP$i<+q;d|L!%65%59G|pxRbZQ9O4s z0@+0(zy^twekRgWP?~{(;8e`aiHuVmlc;9}CchJUa#TmY#hq^Nh1h4g&foZV=vErX z$DQ`qUdSNWuEW4u%b@TbvT)bqE?L8BeY|D{fRN;bWKuC4neDDu026YCKq0h|hR zM}XgHn8NLEm0u+Eyji`8IV7No^}Nl{d}khsdfo)lCFh@6c>|o!G^kZF4#7c$?N^i=-Bd~!(bPP+t0-9* zz+IM+`j2iIV{-8Dfe5Q+EN~BXj%E7;;t#M%Jj9aW`PC(Xeh3bjUkQ!+{ja{@O1DX61oVMSb0R) z3PP-aCKh55cu+8vdFzQJW*`7(VIdYLc2w#gXGNyC0_Z)Eg@<~ZbVdNNO+#c>QClB= z;=hgI@wjlZi7^gYBgnBm7jkTBrUagH>x&BCQ@998)+k;RH5f)#0-%eei6ff~A;9sZ zJzaex8HDwp0+}M3qt9K1WFD)U*0-cdWa}CTASo}B!LUEf`;W47&BlWodULgf855a! zBpRVLxw7oF0`#E(0+$J7-8Tl`$)0o~(<$Ic3BFc4%+1YWpdv(u`ie>`>j+77E4B)-|v8l@d z{dR&scA#w}w8H^Jc*{B*`7THvJiOAhz7GCn^wJib@G-o7_-u%%5CruI1bM0KY-ru! z{{%x7lSsh_1X584ok{1Dd6<}2Ae8dNM0xInn1EzmZ^~#fA!N5dGKS_TT+AfOQP?Wk z6t*Z}Ztc>A)`m236y* zW&BJ2=xl2Jks6!9Zopn4>W_w6NtbMKfU1vE8(S z(gDS|8PJQ+$idm6#SV#|ZneP>WQn=bT%GeQ5d)pqd`s}`lWh8T`?LuHJwzi~y0;Y* z!QK!`eL`>mP$0qiPe+S%ShHs19m8aH6HD=+%r^Y{c1m- z2+rT+Fo@yb_A&#ixBa2BLFrm5I%!~TCOemE=)U;ONoePo900b+)Bykv3;P$`348PQ zIT}EWQB37De99^gEm_KBKs!cn!m}hDgTPTA3K?~C01CImT??JQnM98&#_c~GZGh*kn-fP)6NMnw2V_`sz-+B{JrB;;guN4tCYJj{0+?Cq3)I8`W=1a*F zhbJWf@(NGW?m<6ad@hE4i_i6(io3g6i9ogSy;+S8gD9jrQG|OEauINxX48aibQ?G{ z0-`k=sj5x>G=_BqUq;8S8VCO}>?t%EbNh|3^b}x0z=GsmU~$dTN>^5(zTtGT@-6rh ztC%g8Vw{Y4aO%|(6_yhoUkW*M8eG4_X-t*0h?BGA*_|pz=ric;x0j_c4wNMQafn7| zqNc|&59p|aP9W!JfQZ9b51J-Hcc>Ts$4)WS%?0!WT%v&~2slJlfU@rC7&1Ps1I9Zs z(Qw6Ut+N04&{sm7!fK%wc;@a6n~8ObO;8(5ptMj^AvDWl=?~!7_>G|m_XL=-Uw}zN zL0XvEPGd1bm%ZQv;F2*u0IaPTKx_y|gtZm_Hw}ka3*k9e>m~{Q`Y|2{7=nu=lcUE1 zKnyi}aJ#>FPbVo4xH6)CXl{cRmRd90*()jW8u4OO{o4p)rV{K{g_;xjqx@Tg8W#bl zGH~gS3Zl#-~bk(5q;r$$4OlnzKdtb-VpYIr?`@YTZlHHk7bMppOW z#B*-1Apqvqe;PUwOCCMtQiX7vla0l6m5XEm@Iit)wHJ@u6iI>b$cNZ*wfm2Lfr-u~ zW|)M)VNU!1qAAX(nImzd&}3R`F|?kZ{-XjKh8<$!zKJqXvNBxW#0yQv)>{BZj7V(|mja?j70`pbCqouyT40oC$E!=XEVZ z;q<@iDSiT+9cq)54F9V=#pt9z4N8d_723(B;cNe!E&iW-ilgy?Qm}(mu;Vs{G|OWr zG`aSzw;FVlP7ZqSBx?P1!1zNefw1jpa_WtS+Uyvtad%#A0e&%;#{|XDmrC3Jt=;y2 zD~PUu~>nH?JGYYN{a{sOQdm4ey1m2q0 z63%UUb0t88;L$To?fu3gG#9izGafI@?Alq(C1k?z?C=%LfR<|d#xeG9!1wfbB(dmj z0(|y}FeVHacN;A#p;7YOE$?@vJD`4N{jcR3sQ zk@yS^kj?O$gKs0u_LOfb7M?-J6L@{|H_Hx00nJ0MnAGqO{rlLvVZY9tKr^F{8`d7Z z!MuvcM#41}Cf6$j)#vOU2_E}8lyLr4*%e^uIuRS{?DFQdcEtQFd0=P&&IafXn`G*; zG#|ux53sI=Y{a|;)lQ}>kjy}*F^aB0C$l1>z!Q~Hsk%UJv+sc*Rdo;=sn-&y_R%n( zkEJM87m?e5r4F(f7>y0$6Wb(BVWlr6@o0VAr3?rWYRg55y%7SRb7WTxO%N7<` zm28WMsub%A@Gb(-ih(pug-eU3|3=e@U<;9b!I6ND<;jo&12;-CpBYSJrW>Nxg2a=* zT#TU&SYNoS1>xN=0xOud0}-nLQyMTvAV=T;MV56Ai-?y+f5F2R<$!vtpx8FV5md=Q_0x%QN-(<@OmK!F&YCQ{-iR4jfTIHZ zXM#3t{lu#N?_G1WND>bFkXeVjbi$3$M{}C~qo=?g2Ce`OPLPLw4Mg#SERGR}RdVgY zZ1{0MFqK)qhlM``LWd#nuWixf(Qk!7-lUEx4!Snr=rgf{c)o@vphaUYXp{vuK|E_K z5HnL1aj7I`lL=2lghMhAin)&`N$lvzR6LdkKKmEfP~3zTF^x^m1{@8J1vPLA!rKvr znYt^00WezSb^({ath#3U{sWQ*)TrT#TqwMXXhe}?Oma8OcC&^KQ&FZr*Z{aXu$cMz z7?ID$MletQ8+{np`MJ>*c_8N{^b>z=ky2`I?h&L00EF@1Y^K8*Tv=5?+WBsuVLsyi))a z4;0jW_ha82CM6Ocf;5uyZ`?Npa3e*eur7rC{X@;|B%6MYgkuiGsvpmhQ~Q+IJ6Fxy z4}>@9gvIRg5~j)l%Q3VbF(S+w0Z{I ziwVi?p;Iab(WJomi%JAb*qJi&2WXJG)wwAi&o~ zl_cdy^7_UwS}Tkl5i3wnV}|*sw!VL9)#GwN{>O$a_{#A6mawo0=^|?0Iz&Sk{^%Qk z+WH206k`8FdtLtwX1g1U5wv+Pt&-2bIKd#s9i^@p6%6bVwG}sa<9@FvGdhe7ZnB}z zWuzr)3ds-Oxqdh>VUqulEb`kFv8w5`v;LHRL~Lm8S-*e;DM9;nC#)2KvFHFP5Y$kp z`Y4V%6yUQ)mr=|X!}7u$-3ac$)dh`u5LW+r1JtQb)}o+H!S9Vk)q7q)Bmbr!nni!8 z3-CMC~eZlXmGHWF6~L>!6A zWDyGCP7#%%;oqfuL?D*R2ZVoP8-*Qn`7f!&xMy`Z{$t3isS&O1SY4;3I3@mXp_I#4 z%V(7RXZEjY;d?Sog}jkSL7l@7>oCrq=O|B|!bkSE(gDPL9t$Io-a>Eix_6+lDSf~VtN+UeBCyWCM>hIHb`cw|6DKv~g09F`Fj=O^GBq%*{85FUj z+Vlb@7E0wHl!`+#)VlWCN{j^x6~(b*An2!yw)%BLy--2jCODIh;Xmtwg~ z{IZ%`JkIL0D80N8ag{S15FBxs6I7lt9&oy?*5xrYvYmDX1j6XLb@yE$Fath8ZFk|I zj{Awj7#&M?5zgid6wvsrDG`Gb_5suH&iRZcLw88^N|jSC{>hPr!1Rs{Gvx*zk<|Pr zsuSMDzlkvK=06W-Q?`3AcCqg6%)4_oKsQu)F1-uve?(-0ZfXBB$j;ZRhC&E^tG0XIVVzv8NxLRQcRe){x%4b6DHPM@HrVnQ-h2F|;bHI;|g&$NF7m;VUaG%Hg7MA2@Xrreoi zp!T-Mz^*u(EkdTJAXyZYL4*l#xsKIX0jGpZJyo(v&9r00*BW@kaW-7uaQi}0+`Y!< zM{(KyY?iDbBK>N-ib%h@I&hjxf`4BVS;<3L6#`=<0!QKQ*|uI1$aV!7)m9FGvYz9} z&QIjCJ=Jijb4KiTSztdfAOZ&umn95InFjbPSOibXKuRRz3C@1U;1&s7jE58>PdyUj zZ3KXrBF;-4A;Ff)D#Jw;;2f}vDnJ+sWq$;O5x`oeA&ew(UOj#Q)q&TikU1$$KAl4E zg>u)WkvY$Bnx_H&%i5;B>L@!U>8Fi zIEY;gZU9A@g#f5>*E*eW5^e`EYOrfE8MEPO5%7w@Q%}VA1D9=ZPiRcT7M<(wi(On} zfU0TJLO}q?i=d9j6Ok(n5)s??Fg!gMS(|qBtvh^F`GWUwytINCnv@t;y~9%3MfE^D zgaN817a9|Ioj(e?wnRb~#kNr_XD6JjzWkxm!QK|Sh#kesoL#k+?Y(Tq%qgY;M;V1Y z1ULWJWMqV>&jD=#`mM3K50}S?bDbvEGy|S)hwE*43RnmfKHs`)tx%$P_2h#pS1bp1 z8pQqsHGd{O)>RAscNtb_U;=iL3duK>HOhZF`Z^7mHbCX$&_rD0aDN8H>%x_=3T!nn z2)e@L>koeIt-S@9#i;dmbbzb!wA}(TWWc(i&iXkQ*rD8?QG{<+IP`xjERd-YLH5Vr z1Ox`)G7@szLkqx%my!5hfrD%NspIghhH=g)AdO#9apY+nF5J}@Z2*QQ*aLWK2Vz7@ z&&3#PUP;2j{owW=EMNxE3NB*}WAfLhDiAXbWo{=ZKE{r?LrZKHU(Z|~8h5@nxH`f{ zeGH68piWMqjIqxaB2)p;o&A%vi?eAq>t60oMyh}!EqZtYuKX>hyWOM+JeT2$V7uiF zG6zuJ_!TMr>B6aA3zRqEotI;JU)R2rJ!4o3{5lXw2gFU9Q;#I%A{KF)O(GCz9w?MS zcm6_DH=x1c(c7HLpIsyb!+9&l6$tWPQC3;-c%a zo#D=!7^x2x-T%*6#2U8q)WY)E8Po?DBn1#Q3;;@~D^uMNV>Rt4_#UEd12~f_8A>oY zaQUf7vBaINlj5DamJ!Ga2S;-R6jr+|PF4#b{rfNSOOj4i zE5_-I&vIW=jvjs2OWs}hP}?3$c!iPy*C2KnwjfR>6XQbc`xSt$IFhYtWR3`E24@NR z9FMROC$kJb8FCpoVLw;V>~}PQ)X*m{aAI`v>}vMhcWPOe)S_@=CRnbDvww^@6tP@Y zG1B7ykoV?sO(k2nXu=$312PMuq{TK2Dk`?fjG|EqwynWtNE~sVTTmnrCP8g!)Ici@ zA+}(x-bAv3qiX&<#+#Y%vY1ILW|hxei2)1FY!BuLUhL4!FPr;;dka{y8cQ%mw1z}r#0 zQzA$)2yX{(An+7stWVMaDQ-6o zxJM!GC3`Q>fT_N)e<~>f6P)4*l#Ddvg(6Vd%prEl-UAlj-2uJNjHo9iVs1mo_XX_! zdu8Ur+FvaKlmM3cI;&}erKyZ4RS$^?yp2;yRyYF0B%+FmCoD-s<7z~^C~YL3{F8K3 z3y~Sla=?6`Dclc=fZbPscylvpP{0aPUDV!NJ$qb_l>HG%amcfs=eY8!9w;CI4QB~K zPl#+hg7+yV-S>`$9twIDU4ZHfD7oOv;%`< z;ENZ)iFsD7_+xX!Prcj1c8nuod=-i-6|51y3Rr3N0AEEW@Ku!q%^nyJFVZL5a!NxkqJzGC|2|S)5CO!(0SWnCUSLB0Ni!qv=ua zv>3p5Qw}Ezz_m6HcL%7DTJh{F;fs8le@$dVRGd5KOJEo(^V(Z&G3E;fmwBO9hs(VG z46rJelsy??bt`lo<6QF={q0J()Z(pffATr)s!oZzqPpm(w-*AJ2e-H=lv`5sKKW&e`#$5twhly+aCVj5*W&kZ`Psbe$I-CL9LGkqG*jB^47ALNZK6@ zSu6Y;e)Z~YzJUSXT1T@&TtKzC6IvfhyX-R1%83$FZ5vVRVk6e(kLmEEgQ~H?9Cp0H ztGo{d)aQ~2TDRqR4rPxa>ZCSGgTcycIHbyN>@P?+?Qrko+h)X~^Guam@@){D%Tv=NwV=uANBkSY^I{Ujv9%A882^ z2$iR1If*>GRH3y>EJm$snJlsLba^X!_H~S`6$Xsu4${z&%l#V5Z2_aftuE1Ok^(xN z)3$%4`od}T1c4BL~VL)eJpKJ`=q;~=uNBC(gIn$=IM7=Mbc7Nur^P! zs8nF+$Hi`3%%)`4JG?BQ2CkR2y6nB(5U0)Jl~}}euVz!?jQIZ3t8|N~H!>_kc5o(>I%LHvLu%#DXc>?QT0)47F*LV-{Qs2M6 zbZ{?@cSWyOUpsD$Mpc_#K>ev~)y+s+-ZN-*K0ci9sH0if9;D9bUX`AP4NQx1uYXGh zSU;R-TGMNJX;o-FI?$)~WP!5o4O!t+23iNLaLHi{6+M2=MNWJ>te}e`&kNWetT5)M z!dfYyHsBQ`TPvo}+92M}5+-YSw0;v>Ks9Iy)!JD=eLtS=x2|e0emra=C%%&~&<(83 zok6g8Q&nTZKq-bDcoCu2bPX+OtITYN3N3R$Na(VdSX#*t2UIS4^)BB)h408!8`dA` z#}aa~nyRjn866)%*-y_*x3s$F;rdt*jeAjxZ=PZ~wZ~%X&4xMNsc{jaMU?oTzd}SU740w*jqE&xQOMZuJjl35WVKG;eFbxcmx=7up8kKT13$ZiHem(Sd^027 z_8LWgFzenpu+m)s=2-Z2(rDDZnuR}0d<{FrB2B4bNd=Vpv#$!+^IsXEg?luYZNL|G z-x`0_j3t~7qkNis3yT3BPBuz3_Ol|~YNE*!mu>zybd32*d{JTP=iXNgHpQj=N0!hp zmKMg%Wyh~EMT@24w0w7}mYIx>Cfc3O?jBG%T0k()0l$q^4*QN&FD zixX{!n(Zs&Iq(rHP`G^Yz(xZe&0lm(!$RcgVx>agw5bR!Dp(~%584w4)+O3m2YQe% zw6q<_uP#^r<=xO_MsyH%RAIoHU=Y|>Cc*NTnGM=9oTA2#(R_m~m#ZP^tIp523+Wm2 zqW{8Jzz&%Jh2PWSCh(x0^D;!y`&(84Lg2EK=vDBw!pi1l%2FtuMEa=EcFZez;|M?eoL*sdb43Nk7wZ8I}e}b#M|o7rykA%KfPO#(cPg+=hPQaubtAOR|pG|@(ueZ7!2pz zPu8j!RYaXzDi;y?MQD|ZXl%+4Ud%482%D>c1}0n;OM9DExmSy^H59eZF%@~{a@5i# zRF=@Erz3B35w%*ji>Blo#h!435Tzr}z=R(n-y7E()qz0-rnHx6F~YdA9do^rPzAz- za@;DZ>a~9it`ou>)7Zwdk+d_vp?0Tnvb}MNW}ABv)doVMSlTrdD7hFqvnfH^nzct> ziK)Yp6OE(2kZ+G#9vw9W)RtoT<2c%yqUjq2_DpmlIR*O-*H)A6OGpx!h~Ahd56!;v zMisujj;ssVBidlMJ|$VqVhMW#b~ozWDWK}?49IUD&hKs-&f0t-V5d47jZ`B8it_M2 zcqHP4n_9f#tGvy6R69+}+|NNZyzyNM z-7U~a92i6U?8q!@YFfgodyY2qHoFfHh-!J{fq#QQG?x?KA`e8hJRYEMb%(qa2cn9y zR@gwk9IYJ$qEh|-MPY&RK-4rg1QtA!9wr|Jq7~9Wbc$w0lp$=lDcR;s}6^>Yd9R#I!TQ_ ze$Q>W%3Taq_|}At+Tm8LavUuaqxbW?H{`9bp_wT0Qy`fA%0MAt)EX3v;(oyi-asZI zk41^~R)`~4Esudv6dOMZFJlLXq7b!C--f*Ixft(GC28IOifXQd09 z@~t7iCSV-|U&{R6tF6grPe4o@tOkE=Ts#j)%7F20AOA1hDvgvKMbX&JBgx^F^T3sY z+m?-I=@Xngw)Q5Aso_sDzm{DLN!!3!Ac!9n=HN9%v<`$hJ^8QW3S(&}N3ettK<&4o z`@Y9JwBJDLgTkMUZe{X>D7Tf&=-$jxdts%+64y=7;^;se5lK7x{;)6ZM8}q1kv5Qs zA*=ns)siK$vZNPz6(Z^N)Yy!YM|g`oO@w$(7W$&(@gLGeX+l^bs`}XUB7*jL2c)3u zs?z>0*(6d>X<|xv6%HjHVp5whU8;edWns`{O?TlM5ASa6ExJkhyTOB6x;d+-2ZzU9+{cdNRU&^T+(gy+0}AOuQMw@O$!1+@;^kT$V2mQ5r1wP!0+SpcRFnUkq0m z^AEW)7F3#*p$V0Sg%%)1NFF zMW%RmBd#h0+e5%v`mnu3k+BuW1h5lx0)Z0TuBrV%46XOh22MQW?=^k((NdfCJP*4F zkt*Q51#P@Us&IW2wmV#c`FGYh%HWqT-ibXr&fG7{H-B80A<}D{ic1R_kb|L+v5;>I z%I~#23)_aOto}k21X!~0=F5Tr5wF;47VdmYX27#!JJ)9x(r9NrKB zZqcI9Ic6rjOhdkC=Rdf=WL3V|-70v?^%z>nXXJ^+)VxzR^x8p@C^&B+h(S1SM50hBkVm4Ba-~V;Ls~;3(wcu-F7hJHVhBWKMn{xx z(3b8Gfhe>N3PfR6&c@JALLjQhaF7S0M8%G%&Ebljd}5EhBBLVQq<3US_7_w87LqdWqhBy>*;?_8B@fBG?5z-o2K98b19LEjG=jDd`mwaBGp8Mp?^uH@h{+-{Z zE$)t>(V^^UAx$;`y=g*zW z68N9|Tgj50J=|;8!X=%34P8~q634sMFI^sZ_IS)a7zf8?daH$5K9GY?s_4u3W|3si z<5qui!Uqzy^IO;2Gf`*6SRYQR& z1olJMiaxUSB1x`2DJGOmG1V7f*G@`+m!h3aCqkI4=-oPR7fD~MG_)T6%vwY$3BIyI zA9WAKSLWkOu!{?VSx6LHO}T(*D*r}6LTq@J6X+@xd$Caj8Wt*4lDtAmu(809K~Yla zQ0pg;q*k3fAiu=%c(Nihdkm?5^|US}BnBr+K{iSkGF$T(f-Fy>q0PbS+!giqj*9Ar9LDj_Ig)nfa){^v}TSVY$Eoy~n zNa%+6Qzi}Q3S>mO!p_|llzb2+L+GWR8j8#`GG8xo8HY?LL^{YaQYppzGMXAlFQij* zaAicjl9eB8$g4^w7HlS`*!GgF!OM~o5>#c1#@%kkdLA$Y-0e9Lo^fZAdXVi%=p|Ul87Q8H|A}dDOx%$`b~1tOscg`{6kwpz=K_@F6D zjQ}qTw#YT;Z|_v8X|ND~=zB`CPMGWc;)O!LHushtK*`#at@mm%x8}l7p?vAeF>@DZ z8VUqE$?BQLg5blbd5(sw?^<`^DzbGda1cEvc_o_){O{h%Ch6a3;VbEkASoYm0l6o+ zRwM>}F8zF}!DI|8lrB>kHz)|a2bOgkS}7FbWVtgX~wmR}{soFymNPI1kJ zgkQyauOhR%Lnne)qHG2J* zbr>XUCJzj0&N$ai>s`eS`TBxZJ%A~eXfea`$t8bsZ5^m68kgq#L;agF{P;oUmC@zgjZMMe`fiP3si(0j0HLEjeK|Ofo!9 zS3HQyfDv`iBCdn-a|9%>TyjFo6jxNoY$18s!933WK(eL>MhH1Aq#HXmnW+ATyEpfb z5Kbo#h-jmUWEVEef#Z~sZ7~0~)~>$mBkFpz zn5a06ozo<1*IFJdFbCH*cbR~_0ZEYcE9h(CtY6UGv^-+-#ekg(X#6LT*8=w-8-H%O zZ2ZA)Bs6|I2N+NmEXI3U%)C}Ila)tO=Kjfys9U4O?9hhuXTvFkYfu!lj&@eI{;X~! z2+2Ttr_(Jrtyidvv9wxjzV6) zuU}#j{0pcLIn91$>t{jWz4nt6@&Q=8QW9kln(UXb>4HWa|Cp+T)zav!^e>7&g(a37;NeAn~qI4j1YIvnoZF!orm8!KV+dHw1QxSOK+sYec-aPw0) zJb27{3Zt!0`mk3h07(uW+vw((U~u?YNCpzcMw78={ldB!&e+8u{xkZGt|Ks_DzQkv zq2-zIT$F>58#0mhv}W{B7qQY3B(B(F2{I6(LC|rkZ@Q5AV=GJ4gsGO@JbR zPZ0lDt6mXjY}#_ZxGQN&L4O#X+x7gA6E4nIT{aTc0PJ55ID z&Bee313yGd59GT*VEyy~_TE!W=yL5hQhbn_pFVequ%7#%Z6dlAB)I-PYwHdXe&g-KJDran- z6TKedR@_=xSu`Jtydd|+#jFxkL1l2@MXOefMHSSd`5~dGb&e@A6!kO-l`kwC4sojp z_E|nUhb)?(l6*`A_KgatVCkSa6z;$RB32H>twr;GOkofxe;j2C6oIvSN>+ z7!Aw3xceS*L^0ey?O6$DVCtsoE60pNPx*HsIyGD55Z@g+(L zi11A!0pt(Fh$wP$A$j%e3=B#q>F?U50Kq|1b;NwV`iyTD2d}O}x&H&tuDHYgeRfNV zwxIZe`FI@3>k1CQeo{r@+h8K81$7ZR6#W+M*OIf1fHhGrNzqVXX^yov)$B3?z4a4<6hOF?-A$% z6nf29S)Kx@n<^oR$BZl%D-cS8LB(h(Fw+zuy55TNAyh+^gm+h^bL#+bzt_V%oSWC7 zlNh>l6-ghb|AN*JBsD$cD zlu$`A9`Nm6D4~+nU+PkwAoxTj)WMH?c(-;a=%W%U**edORF6)+1S4%-p@d3O{}x6a zunr<3WdTt_CB&e!rgo<0!0wWOEz!4;ZSH51e7{3yv#U<1Taj7D- zE`5Tm$Qw$i3i{!^6JOX-1e_m3;0VZj6yrY_)!T}#rot3l*B*@ z)fJaeBZPiKlQLWll%nub_nbb3>Qu4?{8>l+zA1 zTbyDcc+Zga<_(!_4DzBw@;8*UpjNPNoatio_M$n+^ccuObp`< zDBEG91iXPZJ}X0b0|bZK&c-+d1c&P5_I-rgss?rliUWB)ALsQ_;14>X`C7>q%H7F| z93w9xe zo)I-62FmNh&xxYbKiSaH;XUN_#IY)nt^je*GWyS(Pml600qP7WN`$TpjJNS^E$fLt0 z`I*J{ItUjq$1>@Q6AR+m4GYle?!e>>AhYl(8&)e(-wi36x+&#`j}zZy1nTw&49!)*;Sxo!0;XzLgLAnwg%Qs)1m+j4TOTU*-e zGiCeDuLORq>YCZooM6rQT*P&`6F{atJ5;&X#pUu9rP_#;0gjnuK?e7?&azBgc-l{KKG zP*<fn`h~7Mr|{@EF8$L2-+gNV05r~YI^sb zCBwGCnM>iQC(G!YFIcp@d+E>I5ghotS`&bAyoWvCFn05Wp!OHPsRh}z7oj)Je<>Jwavg;i;;QWw?y4JZmDw=KMc1=k)9p;>Z;MofjtL&^LRSa7hC?$W z8^g!po)m?S(J)Xl9;gDS+!YO!toHJ=mh-j#C{THOor^G z4YSbVa&$e)mTsokk>R)^Dqyv9&N28^SY!B+{ipi6yQb7dZ7Ni;2x=_^WrmV14zFz8 z1e0q1%p+^Ynwo!oEH__#sJ+DEiANB9&HjpQYj=NSnw>1nnnsjo76_Bo-k#;d+mhp~$BSVuWIl!?)( zZfv*KE-TM#)kb5j9dWrj507=bb@)iF{x;Ur!bcXjIySG3yZQJh|9~o^Qtca&#$jQc zxVH@ekJ5g=;qj&mEqUj(Z}=LA^fE{Ej{Ko)-2S)aeG5k{>X}q_JZjS{RSU^E=UmqP zLZ7Gnt-%LoslM>Ft;o2qG9uyS`0TN19__HJI>j|#YRGxAKeWOuA!>Yg_Y&<#EueX` z%hf3_(JI<({qyyjm*b|QVb0tfoJPBaOzb7oEH)z)s)%ZkOYHUNISt2_AOc5AN?<+41ss!+_qiwq%BHDmjloy`$py23EgFj9vuQ#9bvgNm1$L;r(tr93t_F5&_R<@+lhij&G#NDC)MedQ= z4v8jy8xO>&OsS{e-_WmF-Y~b`nA`FU{@1(unDTMYm4bJ-hUEnxDOAod=5BB_h+Z*r z(wQ3lQq7C^{C;=o{WGoXNXZ1$Q^|xxlZEW>7pN@mqTlECM#4YLhJOfMt6tolI%5&L z(qoxm?S6K`bd}8LrM*{IXC7QSa?*(!{WY5FOZ{KdpJ?(u`+FLa-`ATxz?@klGQZBU(Lwui#*z` z5zsHpw~+YTWZued)wo`(7q+8AIrGid<9`MQKRMN(1o;&MVcQ0q`Z zdfOob{|A+3z0Gt7t2@H!GbIx=Zmyt)1s{xw%`?yU-Sx-W^7`tIDKB~-(U(Lv(+u{` zwd(Fr)0kJe%4bhjd415wOV3j;hA3Z&TVy|Ze@*4laSrdR+V(t3PJXODw;7x%Ioswck3t&+I?> zW2MR;?5;%hn=O-hT+JB^f-9Q3-=9iz4?4Cn;b?=={CS0s%|I8&+1r2X?6T&&CvzWG zuWjF%Z4F|~x1StSQ#pDp664C_sBPaxy&vt+{V@O0rq-Ha@A_+og+0t8Z#Zyj zbhdS-asE@aU5DI9KiSe@w~xK{NkQC<8KOVt_57%3nBkS*d&TtHq&;3RS4vCIgAfTw zh?ez1t4D49v|ZACb5)e5VCO8Qr3X};r;mbpd{S9wxpnH)=u8{!!sc4t-9^UT9l>hz zD&NdGA5)&aNHY1>swj8SPHUy5-$QTF<=GauHf#xcJ96t(WB83qWb<;}z17ndB}RLB zto;~JW{^lP z%@rC?mVVqQr1Lqs!8XYX8t?vCAYdUHY+=SA5{-c~=eU$;s1C!Ou= zwP!$#X{oGHm1{>hypQ8w;#E_U!+y6W-(R5a+RCMDPh6OiYTMc-9F>CC%oHmQrLNeHLhLfRBo=I9A5Eo zqfpIf&nhq~_?J09{vP?<;&*aZtX0jv4PHfhy5pDg;-V*JH#7#_D|l=csk3i|R9okogFCn`BlPpI|O{dGl= zV3kX6gXHt>#?EEb zndPVF$L3!OJfC1})17zx zG#>4(Q|s;RfsPQSA5rJ&PI`_3sdrl5q}bkZ!xwj{DiXqLU+UiHHMEll&qf^Cu7 z{)UYa+hVlyoXR7c_*>aM^HuB5YFjg#BDP)7W-V$eD9!KWuF;#;n7;cbrg?KjCV$$- z`8kSXV(@?RIi=G?y9%Q|>{dOqC#2wVg6ip0AvN{Gbo?*fj(Xy9M={9u$L`+P?E=-k zZ&$4k7pShM>@b>J6@5;%ev?kf`sa$5u1~KqUC>of`qI2xYjJDj`*9Wr0LOHyc3A1OLR z;w7uPZhTJFU2UOIn5Uwkyc!x+cuh;-5f%3)6&|z4TCHBEBErR}bfn|kZM_#K8!6>8 zIl7A~FC5c#54BQKU*IkXrzu_g{*Z2-6O~u}hnM98X9M?8dnI*!kBtHLN>$3}Khcl0 zv0FWlxktlOUXgOc6;go4Y(qaI(gbq{63TV}8WI7*L(&j9R=+L<3G zxWD%pol-SJ;JQxf(Zd-V1J){4-Ix*lykOXBixC-4PP``Z=p0)og{G3xA)z5kRW=rd zoyydb(N;`>yF$~qR-!ZRyrxlBIqQc}F6{q>X>L`x&5i1Bi2sw<8)WX%G%=nuQq zoGy)0IQs1<`;()1$um7$f1K=nJxFu+q( z>vpgySIt^lKRxd#r=}jR+-tFz7j!K+zG7?Nsl|2~PHcrTn-teSd6clH>fbni%jQ*I zqu#jRE*Stshb-|1u5cy@&76#myDC{;Bln&|G%FpGtN*M`|wD!w)v{ zLhE5#=CK3nm8!hvZ47t?%Kt8-^Q>M;)R-LG5MC2+jOa`V%)HOW=lAv2203T+x>>fW zF6~pAvCFLPRGZ#2s>`NHzx_DM`d}PW;7U<$ieuJH`@y}i)Wf>_x5cpv?^T6NbFa4C z0;Ya<&BEcz&t3JE?e+^{R;(X5|I7=uR94U1t7C33f8+d-%43x02j5TBKWR2Q!->y3 zuw-nGEnlH&_1KV5x^k7xoWjnB`XxnUnSxZ_63f&&g<*k<<`r%${r*JXDYuvpyVdni zoXByS@#yMj$v3yQ4I93=Yw`TT&Pl^dqQ1?sJyAExIB?N|!czES{U7QVbWX7Y7ey*; z8=hQp`*M!@nLVe2#}r(yI|sc4 z6qZ_Ct~=>8^Tr};9Z|s+4Z3aGFTP|0v*GN*4S!M%)&?!faJmUAgKnEqyKRy|9{R)J z9J43xTuo^VHNDzGXGNRRD*E_Z8;-%zH;0+Q8BX^V%Knv|lNy`vb_kxo&#M-A**w1X z$URh~tgio~|AL~X1e*}}qsnGoMrW--$x9oi;6>ei6FaJ$SRKQ^Zz`FN)BE&tXJhF9~i05D;O;od#AtsN&dpfEgd&y||& zMOSmLK-D?YFhSAI(dGjWRh{1{+esF+ygLJ@ajh|Rald!>mS@;8(c#^`{2E=wy%-LW z;Yd>S$tqx@!@H=$()^|o&k(Lc%ruLR%v{6~?DU!Vb5Tvb-42WGlY%NW#~T?gsd-~T zRXoHP-x{~oMg{U0vzYw7UWG=Gi{)6GM4>l3so0IVopWUWDzb5c;)K?Y1Wi=H9&eo5 z$=J|%=JlGxzOi)z&3SuD@N1LNYoDXnj=QtbJSDOrf5D2@171)znC#J&->CH*VIuA^ z15*oC9vb7iUwTH2l8Fyg!^kH06dkhd-96CB$==xJG5166!-4eujpn}>s{CMrFiS5T z@FAXBGwZzOq*T?_t!EFJAn@7JNe+8hFK59qE~_Y16l*YJ4XQuyuPX0TGWCH&wHCIA zU9x}8+z+~@^cU?Wo%W_rmS&%YgLF63dr_0SYffsthied=JG z0!P*R91j|961fdmMewYfn}Tb7`WlqVplmlXu05`}#v?qFU08$pgTewbz0d`>N*I!H{Sem`fX5ZZuxDG&|g$d7lgv#)^Jke z45&Ns!#f;xI?Bb1xcxKHjGc~a9@B|utaGFJJD6T`JY&Na?h=Iv#aWh13EfF zI|dy4?bh9OVXphar$v_=Ep+rZnOlp$J2c9_0u0B?A({1RmgHmBcG2#3_Ar~h1{iN_ zC+wljNb7)Wg)>rB_ln$ZsG*~Xlwr>$!k~#|0C=g`{XsZv@(B}s8!~5@jg?s_GFG!q z=8nRcUq&O?-O`y`UD|FRfVpnn-5#e{YjO19XnOyqId-@92k$2r|M^q%_>r5;0oXR& z3Kh$jdT(_ZR(zm;DQ8%G`$#xMNQh3K*#uT;bs0XZh^8UYGt`n|3O6Vg@{?MRuD@V) zc=;T0*J+IdITy#rx3j5t6TZQR13n=9Y%KijRMmqbH?R2HGeGBKEBZWXXf9G#oSIizuAYeoSmVN2~a$BI(g z=n$Xj*NZ2LCVcenH2Uo{oCB7}w+r-~bKbr(UYuLb$oJ)qL9Qcm%soY)$AS;9jQw+K z7>4TUPH$WcP0}58oH6C1!ZJ838A1=|$e_`$iIJ4+i@8jB^ zN+jvs>2OK~H!9Xf2=Vb5I#jFEr8-ZCb3C|Fp~-ZxffGA`-@<3sEGqy9hQJMQ{EW`= zaBKJ_tB_!_`Zz9Z#VXb&)QHU;{%|4)Tw<+n$kzCR7;|eV3Beo2xpLM50uD}L!6i?2 zt-xn{lWa)Ja9o()PqIF379rk#0Zy6pBR+JAgKi2H^lyG+wRl;CaMjei2pXpHmWPR@3793p8EZ&~1u9 zKzjwk5$4kinFvc4Z=wX4O}M`V&^#&XRoaU12+%4=a-z3alM(u|)y`C%8Mcn3Ud^$E zv5~EBYoH@YFXAXrlbMI%w&*Ajq4ogL1~`3FK{r0yM@NCrfU^b;48iNmTG4?&AVrDR z3urQijuT&(l1`*_^u$EMS?Yd(&0(}IlG~8LQJ~Qv90irYQJ^^^a1^o`#=uua*$iVD z@kxESF7@hK1@ZQWG%Is{dr37VK0naX>gfBn^xYLMfdH^m^4#X`oh@uQ1h@0ns}(<# zNa8H+gXT)Kyn8>6cWvv3dtFjN4Q=Xj0f@4K_I5a57yy<5AhS3GPm!E1ou3j1NHqf7 z1CTU1xCcSf02T*M70`5Ya8G|Tqhsb4R>HO$E=}9-ozrij03znzbcDH^{eZx}04A>m z;cE8BL;(zK94G3W{?SB`guBV6qo~m!Qd}nwfQ_OObk;qsEo0o$H0Ec@NL6# z?byg7y4BW@fr;+U&I8C8?iRpIc&RaJOF6VKp8(YH+Mpy*4LWoOVBcv^9c|Px5Xx;> z;3tJpA@JG19Tqsy{gzrD*-@< z(G)Ti+!Hq7wPpjF;+%f?89-CS9c%0tVZaGroChE8Lm*H8ym#=wo|fcLeJcQJr(>UOO@D3q#5Xpc!oUbPR471T=%;Kr03} z41tINF9{!CNRz)%r2l$3Z7mbG0zwV`U25MhVH98}VGtM6*keEMh&hHXq#>Z0?0Kg_ zy%4SVLfQ~L>Dz>f;JyI^T}a~#*A&f%3u$NdhwCuhoPqWaV5DCGr7aX9NxsDUEfgad zErIvLj>1-x!3mVLB2X**YOreY?Eywb-#{zH6oF#ltPMd?i3x_u@kC&}k;JsCG75F# zi|4cQ(ELy=5S$khoI&IKnzme634z+<3a`8^obNzyI0S!Q3nbQ~3^>9=GH&y_lhF8E~FdbJ5Z;W9G-!On} zLwF*0rfAcL4zp;XB-qA)cLb zQl?jY(PYq_4FYn9uuJI9hC&kDXn_ksms+bN*RJ)4UazXEA~TKR67#P0Wz|-@v|UnW z;;X$<92X8msR&S}jIZ`G0f{CJIkhd(odt9|ObRF?0#Q~{8F61iyX_%KUz_4Ob;lV? z2nz}P8KQd`{J6FyTqc9d5^$MpFb?0vrpYV_1ZNC857Y0S5mR9hW7$Q-?pAAH! zmR2D<$m*B799~Lsb2t(uaC1X|a1e>=j6@7G%x)Bk%3ziRpi+u7`vOpj0A5~S0xI#X z6d7P^AQA5Z*Hm|kftie@c`6a$#ve+S|VC+S}`bLDM+s0eq- z{sQR*ZybT?W#o`vHMsDMadQaL>rUY2q-eUy)|Pl5mbL<#Zf1kKcS%avX;uF#aA}6W{aaibx@s#E09*Mh( z#D!R3Nv`FVMX<%Ul$FLxbV)ZUjGMKc{&0l@&^SM?`m` zfv}puh!fu;X9ok?6~zCC$Y1!~GWx1I#C@U8$Ob|dc-YWH#%~mB2_zq4<^OD$`5MFe z(Foh-mh%XNo+7$VE_Z0BWWEKxzmdlLf9A0Qn9K3YML8P&tAD z4PdGvkc}8$WSmzZq#dH_g6scMAu$6PA*8MKfRKo*3+4{icrdUD;knahbbBl* zqz>0XwjspuUSd||lv0TE1vol@`6@%MUsZZrDX`2envMw#t+{cu{vF1ARBFR2o1O!7 zhd@wh$`47A8W{9mhfu7#Ea5ZJ^)AHLhB@3~EmtGH!y(gT>1(baRH0e~26(#oRbN~T|D>9r)MbRx@hJjlM(+T)k#7Vd8TW=9RQKT+Oh{WL-l@P-WuP%aHFNG`tWAjp&hvP>kYL57*`pHL488o&uKuq-|qSC009F@SxQzrwfBD%wZ*F7qY zA~=0KVueECC|rYptr|+Ba4P~q>Z#6-z(b0OUgexAcQhD}3AQkB^4SERM0f!es0AS$ zjiI5^DDdwEWfdf$>=1ThmRMDle_{jV%RoOP63VDNFU#6y&Z zu7M=bVg>wS@uZ1?8g>~+N-u{=Z6awt9H53BL@l4k>h$@Sz}?7Pb+0EKUqNsxH4;fz0OL z4T}qGvAZQ*lD_s`@cqaP%MIKefH<*}_}Hswg1S`b6;;5Bv-(OWzAc5WDGg!8 zLCzZYLR?;ga1nEfpj8=MtB5=i1rGGTbe#lI?Db57C>Ad)mLn!H#*z%IaOvfsLHuX` z6>rsGvTjV|^;gns$dkgo=Kw((M1K&M)Ic^2F#bWC($}=r4P3gL*=jF-fIDW0;Sf>l zs>_!nA}^)%bfPUqOJg9t1-C1uP{VHde+HX4Khc`Y(uHe*?nEV2Ext24(SMzt_0cVs zRwcmkdn(%V3KZ0V<5vgYty5`GL1`8*P?6ty-XBW8QrhoZ`T2@O%#i%?Q?ZyD{`!*0 z^L$|6sZlTX%wq|kRAW|ahym~&vlhr8zo0Xh5yncV3AUlZgt0@f#|_HT2dK;mf-U(z z{w2W{RDGouhwgRpYyw~kWJv=I2;B)J;z7Jw5y?MFXmGbuZ;hiABVJdvB6{}w-OGH2 zUI)a_zB2tmZp!GQ+`lVRNa$fbdd*c$7KcAvna_@|D^I-SA_?!0wA+vmpRAF&P(+~( zxFv?sP#20=xX0UwJb`g=kPDTye#y|a8}^(nTI1=yLm9eck3%N|1ckUDfO7DgUodoy zDoQ#EG>6vsrGsb=zuF5(jBrvM7}j8#LoH|pj@x)(1$L4gg9Jtze9BT&>md#Xv+AOJ z5~@%dz}WDQgwXvEecE%R{KU0OHGu3LMH|6WnPr@@Ta?K=y7Bk!HAIx;v`v;Oz_0xqY`N=!61!z|DoowQ{)Y7$Gy>-aP&U9r%#aTe_I^a!7(?qWjU_X-4o=}! zHQl1X@(a_YUn@ZAH%cYj7ZnZWkd$TR1aC7g6$0P>f5k*S#D}8FMgvgw613-1e#Wl+ zA}RSjrZPv|_kdL!m>;O@481Ljrvcb0d$A9dG>;wdq7#M?rOUi1;($iA2N`2KxHPyJ zE3e5677@4p10_1KBTB!?fD9IwDWt?|gcoJUcN+0i*EN{yQ5!5ru7v^s!mUNajx!cOHdk~m&C_AqLRjdKO6~&(>Jtu>Pe+t}M zNUfTTjn@w{8#wxt887U6$VPGU4let^_q5>o%AIl!V#@DAp(8BiyR5BJu@wIR@Kca4Sg8wcOrk?CbHQzB6-sOH260?%Pj zi;U;+mT1|9fQg7Ae&DMIANHw#`92x%x72zF-tScV-|@(R=dkPjzHacLog<(YcXrk7 zmV8=Io9eZ^zJp`wwJ*P*zxMFx?f~+C0G%R+ZImFVEJO_2p5U(>Y%+o5x)GBirgV-L zMYmlUR_FmA&_IY&D2V)S899ux`3vhvdWuP9y@cloB zZyR$QpMcDs;Btl~=fwCtnJrtkw9FFaH74 zwq!Mg2XHL{CK==tH2dD}P={JxU4yK_d2%!Po zwI&0Kpu`yoB013V=st59N*(}-oJMbhupJSPh6B9-!Pxx(*bAWuDrY&661L+B`WwP_ zIm-d6$b-WImV;oZG0Va@RK7(N@B@6+=m_T172OJplt|jQ2q_9Lgy`zwPt6oO8t8U@Xd);k{F51N+mnm-}hGrd{MvhA@hHLuAm z`qhTO8A~y9cgSf@{PqUw6y6+Nzvg8!@-7eZ**-r>Zn zNOs}{8$7U6boXCDB(Q(FTLCHg3{34y^Z*6cXZFCkg~+v0G>Z-x6i_s4I#7E+W&(=E zRN%Pw0GwME8}dtgGsaf;2O!4k+bw0kOFrvy14K&bs|7>oueGE^tW#~Ibk^vr1q7XS zEqt}WOiIsMbWTFlt|mUMu&Zj+k*4gN+71UXEzE5t}!ZNihvK{%C;)pq^xB zN?(*gO;AxZ^~*9S=AlKhKb zSktJ?C_hbtn!p99HO1w!5i#;e3xcNPRwUwzl~zyp$0(vS4IKl0`PnN;752K)KwAF& z0Kykz02-vnNE+!({JV+(_C`c0bnu5?hLl3_H?RIu3YAfuV-vuipunY2`0&faK_7mR ztw%&$(hG6K|Jk3;avt*OEa2gZMxV}FIf~)kJ@o|@uuPV~w&mshB3y;L>(j@VO-)bp zPuWSjIwfJd`ugAZl(l5pNsJHY-{PK#pAmQ1T4#8LA?<-@P&$-kRs-^2E)bzT4O}gB zS^)GubCqZifS-Vx!X)^%#cuBg1xz8kh@61F8${9v02lbZ79jluYy_|}VU$u5(6M4v zuatuqBahz5!N>p>28i$=T3Les6>;YRr>ipiaw~wJRLlM=@KfdgZ1B_57Ax+Vke;Zu zz`AN_FjyW??QZ_=JWLnsvjsr;naVQoyQLMPiv1FZ zq{H~|DML{pKwpP3i4X(u37s~{c(cUlwCV3~OM&JQ__T?s3uIhxEP!%WgV}oKA}MB% z0<%A`yOgycLhKkF4SzX8fGmScr7T3PQrfT;0Nn=&J~}1CuLNl^3Al{FYaNEyh4eGX z>Mm{%vRtK1UQ$dWAPv7x<@_bg>wg8$w#SnHl4twOj{i$}wj0iW z$ zcB*?(;>>KC?-R+**`tO#UB9Zkr2P4LgAZ3pujofg63S=_Nm_HfT}Ny+hmXNG8(R9o zHG_%~sd|=f@TJVFbG+}Vl~|2@VdH-8v)y+G8Z;S+8nNt4>|*0NzXH}vi?LABxgnb~ z>vgQ{Rv)Xja%AuRec zDPhmdTR(L!WK)*hPt1~7e(nm5vfIElrN`egk;c(mQKJnZL+tTHJBPfwUDQfk{jEI!VFMLh&#&7aNUSw_=Ntu%FK z@lqVD()(>$NzauT6TYDr!uKgoh5q^t(Y~HVeXcdod}IbI=`4Geb03)@Jja<8c5*nq zaFjU7x7)|h3jIK7j}l|^VfL(>(X^aY(XvT)l}ZfV1F^3vwHU%H9Mp`ZyaeJ(rM#js zNJ{uRBNR=XB}-UI8&r(>BgfEd`=V**xdGmI3biyDn&()iFjDkl1xRW&JRWy((x3S@`gG1bBQcm~Zh=T?Du>cChW;y9gcw;w zFq@U6p~(;>0_I9Ko=^LA3pb?1(u{su=hAGH>C3K^smccQ?|f~mJ@rH!4!JD1LGTngj%jJ9u3V$6flQU6|-x`hvWot!uvo+#@k)uI@=sAg?feoNo(7;A` zJxrH;MhUGWA*EV}UlSUDp8c&^JY^p3HiZ!)(V-W+Seek>HsN=Mh&V`m`CMO46e;Dh zWphopqSq4obz)QU=NKiWpVXii+QT|?5k*(qiIW~(ysL{e&r^k!6oie#YzCffY#KQ* zNDU>1d_=@F$wu@aOcR)$p*o)pW0l#_C79zolKuvlWv2AV{oPN)sSfm7b5PgCW=kvy zsEaj{#Y+`Mcj>`2EzjV%fo`f`I&Ld7%4_bwhKU@&p1D}{8#g{e;GY!V|Yff>Ud z`g)Ptz}g(rL6!!WO}R#g*~*6xxI~TpVRx_&XV#jhE7Z{HE|j_A&oNZ6kOA8x{HuE* zVR>j$W$x7unNo{Jeo$#%#lf!9dO3ogNgLplCt>rEalG#5_J0s-f_EUX}@A#xs@18vIxFJlfIFUw;}-FNQazA@92DyQPImdH$kh z4jaHLj+#u5&je3A4xY_iT$JQ*#rm+b)@AuG;3dH=>=r2jIh5=Nc2MPoF~nzrv)qnl z2j{-`^*ZEfd9$V%WN`x+&-_hOHp>2!yiB(8_ z^e7bmUkYvDY4BO7=Ug^y-)M^yEAn3@gK|C2aVQBrPO*T}-KoTw{d95>TDG&CS)%Bj zu-i)?e+rdB=uj%2td-a&QERjYeiq!wX>e!YtHJME(F+yQXWFuOJ<1ROTxN=_wiG3; z-AF^tw}_3w4~zynR;3qL+rzSX_ayw;IFVAdU18G0i}00NP*swa5<^tb@QVh&CLCJx zZDBVdT60`cD=cW)CQdIDTd;U_pa2U~_%`ze_&=2Mg;ae*dVF3%61Z+&Rb-fXH5qS7 zeto54h5tymNaI!DDt-mOqzJ!l4TT-85RCg_J_HLO3=bTD|A}_+0UPrNgeg|x(O5O8 z70+ZAOsQ-p8}XcR3zE7$gyJOnde}fkRu*)S-Fd(Nzp)4SdRGuwo6o~on%VL8+pwTp zlG(FXJzW92j3K>PRf8|cDjRKxT&rALSU|xb0Ryot($T=Q<^+MQAqgiyxI)Oy0zVIf zmWF7=p1~ZL1~l^iE*FXAk8DbU%g?o?Jlf;YtaDEu!M+DWMy6><3{wK3&*$VA_%bQX z1Gs?@m(qc5U^a`NiL6ZjANJlnuBodF7iJzs2w*@_0udB70!}DaMu}n_z^XM`gfLib z9YEBIg3KryltC)iqM){F>p*Zu!4PB!qM&s^MP(Khl^FsA@~yp3MznqV-tXS;-tYIj zf3<8+_SwVQ&tA{7*51eK#aGGjHR!}jw#sFdg>@Zk<1EikM#G|VS!3aiA@BXyMsYOB z%*dSUs*mQZ0dBPMi4ExDJo=@wBCV{czpShIyIsB2mBOA~yF+*Phurf1l>VlNKW}jm z=j?(vr^h|_c^vEM+SE2cn!)Xv|2Uw_r%>&dif58`CUd5u){f>m!HR}2;Uo2Z*CRS~ zP;r2=qTy_#CFr z7jr8@;#?*y|5`=Q_A)iAHv3l!jfU*y3r;#HS%J&CWrVYfb!3Vz+1Xx|W{~vO=&r(A zgbJb;%GPi~K`U4>b)#8iuoh#SS(~e3>J#DZ*82W4m#Un$Y*MiFC#3}D1}RT%$=uZp%`$@b1K=q6#so@8riwDOx1H<$JF}@ zmi2d1<~UtZNIffeMMlVyXqSSpKbWcFrr(;&{Xq=hB(+fO-mApNyQ5W3QNcPsjaI6ub?s zW0(aPCRoQX%FfYoN>&WCjy;1ol6f*KRa3LdK>(ClGiWs6`#@3aM{Srtv(l1LnVHwh z$HGj~jTJR`vW= zcnpmx5)xlKV*)MXTNyNfq^9nMI-jJr}Wx zfeaJ1lk0kH{@^@V9@4tL@ZK*rA1xU(m@Grusm#_4HO*4g`d%}$u&GST)AKttubS{D^8~i&0W@*nt;geKVw@T2L5w7VJ5f(z35muR zCKheuxTg%ONF{|6k|pG0v_C0evqU=3ro#XM2Kxvre_$_+RmsuN_=%O2PD)+ie5DGN zZyQ$u%o5nRH)7+e$jxwKE*OmZ3pN>T{0~45uzNdak;FUNgIoYCG=Q@NenxAgW$)TM zNqoT?RQ!jln~YoI?#Q3`Kg|B$CZ?Gz&IuoQ3Om!0=?(S$D^e@I6SQB?PYKDz{29~g zz(*S359*YjF*)qE<4#KYJVrDyYB6h90r&DV5-v1O4p|>%xwKbtVf(pQOJi5YrCrxR z0stD`{tkS?H6SMx=zA@ZY6z(K;VWq|BJIeteFR?XM3cjXXI@MKR!cgZP!MsK%GEFY z&75JuNP&0%gNQJ_AmvH!;;}TBMWdoYsgQpw9M{pD+umz*CnanePf9nN3v}~kd2y?< z3^D#2#wE{+ZTjwH7U(~P?~wvaC>eD)^BQJW)N3-qSjf)5P7x@BwzHq;tXT;Q`?7DF77+SCG(A)KYLpv6g~VjX;9a z1La#_ZTp|exJ2wg{+_s%gdTxfDH;Q;7Kro`tQHV@$$%3mb4ly5G6yW(D8qYL^HshUUIYlnUag77Q!b==9jwog#n*HMbvY#arMG`i(i4GG?3we6P5i5Ikm!M9>OLwE8$atYLxjf)(47FmfRG@!`6V zwcI3u6kg@0POPoMuvC-7^-$;0DwuX;s&72d!+V3$H2{Kw!JZH#7e@H-yA}&?JWOp~ z7lVK-YFxzIDv(!e<>ZL)6+7_!qAHB7mI`i&X#vW=2)`6B?Z?xvm9oN=&Y=J;0>hPESI)eLDBL>=ltH3(6#rqQH&A>S13&*)dJPB&h>Kvg2E7fr*ibKQ-h)YJ@t!8; z@;7AW2e!c+-vz`ROZAfibs9GfFgPJl35A?{&+L6*%cYrY`l76c5k*Yhgp|I)npTG+>lYzxyCDMbA` zj-j9ZgZmtCA#e6?168#YJU-Aw5pu0}$A8a02Ein6YsOTFTkWwNNtxHsdqVZF+h@uu zeQq80Q9&Z0fkdznNd!3j6@tQFJ?}tzZHJk7n7i13w(l9}t#BrC>2tP)qoRovM`2|n zpP3GVDcn#0w-tfsT)G}1asX`<@@6mHTC$GDNJ-NM!FBEGD5Q$liG0){8WTiNP|RtF z?ig*3Wv-!XJ!vBf^AJWE@sOf6hVV+cNnz)GHGc%YJJGZ;-^M;Orr2g{41MK|VPSc~Ve}OKzYbNc6>5g0!lPLTxGhL><+`HLJNP zf>`ivfRwp;Gu@|Ku`PVm+joYkgI0?ckBzoA2&2Zx*TRCzf9ffYaQzR>4;Gw3JBP)t zhh$kLVo%g%=tsCOXQUJ%IL0C4OP?XByB+dx9TQO_i7f-fR2%I*g=gL?0a!LAgVc(Y z=)bPr2S*wPM%Rv3dK>Qm;I(2w8^yN}5)xY-#x)|MEwVPr{!ED9V!MKsDpL13lv#t* z+@j1GA>i&Kbp&F+SS`o9pt&3Df_GAAgR}P7fCVJN+r932rlwVduPzNG;Rt%Y!%osCe-k!K9W>K8ZZ%W*b|_9N1v@BbuXa#&{Z^G zq5+06lMUYIQ>Bpt*w#|+>4?JjVpt+P4m4IoaO#1Sy~De}IlRPVLH_@OL33Zm$vP^4 ztaCeeoW(kowfcIx1^}cj+un3_G`9B+1`qV@c-PL!61H^pb@z3*{gn68{(ei_fujur zr^oT=^j6So?N3cSwEu0t|BpzVRW^NW!Pz)bKZB=@{^3c&`oyyfez^6U-nSZ9#+wbF zCXQUIq(9I;5=6C+X%%8Q%w8D;*Y)rfWi_1C$)Y z$Y@4vLqBJIb>zL0`N~#pD1-$%=XmE;pmQpv!Y!h8@6@awq7atC*GtAiaoKc5!$Lx~ zgwL)ZvD9Ai?vLK5H8af|X{8-=wVn6fO`O}iLNRr;Ya|i_RIK9ZxR&Q@2rX9A^V^Q8 zixpHwk}IINxR%$aNtpo~BlSH%_c{yz%}CYp3??bwwGy16={vj7TvJ#op20@}IU`fj z3^LEZS$kAL%a4>2a#QhZjMtvQqo6UU8Z$!wm3!xXg*cE4=Lr2GQv&tC)IebKh(tko z6)T>+vZ|DdqUp}Qa>}Zc;$4&+kZB7Fs=Tu5si?KV0GG=stMYY-l~q(~El{-LUs42j z)f&`D6u?qY4b|{OEE2cS@frM$)zVMnoq^4OcK8Nss7M!;ZS_4>qz8+|EDPzgAZCeG zSX4u^tCC@ZoU&>z?u$sDi}tPTu7{K>emE)f-nC7M3R+v`v|L)Un>9sJ=MnN0L<9|#@5 zILgSP847EW0^oUsFjhhq4MJlMY%$Yprg+S=kxr@Ui4roGf~)L_w5(XTL&-{1%kxT93)5KCZgC&My$9*{f4GmZh}kHV zBx>GdL71YmZ@7DkK<5!y5DH@1bVSTwA33$^se=k?iqtHyiKoG5=b;oU+~J48F?Z$; zpwWVHi6(^AUsFI>-OL7Im6X}gRHo+1_!SSYjIjE};q6CLaWe_qEeP=#WM%CF4|@K1 zsWnS&Q8mo9>0i%g{!&866)JnS?sZeNqAfu)3K>z6!D=XGWJ@eJb6;zvXwVNZ{7yDB z|7Aevq-XLP{c5dp3g69J;qFN0A1Q9tI!dWee-dQ8t<_ROi)&ShLgO&@BIlDnVT!5G zBl1ns4Ho)Zf18pAANyvM1z5hAd>Aw{VKy0;>Npk=#oq2vTx}G-dzsD5XYD&DPqh4N zrC|QMEJ~zsFz>`K6_rj?C-iQll=FK_BZ6iw&HebR9# zZ{iHCl_L`L^VTkE$rXzbKyi{;{5yKGrV^ z|5?LwCNER)I(uW1^S(}H;dA?v2N{{yhOZL{0tW6zX0TU29AA;sw&1rczQ_ISuRAR^ z^amAJcs!lRGw7b!Y7v}ssA+k$#kXVLTU7NeI=EnabVOUil5m^mDdWZ`->&CaG#N)5 zod2sfAtU3w4>bgS^RmHSm}k7JMBvpe<}V zACq#P=8-bR-rez=qp=6JkG7woN!C1+@M&%OgayT^X2$c~quU)1rYEUXmL(^A+Vt{- zd)+x#v$n5p>uApIpJg{-tiOn4zU9%S{74J`zQnMze2p`2X9c&Dylfn%-b~waZS2TH z;SG;0=X<^`NnUoaW*0a4Vcr1)lhPya$7WbhFKC~AFnzsBeZahVJyXm5Ec~N&6HXaH zXXY=liEb{U&+D;U!m#jLl^AyOtj68`S;fiwnd!gr-g*~5-xnaLcWA%vHi5MH<~2&i zdAHVM`uZamml+x)Crp^r{!WRCx~b_Flo!T>ky@}fVA0ED56yq80prp>+Zjd|OI>=Q|}$p-DCf8AF2XtHaoX=0-P9J)ra zW^BSI)0MN_iyx0RovyN#=hs)(f+kMEgs z^ZJ%=C?gFvF-PB5FKeC^d{oyfA}O)SN%2p9{9kI6k&iYs%q?a&C$vIX43U2x}Ql!2I<@j z-d$Idk&nEXq*Aq#ce8?1;1}6w9J)u1JoH_|qu*y>qufxl%l7~>$|t-de^E26&vKDb zdMej9Oh-of^;mzZcEYKL&d4ZFMK#l*)NYCMSij!=VK+n6wnQEDAH7qpc)>a}eVgVL z|2D#S{x2}8j%!s*Mt+Y9SIsM4KB9NqiD564#>`)m8r7_Oh!mkTJtg^f%c)bxo#pMl z>(9P?(8J@z;yPnAW(mntCaV@F`=u{ExOl>>a(#a=qTvfjJ|kk|6AOPbTsQnwjK&hu zsUTQ%UR3`d_lBKi7mmF4>{%3N&Ncm0{Z#6fd*4v&BLu%5KXoX*@R!Ta%A*e5x0u)S z``q>;Z{3Phb)PQ?svG9Lk)K%_Y;dZ7z^Aq+E8>Eq_ibS{r(hiQ=P-U>!_pgt9b@>XXYDf#OeFYV%83)PP8 z>-;&eJ}l5SlAm{Krm?fzF6N#Vbw$UT>K7$WqkO_@=b!to-XlD-FK_7&v`>0}6c+UC zcy-Tw_4`G?wS*md(|uoWGydUBw}~08dEB$LIlou9^`+U|gDThZ^ZcKi-EB=jY8mF# zw#2wK@SyPF*>d6Kkv)NXY6@DOc)bcT|K@p2%lJ_=q9rZdm$ygyX>oRRs!fY?x74{k zGc2udz(+r0UuRs_t(SHhmbhnM$1lHFbIrvVH={qCybopQY_?GPYYa@py9XQqsY)8x+;}2+xGp{!IR1( zBifx-z3%&USU|+FyMs!~J%cTRz>-rx{NiVo)Mg@t1-C!ac~RRRNBm5KepMo8PK;A+ za0+5a^8c)E<~Y!10TU~voj`CaOrxksp6a&H5qX?$mV<8tT(q!KXyH-B{dqZg5HwwA81QvzV(r_~$p?trZc@HvDyhQsJ(UU+awe zx9(rkXqfjjBBQ-LW5&EkQ;V`X)(MI!=AV{zj*38Ss!QVsE^BSS{by=gPY2~eSwE@% zW554?pBIS}9DiQcd3SL4U3KAiAJ?xw&0jH)keK!h91i5vgVHKXTmv=H4(=Ix=>r-#+RJQyNbdMH)?n8 zAJ}?tM?=K%)!r8pXVStZhEEar4GdJZb2D7$E%TUQ^LQN$+lZbCyOJHxynWn}+CFNa z$MCje*2KoHUcS1ZFAOGeD|-2_(7O@K1b+!OX?Y)B`E&cFutDWrs~r7uKZY-ATi6bR z8ob{-nFFSACh6goMQ!KWMshmlC-fWU>1Qn4Ht{q+j$dV%s{s|$`A{)6tT>`~Y%x?E zNmSg|zx(d^2(yuks|@qHkGHA6Yumlwdk4|uOZ}Vf)?4;0Wz$+0ej3SX-+Qo1iSyD_ zJ8UAE|D?N0Dfh376B~c-7N~cA9a{=IU|8raOBcZp2&&taAMNO4Y>YKyYIMj0lrFGpGdN#a&c<)TzcP(j;TeKZ} zxANA%IQ_P9N$Uh$%9PCGf zjWJFK@q3?_^Y2n@VNL$|6I2WXdllAX^tC@zjjq&FTD4z{6xRRhdVNCpl&`9%K81g; zycD?1G|N9RdQ+5lNjd+JQ}9bNf5wL{{p;knmLK|~cML{OJ$iUTc<=1`nS;D787I>& zR!*u)uUmN$>izTTpQ$S^bWmn_Up<)Bx8_~dow^Ylc6-v!+`aWzVqJyJx6Lti9jqtM z7ukHfEv|oUk92V>7Ef8&@}2PY&HL>pl_NQaRu|Foc8$5*`M#@zmOJmjs&Li*o~N4* z`xKP(L$3C{`=v4KM1*(8EPbEHKCYCpooNpe4{nNmT~^MI`SX2mZMe%<`AS|(djmbC^A$OkrpdrX?ET$c%m-E`=SwV>zdG*IaU25f*blw8c#)5 zTPAJ~Pn+|!cTIb)ph$T6Tc3#~PA9J4O>WLgO+3@r)t>%aW!csgZ<~q*yYA14;Jyfb z^Zd2V(Xo})6Ed1Ri+7&yFlovz4@_@r+|@Cs^6JWphl3$Kb2uL=c^OWvhdGBF=k;#e z>^L~D@8wBO^6lxH3GOZcv#0FrZEnoaPF?x7{+I#B6@IU^`{JW>o$&MD=ZEGk zO7x20guw)N!2~~X%9<4T1P1(;eDAs=V6MemT$Q9@Oj)HR}v8nr3$TAFF-@0R!Q+o|x|zu>nE`(fBW zHZ_)%^`8qiX{_u?ZVvnhqHHD>570kk;hA9N6nmG?D&CrbOKB>U#nt8uz_AilM;|-FU1C-i>pDUc7G|Q~& zJ9V>4pBWU@dn$g%esMlO&45={q#C@YLutK@ZBmZ#Vy_j`Uay&^9(=69`Qjn7{F|;C z54`s%i(n_I7WR65YHo)bm@7 zist>Uyt3a(erp;v*4rdPYi{>h1+|qFDj5W)FkP4Ed*=T}HS}ENrkFEW+?#H34mvi% z@7M)bZ|loR&7)THy1&)tb*(I)uhad*48VH~x}gl<+@{S`&^ z{MaRn=;tpV2hK8m!OjGO8%qsxxlM5&A*>BfO>22E7ZPHn?4zc?=r1)3LJD zGo8m`tecyhR`yN9%{>zy40dq3zxvI$u%oHIeP(3_Ghv+N4SGZ%ntNjgyv2c1arMfq zwvlbx0Y4UP{Pi29UZ=qs9ZU21b+H=@XVNnIdNPFp!vtJvAF+G(xV>%rG`W$Tt2wq2OQYj5ojhd5w>X>?f9X*8! z#j8lK?nCi~n#O%lY^QTWY04JW7nWt=@zK1;S@vL{%Wc?ql z)E_@6nEPYEmSqPZK6`1@&2F0rewoLS;!zWapO5llDC_Kh%3B$q;LtiIvhqQJiplta zGS?`bMg^1AR@qT;N)(>2-L{C62hdnQ+!LIsW5<5MQ=LcQ)k1Lr6mK`LQQKMo#V=tB zC=88TC*tQ{q_~g{Od?j_mg~RPZhK?FdTf#drIw?l?S_7|cj~UO`ep`ee{(-If zR=?qP>^D5sVl#$D#fdo0+32lKnR9*AO7qXWr_Q!r^qX?;nssmcyAqu=4`17)wsdcB z=5WVne~#@R6=$}$`2jn2%y0gAFMyhXB(zRo^@>JER42^o|?i}=DH`BXObFO&ah3>i~-P!qeFxC`x z*HyQ1$7OD{?PP~b{Fq%eIE-NRAsfO7`S1gWXEn=SC~L>klkSAV08wD@3tEJMk-Civ zl=Ys4^KXCky>0a9H*)y=O;x7SQTli;b-k? z_6Fzc-cJ$ayK+elY|2fiwi0AY{JHk6>L!ec$dww2W_yJX1~i?QK%%yS*)o zfvcpb-(YLD`iMpYvTK!-f&(p@ekTkyjQ8kiwnsEa_*-cNBU@GRU7}H-cGzrPl8Uyk z%azucz^IEbPE+E8nR=5`)$H$B@M>MQ2`Blet$~h5>%nK;XZzZ*HSCowm+e?ztE*K@ z(Vu5Nak$}0!66%iH!&An%RNh7C#-$;RW%9yqCl@P(tNem$Y8aFwPW_S zmNkswFIuyWH`4l#zvhNI^0zYKNRwW?6{mf7K^QxZH_~>Ma}meWnTp1nN`lv}hS%!b z&mE`zM~HbQ4}prOTkrVlN%zzaQ`bERaQXRC>oF(2i-SFJKAiJuzuNWow=ZS87Z*^g zDN_Pd8-r(%x#$p#Z*r~|10DN|rBm(5`_34!GH-b_P4`VsA4fx}FU8c6+N_2vlbpO8 zrXMS3FyLe&8683NPfpOKwF^9bNz21W-_6ouHR$;!KfJ6%BA3EL$CuCwK0yWz+uhq* zT20}jee?&fAbv|OEsLYi>#$o4^0t3+NS`j*Wvw46?9UnGQhEWEV>GyoJdzbaqouGe z3iOiEDHu^RZ5}1ir;^3ZTnA4;yNQb6k@W7;L>(Ng6}@2U1tzJXfZ8U|&eo{zZrcg} zf5V4?vcTf#Q)iM()e5N)B4k+6qT>pvD42P(^7Qe z={Hca2#YudldbWiHp|S2Tw0>fI*X3MkhwJJ)6sGHsAgUqJ&42RK>*#90YP}0J|!iN z&Oj+K`P64)X(%P8m`S^`SC2xqEanL`0%Y>P8e2T#)`sNLmkbLNJysCP=Na-| z74k#K6tSj7_s7vux+Fs-hwW}>My^GnTG33dfhiTuB+4FwIa6j8QuIf#0=D3e_A>oQ z`yZJq3yBx;Y?B(Czg)Rh~k$z9%01phLbdGjXjz$Fx#P}XkY~C z5k9Nz6XE?m+LG}~-sns#K>3rRQh3dK_4ZE)7x(^;vA3 zT1bm_0E30pLexz(Q0q|&4w*ZE%y<=lz!}^9!dAI zerR#iXSF(b`;+eJllN7mjbLS7!yUM%^fx0++Ww$-pTm_0q7?*YhYV~oD$JF&#oDiY zrp>uC&LDLCiEL#2TC9N0cmb7Xmlm3OTY-V%E zZH=P0>+ah__k=-%IfmiJ57+w2F4pR%>J8tPdx)x769VRaDce2lG?{E)GH%80^@(hE zbUG9-9d!d#^FD`8?X}W2TvE*D+1vf{Y%Z)Ml+`4*C-}KRXb3W1l%3tu(RAQf!R|nY zh5wesEL~@t>(LRy-G(&%L`d<26&wuc2PuB!ea~KwJ-(Ty4@aucXtEjrNFU}dng*cw zaxDIPD2Dd52_8h#Pqx>4hOb~)?A2f;9N!cVI9+Gjw#`5J13IwHYG^E=qU1zcO7@NU zb6zn}&LRN$&Kx!mWdpL@09iaDn8|11zZpLspa&6gFi|u~6Tnr6R_D_}rVuYdHJhfsfN*|M3b)f)M?tqr^ zn*@Fq@@}%hE?|`sfYW=z5i-;KN!W4KB13*Q1LbEY022QXH zm7orokMsKgT-3??oGd1iOY6|4<~}9#U1HPUfb? zIn*uN&ZQco6WcV%!j!DZZk{@9Q$84;@Uq6p{R|vTI!>~Y-GjxwkpLY$o05|)HY?cj z@Gue3;sAK6qK%CT?`2i4U?qF|c-6KC=$AgjP~2>BH!+4X5ELe^Z(U=|u&AzRmkhVW zbx7-8@>{n1?UH^fEqWFB7`-V?Wi)JwM=W6%f}C18{7>A-q$$0}HYaik{@D^W&c;X) zUD{E51gjX72qytqL-MqZQ?vJi&mdkp=v~2k7L&higTY5vl#pGvpq(785#r&!^6L!O zDgtZlseB-1{Gm;TVgS$z^@!m#nN>#A5Pl*-viqVLkgY<}vvtn`{B&)Q83bzEq_qfp zg@fa7JKhH{9@ldtEJ7tL=auj|+kMV!Kvh4I*Am*Lqt|~Z#Gv))0R7~xZ1*K&$=vCF z$xnbxlU){liUN27xRN}b27kv#yqrJh3ZS1LpW3^^k2K7jyb3P8@FNvAnD!zJ1?O!_ zwube1GRiyj6&JsSElFHlbw!t%j8OcYE=~XE19Ui!4R}Uk;p2n&7YqyRYEB(T<~9~m z(P>6n^pTfiGZ4}rprc~k%Ee>Ft$e;lww1-yd;1*V_@IAsSXBu_#Xei3Wjq)8@L~-oC4iB>6 z@F2O?)Grww9>mqadSoX4<68@jyk(OwHHGy5NW!*?= zIam^M)pe{t9&?A~k=PT*h`k(7Z||_INCR92i=VX+Z@m%|o^1HvT1RLQ80Og+sZ~pd zSLLw_)GlXB_-QZ&yu_q4jf|aX3Ni*Pr9lcU+Q~wT?7PJe*-;2Pn>P|%$UAr9<(6-{ zFF2c5z%_=;wj$UXw`m`erMRk_?T#)I63>1)8+>E9NJzSL!G-|E$8|pdh(}jgiF-|; zDl+31Z69H1Xx^4XS%80lUxT}MyWjRboK^j20=>P>QNq8k15A=kScQ+`=$F30?x*{a z7Cn-BvB+Ho=2M{ybR1`4`zDX3(xyTdb^#ItP%RH+UBvr`x% z9(ejtzZASt>gTUT(gDCVx{pYtK%k~0*A?2htx~3qldzjUM+m#`_1$umHTfPaC2kzd zD%>L^=ivcMhIKTASHX}(0oW7V8Q&vBcG-k^Z!g1_gzgb4pu&zWr7TIfW(h|wP-Zox z!Im-iQnm)ZM~I;kD$5ZW41AA}h*D!W1YB$Y%`XsbXV?HfC)yTde2 z-jH>AFh$g21)+o3E5Y1+5J#-?CpaPyadg;G#1RRC4CfSqVq-r;q7NVn?S!4sc1Xge zMQ?y@(ct?#R4Z$m{!T9SApr6hyi#!Y0a|6fQX9Zkxv`bgB>)G}{Ub8E1bQ#*3~>L* zP!$Bah@}+Fkdgm|^$wUxNah8G48#YnxA04*ZN?p?&}jG`p&>k*7;vdQP#AEJ5E$jJ800YEUZF5LW+tp1}n8r;r15+l34ZN1tzL(J$~k*s{R1hIqr+ z3}YX=NTn{Kn<+Z6bbPrKA>D|&i6;0P^4*Rz z#~Z(@!SGkwc{nmiLrL>6Nw{I{+ydfZT?6UEu*c$BAGrFX!Jh-f=s9#}nF%Z1@6ex) zSLQQ*yRvB-qFbznm^k_pBrEjAO_f#v>kHl{))l124nG%Z6&#z~@PUe^9;ep!zCLeE zxLbTEeu2HszXO)#dLV5vO`C;o*kQXDzQJt#?Wae``2-#h$L)@0Ba)8)h7&9zHV)VQ zumZwvB*IrJ!I7lwZ9fP8sv9GqbK~4t5H5S-&j8!mF+>CK>D4q7Nd{t_QzFMYvE7%0 zEbDO2jKYbONM|pXbjSNuzrit6C?nTA>^clZ!xG3fWpM?j&yf!-uXcj7bP0JJ7!wHQi4D&bI3Yg8BDYk~vxw`x#19ETuicf7|FRTlF|`B*1n!$H@~;_;$vq@{c&j$&a*>7RrlEcIXj70)sfAdm_t zCA^=>AC&iF;bJEcCKCOD+h}xau+CrGj!29zYPPtWsOq)8T;x}ubm3Ba@fjBBeh5;6 zyWNc|JE#Zf?Vqcnx*(E%S<+J64(D=Y0t?l2ugzDwMW?+ep?a&r|>;z5aCH@pj&xk>3Wn;^>EmlMI5$fyAPKzdU;h;OvL4I z57!d-D4sqQg|lSw^X-1&H%?k`YX!VPUKaggMd|ZIazs3!Eo=fmiQG@DMoc67T7Mu_ za6s&;awJrJ303r$T`Llbs*UtT4UwuZ;qw@^#Hu5{3z$~$qL6wIe&m(8-l%C zM00T+;-@ntv|{525+y|&%-=E57l@dI%>xMQ+QHw%dJ`)PAh^m1vEo*5m0cG1WDws2gxyczPMfO6(hB6!Q&dYV(GD?sig^}LL3#At zM~5?jOcHrKxipuVxZV?FXmMZ(Gi%VjY~@5zG%i>akkeu%Lc~nD?M*r;viK`$j4bS9 z(vNfx(M~7|EK#KH44O3=QB=ggUF2n0tdn3G@0$o`0D;D%Gk`2O14u(>0D?#gvxgz8&Ahf6G zmw09{Zsp1^F%fLViHJC1WdO0-=R#oAA>V>arGfqeHVHcv=GU!QDM6}&^@k|f#xcK! zKS7@>0G@AS5?Z+KeKfRc!3xTYx$?7wpB-@36pLSY6%AqSLpudW{RWeTNn70E|iFrE^W&?5bz0|?>00UpdD|#5m>V-EF zL(XQqe~V)B`YdKVoA>tl9t~E&qEE>lMr0RoJ&!O{uwRQESfr4GYxwEWNCQ@lB!mSl zJVQd;!6alH&r%0={O4~yByQrmMYL!j?5B4A3aCCMNBuMj(g~KJ(lQkA$MN_=(_R6K zt??T9orTm~A8|Y$DTD+qv>?|?=)@Axt_WHP+7*hWV>bYabog0R1A@(M1ku^&&?+MB zh17HjY2W7nN+IIgNTkDoZA{u>ory{N0F(4d5=%mQ4qKxKJV_Aa5NpK|1yEiILMN#N zMaMyoG=sSA>_iX?!8IbnLrA-Y!3VDmiL}Ts!~#BBeH13){z!!oN7CCVT~XDxaddq5 z?=*6)G?auSG(wmVH3J3pdAJ!!C4go~DuIR~T^A^NiZGkYh^>TljPdty;M5`*Z%5H9 z!_d{g@ElU(%L<}F#tH>#63Zd~shi37g!l zL;*9;^d)t|jg&U|)Y0Q$)tfOZ$x+rCPNaF^Nh8ZAwqg)ssq70|)P!rb3gyCg=FGJb! zjL5VBDG?CUkZUZuHeHpozF&?*iuo|U+eei3kr;L!QkvjyA77LXB9?7FW6y-z=>T{8a8dAgNFoz3#f2yx-ZGlh`ev8!zs;V`WIq|1o!`&2=)JE>;H?{ zx?D;L5HdN5K(d1qyeAR?tz1SO%I+X}svj#sfjpev@E?|%QU{?I3*}OokgSCr+FIY1 zu(GY9BtAqCWl47{#Ix7>CqiB*D*ogBT$#9nq=pkdR$|PS@iSMi7jJ-=VB%Wu;NHOn zY1Q1p*EdRgNLWX_SnV|MvhMmGdfm`?(XXL}I0!!^8jh21o&orH9+V)jd;j4wVtgsT!i6 z%GD$BJ|R^KLA_iSsw#>@$2a*vbZislKPy~Fu$N`+5?}B$)-G~CWS zptoQSt{d9)-Er9{0~QfPI0*Z@Jd2m+USpR<#NtN|&7eZDcN~F2;XfH^0+9o_+;_La zjYb=r%F1ZE-l5R2-3tA=K;paF0S5o~XEZ@N(*I3p`Y#ij1O`M#6T0!5$lDPm%0S)@ zPF?yJ89{>iyK5w=p$T;U0OVppdOgm?k|qU-aS9Sk6zNI?**V~E^CA|B*t!AB-+ z$+cGtsr=YgYz>wHq*8++YLQDnh(Tv#O)O2V~H}C#A!}n z$j6dsZNPRRnF&0Fzt6V8iAX3XipcchDj^vJR2X$u14SR706_nO5|NocyKM?{g>8toJsTp%x>8FMKM=S2tu8EWSaG+{EIH{1*Hwb4TRy`Z*w9E)e2Y>cGkVGATwnGF_6jHJj z2M2KCqP&PJN+6V~y+|0X4T5y0#I!x=m``sXx2t~7s*3=y|1YzdS}N3I;KOJv;=^bV zQIatHIC|Z?0_xkrh}c&y!Ku%$1=Kp83K@H2T(U*9%M-yZ)!$rCUp;*J)T-K@^!Oj2PHHKb3O#SUg` zR6ilJf|jy*)!GpwS^Me6>a3vT?D*4-)9aZeZ&O9cCtY$*Uqu|3dXGha zX2x*S-sPU)4|mcCDyR*=S`w~otUxWPBQ@0c>&LZj*Ps%D&G zxb0+XP)5`09PG2^Fx-07SzZH`1%9aNje4|`st%IUrULvzD6Lb)&qBM=7ss>X;pHGh zJ&ZoS(v)_xpEC-oKo7qu5?2A;U2RN5Uvg#9Qz7=u@l|7mJgb6_t20Tv;an5?xH_)J zPD4@+s(h<28&wXaZPD;GZQ4nwXr=Hf8#OwfeA}Ni0`g&f?1s@!Ziu1thi~;o1uo$C zjWT4t9qWib`wP#hL3>IHqUfpWEJ&MlH=Z9(5Mm1)l1Zlx9H3ju?qc;pgjp z*}NwalWF9os0qbX?;{;B#@iyKr3Grx!w0Ao&!m%)nq($<#GHW~I@b@*G1;I>3e?qE zXG1C`!DJ7h9_83FVs~b1n5eMUyHsp|PUALL7U z;^Ih{WEkdFE|>bg3cYnY4J_sJw|?1vP$_!W)`l#ys>#F14-1&d=Y*>n$Y9+dc9d(| z^s_qa?Vz|+0J*F>)4+P14!&z-l0IsZb6%7?aFMZr85e59SItGn4d1axop*`xBkjhY zRu|RcWlSr`Wx%J^E7wtD=$-bj{gBDRr`7k-mw$z4^!t&l5Z`jis1WmvM&-!t2D#aR znM8ADgiE3EvUXqi*j(Cj@jIjG$Ndbx(97d~hYUgke6uCfizd<|dml0oVLnx0p3RQm zua3G?8xsR{z|-3p(rHJ=;E`Rr&*2gqk11H5k2RSa`ra@3%(H+$6F+E@M{cT2z^f@N zh|OEJF&NT;T}H^Qv3A2>)1Qrnl_6{IJNGYM^5G#icOiMOueP&=vbnw4C_9R7yf;+P zH}JkcV~^8d?>Z)F&TaT6IjgmunS84ED4g57@lx5thV0UF{0$)65;zxdH1UTbYQh}{ z0IJwW!AAiCZFI$@prv-qRVTYNCe96;!HAt3O+R>igF9QJK1g>?9wYYER{6*8IJ9;` zYG;cC;SlbbL60B7qMm5Ps#&uMd?8hqAg?to`z*li4R!b{X!Q^fzM+2Hn-)!g@FRHT zn+>b+E1|W%J?Y<%rWKUMK&k(Wd@wJERzam7Dg4EmA+!1{MrS|$MrPAhTd-Ft66xYu z#$eGeQ)*{Lt`*^vPx~D>ee`5FEW{7o5;E)TPuS$ni!FT)B+bR3nkDw{1qrrcInR^> zQ`E`6ZO1Di{paCvX7a3SFZtaQPB{z9}= zzTCmReKj-h`H^%&zvFy@-6d-!SmRG0C*XFd6;Zt~2oca^JxpA>I!OXe;!Oq)oA|c* zkpye+)S62T-1lHmMi5o{mop{?8^ zD($rtf}x+j-XFL`?{ORPF3}2b*~rw*JqMfJXXqK@z_0Nmb$>+QJcYDX+j!yl-HGJ??u*``or#b#krl zzBu}F*i69aDPFYpVSsX{?!aCzav9J<-MI%)E*V@F*a9J7$Pdm|f4vM&szc&cS2Aoa zr#>EC3LDb17+q`8vrcC}dz~1-rRHA221ve%Tq@zZ+7?Qdk1*&^hL1XV>F7^w=UO9< zHkMSx(Odb)G145MUwpISXtqXuFoHalSD{A%l4jj!H2mlY;ASdnwg#3x{0VR(Q@5z6}qCd#PNFD5-e6IKC_q2i= z3>6R9WX^igqIX<{r5ivCHXNKvCSH2-^Owrj5_A;ytgyw?P@lLzfG>I+`Jy2?sC3aJ z@)pw%QB52$lteDM2kebwa^!m;wjbD--bJ zVL{pP-Nah^@+(nk2KXY-JZMNfnb_{9lkNMnV3Cz$h=>IT8hIWwp|k?Fs`&S^QnEipxK)$VF^OBWdKY(Ohl<@VL}Va!D!jg zanj^4=!y-QOE{ee=$*s2GD$`=$-a(|Fffc(kjU@My{!ZYfQFU=oBF>QT5&&9jbt(9 zL^khv1S}GmOBqbzNJ~YChn!B-PbZ^MtXaC<4`42cwS7}KhSj>auz)(zlvYP9BG|pK zkB)k@wN}?x)*hS^h*!j(mSSN|Mx5jqC9RJx`eP zfKj-Uy%)hCv9S%HQrMQERCW^-J?pkJTU3f2-BEJpBi>%nJYb{J?SjwM1Kba8S!4t5 zdm{Ayr%zMRn4sPh``R`}Ai`P-@)W92Fs8{zrc>&AEU0MunW2k;FpF6x_*6UPY;$ra?(H6>;#vuy2p z_+8b)kb#(0;e-8G8L^4r1r}3pBA$!AKmf`|zy4iTwU^9dx0jgT{*iXl9O!w)3=2kVc8+=mP^?e(_n$G`Fg-81;zxpX z)UaJ_jaxm_{ryR65DE8z`t`u+g%h9!cYy=1G@+fObEy$Fg0-}XWZ#XSPSA^~M-M+r zI6&XFlg)dGAQ4KrXMi_^dQ7u}28rC|f@d%1!Zjt29nOq2VZFsp^btFDe6YW+qi_bp zEu;J0&c6O&m{ zX$ar}luCyQcw%)nB2=w5Cj04On?P^zwWgh{gM5c6GYGK(N?|v_BpkIHP*l|J0XY3m z(KleRL$Z-UILyM@2@GM2M8k4OTWuRdUoNOW;%!H6 z1Ilvl<4XfHrf8gU0msDV%9w?19$3=Drpvp$<@-o~T(f=mxT&xj>UGF%=b5BjPP*8V zLk?p>CD@--EfG{qLeBy@2SG(#ihXOM6ev5C+DIt-0f$_eD+ILSrbs7p(U@RwysYGx z2-3!2i3opnD&I*cO1Ns?w2gJB_rOFW+-caT!0tP1n91v&H58kUK~6q)=S|>9el|P} zxpuH;ATbV!V?YRw-$d~F9N<$djlmq4jz$O$X*&^~$W29>1Tiy!){vcyy&sj-6G0pYglXp((Le~LN-x>e{u&}|H=63r7ae?L<0xyj_(lgwne%4sTj1n8JO zHB#@B&@pkT)Q1gPjX-rV&~-WQlYm+i?D8KMuBH`u^bb|lWE~u-swV5;NT7_^;zfj3 zxG>xpc90jC8SINK0G^^Ny6|qPWNuw}gZHz)|7Psdkx;UykpZdZ;tez44 z?_((z=cFL|?D~ZV z8rH$<47ba0i`O8e02BJtiB+GA1%%y;{Yj+96UsZ{DPl$<-rL}%(2JoA-_{0O?9#pI zU+5-49AvnX2L~$>IkBLr2;9;=sC#Z~RxYExyI zI+v7aVfrP~&ZVWY^vkB#*ETzTg9+k@HU2En+%b(gEKg%Za7(-|tc1F2i0o+!85Td? z*C1~h>~``+YuYW8Q2r7BmQtsotQ=^T45G<%J~_$Y?cA$eJBbWNrxmJ*sTT&q-q-zHS$9^sk>{hJv$zP-?kJ8c&m|X=ZEd`_KCs~ zE&KjN(548T;mZ_pXg~i(eGsv7BB)m_)+7iWj@WImULevsWHd zTNF0>CpN84ZYu)=S_#KL_B7_U1EH)egFCO*Op8Wx1d>lb5K*IhUz82L*ua~p6iEzL z1h_!6(Y62?HuX4J3Asw9xx&eUF6F@trH%kCDMiiB5 zz=%|Zq0akVYtIY=nw;dkpL_3n@BRIAa@g)!d$qmxw>;1Dg-qbQo+^(pJ7+jNb=ZDu z1gXGXt@Yq8qYSX{c@QYf)%`DhcVQ!t!67{QjgY|+x|jeH_(HS*61rcGP7H1cY|+`A z5gm2!XP4f?c7r3SXHZ6h}h1@yyNFC6I&J46!h#7C(gr;J?rGmBG3 zIKuFmTUsiJFbJI0zll3wXAPz71->NTg&XlOu`h|OX2O>Qs~L?(G-U(<7YLO=1Z8A( zU^fh>3qltnzBJ0XAF<#HGVTk=ozJI@j<}$NJH%~-33p;8j3JxCkK6F0Is7=0;3`hI ze|der9O4kH+F_RN(}$(BH)?d>n?HhQ3gII(c*2p!PB&E!QX9K)K(rs_j0D>l=WjBi zwNcJUirum&r+{`^BxeL6jY^ZhkBeYy8rj%Hv;;sHR+&r2L>=7!Oz1{&M3k2q<+~3T zQ#J_WM}l=6_hJSwP#BpuNHf2$6`UW1`bIeKM$uK9ti|N$Oo)k0Ob)mC&)00IP*k;izUapSK!xI zv^=+;+RJ6}E`B`4yUcw~t!{tFdOh5|^t{aJ*F~{bR(?>~u*Y>h@zg|6oW}i3E9+^4SGW?2fQfKp|Ezk0J-1ZMpxaG=W+XTy` zvgVoR4Ym&WM5aeZy4re{*Di=t@G-DwagD=fPMjKka}WAav%})a#rGm*`;rsG^@sk* z8#kPDSsy(MHTb=Gw7-I4sJV92o^{VV4?c^Mw5d5=uenZnh`Mn~dF{jf%M4_mv=0w# zh?OPPU)J3`*mu9r@Tj;?dWf}U^BjHqy#DsRR_T|=*?gd&f7|fsDXVt4_jixgTOQ$qm-Nn=(L(b1RqFJ{ zu7WO$UwjOxx*DB6d#R0oT4+Y?@OHitRr)roYpc>mYAd?>jfLit?RD=WDD>LK2P6x> zAvW*8t&`HzmKu}XgDe$S+Lw6S~@C)1vSC9Bt zE9R{Gp|fwnaDraztHzff6ZDc*s~=zRuyK-Zyd-aaKmU64${n@#3Z9AMFNi`t?@u1#-V zf>fiXT%6qFsw~~LlrshI4dJSXbD&gX$9VI5^TXcyJ0ILDm9A7_dMDi{O)GlZw2qI3 z@-P8M(KG%Sq!;2_BFKlbI7r_My4|g7dFC{2$xJ(%0O4&PKc#06R%ZePpj^0Jibx! zm%8KChtIzILDi|ilp*ere#Nm5rgd$>`=Y66vK=KGlcFmfsOLgc-2e1>YcL_l@(k)< z$twLB7xSOGJdcvPGKFjNeEawr<1cUrDL(7QuTebjsw-Py7ox762s?d>U!ZOY+Fxf} zbtOVBK6kVq*Ob+zIesH`q0e5IM)Ap-Wma|X-l|PafsH=NbjBex&}SRjfO{J`K;s1e#bF%pe3(s6PLep2)m zb#*?URAAlP(hNJc`xG_bE-qSZetm+Pncp{C7oCcej8KVf)b6Od7QN+agQvo9<4=e2 zT&u*|YIl4*9KGdCgSrA`tuh)~p@HU-S#|G9lq(q}FzdS@a<>|V}%2VSFEN{0tdG*)F zH@U9Tgnv4)N=xF2y_DDZu>1?jcKyGm6!+!)B-7CTkbrK7(6$Fd9g(&sYes@1u{znihY+Z%G~0R`PJB7^KVaQy7%SN2YP;eONV>s zWRrMd-qNL=`_Zsha)%`htTY(}x?DU#H^B?B* z@6MaKbEWitmZNmex+@)h{)4HC%-^2s4hAdgs}KFdlYHQGy>->3?)eG^xEDOdgv z_*Gx}?an3FlSp?G%@}d3@}EA`Wh}pF@pE}dVjkD{_RO6I()*QsU3Jd~U(_)3ep%V5 z@w4%v{V)udoqJyDE4FNG$TwXa@^m5btNf5e)+ZM)kC)<#t(3aptc79@#@_irF}u+r zwPK(?ulA1{1v=FhIU$`SDCOsRkfd?%NNujvuDZ2Tvg%vRBGuuaMl+&E3%YFjygZadpBr(%e*kH&SE1)C&K6Df;Cd z`Dd<4z0vwT*p59X!iT) zoyvB5xJYfQds{nLQ{BAn*z8pQuStzb66W{L;YAs*?bpX<=@i|N)ULKj74xwZKfSRk zc-#CRx7Euh_xw>?YP!=~YQNGJSKau0d})YV()uu8K4*~1bC296H!IbDCaG~Nw3me2 z`$o(3!$sE2q8oNv)kAlukQ$j1E95po*UENpohf^|M@%cO&|{?mtd@lNjRZ0F-k0nL zny}GWtBa_=yUVvyN`tc$VQM|_)at{~yVJKP&s8SfwNfUz99hU6{QZEw)Qkt)N|g%p z)4!Fm^^Y6=N)sa2oxar}eplL9{})SGDh=2!v!?G2 zdHQBhNBg3}o&2^mxmXV+Q*@1MnYwYYgs4v5v%ghS4qegMJ zSBpo5PuI10o{%9~>LcxU=!N)Qo@vm`0h20mW8U+;r25LOX%UsLrPsOY?(67#N19&O zxOo20+rsD_U2A#nJqKSJ$+c3h1!sARIk5Doe_UbKoeq|4lZF3?k(s8hAwI=oPz%TV zWld*Ibt3D*1i!v{yt$Fv*wa$|v&9?zNapvPL#WxjX6{Z{uklb%F7Jrj%fj)kl&ksN zi#NqiZ@ikn%__dOG*|v|{% zF`x7B%S+xfqn637LL2TTY`9gfy$l$mR5JO3w}G_7v~SUF+o5$~`nljXyYaDSte)>S;`S-JJzY6$u}(>r!;+KRu5T5;lQ@wPHyyq`YBQ?qwnfPDryx|em6DWidTpG8@vj#gP|f8HgGOg9uOK~T>pt1Tc`;uF@rI@iQD=8nK1???sqfafU{b$l-n&p<_p=MK zOWKWhB>9MY$dZ(%IdILdnu`?$wR}j7d@)J)-t!C@$&%UD8r?rUty}7MsvZS~NZ2&8pkM7FHk0Oa0|F z;_mElXbEj-H;I0!mJ{q&AeRy)tMAABSoqjqf$icrxOzCjA>9?)3Wc_&gv-xzLv1aV zKg?<|cAG@wD#MrGkMo+F8aELo-*0?e5KM^uFaXAg+_V ze(oikZ6qo6#f-T-J3biq)xH|Mt?T^qPC@p;Fv|Mc{NEp|#D35*f57{p=ta;6IUny` zjdg)GikgnJg6i^u+XK|SrZts;?G-l0QBym9?nqE<+3+sksr^a8j%9jlp3k9G7i8ZI zqd2$a&nZxi{Z%jEF3$<~sI%@>la0c53M17$H1k)~qgL-*DFcrv$u$<2Z0bqU;ma9w z13D~ujWDpA#ythuongIpR<70`Bs|_r*S4{0>%FXcwX7${2RnwT%E(Vnt+P~vH% z=)r9gI`TRpmA&7s@y^{D-rMIAU|JI&_*SLjgJF)bb?89hG)*0QSe>&!@iZ3pM0ava+NF$Vh9i7tK?Hl{akV+dhOOTZY6en z7=BJgeJT&%b4qs3jODzy2=L%s(lM@=RK7j zW-|9LycsqrdA&nR!CSSK4FLt!0fn~*QbN$Ok<}mAPW~-5Qk*oEkyRO4I522zllxX529kILDO4bLh!_?$ct1sDXkd*pv6XVtu7{XeEik>|w+akKE z$IqGkOMdVZ`LksnK5?E5A2hWD=RX;L@Iy2?KlRR0bGbBV?)K(6>Oz1lTcE}-;^b692p z>X51r>@Tkw$E7!1DtOO5?*2^D(ww}ne&uG30BZKDh^0CkO>gIPT&j|5lY8arb*R2( z$iWUxMvGkY9~#>oSvC#I_X?_q(KFa+@+N9l>}33wDicNuaL!bT?Cqn*n%1NT`e;@t z%*-)XZH#Gj^@@R3b}vr;&}``;|Ms!wcE`9*i9OyaW^i}P5p=hTR>g9Y9OH?NF)gO% z_PuXi;?Pw$t%?sOzojx7W#4DT+Vxm?Mh4O4f2aqcv5F(JKGyviJLy(qf`P{g-VjXw zOO4d}R||^<7S29BE zq&Q#g3_qmnc#dV?7iENYRZirdFoijns{I-)6sJE4?7IzD_oO_I+;c@?&g2@uP)kJ< zlb*hmW2QB{+wHZrES;g|JZ^TKRAc@TR?tu`Z^`$A{Z@U23YI`aU_GmuyJ7gx1A!NSOK+lP#o*t8wAj*bsenJNujRG zEqH*w+~cI9B)rj=dz@man6BTUaZz`gXE!PIcJ>y!l%6qBEOpa$_AE_QE=5S3UO(`7?AJCg5xb{zN-U+Yh5Y*hawI-1Gv^i>8%^ZOZks9#15#k?Ug=+ zQrXr@Z$sc}OFcrp|7I&^Yk^=|KSgypDoqc#NSR7`UjXoiYTM^h{s`Ux7g|FQykT-r zRg@n}&3QvFd$aoEBf|VAEA>__+@pjLL1Iu}t`7GnV6qa|H7r;OvE>ZlY7?5Q$N+|M zpKDkGx;kCHzp5}b9L9rqgu0#& zU8k9y?$TGDD}Fx7g{S%mzT(f)r`=8K(e_} zrCf|qu9Ja*D2c9~*MC4&53gm|+F*Q`q7+bC5)i;a{*1Y1xI(B6!iPnLwG4YFT;VZI zO{2TKm1j?u#`v&<*3gO!f=-DUJd#^j4frr^6WXGb*VAPmUrkU3e3;Rqo3;y&M}==a z@iivgr7FLss$;0m!sF5r88(iXaF+pB$%uPV1oy&KCZ=@dL&xQD#|<8kY;ROCif;fu zEGn{PxC*-Btf^g?Gdo;ip>3=V;KRafZ!k=8gg9!llH%iqjml^@)EnHfGDlZWz*Qx; zu#SX_Ig1VkN4K%YsX&z3dQk~!(Q)bMjsh{7L&*KF&F9k>;k%fAZ%6u}qi=kp^x~yr+EVDF-GLOem=CtT8Yv3!Y z9~{4Y#h;vr^B7n7-J*k+WOTw0o1YibC?Lu_cu0*Kbt+)s6F@^s>nXLYq4<{gO?^EB zwVg6h?vDT)pfp-KmpSPkwf=0hZQs&A&un=z!=D1V^H z%3K^nijDGz=nk!AEGZWAC-{U20!)TTvDKtX7NE{PC&dczP#Co&2>p-BpMM#xB}$5= z1b9KRZVV}wHwQ!GM}fOAU#|y_&=5OjPV<~rs3j=G*Aj{Hmw>Mg6Qz0zct*mjBeavx zSXQ4u5Rong7&DBj5|GaLiSk87Z+=hrCwQK|H#hhL&i9M#BjT!n5ix>evbzB^8fFd< z#9uHnqJIHs%YsLkg(K0IPua@Ikg;lb+TA}M0J|7`N7qGIJyGn40DU?dy3a?d0!LL8 zx-UeZ{%2+wtfqk7hyY7`SjGV8`db-6K^!2W0lf_PATsRUQAE!#;pqnRX@|_JN$r;b z*N~CC7DU|o4@vS9KLBJxII}>EGmDfQ!A>DsmWi#*T z($4^6X>CpRB#eI?;rU@uG@n6-mmuZY$ezO7HF}{``uka&6562d?#yVwGt>>eEv8-8 zL+^<#0LH!y-&+Lm*w0ae1TtVGM~Bx2BLjpKQ$7j~ldlMhDZ#Ww`v5b&{*UK$rSr6M z2DwGchXeJPi+r-m(s?^r2mAK$;{S)%1+YqtCHlXa*43Bh(kMzfIm4F|5E6O*70n8r z5dyld0MOMn3c4vIf$>3_vs-r#-I+%amA2H}oP?<_@D2(XxO})2pOVBUDvf}b0Bj4% zWT2OJBr3q^yUs)9UXd=d7|H@9DS@yhaEgR#0tmcT1_B9yxj}~tVD1I{Iz9{T3v{yo znso;(6N1(z0HG1DJgZDdO-E?HFaW9MV7l@MWJ-YW#q?-QV5=vwxnudTP+3z1Yb4;q zBDB)yShT041+E_lUCXn%(p{gx`V-g(HXz%c6TJ+o;!9tEXH?`OuLvIUdzwE?l zw2^aDh(;rTyO`qS3E#gLEI?H9nPdcIv}y#J2Q)eYyX6EJ20R`5Y7m z)P100A*B?6x`M6%U-{&e|5k($dn=@3VLg<*yGrIa0L=w#*wr2?Kt(VEHf#aHogwTO zQbgf1#VjuXlVGlZDJG;`LHnVm%y1}+sWB7ts1|IE;nI{0lmb5VthA8h9poO;I3chCb4- zs%_&H$UYx1!3Y4|LY4@?$^-y1Y(Zg)bB1)Skp@!#*ijAWBB6``z`Q^d#1CWy1n`~D zQD}TKjE`CQj9rCEXac&KfD<+N>laB;T?am;?M^D7QF?9#y`F|qPEFhI_NXId*%y#Y z{Hp}YX@nI95V-mUST~?NC5PfRiJx3Yc$voE+wEj6!FDuBT9hg_v(7!XlV&0xtFWe)#__BrFdw z>H?-9pA(38zQ9xloF!at0J9o^eAvQAVn6^D1G?QzBsw4@G76!ItALV#z$ zM~Fbg%nOW5ghSN_G4|lYY-L2oy9}Oq2xL?+cS})Dz|+8O5MVD*P(pzkU@!mxI>2EA z;%<3~ND08J3Isd?0%mpTw!r&>%Rq?3=zwp{?*TfU&ff7@Y%~Pa>fwI zgt2BPa<=*6AebNUHzF$kT%&}~5ytPF=;C0`8J~3|;yDAg65^d8V}glmNI(Tt9RPNX zb;>Zn^$WobF7VxaGa%jx=ct=mI_O9t`kO!&2|N7*J;>=-Krb|({wAXRBBW!9c2Gn` z?Oz0p_#zN)o$(%r%&-F5FSqspgM^?z34#)6t9jI8=^;@z0;Y8%fa_Q`f{2Dy->J+f zaNh-Vgxc7Vy$t-Su{5p!LWl)X8j#R}@LNb|LtyI_YfxdNEGCwKat3>Gbeh`)8yJMreEp*cO z0oD;O4QQ#NGFHDc7qv5_v8(mRSQ#rcqRb3T7{V{mmk2{+#yLi*Bv*FC-TF_SKjsYa zy)cn@XKkjCn@-S!1PAEfk*k378#FfF3F60)g23E2k$5MP;z1%m{LlnH-ud?-n12h@B5c|0==;ezWYw4v;bB%s8|9u zku|HQ3IqnG{|!^_4$p3cwI(8DHAc%wAY_Hs9TaN#YbiKC$B4J^^}29m0hUV`6CiW| z?r{Hu3G9we3!!QXCivG2R8xR!x)l@l z2^EwyATk0BFxFaXf20=3h#*Y?cNLaUMwQ^|pv161?_?B%2VI3A zu^>nhts#_ARcCWWEl@0F5N(MQMw)#08zqc@G4mh!a{Nd|_`i}X5yn>p?j*n8NWBGk zyo4_(Axsz%(+#U2nC`#Y4JcvsqB^YoG8<@H&EMyF;K?E+1qg)?lyQfL3MB;yA6D>C zWWDe`+Y!ka0X0gdn=0&ggs5W9m*X6K9i5fP1bx9Q20j;If)a}+`b2Dk9>KI}tSR6U z!I$~LOh)<{oHBxtmhSG1=q(~CBVdzVM*=z{iYiFdmGE!{!6B$jgvnZ?lwigNSS~1< zv4EvYNTh&R1Kx&6s>OjXOgf4@nF66lBw;!-QE>7lBT*L-IRRp}!6@hP8bI9NgBSHl* zW7++@+a0yFyKk^~8de*5df0tW-#wW3)TNil6xyH2#U?aON7qF zF~2Ws-QcS@F)RQZU~^M&X8(hPJyzU8szm&i#ENxD*rPxxCI;aHP(T7nsWcEmd4h3% zDftcRe;db&0Sff2AfW=voNjzEK>nc*ZDT|Mh<^$6t%>}ys2YXv1MzPV1!Kej;Z%6G zzfE?u$Som#O8^^2%+GYNIuLGz2vUIT_5a0+EO43$g-x-xHyS%(HsZA*-Y2A(z&9I( z3e5!`n;F5!`{cJyX6pwi2G^iU9DBp+p^m%*i!$4R3h}2_@Ni9ze)Hn|0Pms zl&&cuHHYQP6%}$(D6bPvbMcDooYzWC838YMf+IC+MXF_J@SRqva+5FGR3AGLc zU?K#-K&QQn-2W#|PJX3?6ggJFFmLO706xt1+mI4NC)YRovC;QlqTP5BzZeAtT1RD2W1R&vHt3Xs5R7w9?(6gy<>IR583uJRviX40`8G?il@m&-- zduJfI4(Ha8-rq>*oL(hja}odxe6NVjDRM}T*qr#KBeL^^&FRGL{={O;pB`bFV zdoqZq&S|N!f}~Np%R(tQJK1)cpgSs*ga-2si}$;$tN_*2*+?lmiA+C(L`o6N6P$jK zRzU((@sO%HT>Dy@G9QHZA;gPiR7+`VE9Vq57aNkbb$|upq@yVh1^LO1Z0q)22$`xzG`$kp$v^=cED1_Vt^YV z6VVRNmp~;Kxg{uf1mc2_Q5HslPy!HSxj}Uee8XOWurEAwI}&2UH;?W33@8X7=r{`h zf#J>XIMRz1;*AJxkId*ufg+0u=py|B&#!>YCsMB-Jy|e|XtHjA)F=!HoNqqN1l&!b zAmC(jr>K|}O2oiRpppVbIFOzynqVu)j+&wghCmInCaD&Vy9kxP)C1)U8!q+9~t-~oCeRaFk~ z4|r8A0IZ2b{r}U>K#J6Jd+G>9YUZLoq{||dv_kSOAZZ1mMC8LGnPfEeuxB8!@;DUf z0nu_%fE5dYBVQ2;YyY!#A~q6AMhP|&mN=_@7L^N9WEosQpdx7&54!KIA7M8oqo@w( zluL}v3yOn6JA9vAXoxq*4X3Q`piK-x(A{}Kc>w+l8g@nnoyya9w;IENTG?KE*pADW1r)|40mN`9P-KM=wi;DC1q$=1PbA(MbslSEE$N}V(O8gdKD73DxmoZg{=grbnGYs5)RCc zs_rq4Vl>9hjP=9#b%wBaHX>{VC2sh_Rv>OJ6t*G?9ucLD_*F&lmy#YT6r~;|t7^xs zb5&^{E2}D~GXw(=x?xaL2UQ#G%gV8s?zS`5ij z>q4OkzAQDM5?#`TC2WX-RJ(Dx5o{yj*a7ir=En|%mJ?KPB1Fvv)u9AA@qau-2nf!5 zBs4O+?AxML+ z@_Mt~AdGp;^~5QQ&+RK1`I)ChcuDBpma6@f2-s3?LjsgJIN!VE|7 zB~%*<&P`z@6ucxNrL5pcKt;yjNWjIZ1n8w&s`}tibb21IcP)xdHV*KDhBAj@@}Q`C z83qC20(V$jKT*KtLE5DFRKnHsvZOD5Ue4+Nd^zgAc^>~0|3n(jf|vOJ6t>YAfXqL{ zUhzvqjZteBg$Loo{a@mjcs!@O2U^$Mk%*}n)+@0JT_@q9zeL~VSi)CJy5|*3tIA~_ zU_41MTH^lEOv`5fvAXF2C3hT|Uo3Uq&Xk~%d!pAqlVrOlRTu(n%F?Bfc7Eq6H&mwC zkm^N08W>2)&X9?eg(AlLaAA8Tx;nW){6}HI@LN?(e)aDAlK;8XwKl4ip1%<4-2Zm4 zsgRb13YYH&Lok8*r(vEOl+x@Rm>B?R4k${$rsmEPLDQlSyp{pQzX~ajQ(ZX$tP_>O zdgdD@(~o9n+Rx3p(Yr{S-8A5L#E!9)X|&O04L$TF6m^ZTfIlVV_M!2#X^@?UY5;)% z4ZX-`qN33pIesm#7X zIg2Q(PJ&{$BekM$gZT>2zZQ~Nt~J+*St8fYG-BD$riV7*esuvpnUFhXLsgW zrhU%kIpq6x`Lrt?dDo&LypXkIhAR0!NDuvWGu!fM*AJeOLgO;LD9iRd@M8s&X=E%- zKKbjz*-%lakkUEG&a}_1DI*r&mGe4ph6LFSR2LOuQJs4a*zn|yjV|vTU`~r^5BR0t zi5(e0o%YPewk^PUVsZW z%P~D~@ASw0@FaO~oa=CvcdLx@HWv+X_GFEoa;Z`pGZkIUP-c4e?uJ^^$KjQ!4}qa% z+7Eiz7SOWD%T04~?3thhBsv`gNU=t)5V7f*v+qHCjIx+Yg3ziKn1uxlZl z-d^w$;r`!9fEi1d16B^6N1|J>?OTWQtc8O#|=VB&hjHu(Jf%%wt+g z>1(taX$g+a*gtmukYQg+9n4O78f;g+;o_{I=7ESVUpLOmYV>MQkgY;^JNiQFLbyKKE(=aY2p0vpah~O&&pzBMRZLq4=UI9HTbVo_zVSQL zpiI20(sT)Oy?DwJ@bU&Ch_9&;l%t=kkFJ(21R$Wg;LH7-cXM}AF-?2_&b&5R|Ca8r zfVp@Jl;q1t4U#`iDoyzmFKYBb3&c#$D$zOaQ}Ag9CZprS9?&yS;e=t4CUJZxj66WLUE2@K6}d4Q24V_u@sj%CH|y zxWqJq>IC}IK=XvuJshASGkZT-FyEQzS9qKqadsW`2Zq1VNWUCmH+xw#hj&>iFgM)p zo0_>r#M%RbKi3kieGyuFWWk`d531nhUK`nL*owomSP1s#;7Ohe^}pMMDZFOtwNe^A z$SP9F>Q`PY#2233YEu#275r&&Ap;Fi7pgFX+hwFC3nv^~*^qWZ2B<2#j%pBYH(S&I z4Y8Ol2ZP@yd{0Jo-DuL|(R_w*#`>1;wz> zMXXU5?k)aP#|$%l^e}nth3T~kr*nBJ&CQ9Cb|&OrZvSK7z5;rsL!~6UxG`|PhZ`ry zndv!uHyEL`xxLXBb=Zpzq*P!N6fPS>q6mH^YLcR3*yLBHQDae{xh3F_E(KT}r%oW> zHz=f?-J(OI9|c>|{58|)?)$x^g|vg&g7cZMRFS=lOiXk<--f5C=&*~Qg84ob{(EH| zm_$bOt^@U~O`J^o(gsSlJ=5soyT55?g&G{$=x7Fu*B8#!{m%&_TX33YXDl)2xzmrf z_jC&VBfP>;!V63-uo5!iH4q*Y*-+tmJa{PBh{emAQu!7OS zj!y~f^T?1}kPQreqtNFPv4Mpjj3dZDvPWkUIGDmSDdsN3_N_fVdW8vvf@ zt)203D2p0)f;V2^&%wC_Uf#$74o`7p@S=oS;U z8dTfuv_0d_q3;qp;w9J-7Yy`^Pt5U931EVcxLO0|YkoYyNzrs2zqKEJjx10H+E4#vF;D6sYZCbYcv?npAA#X6_>}OM?Py7RS%;gON~;P~(|v#XfV;>7 z9W<|XnTgI5Ivu;FvnMl+YE#|{=L*e==PvqDg&7|#IHj~c%Z(l?k5tJq&l4xGQ=w8F z*uwB<0pAuDd^%x!3d~AW`Sefz+@hBUyV%B~ccG|@txmpAcou~9Dm+K!M66fjN}~^} z@G){%{Oa}CO-eC%H=*nBb`aqJx6xBH5)ODCAx*xIT)rKDhC-C!>($hkhV*YiJr73- zgwcS&G|2moewv#9Uk{3<5i}I%H&j2-C2tcMooZ#zm7d4Pr*QANar|-|w$SNE6Xp2k zT=5^2&b=O-mbRy6V4z|vZ_^L>1jB!iIl%(5;>)7QbX9DSg0H`b>G{#iHXI$a==>Ep z)gFQHY{d(+0o8Z5zchHZr!|jG=45rgf$oIiP*N|m5fj%;F(7)UcoV{lc zo|=e{YdA#(5d^|)mPGGQbhAsWUDs>N|BWaVVd(SST;8!D&Ao!yQCDUu?b6R^b3zn} zAG5+61D#lcNLIR>68$K3ZcntveMz>bPfA$^iR~JnVZW_rvnJ|cxwH=a{db2o-?-%O zFMildXaIcSsK!ArwB=Fs4Q_;YlmDex`oyUPx0})W5{UCmi4h<4r%-hyp(RbI7YhRiSUrSLYQPZ)~L2);^RdZJ$$ zjhm6NB3ZL45v#pCPmYh`=fRYD2^U`cW$*ZL*Dz8~Q*9-SQ|DcE%nUj@RH|0sjD` zFpaFdT2<12l0zYY)qz{byk__e{}^F1_G!z&$ARp=$d(^D?RidqeZvkUR@VLJw^w4+gXc-3g|BBJ>$tSWpLCjqlZ3>v0KwU_XyL-!zVuAPNx0dc@T#zrX?+=Ujqle zkQRO4fA|SZD+z^gRrcp{z8ExeYh-^Ot(@!O{d@>xOs^|wHb|?@F9dlQ4UNO>} zE*x3KmzNomoxuEbM`KIsxu2-;VuR@Ir8IEcyZV525pWxsSneus9Oxzk&ms5;uXI&D z(?|mXj0Tx98mjC^urLrba#w;k5X?1|rea!73e&S^H@q83YW}InmV@Xt1SIERU7HcY;+F7S2V`X&nmOL)dl*=nABs9f?&$H zFEEnpto4)Wh2W4vM}0&7(I~r5_2&!YqOo?|KIr+*8Vc_DRuo+n?YR-zZCDnZbO?;* zcRz};%YrZxe^%Ju!oX-)rc65Qf@zOJ?U>0#cE&NoKDVR{PHHi5&5dAg9zueGn43^I z*#(2D1+$hI6vx?hWCr%ZvVcj%p8=*ly>QG}(TQx9Dbqe_WY$Oe?rktKU3Dm`N=(f^$29ZfBnDxJUrXSSCOR6?>!Gdb+^DT1?Yj z%->(odKR)o!$nRm;P8E%#-4K^c~)WV&6 z8|LlN?mtQBLwJp=$F3_XroG}Hs8RR_+9+Z^@`FS;9H1-LkVh~~$6ds`IvpO8AjeKE zIDc=_6R=aurqK(XifMiQ*WCCUy8s+2WEczPhW~cJdWh}gPbTW;9q2IhbL6pjrAOWZ z@joFfE@)$9e)(}ySS0@P!y@tHq~k|zf4C8uq)0#pkdY8ULQ@FyjZZoASm9Rm_ZCKE zBT%i{Xw&mH zaC_$TgLLSIH4s58q`6SJL4(hSsFLia&pdf@%tbk{B*%L4#L;@;sg@kO=`FGVPi}^I zYlt0%x}ARXb9)rGl6rTA(AdRRZ6U35uN$YeZKM^jBUN#7DWB#9>ZvZzAYn)w364T0 z%MMQTv5%d_8Z3JnVR!8=Hl`r}LBw|&U0|xq-pW z@q%QdWxN|?DTI;H8T6w{WO6-ahiRB|H$W)`R7NEJC4U16_-;%i!mh zkj)4mgZrK98ohGnOFGg z4D1h&7_~4^vAC1+h8g!5PcR zfyE1bE~Yt;^~1^cQ6!bfX(8`i=yAetKMSvrPu}htoIqr*IS%FEu#B>V1OEz=BL)L+4>Ju=f>Kl>Z}o7_c?`mL*#p${b0 zce8lQdwsr_wEwLKb+2`G%3yC#-ulGV4OGsB+PbOr@mGIFqjkFCYE^xuD!weIJU&)( z9wj9(bD(@)8`sn~J3eP)tH<8mjp3HGTQ8z7o(k|hNG&tv#OqG#oOvhFr-!1&-qB>b zO)2)NPtz01!Fw5HEgMTu9`dCB1Zakj&Q*r#tOnkX`~Kj3f8N}L{3LqGOTX02 zIK#xwayuI3tiRTlI!zdSaXA>zb^h{l!a`&!XftYP{h57^r(n@dam< z#DZ5h=#2N}%&CTy?Z1UgnIGqT3GRQV`TC(LJ1$nzq~TqUuG5<`&ci)TpBi+}`s+-3 z#L1*DHh+Db^mdotv)iiEM`~ig-wU+7nk~Kbnd-=gx=m* zUNX1q&`(Dm-#c>bMLE=4IK3+~qzgLeZdfMk72CEcIeT&G?%%Y{+VZtuykHs*8(s~a z)3wIwh~M|smlmHm@ta?)+zr2gLq6JlZQ9f_KeHpclP=7>4!0}tq|G->*QkI=GkqKzJ$+ikyGSjVgqbTChGq9Rp+~P?T)J?A z*@}sz#=W}P%NB1mK8jXPN=xhEs^X`=&b*crZ>UjL?(;+w%@~`LIoU4mSh4j%y(KeZ zIM1odjh&OM_i3(tDR1a8<*?r+mBssee3}+&9=s=C3bXdL>mn~}=t>@*wJr^_6@%_D zYi(Sb)zk%@+%s8Ka$Zk-nxyZQR~~PQICVmDzlIijd9m%!Gp=2ZH%z=!zI>qudaf@g zvv^UQS{8n;H|P1o^{DGN?Me$(JNK?v7(H#l-cx2oQyWuMowpeQN#K(K6d+aQwpOZruiQBD%tw-g8dp# zx+e7e3V!5T&U5za*fz>qN4ruJm3Rl^bF|u$rp9u+sa=O+4x@Fw7+sxAI~}xbxAu(- z<@4^WTLo6l;j-t^&%X8CwDNH5R|dWueaX^yroJ|Zb2i4INw_-Mgd7@uvBuGQT#Ko% z7F-T@hu2ABvdIY+yiN|OIdO&>DKPVDsGkcsnJu<)$C6EtX{@sJPOdLTdvf_AuTRPj z^L{Y3)ljq8n*693#_6=olircg*z{FJPRU0_-7PcFa+a!UJ)B?sboo~mmrBlPYad8d z?Nm#(iJ?!Q#K}yuHUI6KhGkC6-li^JsEVFN<79^0#;GNklE`YN-pPUJS$gwnmfK%- zaF1qHN6%Wnl0&)}y*O)|ldC2t(-|6|H^i=9_Iti@{A$#P7mGaUPm~>QN1LimST)-_ z*#`I4)|37#^fuD8NL_8#)?|8d%kZqWzJYlI7u$Iu>AY2H5#`5!sDB^v>TS35_M8c_ zom@}bXnQv;it(_6y!-4K>~ekD_nv;vo|2u_FJx%sf|*S;)#%67>_z$}=iQ_2RFyOB z$I-skjAR-OGqn9VT-yut9(0%%_t$6ssb^Izy^VUt>RnOG+Wupfp5NS4wl$)jxn5^` zE<-NUzSV7Z4=pol*%S?mhLeT){<(*u)pr??W6WbqH>upWJ=Y)?&u(j|&%9h1B3b9TQ7LS|0_nft4SB9b1yzCTdpA&)RcOV>K-5UK0{|ydHe%fF=c6FwMTivp51WNQK&)WJLsHCv|F7V>YSpX zi}hekZG?N$r-h1*Zt`b0l)JTaC%u1sS3zxq^{=>|1$raQ~)s+{>yMtQKU|!?bmpUPVcHmxkEb+c92gAy)bctqW{Unq z({i_{Z=)?1kJqx*YNDt_tiJuhU}bbtseZ3|n)2@N9@h^pyg#WaLuvThrvvR>5hf1S z0VT%E%$ChZYaoApxu5RhAJDATFdj=38*?M3L^@4`PFJ}3%FdLh+muk0p1XOqx!9an$qFa*HR@*-NDn_h9X|V0MzmfbkGo|L| zOLE~U8t5rqpJp0c4<4@lkrFjwgL1pvllp*3=e-IV8BfF~_?tUNamb$ZiONMY-dY@p zlr$rojN4H@e$9((i?5FBoRG(OtNl|bjHhqY(J9ex`jV&*fhSLYJzhDlPUC{+=9LNU zhnwqldzLxC9+f5b=!#(Ov34te-ObB0=%JC1RbgN8*Y)_gPMz9Fa*>hj3EMh`S*WJe zV*F+?OhRMp$1xrqcGZ$lIBQVuMjiYaCUs|$j9A08+6(XlnG;rZjJ^;}DNABgb&3@m z2i$(y$ao*JNoj@VxJbRduFrP*+e<66y6$a{_oqvrSWrc|6Y{FNqP7TTG}qCc6kW@G zb5nEToQy|eQTOGG83|%|{IAQcgT8C;i?<+?CcR0$_lY{IT=JWTPc}M_^U1AEnRQO` z#GJZByEXbf!Q;_%_H0s_U_DrP;AacP>*~yk;G!l8cg>{W!xofZipnM6@jG|K7hRP& zF|&%H9irP)ahp2)dSGtrz>Yy%`P|{Py;eFQu`V_ec`h|WuXuw!Jrj<}7C)UXPkF-f zOXsn2);ZR-zuA{`$-3CD$SUesw`)^cxTOS+}N5D|e&G#uo*XOdnl?pX^N9X;WI65!|=8GgNc)$qrNb z#nwd<^61@+(exZFV0rxN_MMd3GHZj#d)+@9AH11d0KLwjDI|1P8Z>nq7fSUhlBt!< z>T$Qb)2BS@*_V=U^G82hW~=_51X6%`?|ofYDlfIrtG4Hbo_;gcuFmoasr6}Rteukg z0^S95-GWWkZ?3hoCdr2D)-`G^)vxQBG*s(6bay;`dPHzCOIs{{!XoP(dX-FNv9sL7 z37ZFQRceZv@#c&7J~nI`2hXO6-R_Q`2G6c_Q|&5REZg~QHQm5}z^`IHQ~YUbm-lT^t+KW^kmmZ8E*zirBWsh}t@Htj z2?^cCU!{gz6_;x9E4?B4|$@AK!)};FpFotXg zU$FshGa2>tkXT=VM%Srx<4Bt~JlwrUl2NzktHO*sx8^LCFYjBcR%IQBThhoqA_aq( zfhLen@*S?1n611ee;f=t8Jaqvftor8gZ?Pq`}#ZEo?GF5gRg&O9Sli)FsEtSeJLHs z_16r1d41ttuCEeyAM5N)HhvWxIQU-fdf417w-N^>jwYFn^`If_4kuP#TTt8%8VRb$~ zFkGqnVxyLvW!?Vauh8{bLDm&{7lNg_l+5zWW}RTc{WIZu+p!S1|5ARSr?O^hqZZqy zu7|X+I6h*k!L?gcBz%XLOPVvaX|PVEPn2OEkD_@rqM1BTS#3>9i^lUfS$u%IRtpB- zu4vfdc0bzhgO^T-)BMw&ZiXG%N8=`MsF4|vX&P)C4_w_XO6YE% z=1n~>fmZOSDm>w|+pXOLSHDWgYjB{ahU70&?C6Y@oCy1HVUd?huk3QqU-GU6OZlq7 zDE6ehlIZD-pN;0}1N1dbvdu6B&tHJ}?e2DbT~@NI$gyeO*HaF+23mbj{r*h8w%Orl zH-F)rgJItemMT<7!-o2$`-gABbhJ)O6*uEGES#J1Q~A7a`}|5xCP1GuP+yy-!tU|1 z4qJMVb!KL1qm?n&VXpUaZ@Zkht9QiDmrR3^%eU)@3@Ieng<(CuKH zS}-e3@=#EFs^Llf;@aiwUD5U3A%TO93fBW`w(JQ>W(9`~l+VzY zf!82Y?o~xzEu-dn;2DjR?{_m&Lq1CChr~5ozLRThOz}?oP-7`4-!wQ&{?(H3kihw; zGnJ)wHM{tr>$Y%xsr*)bwwMcy@u7QNkF7^jd_?I?$MqDF8Bdc$p&y-T5w$tS)0NCS zQ3S8~$xZNGzh`m2QtI~vYySvg1y|QVux{ChL>U{9Rx^dZo*f(3m~pxpPU{ z_B)q#r3HSg18?jHMh&lRpuaXLk=oli{IYIwX{b)Eab%F={eklZM=-MC4kyutdu=Cx z!WPY=&3z4i%Ps;GrepTu!CEgAHO}E=b}U|@_NE+B2Dpni4i{?dK-Y6Qoi;Ops=!@L zP!+tJl*Qs6Usq76D`y59p5B$udA)DGhe}+|;1T0;1SAVLgundm$S&E7_z|XEU2-nR zj{rtic}ekN-Oi5-8loSp(e3=^_gF)X7@xrnTo)(LQck8O&=nfdvjHo7`0ZO+v;ELi zf}w{EG-ZIBvNQ92ImsmvH8puj=^0(K<;M*%Bu)2VpN`AXBY$jKSD;&der5xt=i&nL z;sCDIoIli{i&B{toNSB5a~aL$D5xy1$DCZ135*3Pz4EV2G8|J$D5z{N-KO!53F)?D zicKb3FY27m86wI;nj)qw=B7IX6N92A3g zg+^MLKv^K|Z;F~es{!(7dH|K5*_x_XZTNB}AXqNwm2aBWRd7MC`YdG27kKA+mm%)V z0sX`ZfZ*sM&=dPWT~KEn3Kh3o&q(1YJX(NxHh!*Y!T4T3{lu#Lg<|mtg<)szoflmO zf!V`;p1aO+6qcD|T1En(-VUP7Fh{y8YzKsu4VC0^Sh+jDdFdk$2rEA_Pk6Y^lQavr zB5C2Bmx@{$e@H*^w{odS3c}#q0Y>3B4`3fHw@6?ga;>+qxR&+v5=2>`WUYbZmD}9b zkcL7EN8@J|h4DS*^E$camZSy>b8=f|e_}+0zkcHL{DnSBh{z;P&2p(jO(|F=EcNmv zg%O>%^v)~Coe%Kbbsaiyi925foezZ0*I%!K8CRgI_vfRSYfs2Pi6w&jw34!4!D0@e z#dPi<$w^uv>}v-pyGe>XJ_yr0hVqA`hoY&f-v@d6JXLDCrqk#8G@jlDGj8Rb*MUdM z^4xU~xD!_Rk-+~y%tDX+kyTgJr30LW4kgT47+27|blkZcJ7>vTCoJ`D3RAGgoCUE0 zhDrijAu*d7MIjM1eau;~_RdqrOsEij*7=5Vsm1zuIYa7#X5yPk_g}>s>Li6=Vup<} zU0niY`fZh)j_NWe%U~d#x9Hpp_(M<@)*g(mZ4?n@>1?6PMk1hoJ1wan(2 z@Z$Fmzgg(G-bf;QnKb-~!I9$&h87wiZkBqe^JPOFbGZoU zk;8x+&CrNYe6wb#^EH@%TWcM_$881Dm;%DKKTdeGbHTNcZ8F|r6&`8cfHI6iBl3~) zeWyrQSHyrc3N&ns7SmiJI{+G13fT*Z3~^c(ZyX9Si$RE4*=9yP5EzurNE46w`6Wf8 znf)PJKe01^p$cb~y9oz4W--7qs}EV!RkViE`NJK3&MePw??v@Q#~?`GNtv!`wGK&2 zbJff|CaN6*u_hY!>4@?C;RMS?RC~(>wVt?g}*;Vx7%B1 zKJBYex8c|x?w@5E0^F}wnKAj=4i z0UWmJL?Bv-OLA#|*ex^&AC9!e_zEj6PvTpR@*H3h-8(EUuA#Cxt}SCiA3`aiattbq zUw{BfOUiO&khs<*200AJi=h^_EH@1qPM<y zr1EGr-Qs?Tp~sjaiP0H=aS%hXBos;cG->7KD+2V*JEphfScv29xv8VwJb{|sP-ws+ zyah+9^&qnsIZ`OREr-%SuD1_Ei^<>#!+3Qv7|L*V~hE7zZqeHw% zJMJUmSy+nuxDU7rk^#A00}pY&$}m1yLn{w?Py{TJA^8C+CI&44H~>IB61423LjW=w zO#tc_z{+IQuL$YAs0BH|0U$Ed`s~4(E{Fm!%xxL>3lKgN5wyT?mR3D37Gv%gAUC>P9s_a zOBLX4;)*@O1W2pHIoH(#3npvTr|jt4Uycw@&@=|zikn721Hh$;CP`802$<%nfe;RW zO_0HM;psAjL!RqTl|!fsd$D5(5j#-HZ(>6M`#h_=4p31Wcs+0S**Q0wX}N@Bjb}0i6H<6oe?0 z*8UNa3PVj~3yf6&QY2Tsk-v`c>kz)-I6~V3ILr{}de5MW&%=g^ z;0;pK#_$GEd;)kwHo0_|@jL)L0;VbC8wBVjr;Oe@h6z#VaWRQ8b<|c3j2!vW2A5Bj zHxHyqG_%{w@DQdVpj!dDpbd#(!t*2;Gn_~c?S z^9=P?JfYxxX<|kjP`%njeZijw<9h?R621bnsui4PkQ=~cB>||+dkzmkWh7c~s^FmZ zp8E{(71kFJxGm3MjWEcVJje7Ta21@&Ne%#Y-4hi6klkUdD=W-DkOz)K=w$#Wt4&?L zj-(Z_0W|A?+||^UFM4PIgj0Iz0SIW{ZSlcN7B&DxcUTMxu+2|tUJ~ZwkQnqcBHb_J#flGz zp(mE8L19`5_)r;2Om6xZoH_(1hFO*WLJY$&F}x?iqkRq&8zMp=hlzFP<{ubb_Pw0& z02wo8({LFAjp6JPtSTe-pyE^B@ZO4dm_&vExrH26a*n92ttGhOGA5LA-5hcTJEy_>8v7K2%t7!tv6*)h*zPuxr9%17g=CJxI#{wx1v1rQxUegnbgFL?t|23E@`C z!CW$A&itfHnsI{r(ov0VZk*?}2;^5Bp&t&Yncl2Y=g6qD*_BVH#pJ4CCiQ z_z6>VG1x-u!GS)p^vXZcdm!o)pM^i?DGnnP4Xpm;`3NLiR54cz6BRI5%M`_kVkwt*zb z0{}Y1*6;bJCt`pt(1(6g)yhKwsCc@DGMs1heL_cMH6+Q@nlEOqB78sim42XN;nx3l zIscNLi}1K&1(?r($dZM7(9q)zBsBE;y_vB;3P%WXPlg{TA=hET@}TJuoHrKu8m`}R zHf4D>_ol1T9Wht!EX46}_LA`63*)9DvwT zavA4cfwa3i$2;a%8i2vKLpCVf)o1eH1}#Xv!kHWx3*gC5qD;Und2fV>*bBUAxD1)w zn*#r@Qb&UX4RFeabIc$Iy6SC=BnLX2z=Z5nLc2jnc*Nz9(7NEXi)i)w=qw}6NTTyJ z(#sN4sgMGeCNqTuIWIWKJrmpCB<5}{X;uy$H9dz@mq1IY4z!en1{@r?g?QSS=F1W^ z&^&Bvpe-Q2(BDzaqV3pcjVH~Ic5giWO7(zk^L^`a%sT1 zft(|xvXDFd%Y9%sbqIwGnzu8RsUE4s;tn&>`u}&6vQ5 zcAX?5^^oU7#oS07da4^rbNiTJDbYIc97?a0%Lxvr=i$inL+C_#17PAq8;}i596X~c zLNI|l(Dt#B&CXu5_-pW&DZEPN3sBV&c7YI}?JKdg-%vGxEYLscd4pUScu%oNi@0zT zBGL5|bEzO*sps0%kpM~VFV6EIZIG2RI_q=k7SoB6RBMM->Sx+5z|cPfG0o=zDR?9Y z(=VQ@3Suw+hw$~k6XDCm^dx8oA*Of?57I=ip#x-Mg7R?mub50?3fnMtoFr=czs1Ib z-7h_F;-^7o5)$)$>ZTLPGv+`HnhdW4urodzff+8 z352Nd(~xi!r3!HY4P^?Yp{_U>m2wL|6T*VCwIpMW39`7152qZ&XTo{oVN$HFGjcq~ zGJokE&;}A3I?mkie+gV`Al(74Z?{-q5+~oqv40GD`$;QG@>3Yo=jh5qtFNStepP}h zN<&ZcxWM$E=y=dYMC3wgd5C^wwFF$x8x5IHxn>a-!dOlUn5i{gT2aEswm?lp=K6d7 zpS8Mp3L%dzONxru%`^!;)Lf>7B`zY)#wvzL2PR8OuKd;?(YJmZqJt%-R$}(p5EU%& zB#ac^kOpMLN-@t27v@2ewXY_4wY#WI)D=8%pg(vpUR07(+S*bXbu+WPyu7v2WRZTf zsE=HnGQM_Ksj&C%VBxOhlM`brdqnpGg9Z!B-|Z_NVVpf>gfB^?(|^BX$D5wI8d2h? zS>qmij2*r2QhcsK{O{VPp|MA=mI-Q)3dy_q1gppjhuvQ}|AY!c9<$G@oJF#%eh$_r zj6y2(=RAVC(y`U`%{jI+bv5psc8nKxDqGA}n)c0d#zWf+%(}IAN89?6%qpIQ2W&bw z`rD(w)`60Xwryx^L1LM}_j#1YV*{7bi$3U0SDpi~0l5vaid-Z7V5j=#N5&xJ+RaM-c0%c*x(>@p+uVO|S#V@> zlHzh!b7|JflhKyybxXQN7+J4wi8*@Zbx`za&^~pZ*bu6uPO~%510cFV}cx-t)|*RVRB3<8Kts8l*I4XU-Tj-u%mysw3an--f(=d&K)uw$%eQ z`TO+UmN)0Btec1sN%b!26UO_3EMx)Wbm*ID+3h8Z1GMit2t`kLtX&}Tfed$B{yQAj*#C`<+W<2Xs z-}JRVh%(H5!wL5G+osR>2|bWE`K3C(d5J@I^u&;H#^M*^)t{54=YV>0Dm(x+@!fY=Tyf1~`w3@25x3vSz_)5taBOMiQ>Dps zU{3`594EW)>YtjDKG$l5efqK&Bh|HH?P@`i&+hp9QOm30xIALI+w%9hDotq0Tt`P= z3LP;Ul{jhLM!3eB0A1Y-@EU^e4`hvHs5R=BRGk7ii$r_-Tz z<7sxp1n_cG^c_`4euu`oB%JW-t|Hg-n-wX@L!Iw0j8EP=Xml6KHhJXiu!oFszs|q| z?srhlTaA7(b@|58&A)`YOhnR#^)CC!Qyzl!>NUj+y#%EqoWEitjXiucaG>NjF34X!Xn7aZ z-r9t<2X6HrZ5vmZznXhz0wl783u_-l^wsvR{~fYt&T0*zS70&cpxxNd+V!$7k0cF3XXz1~=5qOKm^Z)<}WX=;==`Tz^rJr%D!8ay?IeQ>UlzuzKG+ z-QbVR%Cn2yk6j(vVSa8D=@(X=ef+Y)GMoJkgVx5g;D=HDW<2Vuu3QysypX+l2M&4F zpV`$zfkj(4-M4;W?Z)uX4TE9dAuxoy@Y?DZqWlAglLpDEwcMa@vbS(Wvxv!N&osl| z7;?FP1P|DEPI7lUo)liPd4rGh7DnlHll5JBD>~!$DSLeif9taaPUj|;*OGFZpK9I^ z*3FpbL}&C)+HSD0ngZlZCuce%&zf-KpwQiorCPXdQk)T8 zch3vFzTQ=_jcA#{;*}8SF}vbYIlTSW1lMKs)Q7SA2`p8C^`!H&=!}Dw1fCx;fXpuf zAkIUIc_PbBk*veTdN&l=h%=OaS?u=6I~KVyKV^9Qez8zB1v7q!s!(RpO#D<>RH4!W_*iO8cgB z%)mdY@CE5}w+(;pUe*}v6b?_BL~vbB&kMCCAg~lY?>sd`)t8v!f}3wkYdId-e)d3}CFbf^=A%;zh8RYhr1V5>G+6SCt4UV!lO zBSx1x|H9xq5>q(2_R!gEmMVZ(1R+I!#JCFQ-En2g$6&n@Iduc_o+yl?5%)6q%6sAd zE6|hHd^V>p%+IL(+;f3KkuNd2woIAqZcVu5&+WBlQr!2H zXh8_{MAl2fLyAX28EXF3YPtpNYw4sL5US*T*#gsZo{IXCVke(;fB0dS?nOWy6;XUT z?s0O%{D{56OPo0W)@lFaXA&RP?Ifn%I#q0Rc%dbxix&FPNETjF z5tRtKDsie>i5%VwJnPDZM_>UTQ+8`3)6jY@GmXSaKszeGy~VSrQ@G<%GXcdYHf~!~c*EnjbLCB35-A)!yBLHEf%0rFx$mV}@-H zEJvvR1NRpA5IgVqS`mziQv1N&l0VHC?O)vg`p>qP{6-P6|I_S`{g+7> zWw&=@yOEu}M56#k$YYjkv|)oM`XK z%JRh0mcELQedLh?ZLOl79}gco+!t`qEhyqaZAVl-ul1_A<=Oo3_upx|Lgjs>XVWaF zvEJ71Z)f~mP4zKl#~k&u+8YB(F6@|CJyK)pnmalhH^RB8R3Tcud`W@pr>me(pe;4gy!O85EMCE{}>ZP|~YgjM*_lKDDsNu}1AF zcWS;?wHhsk@A_?xR*hOynohMH=_mxW(AxW0KEm`%uPP!;KTSpJAr+luX)1fG)l9Ri z)wB}%yx_IQB*n^y)WRFZ+pW^>`orHMY5HtND3n%6ian*`UpNUeQ0u52RbQ(V7ZSq2 z`&&hqQaz^otDrchTJ41y8<7z*bbuI;#(<|mwGN(h8hX-dUyb_bx}2Sd&askq{S#zQ zLkRf4eOh~p4nV1^)h5UC?TBoKXS&XmYhCb=-8r;kz*0Y_>cc{)K=TkdNjeAmjBJK_ zDYa?Gb{J;m!KN@i5C%w>A&@<}d9xOq550yzyN7=V}OZ zm8NsoT|ROjMHn4~?2@a=FflM6=qf^bL3fO$^8p4^YwmC5f{>eMaYwxG+&biAWtl1M zH{8nzm9M*^s-M+emzJ1PYF$uuBm`CIsM9gy#X*vNlH~m$T&hW!G#Qj12&qZS9lEsmj30fR+3wY7xi?d`SoXI7#?M`?o zoo#ed|I!p9AZdWCHH^>Go5)AKb80H079RDtTIE0L*aNCZ984?V{E>B|QNmTZ=|JRq z8@9-|0|x9p+ZRSd=vqYm)o-dkI|h1fyPnke^atn731%_=vSo*riCkM_;U5ZCfUx;e zgMy!5yVVYB3fzX%*lI%4brLhYpO1y99J({aO@h%Pb`5NDn?kF9)t#H2{ z*`p?)U%VH1ho67`v!6-!@I57d7;LfiqS{dR+VA6o_LX$?(NlGFR&EF!FghSiH7s}6 zOW}tj51OWPkV7j54~qO9c+gCKIP#zp|CQsnWn3`r9*V4vdN=5GW?dwr8IvhweC0lfjnwc%Tf~f z)odfe3Yw28J?7|4(%uwkFf}H2B`s3WEQ)LMG9=HTcl16oAYDpZy)`iWgtk{|{l!~3 zg-+n+J6xD2XupAnrZpKvoPduC+^&MxfkEO58sc!ddKsF65%9-}z(ifN zn5i+saqfjZMFym_?spS1meV|#g~i*SXSmYzWAE}*v~=UHcJXGCcIOl#YuY5eifaBV zX&wo1)t&GST&>E@UrPJsZlP2E%B32*ch`Fvx<#x{jVYQ-ie5?aQDmN=yq2|te&MrI z+8OVJLKUrVXvi*$RQ5)wnx3x01fWz#-%JwPqh5-fLPt_c6(#_ADXOBYS-_#@6e`2- z5CKR!oXy+N&<%85X&BNaX#wsvq%)Z`k5ok3f}f|fPtXNd88L2hESeOC=R{p?aFzcu z%4uGTdS~zQDxYfU8pEkyJ(W=&Tj=DsnK~IibQ-15iF>11KI6pGRlFC{&Xm|kjDvxp zJ;fZ?G?CzHoXS9M#7nVfrEKWZE^-Rt%>?(h!jItI>RcE!ysw5#Q|D2)LYp#JGn|ve zJt+pZ(DHwu)@kKE_Drcgq{fVU?`6o`OlxBM%_Z%=Rp^wRf745`Xr^S*#vwA-L|y1C zdSz+p@@B$$zzY-QBF4QigR7OH6Lnde#S4stuwhiluEYzWfaV(f^S|1lWYHu`X)m`| z)SB4T>IRq6Kvmj^9o*N{KN)K#>C&WfI-7?Ge?=FAfT{u_&&v@)f88h32d zw&4q6)nQQ-3R`XH&cYAdmQYlT7*7M8Iq{)e4_z z&i|HVm?ieP5Q#Zl7K!{-R4S-Gv@IHE{H?rFR=0qcG$iY#>%f8jyOo~$XD{>ozSBmZ z%{rUUE4^+GnSoWERi0MuYu+3$nFH^}3Gf-26djAzq{|;n-OcesI$UZZk*9askmr;VIz~zvw7AVm~@KI+YiqT+;|{{??K$mIGCmr zmx$lpWdCAxK&P6=-r}ib=pf5OvBmR95MaH+w+r&t>NuQQ6?yaU!k^}*=~UUX(fK@0 zr_9$Rjp46CeS_n>)ogTtlwNg0=}H{ap(9E<+zYS16dhv-u0+>dXevop`MeF6a0sA6 zuRc!mV8^I}vOUD6iF`QcLP*t=p;?_vLYof7ThrxT%tfJzINpjUd7~4aRb1(MAH|wT zlpBNRM8j1$aHFdbr>UUN4nX|*m;JkoT0r+k*GOBy!Ill1p*OLJnljHHdN)?>6h9a8 zP7q!8`B|aEGwCRY2CkWpT{DhUkaQ;1s@Jpnc;L7G5QjnWCPk+=@G&(#!}l0!b96Cxdscw+G)hzDtU1tt&Q zJ1Q+44(3$xcl1b#@n*1?8SfMLb~`u6jH6j$Iw(xd6KWZ}e`sisrv1P0@e63!D4j@m zYa&f|vSW6!@9=Z)r0WRB-o{4*uprbB@^d)Mmst=jk7OZsBfEk$2~|H+YFDXfSn@f9 zGdYCP;+Qa92OV(Pd6WzT-6|@6k;x}YGT*tVx(2bZ{9XlEef(yJs8YUYP69CeqfGu0 zfFa|>L#Aw+j?ErTH013dWEGpe+ryRRUM3A+e`NZrWW!6P7naU+`Q--NB8( zIV#r_H8S_Kw2`eiUOX+GaJ)E;We|eag>TXdjdpeqT+^8Ee7}@SZf#uh1h;|{6ZrV{w zwQ`|I?R4JlsTJ$D!I@>~a^L}&$t)&K6D)rZ6(ZwDu!4xy)Kjw+;>yaFoT|vk>n2>T zJEb<6+)-0RGSq9U(5ax-;iIebZ9Xq9%OD<3Ai%h6RCRkRz79uP$#n+!$qrHJ^ZPzF zCuc6ude>s?rIdO;$!wX+z&Vk}MO$lP!;}fnBB)~yo;WgjW@7)#xrzK-Yji9Yx2;gI z%?gRFIMU-^fJ z6bM&yT-eOW>qh1$1P1rOp<5FI?m`;k735SMXjU<1yXXv6E8F0EA0bhLtX)_4Hq*p5;nZpuwM)dFWqcc$P$)27E>CPK|HC~XR zghZPUao)<77|3}F;VJ|b(yK_o6S9v9WknEuinCde5cJq{j@f??l8v_O1qQD?*VAK) z{2@yTIUUG(K^^Fvs;$T#I)fjJa*%Ktoaz&CLvTWdv>2o@A;kzz)tV5CH5A}WPJvJ5^p3JK3HUm}Wk@zt+* z6qM3{tM)7=9D^XGYwK*q=y_^MKy}z%f{=JK7V}9)nK8QEft$iteqRKs1Q?{dzzf0- zU!r9!q?vKQO|M9rnVSw-I4hLnMb&1=QwE~O#a9_BmIRa=kX|LCj2+|=EeYrh3u#0b zXcy8MkZf&t2r7V<(6>qB#2tYzL&b1-kiCO7Lt3$DW`>LgQp89rcK8^TznX%Rx4TiQ zGwKW{{6O3vlwa<8Ko~1ctHgTrR|aB<2K=x&K|b>xJzcIIq2wt6TFmwxjEf8;+XzM)@87# zHV@rX;wEHIqeB%T8f9*4oCDCtlZ!U%n?=(`Vn!5yETmpK-HH>tMLIoKIe zlMr4Wgu|`CKo5#qi;x4O$D}@W$j;(BqL|Z{*jaB$K;Ju&T}GTGU*g_#I44?7@iF}x z0zW9tK;TD@Q74xbd0*a6OiL?sEL=aS;}WU}CDLQc9Em46DESCJ?Wz&{*bz~dq^+}l zsMHj$5yF{zZk7Qm&4(q0Pk*NQo>R7bF!`#9e>uZ#T ziYwr(U^~m46%=yX%~66{BY1;LnesFfx<;G%4GymX{Ia_!l*L1pq(>0KQ0lO+#aoN- zKtgpP&`^;yg*S$;5vmCx4VC}!Sn<98(8U1cWzjbD*=YsubExuwOg1>?X#xXL^fqyE zr_|X4RfQnDmdp$GLZ!|=sECF_T~wt)K2Mzv*-YoAL)+P^lTkJk0{E4JODLO(N+KF& zP!xK_gb#^X68`S7G6%vMV|p6uQxIm+8FB~0ilCta5+p<=V@K~29-eY#6nTQTMY{*D z=BSG(@`REQ`hv4S0l90jmxMxzE~<(_ZgJ@SmXlz)a8dwlBKWGb8B0R7q$K1Pc88Pe z?MrN!O8puwB@|0gLpW}Pu1Y;Q)PA5-`0Vok#A3>3NJa6#Zr`^PZfu3fd($5~5B?Y1`%Ln1k z?!A@l)G||pSYZIsiW%-F<|hu=9D@|^aBzpxu;vEav}GaRn9 z^|Sfs4OJNP7hH6oY8CFPqMWxgDy($FG6jQ*oPJ%tD|IlsG;mQYi`#SK*hA5UORpvOub8dETIfU9D>pmCS!#Op2h_FZl{4Q= zn0;O$mNmc0Qm@3)B8<|_$Z-jJm2G-zH}As*vQ4vPhl*)M2Zj1-Lg_EMRqr}>Z#1fo ze&asaJGr#%tG%qK7R%f4z@pk2~%c#hdNFA7RqW! zGkR_K)bGZ=zy3*UEQ{Njm{>A3bXJq*M7{Er)`BrnM}M6J9Z1PBKRYHSUvoEWBeb^1 zbka(muU>C;>%p!xXM^b#>Vx`cN((hooJ;7e`SzwqozS%TvS!#{GwWx~Im?<3y)O5q zj!sn@%Xm3WJ=1scXqKDM>U&cwa<1jn63dRGlvD{jb5O=xODvSqs!}+=kZ?Xv-<*qLd(YO-MC$m2y@1@KdHhBYF~DpVnjXSyWnDJ znVOf*>5=yqPa~GjP_xvW9PWF-E&6ESSYc?6jj75CLS(-01m7jsHVi6h9xWUDh*HwE z(szAy>8p;e$}Ryc^_u86y1^k2eH)ZGWoS4{Oph9&;rQ#!Tykai2ny8+>}g7A;pn~9 zvw{YHL`I;``*4)J1dL!LHUe8%wNYXtm>>N{HTd*#U#cQ*tlG}>=vU&#itL~Z#+s#N z$}nrG&J_LF`;DVgTll4xD;UnTy;k27Cr!%rKQI-hO(FHIi^ApIIu6s@<2r-LDw@-d zl)hW=^OA;<^IuOQpIf}^z1bOGyK8#=^>bn)ls#BKw|ty``$&oJx{=5dOz*wE<;f}6 zqnC}`U9_bnM)U_;ZO4coOp9iZG$>jew9{NMF4E3@qScY}U5xl_SOWKnV~#l23U99^ zR(upa7?oaDDe~6YDY{+LSfA!>BeDXky5z-59#~EK#h2S1U)uSM470tnG@y}Ov3k(@ zOzFOt!FxxVRqPkJ9;+F|U8wk0z0kv9E?_uZdHE#bZr zIVitv6~4%;8MvHy;59WE_V)BSquy*1`HcKDR=6qHwBS|{+9q84tjF=Nxh80q23`o> zJ7R9v{z2GWQ6A;&OyBGW@z;q>EonQ1-+uS*=@Z3IQ7)Oi%RJSej2nb5++M5J`ElUj zfV=w~_u44myZ6hHvxxo1rpK`8{vl%5oq>bzYD@R|lVcCp%}PeA@v^EMcKE_(%Pp1h zl>>LmDnCNkTT$0*(vlAt#gj7!YG0N54lF-dKiEf(ZjGAJ`(xD2nom*5Z!bqpPpT=Q zmwr3Ya^gPkz(>R8!+ow-N?c1u@#>^M-eF7};w_|8AcKYV;# zGX3uMsOec(McJtY;l-dU**oHy0c*%wZ(e(cv%5LG*bnhG-Iw~l9_ZCieqJ)+WkvAY zKQBkszxz4pL(kO1A5HG;UrGM%ReIE5)-^rN{m{F`htwWx;(k|l7&f2zL@Dg+756*z z6Q${1Z@I47{t1cubVU{)4}a4Bv$b~*s~}7-vB7rnwLj+!c0DPb+N8bZae16bWr=m? z)PWZdbw8>5apI$vwFV6?wYcys_(t=wpyK|-QJsJ6cO)Ns6B49W@iB1GrphjFSD}sS zBMRYz;oyD$c+rYKj|JW2TnJ}mUx*r$b%FfV*)iPscneViBXIwgN9A8cfB!u5mmU#hvGr01 zHPEAfho;ZP7X(;9(-!0~p}U?PeG4B3{KJT29Xo@@H}dD78vJfb@gd>-$jr`;Z7&~|dk)T0N#nFN zZ!HVf*LUASfF30^!|xx$h-afAZG<7sC3_9r8zKBND;9cVLJsR#WqWMufzD+w(@HWs ztpwyzM;2$Fh0)F?cfbC|cG@iyVMpj3(a(0Io~!+l!sHQ6H(J-j0$hMD>k837i<|vj zBew;;cu*eIx&AQs{vTKSUtBJTc|~k$w7Q}y-1(-v`5Rci3!;uo+*5i4n|+3&j?#v{ zUKnm8IcVc^vKEXeMlUt!k6;*Y6ZDr??wS2FjQ8jGg8p4fzi^06Tgz(Oqdc=?U=sDf z0!YxWnqGKt#fa(`Jsnm8v+nW@m7&n3)?N$e*p7~ETZ*GRo86UQo=eK(a>~i>TY5U^ z+PfNC%wH9in7=H7xe6PR#@W@lHSnIRUhSvAspRe#<%OdTYU;&L-%_MEw?++`aLu_7 zzs&5oob|q;q;i=}hlR6EM`P>Spm*eRtwb2q)dB6|(%$)z8#=t>hz+p#;jl!z`pN~| z6HFDm|1qVq z-Ad2~KY4}z5DF_iN-yf!)PC*tK@4bkE;QWQ)Ah&xapYa6x+cOhYQjF+&<^|P{=l}R zmAyJ$neSU}v}%D(PKBQ7_QC@9&M(VJBD4F(!+3rBw2N2v9=v`YeiKKmYkXXy+`lIC z-DA!ElByhUvfI-G?LEqaFADm4sxJ5SfZ^nv*W>S3gk7}#uv(*L|KVWKp19;%n5ZDp zyqg2725CVZHA~zRqB1khvKTqZZGFVWM!nsObu(UN1;aRFg1A?Rb!|0$9msMsnilnp-#10zemkCjxX0Fe@MJ%1S#GUO4~*~?^fUl1 zY2`Bdmitk?cOBzvyZ7~QUsc9$XqmsX=l!x$%L1D=Sj<9L%s=`L?;>+;vwi^A_55() z;fHNcz!C!Bd6R;;Svy~~?dY>`&U}yl!HjEu+Lm+(I!bu$UG+zfQpDD~VL1!+RzJPk z_hRkNm&-ie?}6p^*n;K0?*Tizwy+0w%nNW3s$GvMnePpsCEtT*-swBM6*lq1#mC+} zJUqUu?E!Q&3x3!l;jrkT0Uy@UhVJYQGfnC(8xU7CyY82IPXd0v7oYc&BK|rcl%e68%+jp z#RaZ$uZX&ol_=`<&GS7Jv@vk4=wMs7Z^xDa)Sp6+xSg%gpZx>SA9}ebHwB(K^;)S= zqbp=_?3q^Ko;w94-t&Vu*k-&rHt20Lcx@m-!+gbo4>7GLZH-#b2CaJ55xIZ0-s*DZ zr&;d^&OACdH;Q7@dpkC{y~Gs6y<>YjK4cdKKjHQtpuF$c8g%chUad{(w}aabFFdt! zU##BBeXQV*w3UGu^f>Rkwko>6E?)ym#YrC;-yBR7T{&FSvUz~F{}x%d*DY8L^q%+M z*6ZusE?NPC!LfZYtv`^vr&jje&V1iP9-O^~*xQ(pRj*gOvQ<-b^WDNh-u?&h!?VF} zyWofAdaHAyU6MhdJL%Kb_xA>?b7Kd*k3_ZDZs{rEs)zjf2lrjqiQuNJ&Zxs#UGaUO zul({;NrgM_#s<*tCWvBM1;M2DKSbJ~ao*ZV?%on{YXfwmM--zv!XsYEZv3N;NZ%3d zA8fvQ3oThG+7U-Zk5e1zbtG!5>DVKQ?#5~8_OJBm^dmG6^$AE@eT9-o?GlB~s8Fhc z%Vy&doOL6p5z0-bAo6WKVs&srts4k6*NkY&A6cEdKwky)%{xa{9k?oRd)LZ6I=ZeP zOAz07{)AFm=FeLL%|`|%H7R{lX?bb+$fipQ9r;CL3!AlJ`ZtYOy_&fD3HSXZZQctn zecd>+5Py!=t@4sw%b{kM{5pO8dbCz| zj`UxkjqGdE!rkYwu)2SJAc&M zduMA+i`Mqu2(_Qu?y@l~Kz(EC(q|bz*b(1Hk9#|HReE8H)~ivSc#VGKz4#M)z4-hu z5le^6 z^~#-nBs>=7%=J6#lLLdT0GUggpi^pBc%#M+Bgn==l09sfKl)hXSOf3b;Q{+i!jTwP z>5``O1Kb-rkRD$MGo!!v+!O~4_?X^VANErK&B1n!)(U$E+87P9?PD~~99}?pVBd6U zHTOFD#pdux-|2hLnL40^`c?Qvav&K!`oOptJUEG$59c|y1(sXF541FNRys6UM}))2*mX)BnhHdn?;fIhqk{v*WodSxg~q`X zMJ@CT>l~8$n%HO7aBtqLBI^@8au*3ll>vKe;)DRMQsJLDFP2@reZ-EKAAR3ce{U>6 z-Wa)EzWRU@e3@KHj&1FWk4hFzB)ZqQlWkwQ)!NqD5_962EqnUjDJIQkLjW?F&uKF7p6l;S+8`pc>gkt?IXwhW7s9TijZxXG#43HPcQ9Amn zNs3DrN=MgTH;G=k!J|IG#D$V=F!*yq@7P7_xdyM|*Sp6Qy@Q`D_fhOSj)8He?V$IE z(2gm*7Y=|Ra>eOk9Y`mqqLihsYLop$S7UFS9)1WVgEVy2M77ClVs-9ATr!vs_ufW@ zoB66uA#m?jhBA~Fp1{57=-!p8O_$)_C-~ltP+oY3i-dD6ZO#JJMGMl!sV>hIRMq`s zfc5FmXn3N{mT`ob<$#qHMODMNkXKF;?}g!;lBR89@Mn;Yh6)OjJJ zNcni{qE4XIbj_r%d45(0>SBa*;RK?JSL@G;Y(J#Ynvt`_oMoQB2p!i%{PK;A`YDK@J$Y$I`=D#t~;o<$bA|Dk2PCFtFH4=Jfwzn)Ugf3n)z?&ZGsce7>q^%<72mo8Qo)`W++cf==J$m9?>u8XFR#ZJZWKbSK z)x+=n{HWP;vt7PJlQi?|=#|?&>hJXDCp&$8?am|f%_jnOZM+5exIgTOG^i?l{rk<5 zr&^n~-9py-K z{Zbimf`-1t<{a`bO^xMSHFP^VwRCmX((39b>mq6x`n!SqOE1H$%`_k9R7MyA&iQ{; zq~ZnitNqLqZ;7cf7DX!8)=2Sm=Tx0fRfWHoG-8tq{Ix1O-{U7xG174^;DU>sh?lBz z4G_`}?zD5JGyEp%&i~fS(EIqfMd!V|zc#BFpUQ}OLMdcwrD~j+OS0rfoS0&ey5`4> z!O6Peez=*m>i{X9tn2EKnhLIUBD!o2O?=i#r(!@tb~@6UW@-aYcUdZ9KMV@N@*HZfLP% zF7E=c)tKjMK}OrGs1@CJ&gOfpa%8Bi*N&SR$~Zq3+RBd`2(!(bk6U}~%Z|B+Tib1e z0B+ngK>Yx?UxJhiPV`{sl{}#~Eqp9S^UU{G{tB>Bh`Euj6KE@iSH<44L+CdTjEtfn zP!I;<`I+2Ba4R4lNP3I$Rp&E+Km?d60K)@s0l|L|+75fYklah$LX6Rhtf$APuiI z%o(8i>VU~02A{3koQDu>uvXGR{k3I+#5+4ryw)i|&4J|uAYK`4c>w$2=^9}X&9_^{ z&TFZaFP|j<^$0|gVjBFSV4KyvNI*xL0nGp{D?(BNy+gLFsCfB&ebb>o2{mc~Kx=7g z22#T@_Op?A!rId^bTGi|aDKII=kv;NK4w`Y@F z2V&>s%?H4aC86rD72*6+dd!z74_{)M1P3=1T$0J*iD6$DdmyVr1HJbPY2aopHzlXmS!<4d9rVW&Yx! zBLFp``ATc}FbFZ$@9!Qd9*%gBXgKI=;-y1cAeT7?N^x)q;gOuvzhXC{tPw5$r}HXB z!aWlx3`4@Pm^6LBz+s?}3{VH)6F@Cu#v=!gAQHG2osI5gd;!-XVzTq+a2-4)MMvNi zBX0tr8EAd#5V#mtb+|PwA04w=U} zbXB?vHTf$Kwr(tQ%uWo7;mrG5mse`j=tX>*K0X>~!w@&E7c@Mj0lC*KMh38uG%+0B zfd;r|`*3&%Horu~&K&~pAXM8)ngrmf1m5wI0`LwNbL(gD4*9J^;2qfRaHDcGoD|;i z1sbjt=r1f7uC%XWc!#Xr`p+hE6(1tnu zJ;%HWAhpy#9I}7qJFY`~UOMo3iHOgOAC9yUkeie}^d;XhXx;XP4o4;@9CU3uJc(Z6 z{Ln)ggO;fMLgsUd&)N$JvqyLUKw;l=Ad2war1{?p3=r|dk|5m8Vj@DX90xb?e;EhI zb^UKRxM!NYtA=Te{rH^v1OVMzQa_n}A3}cu*G*FT9%;rIZqW!faoGn*xGfrOGnq*N z$5!n98Gxg#h_}ArGb-!LluCG+dWwkfg*o8 zCSjNpdIKL&PG|T!Ss=g~LT2&4bd*CM`x&4Na|MV)JiHXHCmRm}r;5je=?OzTNPq66 zj&Zl+nE2aP05OF0Kq|=7V04!R#5er?gK<#!ge`%vN#8#&_>NlOTU%2|gn*miPzr8J zA%f73Dq_QY0ae5qk74h;|M6NP44d@DgdxNK0EJV2Epe*q@D^Tf4YO}ah#_F`A!sA~ z?k(20xH;(Si5CKpix>o!2OwfNh}K`t{%A@yc(pdC3SoisC8*&e#kz{Ui5GX=p4ne))NyQjK++;d}9b@2lPGbbn)#x2R zZKqi!z%t$Nukn_`4aHB_ye)tFa2y*z>5$)7O>V9X`kD?t@mMvb@K7mWaqr^o1pvw+ zeTA1R5{>{EBW^cahA{`sC%mb#6a$7B$A?xXA7Ivsj<%M3{H{#d>v}|6&f{K->GAP; zMU=u)iN`s|M5kqro!Bc%o#i|bfq8Z9F-8CEx$q5OJ&3Lb$luFI1jZV)WQKXIb~Y#6 z2{xN0xU=EN;Y-8sPXui+Uh%AsC&3ev;4T=jtu`3p(3BJ+YooZ7)dE z6xzNdDHiRYCIn8R@DhKUf2mpxqM|{vjoLIIrnBK@P#5>sh?#t19SFq3ld$tV>SrZ4 zNSI!-tiUi1o&0=`nN*nhJA|OtrMMB&n_gDp^d_58PVg_LZSHyWpSWd1o+#t9RZ{(} z+FhSV28LDBRG1Y~?xUC*hAD*7t|!nWWX1ql!sS2k*@iq*O7R0tgMS$%qT!vEvI@%~ zCDK2A4ep(f8_h8rG9uBC-1bb<(RPANOf2XU00mRd6vV5K6uzF_t~wsDdccc4au=LW zN^QJr)NF1k=92=LkXHe92p`7ptC3Oy@WCXsPej_Y!b%AbhuPp~2WDW6Lh|8nnQsa3 zNAztuHlzP%(@yqP|KdqcK_8}?jb=v9YW&pU1_$1! znw4#B1o96}edKT8gbXZmGI9ro!3w`s-SwD zld38J(M)nUzsAokP-jEb`8@KbDO&?%YPb>=83#7QQF`>Z*spx;G5j7VYCvg2jr%?a zX^CamO&X+U^V>S}3rPiwHwRZE?p>#&uhk={7eVs|(zAJ7)=*xYw1j@3$xq2HfDy-uZZxQuJgix zoq8@~E+}32nLHAU$e?VXOwa{iMdB|g$s`kzfz+BrL?&M3Z`JEs9T`yR3dX#7gMQ-A zc8cI-KOAg&su{@LSM(>8>nB}2mBgbgP`H1^Bn7-AJ1gYgRVXrD{U&84CWajV;#;Pi zO4aS2j_FRoy@7MJj4*}X!skK23r_J829xwOcV5cTlJV*g_aWD_+Ph#F9&Z)?$T_CEZEN%f)_J+(WI+shiauUiHklc{ctdtK3 zXI%-A?~0;$o*)?^&89d2l?DH5brDdbmm3UB;mzRjwmX$ zw#}PMB5dC@ibwGQ(nRbTF`4W2N*_#T!vs#C#KD~q6yjqwiXX-1gvoI7Koe6V|NcgN z_{A(ty#R$;Q(xjmmlKnQ1e!zI{B*o}78kOL0Vrbz~%$cL57ca#p(I03YEe8=@?IpI~?4ctI(5IASR zPvbcvs+)uXx9SuJf1+FV(DwoZ@@J7|p&%a|Bnwg6z;6=Mu7ldl7iW8Eq$y+XejaH; zFHxk4g7l%0ri?r}EYd`DGrWSey$*ryrUHWo{Qu6W90LO6d0xb-grg`11VDmxIFnC$?@%x421l*kaMWsf&|={%PyiLb^`f+t zIMfc#MhszRiu0EakiSgj95IAsKr?%fg~V4PXS;(w(&Cq{Dxl79l)h&vf1Sg?XI;c* zlX3;c_K%)8wfOj4Tw|&H*Op=8%30>1O}DROC(E(eTd)z#RJI_{(ENc^ON~2;f4ya-~o6j#O6Hv z56uioCL)F`Qa){H5qS~YU16##U2$$qVmEse0P-YH?Hkb9QtB!+0%;&b<-Y~+q-7on z`;-wVH&`VT$$Y|gGk5;1z=UT2E1pP_hg;yS5aF0Wd)qdn*b?eC1(f!BbHeR|EGK%N_I3qa@qzNgF-~29Cz0Ak z8Yc*`c&g+Ee)b-eoz&=ge)79Rq|(&pguvcp4$rBGl41#o#^1)^icbc(ICBC;2}Gr1 z{j3R*2}bjvRs;SLH4|1qDTBi|pVEHWWs(qQF+n0BSg3UD5heZNE!cP7zv5;{XE;1< zK?u_WdSiJ4_Xe79H~@Eh5_@;YF{`t`Jqig}I6#;Q49xO?=)NFMHR&iP4uVTne(2t~ zF?^K91YX zLr;lSbp*aE6^q12UrcgtqLeX)mbAOVw(rixHB#SP6i630!RI_)OV!`Rt z1 zSe2V)KycllAC~mU{`K*fq77%V-9(h6wqRSX?bX;|?qIy0-mc_b@w@b5-TgWj4T?nN zC zg}_N~#Ym|XUDDEf!Tu_ux>UZ)o+`EG6qFreKuV0~Y4rgR4e-H-D}0ynoAacwCE78q zd@2mDKAHb0%+sXTb^ru<8{q!nm{42zd;up7bP{~5P8Y1N3k8%$pB1Dzq)icj0*r{P zDOFFa^a&(y_&|amx*g<{Fd!z3|ESBo*INL}A5W;pVYfUaP^>AWrR8CKw4k_~kodyr zs-caD3{=6fk_?%({wlU=n-j__-3Rw^phA=aC@_;MDa1-L1pn#&$M#l@1qCXMbV||r z(Uw+>%m|*!_mE+Z&XSf!4HW3jX`D(;)tNJ%oiHT>tOKd?D$f6+C7$yCbhyErMI}x( z!{#|!dC2s`oJpqN6?B4O5@6bX5M@M@md>Yz0)Xg0<_xW3bP8U@rZi1>qlsZO z(^S~0klIYsdFY8?LO9ch5Kmy~$h-QQv;%AtU7k$MgWME+yI=%{;h61^Bo<@Chpmw$ z1L!B|1gPl$U+lemSdCf#KTaoyYAUIup_CERQL!-^g^D4E!8nyl(m3o$IfRrPJ9*R? zM2#GV7{?Nds3TulM`?It<9e+Tg^m(rY(o0ey@vw_I=BB-6jTFBxCUjfI;bLMKT#rl1qEI>u!+ zZ8EQy!H$O2+mQXwt^ z16_QhQNgO~KB%tCmv5O#o0HB+Pp^ot~i zI5A~+v2T&`eB0M=LXz|Yj{)4Z@EE@A5>5~~MW5jAb8TM-NkoU4xbH0=m{!c;_7T2$ zHS-Pmw?_Q^LkTFQtUF@bJgTgp$b3V|Qt^m{iZ@Jm+dJgG+N(P0K*dd^LB9^U$26?< zd{tI7*ewTCt8TV!twzt1sPDTf2lN(1L)X?ads8LO#Nq089?cf%IU1YF!dk^@|IqlEIdr7(`=Pt9$gG@I<0BOKS4RQ=5iN<^zYzj{)OOm5XqV{ zQCKe%gNZ^mVmV1yJj}eQLfMdN*j)?)FG=-wi$yA34Tx7D*M#r>h2Dx0>SO`aN)=XcO4DmSsp4d-?2)O$vU^$OtvFMr>5942G$7*{emG2-m<@+K zRG<~xAWNX}MRkvmBk9|;Lp zRN1Afum;oXlY$4%7;2xh5jx1UOmiStyhZ4cw8Roxv9H+>@qY1cLN`ux_p&2hR|X~L zbd%Y8tSX-qp^6dH89sbV9+aRnW=s;=ZS3jlHg7A0mrLG}@UraIH96)|4P;t=gZ0p8 zU@O_>g$)O1>l&DrkH9Y|!g(Eo84viy%I;=e;3SvXEZ@xGMQk}qUrf%NmhMUZ!IF+) z<7^(iq`AMLhy4SHODE;!6s^d!x8Gk;{d^(e-jM;#b{^*DMSx6mfeo^k)6N0OF1x(A zus461SBBjN#p>Jvk%Vsd-<{3N$Ufd&j0|Xw^VA*1Va1imfO?s*owHcv)Wv`@p!9U7 z@!N`722}b`NEX|ZeD;1PA*;1(8uZWhq7qR!wOLWr}Q8#1FqJd?R)~g#341;kf|;c=A8t(u*OJ>S)$tvEoO=QG20oy zJ%G6HxI%v7oSS|(}P zi}jL1uZ+e;U*_ZTzC^l1QhVnP5gp*t{+eEmpPKF4P zMB$P;%TlMxyIS|?l#38|45Ktb!f?OY9?vd$F)Zntc3UU*=s!rhYBVhR8(>n#^EH(T z4^~=1O8dW}M)r3CR)&Gbmu3SikyCvQh$+>eOUMJ3oFBzPRf*accj}j@AATZ_;O4#l z0@G7l*@Fjh9+1cxvP4|y2Ov(0WLr-&FAMcgGYLG9Nq(YuRWJ@{)+R5o7sVn1Wqu?L zs)>Ih6z98dklJUGhD>6Mr7spk^^;S>bid(R09~)I-y+5TIUWI#*vS8XM)o$R{)>_Q z>DRSyO|DVk;FinCTSZjizWf{2|c$m6D~q zRqc2eDb2~_Dp(Q}g&fdyw!mD<3K2andqSshsicvNU6J#C%TxZckSQLrB&e^YzgE7o zt`u1GOD8~}M3h!7bSrzztgDtIjrJpIOewLEhlK$#HTiB8notit{WdYp!DV0!nu!?) z!BALf8S@Y-mw};ZqHQP1>Pi;a?^Zn~!zb# za0n#^PfFcb=_T-W69?IJiSwnkqiQDU>0eXNaF>JEu zc+LU|7)z?@N|8~_iicdCJgNFhSSJRff?g=e{UIyy$-bj{OCrV0i3vF#PoU|kBu=hY zK*&hUgPh=MMHW~LTScZ`ZOpac>}B6uXgMYR{JJ5_ls11e%@git{(p2HmT=zdomiu# zlb)SN=k-H$l;69~t_U_$tC-TQscGWuyq1v(uOAQ)DWSeWv%1jN)_QZ*E)Z7iBUAK` z`!*Dm{4aBb7;8krib|D2OG=}if~9f0OI(%=jP&m@u>^|huUL#wac0InwP8C1CZ%Tt zaarY%O9!SRljm;v^&)N7*AwEJ*>(`ImU(B3=fVuHVEmjjL?5VQ8 zul8Bv1`us>K}}#(D~9iA%Jnvo|jRWkS3D|dZ#h+RvSbTBT=4dBq16L@5!Aprd%&1E1B&V>=Uj_`G7)ErN1hy&G z-o~SsS{Y0|-kgu)Cd{c2T^9>X+@}ak%&6erCQv^B&21KUGoFvk*6Q05A{Xf!3QRT? z`=oyV+=}BU9TuwWhFNQ}K4?cDvigx(v>(#9@kyu-RqizO-0ia>?qx&t7tCf$deKklb28nd8iz;^Ef9N7oh-J0uR* zggBSHno!rHdkG5Zx#WISQ$t3vn%z`^$)kZ&<4}{}y_pD;B%d6B@I8l*V#4*Uy^~1U z87;n%U6ptzF^PIYSOH5VF*0Hl8lN&L?y8k}7i$4&1e1UgX0C;yP zTn@n^1?SIMG3tOzQTR9w^(?|sjnm#UbgA+%*g;gM95fp|sw&3tyh4K0vxwWve~qb6 z&?Att@gKz;CW)#?R`{U|X(%`w%lJZB8&OCm^d?^`qXH85n}NJQs{#_SKbSbUoT@DN zOvJ0=SW%K{8(J`|G`_Uuz8mKx9RO;29;2p1`_W^hjKFD9M6YMucWHRQ3jj@ zgBfe8OjA?3iaxN@Ew$uzk>(qHRMmK zEZ4tN>@xzaE^=+5axamj*sXAF;jvMSUdI}hFIFk*y62wkVpi!D*Gc_!T3FqVJ8s@f zNK}^I6UTXy5|q;NrR~ZDw6QW7m5S#UWvJS>G&eOK5V)7NAZ7tPsc!pwL+#r4=l<_3 zws-&QV!Owa>LU|4cL9hnXE}XbJ^P=sh5&J6QqF&&o{iuZ94egwgJs|788uiUpx$QM3pl=l|^zG)M%3Gf%-E94)rj@Wi{{`D=L z`cq3CFD0Hm;jrYVQNh1=4!ZQS*_aZiQRN}-OO@JgLz`pnd~qHSJp?^0G~vtkY|rD+2`s13R@wUhEIi5VGH0v$Ux6nTTt2yC zeQAOCy+`^i$iSNqT+;mBw({DB^xzf?jeuv&89c`lc49X9n-~YTSb@=eFio^#3kQ|t2}>NoQW}=~wqhRg4%e+W z5ZP6UQ2^~}_;q9*_mtc#;h}%@UY1Qj1h0^m&oeY>e+snKLo~-sjHwk$f{}45xQ-uf zg?l1gtAh!cG+7Rq#Q9Ip%5wY4*gf_4i1g>>Ttf7Zh$m&q6Z5On!^KT9oU6!%z&8d z=Gaj2e`Bd)-lL)ZTZ6@h`Eb1-SX1|Wji~C{geG{8TtdOzB>)s1p6E>}OdMjd^C4$= zWiD9c0)UBN9~HE0m+Dejvyjjb50XE$J9EJ9$QRIaqlBa!>>V4N#}pts5rywZ>XC5G%SNQON@4o#%f@=qwV-39fR7Ed+T;O6onzQ;sZjt0)i)IC9CtW55=c zke3kiZ9)hxXH!I+41|>E3*wwCeDJ&>79;sUs^cHnWbG;=#S82kl6EB?Ju-JI=6S`S zzpbApvp+(DRQq#)(`J8akWCtSP_3aLlTpxjcS=v(fe#c%N?XRmkxCQPoDj{VNy2&_-A%jL@KrW=-JFl>vGwfgVs~UPZ#=) zr!=1Os_Q;}J3*<*FIz-lgf(-K{h*Ad_St;S+DfoK!3zI^3VOZ>7Iu;Z2&ESJR0pLN zZ~HK7E2uoluBvqZoaMy)nDP-ks8<}9cu*sC7Y!97(3POMBV(W8C4Rs@qud!YHlG7V zDdUqd-~~jBNC%0vAcJGDb{PWo!MTibnX>Fk809jH1?!Ws zg+>Y1LkNff@x>66(m^Ja5wf5k#U-d9=rP|l297P>w!f=$jx9o}pC{|@%AHy^cdl(; z2=lpuXg8L(0!P*l$;w?XAyK3%CU%@;G?)*hGE1fgO4C!6-Mx=oBq)HZ@>!o`qW={Hn<<@ZoQU4{P4;vJ#lg zc@~kNYHweYFg8h_70!hyoJ+HWCr~)&EvVULP=^5hVV7CqTt1U|(99paOGX`nc9MK1 z^E?iT00eh4UwRm*!rVBBQclE19bo7o)c@Xjl@jpz z&QFyk{}{b;%M3VAgUkFuE|c9(&eN@OnY?2sWgC(HCo~ObTE3Ymu~GFO<}x`i)3%5s z-dMAZw>$Yhvhxt1g(Z18M#5$#f0(V(TSpR>uF}2WAWJj0ZSQ5OPe?bxy`CRCOPy-O zktzg-yqs%h?E-x<-~)uf&F~AAnaT3Dv7BT2=KRdfbIoeMJ_Ct364>;Cf<_z@*rch& zu}5H1eIAFzdk}WS=k}4ua$6H&rIe_CPiMHcSgEPrAtg}{s-<%t(i~?s*c6G|vtUm7 zcw(o-w9`%*vg=2??~_8C_UhFfPYc@;A7H;p1F)Ub@I}6V7Dm5GF=;uVdNaRnU=7;1 zM>99qR(J?Oa@H)N_maph=`IU7-4{nD_T;!HxFNuu)#8^NINC0P* z8$*qi1UQqN02hHfw8ZqB*_+d=k_=O3g}!zWe#FJs?mzS%m~1in-0@Ln$;vDCmW?_r z?lD%OqI>cgwKq3bp3%s?_%Ld)o}*p9!#}i5m-np(vL)nJWRutYq#D&v+E!1iPrWQq$_OLXsoOaYoc!vovxG;WWnzE1nXj zD6S8~6xl(k^8%FRn4+c>$RvV7CJW|^MY$SDH4hF)Y&mA0q?MHKWcPQ_BzMasVmN6e zfozl(7(7qQ0DgnE!?K;#l8XHb?s_l`QsChnXTcqE(Dsi32Fd-<457C~XI+;23WrCyC=9 zaP%9Jq9P6}^9_Uuz>iGE?|J~Ft2Fv(c{oR&5DnRiNFGJ3$lE$cU)uB@Yzm%!zT>;( zG|{YKTft#1wxH^RIJgbDi9LX0&{!sCU7?CYWYADhjZVO0b=p4%B{j;F;q(9buXrN54bNpNuT)X?uv z?flNEqQfsDjY&?~-L^%{TR17E=BFvyD&d`1nBRHU&*tJ|E4w-C2RiMjn4MiP;jUpv zYvtAVCOKM;iFr1()|#xGas|7_&2hyKR7uH%go z<1^oG&_24_V3Z)HMq{l=thuF6a!rqMo+`g8`P_0jwqx$5Y$dOCn}g0@RMNdZ)+ljj z=G%%cM_22cnuo^T?Uk_T%b2I*zKGs7#`E)o*?&B``s+7FeYRz$j{Iit=^q_~EK+{R zJnq<~;HO_=M7NE*g!TKp_L)kTAvYZqhJ-4eNZdO8Vaeb>!lE`B)IK|_HRF*$;mJG` z>wgXKT4wb`$waeoplAGarK{miMy8ROZ>MO{Q?)~5f5ua_VxC$UM^AS2{Cqe)HD;vI zA)m~_vpfE%x5;6=TIlony=bIe6#DnVNIx^qEg5c<OHTUiG>xSZ6~uz1j`)W_@9+V}_U zizW{}_R9D3<0G%`@7%C->}K=D&(<#a@w0BDem`}7=Mt~a!j5#c9xrPDWW(pt+C$1# zb>DpFV$?Q22baCk6V5Fb)xJ{~Ju~q8dgT=iR%?*ap>d+bIKkfZd5ZqGRiX|Er$5Xc z+({*SMYyI%mq-uMO^uAT8iiJ6woaE$?QZFip|4z|J;dAmK=i|LpZlK=R~$C5_hRMj_D@6x^mbC)_xDw}8ZPjRXTxxtaF3?KUp?%4m)d7j)n`2VrTvia z6i=8gpjGmNO7@_z4MFFJE8ciBIA9$H{XIQ#zDjm>$8M&%(NBH#qYG`y-VdECs&40G zvv)wRk=e^T*4(<>t=8AkN3GcL>e_Kr)Q(=bcF)?V&+tslR@636hw)i!pLgnp&b%tu z+kUr0jZNd7!1jwpdhQOdPM$rhy5QdV$(G*cfzex2Tr)4cda7%^eo^~KkuLRqUi<#} z?XQNLd&Y|t{C`k(n~+4kuk9RmUA^|%-Ohn0FQzE?FHnv$nM&QCq@4YuN;lKPekwis z3@95sWFx)aNe(XFc)i~aw*9QIn_qm`WqP@Ny@MRqH~G)o^Ez@tar)ZHhqb2`+BgZ? z_n$v}*h8DgE&`Vsnf9hx8_Iy2R^q3ZPR zQL%g0#${`jznxv!amLJU?fYAxjjoTQY+S}AFgx7bsDH=49>eX--x=(weV+bb?5Jzcr&I{m}5;h&YSH||g{+3~ae z#|oTRtzBQGtkPk@^a$0@9l!K@o$gR(H1rR8`ur~rg&EM(^VE%X28E5QP@(=RcN2}f zs*b13lnwGr|82Hn>0VCH(DXW)1Tcu4UuTay%5P5+<0a{Q5B4 zXpR>CIc)g&EAz+OT8rinYP#b$eqpB31=Vie=AO}ouQJ<3{;qmzbh=S>S1XazMm@*5 zZ`MWSsFpt~S7zNvHL}VmTf9DC<`w08vr>(`o~#Qz??=sz)3y-JpVlmQu_ezNCq_m+r^PB-VP>pHHuvMx#)Ew1BQJZ6;m@U`CMA;*)}y|A1b zoiu&;coVbCl!6+?qJ(vwYin0DT|}ExG#_s1Y@_>SSfZ*<#en$A0o&H4H?7OixjBDJ zSML=u>%zu$E`MfBEe;&F*C?^aUeB(Uk!tvhz9J_j<>`O+54LQaJec)D>!$s&tDW{= z7&827$n{PbnGzdWEcK%s|zVu4_7MJv{xjPM=KUpKjLgRce^g2qNZJl{s1G9 z)7Fs<-`0dSnTKmc?ePt3=a8+^u4ZZbwJ-iv*koH|)VrjInY=_H!o+vuwvy^U6kQK}ffer@_> zBctU4&FJmQ3O2eO@fwt2Yib^x=w$zuid>_T`{Nlqt0vR7uB3DNl?I_4QhFzTi9JG z?A4}r`l<@qh05*yyN?gpt?%HzM{R9kcSX@FuXg&8?XwGW+F8F81cx@rQ4q}^oIk%$yOj;Y+c`fzJ6fr1h^10l!@fT48pijGziZrnt=pg1 z4WE~59K}>wwu??`hd*kUnex0o>D7dljUn!!Lq6Y=c;}pWR9&RUq#ftP_8Fst@05sZ zt}g%SX0eAyZk+gD(!ioPvB|qQ@spTUZ|omsw%7zOXq^1$eZuM!O-C$RCf;`ypT2+goRG;Ng^QcEz6yR4a&^^{5W886o36zbiT`C-+VbPM z=BkvS68pq6=bFD?aq*@79Q>D9<15xypSSzbp9woN-c+T=Pkr>K;lt)b;;6TW#DV7@ z{b_%_U1EcUcxA&z`=p$dcRR!{PMm8R)fAW;64dE8*Orha3U4eLKi@y7Y3rW3VWqFp ztJj7TiVRvz^~w@rN?)PX+EK~%whI>5p;H&osSDJpx`gR#3!8kz@ynlV_3nTC;ywEd z&+}XK@!yb_l_C9pNry4xjD*OhsbaS&kNz;+-aHi@no1q|!+sw+w55eQ6pju#qeFw< zk9si(rf6@S;YT}Q+~PL{^QX1+-cfj?qzN-si9S_grUc?}rNQ}&YiXLcO~*9VitFCI zAJnD3DRujbhVO&E2y0x`{O1~RRn_xp$LbpFL%f=XiK`X`o@^1Ew|#)3_1`%SVN>x<|gnSK3vKdh6U$ zwOLpBb^5iVsuwq@=8Yt{)pJ;--&PJ_aW!o_CO$wseR*_BBO4L9zIj8;DnyxPGgvuezZ zy-O`jB5WNj=V@wK-Zpyl*^?*wW4o6vZ@x(#)fR{z+=q>x0W+2>S1C^PaHR>=?I3dc z?9_xxqq=8-S8Y1r#iY?Jt~aCx^O#gwGY;J*(5CasArf z|A^uX?V+MISSH2o7Zq9cnErBSiYQcjZtZ1i`VbdXV zYv;c0)257gXERoG2Y)wRVe0cD%6BCVi`JBP+Erre zt*E#W!$_Op(7y4{+|EW2oxIk~r+woFT`w|AOj%o^aVEOdyt}J|Z`wwYs#{nG zy)@10_}ZHIFVfb|c>fT8a&Ove1^;KtFSI?_!0Qzj6`i!g_i<_L${{l~N2K2fJ~Ml? zD_r|_T4gBrCriDn(P=$K4!axO>-gG#RdpGz5_Q|EKYdWHDixR2icRzVyn5N}@WHzK zT7}l#t+j6ZVNEw6er;HkQ+KTC8}xbn+&wySpl5>HmGFpehb}j|zb#RtSx9N0CLAfS zUNm^0mg3aFgphq%3q0zs5Atp~)wx0W_T_!2!{&EQan7E-%y(hb=h0(_cq`g&*6!Uu zY@;}(X`wo`aJzll;gNz<%Ld1ExiaI&HShD$iHD}I*1A1v-?-?hM{;?;ri~-pYotyo z@8v#nYHjox-=5K`UwbPa-K=ffKYL?cL!ALWi&E3aBP(}k+{^s)vC??8<=?)0Htlm- zBySb{YdXBx7Bcu(?JMr+UvAa{@x|)rjaQ2j8%xDGFBfZRhV?Ug)Y5$C{h)&S^nvZQ zww_B6#i}Um%y|4Ze}Vg<>kdYTLPd$>s;3$eb;QW8LDl^}xjyMAd3_lcbY91C`ObZ! z*v}LShrRyA2V|}aBhA9$p5&@`ZoeqDi^9&*FB}ILC-jZ%i&@?v+B|cFhEo<=@7Su<>YFY9r-#);od@^(=V%`JVsidy`i-N}p|DJH)mtk=sqR?F`X=b{*l;dV>(s- z{Fz(dexb_yyNKq05omv$dU#`uwdryPMb~gQPxH|Dnd|B%j|Fn)v1y8u|B?;^PVEpW zS9Y0R-^nU#;|iR-%c>$5>_1~+dkpt~U9moLx2W!P>^P&uIP{+W zV)UR;x7X->AOFzDO1hKA`}KOtW^%l>>6)?;*E^Ya{mEhc(5%M!rat1c6PK?WQlr?t zczlJzlTH=Cp)acln|H)CcANd)(6>suVH1oJ6Us)s$0S<(nBW<_Q?o(&bbYvaOS`W1 z*2>EE9$mWo&zG@o-slR~?$PZ?ociV*p>Ca`;(c z$T*-irV!)LMLA%9N6R0Nh?JdmL`S|16wmsu%wWv7I_BfQi%FZ|I4t#WL{P!D8Oob} z{m!r3teh7fy7#}cHjOG9k%l23a~MAZ%iat_em%+k&~E37=hf44BaZpb425+2+2ekN zU#&f>kmjefc0(<4qni%6|Z3=u*c%*F-krfDeX0Mvja(ZRMR0EF{ zUBOkz%gLBF29>(!uAxvf<$$-j1RY}rB;YTc&vRN%#-*0E{u1jD(ez5=J%B_?6#Jz@ zs*n-rp3mP5!%4eAyf9#ZmIf56B*0rK7>ufH9HI zae>~ed+#Bv1)~%+&SC`q*ocHY>{R8^ZohC3raQG=%_LWAYjVC+pd#| zvGQI&WVIlv(}0!E1QWqy~C>la!*C2j_(US^#S9@5Zr2CE6GeE3=zZ# zQ_reEGK!3ZM#S)Eyww9IGR?R9=`pr`8bqcuzTx~a0JgP`s$54%h&<(21eWKtVu>X~ z3?&+v3{nPznsE}5>DI0$mgQNn1!0A{w9IBg$T4Ya#;ZZU8T?f$GR>f~glYQZyt3J5 z8q=H$6Tv;?*jWv;Ez4C&W7_^-ZPWl4GkVWoQmb0m=onU7VeyhPX_;qGv+jI4R#j&w zPirF^E(xtod|=F@MOGds=eVEn5U);eDlHPfS+yo)wKyolJ^1JA)iviXiyDtxM~|Id z_GTn-aS-R}tXMa8_OX_i8STuX@{U_4hjvu~HA{C4oJ+f2{UakteK{-&3D^OhoVx_t zNo96rA+W6j_$E0N+Ftc`wW_`$fZwy6*cLXfgPoP>)RvL_YEN;oJA8sT5bnCh6*t zm$7F-{F0MFdUV77i>bn^XLY*!fSYP@lsO@aO6zrVghtfkLmXg?FicDXNz!uqL>?~( z!Y1%?)G%mjXqX&OfO{zHac<{1AHs>%*RML>(9*+WcYfG4Y)Q%bE7N!(e)Cyc6QtNO zciyi~A66cqjwfGWATNN;+Jd}5sZDP>rC+e+mweF;_}jTo%O2@#3)$2vsO`J;hV9+X z`DgXf42faIAA&!#PsLLva`o<%e#5uVB9I4&BURScVpb=@HsAMQUQzO5R=0KF>Ssc@ z2T9L~$m{4Pbh5it92GQ&a1X6nvO2LqBXKO*I++Yr1k}J{Xpay|muOU8bspg!;yBzx zD=jPXpvdI3tQvW|W-I@VRxhz9LvfPEs;%E~NLel5rK~ti7wx8!b;n-g-vi4&-f>Xc z3HLypUuLfhz$Se~AMGD&0r%pQ(19cy!#&*a0pG$FxCgj4wm?A*U{!!ONnSPMSNZSa zLjawf5Xc8tARl~f8S(+9t$@4|@`1#>oa|EZD%ggapV=%yO~$18(j*d01m6m9aKIqI zfdgKsG6xQ}SulL0Jbq64f#F`bvZ!E7;J;9IZ-?YCtJoYL@0x4F^)n8r0d6AbUE1qBlx_U%xQQ)6jvKy~x+gb@Q;YF?b8 ze^hMKZ{m%~O3Ow^AuK_Q^y*y_zzc?Bt};Gqi` z(#F`T+_jL>A@7?iVv=3cY<3uxmQ% zCDE?Q5LFG+Bh>>Hv1^8_=l#&?v8@_mT2>@8#GFzf3Pb=pQa6eo3&TSI=aP0O@)5w(k@%aJ$(s%rMOHg>4Kf_IT3Dux@*)#wb80{e3~R}jsaX+1a4<<^ zwN|roZP+Z@U5sW)&FYL)%}RQ=oSGHG@!ZUAt!4$jHU}Zww^7&NsJQO(Nvpf187H1B zzmV=`A<)cqd(cwn-`vNe;OUV`S|d=bRKuhtNey%wsQn zOT07hrQAx(s`f&0m@{C3Hh`VMhhSplmc!&k3biQS^10kBUrx))eLQPsb8+S<_#YU~ z%yxz)UzA3Y*2vz1F$H%Myc8jQMX)nse|0fP3uBJYy=ep$1Hz@4Hc1y_mT2kK)Ef(G zUkYGF+FRh?Bj+lyzj_N|@&5K?s}T7M?{7j9MIl`b^4M~eh)|^_c+H`3Ll9kB;}kT@ z+{@SY>ecm%dy@H`Bd01Sp98yjh!v;A5Z-^=Q$qiEIy?%4Cs9e{eL3diD zy4%>Kn3L9V#hyzd)GNCXDpP{mZS!^{?}4odCU(;3pew$UCL}a{p9MP@B`ysHyVZS8ydd({WLKpXi!tvmI zr%LEjua8V4mp&lHU?dAlpm_>UP2>2-e)dd|$o)p{Zy-v(tvgD}(tU&0L2~Fp%4d7i z96)2D=S!a>F`LMHq)UI)=Z?R7cg5^p7JK4y8UQC~r@uUdq>NUfD>YuM{ zxs&%WInt;0nUwkUl$=W9U>w^2j^nUdl?o4+eFaG?$WM{nA0(lV^ns2Q3z!G!r8ZgX z;be(u+eS|d9M+MLOrVqHZdLOiTHUWu2p7`bs&3>C07xzL`w#BM3DV7*jP({-`b$kn zA((|mm><*!>@nt86%fi|eWIoj@hd%F`H?mGK~*Zqg7kPF_(8EC9Rwxv-%V3xOl_|25aBxfd^C_i*&;%I~alQEuf z7~dmQ<+cvBaKtPy17Zte!zN3;M^+m{<0BNB4_c>sFrM2RlZ`O8UGqZ~JjcPW8sw`& zrr`J09uceSYN1diBG<=pk!y^`+5F7a2f$JQAq#$U#8QClm21{U=<$N3FyA&X195q& zF1E)RB@sbCwR{;joLT1S)qB|zOMwyKwrZy$aq=%5JfPppqK{u+2>3WJkh(o#LFyYlz>i>Y=nD5g&cz{ z#H(6Ho+D-+Yt@~j%P`3;N@n&;^0Ean%eo{g(07Kfv+gAgl>?eU>4!Ofc&Li=fHPSNwqjMC*5&l4-XY|F7vLVAkD+L9odV(tAf z&I6%pCockZ^|nsU(vqkTB&E+oh~J0Vq6kc^?1fhY4uFW3EOgGkt5Y+vB#NCSKMbD9 zf>avze~qNYl=I~c`##R@+ILo;8J&E<5o6M=lAd#}_O4o6L0&7JPTDI16Y#s3(FqHB zDv`n=qZ3IuNE5{cRZPfI60?$o)0?5E!%jvbn0wjSOBj=%sfz`Z;+q7%77IeH$I3!y zrc?D{X!;?y%gqd#lo`JeN!-Wc*bh1`Yd(OHtus3C_Foy+mj@Kxgpl<0w|E-7pR$>7 zJlr?~)U{lm2q-ZZm8H6-LYquNd1Lv<|KYpLRACtfNuJ?j42z=b0gPgC(Bzcsd4G;jZ*$wiYxZ79fOln(&{&U(yG~1rcp)I40%J9*Xv2n3Pl6tD(~jy z4AAcG6QFf+@KL5?%V{C8+c}*qI1x&0gd{=&(uxMt`Qd~FQjok4(G704diTcFH>g>2 z2D4f6u&N7b$v8PmCqQefT!lyC*|bOMYoAWWdc1>P;@>zztwaWXkHL2VG27=_8bfgf zM?|8vIzcN1=Xc(pj}%%YiYs!3pGn#U8Wu9e6=~gPpcd7G4l#phSn)}Yu?PG3lLV_= z&v{#WST#3n(oZOWkN`}fyneKLZpl=ntS3||ylGp`kdwKPkbrFTc9k|bBIYIoy|#rP z-axN)fr6*vNNXaf+(0+O+>S}YA?9vd_+eH?5<4ilqKLc#iuAa|scUfhadLGSxsF3I zh<-GgR}s0SaYYf?agdQ)SWZAv$@$Q$i2Upah5NAcQ!9Nc>B*E+8j)xt%MO*$Tk(+B zTag|rVFU#uw+44TCUN(_##@q36Qou=tVwEx2wI#a)luJvCXAlNjAL+AM}0|p|0kvu zQY*8`7TxJm&7DdG`D3NTr<<$5u?gUmxfN9H=UGZ@w*K>XDP4pgGlF{Fx#G6gbVxE# zZhfipEBmER!Q1+tFV}NfH{`ZXj9w3|Wf3RVs^40fxBWz>8*jkKM86(_ng#>Lxt4w` za%vel40F`iR_kPjhp%N>M^X#8JS%S_)B>>nOI#}E_*#-R6+&_AvAjJh3-;wUADL_! z7t6vNp2cM3NQT%-X8yz}ThUh{=cmUitf8j0kq7g0tftI~>+}+u9lj+!d1@YKXJ_9( zj<3h(x-eMS=%F~udX!S zEOPr1rcn9tmI|kK$P_BJQXz64q3xI^``yiUp=nrPgy$ zC7)+`>R**!+p%FHb1}cqVA?QY=R`p`FS|rRxIixrMo&;nsg_Dd+e13qlFaR^|4KT# znb+>2Fcj<6K{+u&lqad2gY$2^fx-oH)Zm?aY;GgyT^&-pq+0bA)1d~1z2u0?hKri13 zxyoX?U(`V_Af|dP>EHZUM#}oa@?oqms^-yL!h?SoP5&~jRrTqwH=_x%XR~*!24AB5 z*ZIx#ZT(xbt2!VMs(|SV zlyya{WvRFl^n|c1__do6ry8{FRNBNPe~@!+ZI;utipJPuX4X;X*IhXbAd%sBwaZsG zyq{h7^!?k?+fT)C3@duxSkhS4__o$$T<}(LKebnhmpuWsBEzs@_9S>?9cZs}^@aVP zoo>$JqxJ=HF>??n?*vp@f6>gAD-g1=bPc_B-^W20LNX}gfB!4*Y7Z3|iGNm#etK(7 zY!z=*{gFg~%nW@i_jxI6WfoTl+RLP=rIOJI11S6Nt5T~tqbw4B_f|j8De3%jUw$k$ zS(w!``EbtfJ^=^-f{?Y6oR<0BlUw@skTJ*ZMa?%G;36>bI4OuDn=(!aTw*{)`qZ;V zvpQ!hed=?F;&5ZC#4c+e{_kmV!R3(Z3F5jCztyYfL($}3RMAO8g-b6*MIi|Q6;K5T zA-B};9@WBU$@(O01t+N7xhRnfP^HFS1)dkGoQGsUvOdbz9}{}c6+iOm@%5lzpel`| zi!crdB2>{y0npYzMp~GU0}#oUq^(H9ynfLrs?aOuPGPH`@lIKHkXDn7@{Ws4VEpD2b{+ zkEs5B-N<6&xKImZS>~5`VX7JU!H?WY-%Y*(p`fvh$MC}-KwMv4>u%WsYeXtfeLf|DQKS`+5s7DXj>Jl!8gQqOo`0_ z$R)ux%o8SKA>?2p4-eq`-6m`&;0yy>wF=wiG_)BIfV0=4t7RNK0E?TOCLlIylna4W zFob~#>eT268JM({(UukJZJ9hiOhzS;39gu~f3NHmtCF9~ZyU6;Nu)%fBy9oLO%e(R zK84UhsNp{l@09A!@H74oUL}OwIZ-Y7d2-;ca!TP$vt05fGqDv(ma7G-?^I;mh5|o(sD?n zVG3seWt2p@(l&)`6zC?yZfYY_H{q?KjFOgo39G1EBO)bMU`b@8n^k*Y6Y z9E9zXBt8u8Ie0yp66CUEpM8J2m+4j{#i;idjF-AMNo|9sw)9Fi7MxAJbxH#oC_1h= zNOY15mGt(R^H8>@+hJ|xtr*UAOpmlSxQ?lt|6Dv+hj*(IpML%3d1S-6hQP)^Gp1Xz z^`xQNC8z5p3$>*c^PMt7r}AgIQq`0%V7Me0$BCVs&v7QbREVAI=EY8$ZdM;2f`68X zoiy|kAbwAZ+5UyV_-tC(=9$dT$qCi&(K2@_5@liWJ49Kid7GD*GX~tWV0KYgHy4NX z(lr2Xb1bQ;Abu}q@q4zj%DGO#v+LLNaodW+Qo|wxVgJ;y+yL=A9y;D@4#n>b ztYJODOOfJtz%oAS{=|?FY)aeK%ts54p=QpzHt{ucnYkM0<;1+w1eVmw3Fn$@=$$;!&RUk-o%OS%v_HN(h#B~Ad>G4 zD)9`G@`0vP8%PQdX&~D^348_Rdv(%Eg&-3YsyO(H#wrTnQShb!o^$P^0RA5-SII31 zgL`GY$fC>n(k=)%6~VL1EbkvHSN#u^WZJw-=_33qbW!_2{3L!M@Ds~~akN$fEmCGI zD1&g{Cv~g*GMEFQ`;D;$US{P3-yZc<$zBV?Cy%Je{E3C)%RXh3$VbsEIfX?108$Le zMEOQ+Jf!#wb}+jzmopBz?~6*0)wUn1I4F>nL?dbieGxB1Zn3Ye6=nxN{UqIEY%pE; z5jm=4;eRYgwMQmLmGke)Q9)7&OOb(&*sdC4)%1Q&$i+2rTkA5Mgho5kQr9%kdpqm( z^N@E=!t5t7FA3k09xuc0WEWZpSWPG?W+y&5kcDzoya@U(-7LH3TqV8^wI#1d1*gF7 z1Cv5;bT!Z~amyZwR;YFkVW>aDiv}HCxvLL@DJ6a*tRV9e9@CUEQdrh@uY^G*)TP<& zJr^X!j6=yD%{YD()#M+sWqiAY`aH9;*YrKP-5AKwdobCJBwsaUxZj zRY?Xi zkXX}41D{p2aYa&=##lGhgd){hO{h4tD$?r!s6pn`2%s*-q7`>=?veny*wnV#prz;_ z%Ox@)IyNB^3=mW8BEX{rbp#le1a%}4zmwvH?0@QKZ) z6)|HTfw83ffZIIQ50at6fnr?qf}|yVhIPJF2E^r{tlg9-$kE&_->CvN76yJL1CuXJzx0{>gLjCf`?*1hO7G^TCaHsYrHsB zvSDU@K_h!1is}*&>O@$lT|R_$Qle~Tn;vEhv>O8BRMTf)tqSOouYC8q8>^Z#h)C71 zZhokmQ|3tqZIQriNVi!EzG>P#p`wT>OB-I+{gkq_tl07)_J&JCB3HOB2g>bLA#tki zW+>@(m*lDE_qj!knl(Ksp-Pw`R-J(-9>=pm&JbBLiO*%B3ld_=dayg%t@?;G>lmO$ z(n1impvO2lRDXhf9tcB-ODT=W+ZVOMKgp^UNc1sO)EsJEo&Fh>I7JNF6oY&iba zTjwjePtJ8ag_9(5Yr*jBq}V%_)TtXh@fOHERDNP9(dTUmhbV?>lItPiqB!)#>#V60A@Ygjb=P7dNHsL4c<17NzEIdLjt+Pt!$0U zu&uKP=piMY^qx6~QvMXVc7RNgC?yTR#i~|M4<_b2UOE)KJ#DWEPUBA_m-N?LFtdZm z%^OgxYd72`s{L+v_LiI94it6}@RJJq2aOyzi=I4cZ|G8GowYY7^mq)^{!#IyF9w^= z3XT72-Gw7&*f;NL-S?e^1Lt?ZL|H~>)V$nqZ!GPcLfd^01%Q<`THUWSexo>{O!a6U zNdO9?m9|IN%Z@l}L#*$~arl28?9+1b z`RkGmL2mAmX^h?GF={n={gSV9!qwP+!g62-6A=A5ytLut9Z&by?1c&f=LP3JpmlM$1PjB zNABRTnQf_(leDRbM1j7f=Mt)LarxndnuG-D& z(QLn}4kC6B6@Z{>iW(4{xu9xFH3TYZvtwi{-XdS>=Gl9EEw3kA#l-Hh^gEvC1a=Rn zzrT~oHj=6-&uL^_$yPQRG9Dp$SVPlM?%>5SspLtbn8@c!BsP(cBWX;Dr>2(uEOB&6dTSD7fONq(gqi|e zM5P}B7qOmr5xB_G2D=C=^Wl7sU55WaI42E;*^*2OD}jTsYM1AvdoE3M?#g|R;<|AL zNSL|2+9n70mU-^6LbAlsOR7iu?>&=$@lrZ0w}9AUqg*UrKmW7Ny;W1 zTf5)!tMEgxNP7dyiStY1pjkA79tikcg{A~Eu?;fOGO*l{62qH(N^~tDyj@&^xrL;2e+&? zxsf4WU-I_pNz|c_gcpR^-&s={;)|krHHeAWx|s7Z%A{}^kwX}9cFQNkWBGp|Ue6OV zkH!jkl-x-Nb{!s3w0*KLJs@UhX}-LzlN`vXjUf}iV@eH|rz{{aCc`AvTkG|Atla;n zuz9|vCiZFUyUe3LAVyjAK;k3E4$CUY5!4nqeC1=Bb*WBfO9Q0oDS2dQ52FQo@j6^Z>~R zi6se}WS-%WmI>s}-qbv&rY4U(V{B?ki*CkufkB`$W>hhwKwnzF&{~h^y0I4ioHodvjZ&Ljs)y zA?Qkl1gqVVchBaXA~s2@4U?+wROvQqy?s&Do$I2U?a*Jp9=uBVt%QG-O_|y?%BNA~ zZW+8u1AD_8Czu4?{d$0&=;LNt!3PNm!~ELuvmmqif-ybzp>ly5HiCw7F3wsxB^?yCNtwTL!UFM1UfZV)f&Pe>8D=n0_(tws0<{36hDgix64|FVM zi{s5nKt~1{ZY!7*n+GWlEQz`Mq)P%vVr;zJl7I}yDqY} z#^7kcqc(8nq+eAkX??KpHDORnM+F9;0P;feOGLyg>6gY#z6_>Mi+>h%#3W^+gu8Uu zEZRQSF}Ty26ZOh-g+2Cd|4rxgOY7cl!U)yyGSQ52nu1xV{7Hh3v5esJu@Iam z_%tN4)$_LupA7fy4-kUCJ%Hookv^ANM8iBTjT60nu4to2MetZjuswHoz9iV@4V$D| z9I*?G6ENk_;sEvt_#P73XE(<>2gJZ4gb+i)v5{5IV6)8K6&ZH0PwhS%J=iq`Xu+Po z_5GnRCLsh9qZOrKeQuq^?TX10z7HCtH>6^6hjvA$9(f9dYT4yj-vL8;$y7_Y?f zNp~kk$dE)BGUp=}rl10DX(N8D-LUM}N(DMyZmcAN7{LA zEm>1TDaRN&${U7qLHmdVX{?OXgfR@@z#w8G6$qT9hsy!lK(J(CrzC8VRQ%)PVLyur zscOo{gcgWP2||T+Ue=mz)A9{}nR!Xcjwuw$e|8|P%=#}Pd5*~hxalw#+t8xlZ1l{* zfkeWAVqYSTQ^vz_SaGF7btE{Dk^qp+>`uNBEk8>uAii#m9h**;htkS$#+95b|E&k6IjmCP;NK4ORR(Iy2&dnFo2?}~KXWlZe)B#V^S8(#w8rpuW0WeYf0Hp69YtqM zmnLPfPfC+Av`^kgJn+Y~U8-N9effi>jdmb%4>@aZ&H=OS`|G?%D3{q8@l%4FSu*z} zAYgAApzTf|SBi2)EK9&e+RW3KBXCjLMLrz9t+UI}MZv@Tpjq&6ebcW-tp3?-YKh@U zz@O3{41=tRVQOnt6E~)6k~y=VTE&#Ezgulwa%k|`{kIa%=|H^X&u{jeW{e(pi7iw0 z4$=h)se&2-xzx8J09~B<9}s}*`=N+M44_A=nuD{eisqF>MIAJ|WZBeo)}+Ywv_2z} z%fpCZr}XTsJ~I=MhY>xC2t4o0%HnXQ-z^0N&BA$8N)<8`JW2cZjQ)%n0u!(25rKz& zi5U*@jkc~#F+`JuUf6-RaRihI20c!toKI7i?R31N^2y$&dO z{F?4^I$t!s73YWmP$f|H2#Y)(b`8!>i;t0-Q5@8aY?+!7tLeRgs067Q{Vg%3;inmN z;Doai9XRD(>W`BV6zA;32rc;7c~%H1FaT5{wE+X9=<*exy{STo`+EpgPQXSDOi3T_ zB{Ey4_Y8a@)om%^`8BPvCmf@v4UCB6A+bnJ9=hZj3S7-}ikLXU%?JJCWM)2;`vBzy zc`>FJ0-g_aZdj!U(3pQ<>@@Hb#!emZBB~Rxi~d(API53Jkm#Y+!Rqz7v;vc#vN#K)IYO}TuGpB8V$5;fwUV~S;PB+?CGr9#PM zF$tc3>zRxXWyC2G$>|j7Kp#c%1DzsbNww>b6eK3KHI67E&@V|p8i?eX4Eq_){XPQ66%Hq^%U}sl2Rpv$4;-K4*bDJ2FFv*iR-?128 z=qZWe6JnRaqC0p!_DCp6$(5BXkRBE5{h4l$#Q^V*c1oaMKC*gH_W2%QquuZC zcqw)sUKO*`>Z+6Q@cbS|3~Dv(leTxVtwe4Gwl$Z74o1!Kjo+8giBQFRCDA}0AjM4N z_K^Y*Bmk3Q8rHj4=#7os;<5LduHJnU@+th9+uuSZ`&)?fZy1Uv{=gxjemj=di3H95`wx2adW7 zG!*tv(}nC91qdM0xvo)AP0&#OxpKU}ifHeWQrH>Y4i#!36F8E!4peX_4C>t6Hb zfcUll4K;ynUYMJuN#V4nalWr?a>L5M+EU-}>m%hISw2(scWKWhlcr}6=5CA0SxJAB zdqSh>Wy9|;XLZrvb?M2;?~}$FnM6DvP+m1^by0g8=Z7|%KR1~a*!gDC)v!xnZ5dLq z)iPjM&7h|T&aJra<-ICr(4-e#azwN2xMxIU`RwQxW2k9jKl+=PfEU*LPxf%Wx?*#T zS%vk3(Mp4OlOD2Iw))%bV~GI zMOV}bH)ndCS^P$1ra5_(-=3w)e~g`Glz5`7`8OT9*)=qF0B$}mdVfeq^o?1d{rsE- zrIlJ!z0LJPua$h~z2-vayaPwe(k~npRd?9<-Cn_W%3k|Bp6K#R=9l|AS2*gVCmg1( zIDV-)*|DrfS7%1)euW`U%2nS^f%x^Khm*?=RA>e!3CD-tE$=F-j$fBx?jLdcjzLsE z&B75ClOqp`>Mj&dGD z+17UmAWftyDjJF{O0#1LRWK?lGUF&Bf{KiQO0m&NK$NNxl_DTTtfPV`N+%#yP*G4( zP&y)m2!s||@~wT6Q1s5+_rB$MzVH3+A3V$mnX4#qE=F3`H!WPgmT z;PEAJ8Lwe-b-3$tS^v$7T`n?#_Z{@TqkVk_F7JR=34DSFhlEJAUiiM2MHefL9SNfa zc9vf@8!P6h_>VA5y9}Os)r)vUxPUN?0q>riPaoB2Gbp+w;gZ#2@IEy4?fNlF@J_sCtBvNa<8nvr0<8QmLi^*Q}?b9Rq^ha}t0e6i2-$VRNby#OF6pE6p1P+3$E&4Du}=%^>bkyeIi&iIuWD~-$4$Qqpzc1X}ahMV-mOgX@bbbdvx3R9U;(@ARFbSbq!_c+f5qj4kyD>t z7D11?O8VbjR_}I1^6>1!w=;bgiK8d4C@%LZnd)Mj!rvXVE_v>hyw~2Q`^18$3Kz)E zbj%j?U*UaFbn1}BW~yn2SWK@_L5iGXc8A{z_k-19MG2!1t2Ig0V*ZOYBs()bhIU<+ zyXB#{Iazh|#t3b-fpZZ4JJWLD_Dsi7 z%6x%2D)~aX*6=;2!77b~VSF*?rwKk8p?LmrlWq0uw~@zpf1lSvIjy8}q@fO~`!2|C z|5dG@JRtG?{G1xs)xWTur(YjV4IBF0{d%9#2qpITAfe@iGh0E;&Sl-7R)Yk~nQGrN zzfk%#EZ)+!Sk0Z?kJwH+^xmqIMV;nfOY-ZwqTaplrPf=I)HLm8C92y8%=MV(vaU%i zd^Mv>hq=n`h?~LdXQO@Ho^P}-6vb!_gnXa3XLVI`cc=TFM;h0rS!eI0xR2yn(ycq2 z)U)ZeF|U~CkIZmos(1-iM-n8n*1)gNERze>k~JIzj1Q0a-IERII$!7Y^cGn_t+I6Db8Y%S9sLXoXs(QcOXXvyRFI+Ub}q=GvQli1 z(p}Re!TNo1l!9}S(TQz`M~bq2NF$+?eEow;g>UF0iflO_AlI8`rpRXaV#`ps}ZQ~c>M*;k|Xo_EVYnh|+6 zX+;0m)RkJwHdlv-W*U7k@SkfBvnZ9rOdSg7+AI%0DY_hh_hj&Dk{8^o1@$UtS-p(( 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/polar_axes.pdf b/lib/matplotlib/tests/baseline_images/test_axes/polar_axes.pdf new file mode 100644 index 0000000000000000000000000000000000000000..afbaecdefc25567d26e46931273aa8fae5bda88f GIT binary patch literal 16951 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 P1Hv#6E32HUJm~)b7EG)5 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/polar_coords.pdf b/lib/matplotlib/tests/baseline_images/test_axes/polar_coords.pdf new file mode 100644 index 0000000000000000000000000000000000000000..12df119ad92eacbfbf634fe34cdd8dd31e656c81 GIT binary patch literal 7014 zcmb_h2|SeD_osw+=v9QI^h8>0v(K18ma!yDb`{ECFqRp{jKoXnMQ>iDP$?CaQlijm zX_E?X+E7|#X(3d!@V4;3_Zc#(f4@Gz&u@Ir=RVJU&b{}X?>YCJdk;+qb4y*k9top) z>=9B}j=>{1gzFQ8F*HQ5F6+Wr2$sR*Gefum2-blaz=}YKfWZk_vIN88_(4X3$N&b9 z#pJWO9CIe0g)B0s6L2^hjz*vo@B}iRsEs2o#Nie$#$X+ITt9&?i-#-qWD(M ze5fK>IDvB@(~r#wK&Zm$Ex8;%LPDR%VZw_7%K#iK4nG3H=YRm{eFkL7nDyPcbhMPl`t?Y5{y0505(fH|pZm8Ik6rBeVC4ya& ztp~%Mp1xlD?z7rz?yi|Qr4Pyb-G~~Fnb$w=k&i7}Ig)t6J(<*<@d4lVsW{F+JMi{r z%L~z)!`Ix3&R=mwe<-CbK<{94Wue{fZPtNj@E(Ozow<$I1e*k{3Bx19ZX?A{dJ6ZM z^eLQGeEP|(RNUsnkhsm&TN$Tk*uI%(x!daSv%rmSYco1`k{|l1x3m%Bcb9h9@weid zEecxG#Gq3$96*AwF(Xw?Y(~DKsq%O97_OZjgCECILbxtd9oTeAWHg3~7bY@ax zqk(3!xN>C6!uH20%QjZ0Y;&HE?VmTd|5DUV>)glXduB!9t5+G)Kh|Y7`?o|AL+`D- z*?CE?&n09qO2gw+?h30Lju$MDC&;d1vdVhB+=}VJ$IiR;m@K(*B2x2Mdwz7n`GPG+ zC3<8wUb1c55&CXLWcB6WiaM>U47&=~v@69%9l#|S4qZ;fm!#1?ABmgx(Q$6;ku|^X zoX)_VogJT_xUM*^qH3hGru+5aNZcLc^$ye_7tLe_&5U6|Jd_+{ulTt9;G}x{T7jax zLj8#QrQuJm(u!$b7SyC<|KAm>%MYqsRX?dv{+v*?2yaZveC{IVJ8-;DrniRXdj$XK zgI!deTB8DSi0Z2qxY9qct9f-zQl6hU-cOrNe;GF;SrAWNM7h7+%pim+8A6omJ)w7b zRZps18vU4uZas$B&kHQa;|po{3V{kS`q-N*o(Bi)3l+{JtfNYDh*Gak=ylNTuRf@} zTW3)6w)oY(4-&H4XWs};Y)D8o_;XO5wUD>Ny?Q`0s_I$kOXG;&r}=tT&#F+H!j3|AlZ+Pox5%hzkL^~nIu*hyJfFN2IXVtsm38{u=LFH`@Q=;ABcyX%i})U zc=+krnb8f8rz9*~>f6Ai>E2AY-~HFXfQtOG80o+-iNjq+Fx zy&W_;o3rlp5c?#zpuy~uoy{Ma9d5xLk!x!9?6nH_st73Z^>ybB*78SivNlz3k^Ew# zEp2p#n2(kN0_`drCyN`W8D6fQpEAoM4V_N(8SUORwc&Uc+hL;&HrIA(Jds&MYHg3I z?`&6_MtXK9&l?CR|QU zHq$I$^3s3WGiTPvs3R4*^!7}RMLTpqfBxXMe)!GJ``1+8&#hg& zzycmHIliYoY+CUa#K0cv?1Z3NzQwfY1vUp z4=g!dkzoy$)x;FqB;}e_VTbN!fAGBjG)HRTw1&{k{uHxvYZt|Emwn;3{YOi0rrwLs zKNV7TcWdvw)C3!A%>_H+oV7+yF80vsdSIb&V(HWP3_DW0jxl4K&p)}Dj)S;UY45^I zw^|8q)wbl&bhBGt9qzOJLvF=_Y{zGd_q-r1S$O2Fr+w_JvN^Y(?$3Aql=G!^>-GWl zQxEf+y4^J$vs0T6r=K+(N!iywJUK0QC7N%)ffS~*UqKJRED9cxa?$~}p?U^GPi$7^ zq~0IcN;G%=G=ETt6K1wZKPQmD%Q7NdZY${#hfvZwOa?SyPj-+ojvo?+Dmy)>IAAvv}uY<@62?uEAXmR ztCEVG?LX=5L9))DDm{~peKFMN@F?4>EqwwNvP8_i;N|`f1a0N;+AC9>1^2IKS1&)5 zBGc!2bL#bT)0#o<>!*taMlKtdq z^YC7TLc=VQfl{F%E#JyLr@ppEMqBDj<&BFLF0%>^r^$z1c*yvY)BBX#dgokO&AXx1 z5v7$l#TEU}PpPKcof@KIJBExpd;a}Axgg&|=?4Ic9&CQ*ECf7h0)R#i71J4bX|RW7 zo;Li^N4;5}Uq2i=Kj)ws#Y{ePmu+q4CVJhrV~dy1Sz_a}sdCdZjvqx+%L1EmLUZsI zrayM`^BIGWo3@uRNIL>)aWX`$qpEZ6+E8|dX(^QFKB^{uoEplX?6yg*!~?l?(EHwL zgm+DDrtGC`g}>Ehm)S{<6!8X~9=$f2&E5Z3CjU+Gzt7&)-_)(NH%c=vulhGRIQ$SD zV;*K1G?2_^)|6gn9Bh&x8%+*AC05)T{Vz4pim$SvS7CD}DStL&r1|W%p2?e%o!mM%|lZe=EIlGrP& zljPhlnSH>UeAdz_bx-es6Pz`I_~+5ih3^NYw3bIkh8x|eSNV}#@Erdu!Gl1gOc2b@ z!G>c#PxfI%vS*w1{CVOHj3(C?!w*ZUUHY_=X0Bf<*InwW*5m9W*xWmiZ?~h4uuiey z+46@YjXp>aJ$fqM`;^4V z9$7cyX`ytgNqPFLGe^r>{TyV~Uz**J%FxR>e0#@Vw7mu1%hoP9m9FZ!q$zK5_^K+* zIp4oCxL0Pc%)7|EWgFhSM!dP8wshrn#5!qSL+pW=OiXG)-8yZ>%W@fc)88jGzUH)j?^|R?zUM%x0O4sccDaGrbwXKTel0@ ztNl7JyR_u?{SNQ2SqoNgP@;Nwu~TP}`RyAI>1CP4*J!@U{zDMcb$+=@RFDcUQerxz z*88`hawWSJCk^+d+lzOM#8to2eVVuJZQWkge^qn(-WZf|+7|{zs^8`*5*o`$*Jes9 zSg0AUvp5viQP#Y+i6r0XFJr%5yx872<##b}_0=mk^cI`bZ0@Ax@8ecp8qgFcoGLnZ~d{|TI!&MvEb}0|J z^G~QcAMYYj|n}m~B&5dEe_+b^Lpyc4qT${Qb>W%KvFAeDNWY%D@h^6_iKC%J$ft zxZIT=qw`0x+1!8L*&3|1)~I@ONMX9a+!UwmJzKNrMn17;Oh)#xw1+;`-hBH-Msbm+ z)(`N5m(gFr4^PBTa4m~1^;0G0$ueHMw95~uEIG2NY482v<2|@tre;H?>IVHd>0@sP zD7R|f+}>YJ9i}uD`ey0OEsu6`lj~03R5_sNz{WXVNnB|=hrw*vS$BOq;f!kgX}dp< zg=D!D{TXQ}DR=rXt57=bNGS8APQUDB*VSjQO*KxpDOy|QdVal`Gj7KZbor0RI%k0o zA1y9ea(SU&ucJijSj}Pd!j8e332(Z(czqJ03qui}ps$b62sGh^_v?YMlR&~b<0xd; z>(2;O%A_*hMIDU@4Mb-C-`=Kvcg4ilU@+gyiJ#!J;7)GNity#J!}y@?0Fo7Y`L<_< zg8Q-=n=f3-jm2X+GdU5uPTWu?2ZM!oeLE(f$42ktdN>@+hT!k(6Q~!MF(X)LP2m5Z z#+~iQ4+P}^VQ~ff6&_d@Ac7K1Ad?4bCcc0Jtyzr0B%IZf&5Phe76d00=qI3IuofIp z0)W*DLqiPKobB(=0@VdrZSX)q837v+#`I+&;H-m-SY$8; z1!YV)*rJ{WS0cd|9E1pp4ON3JAk;2!IU!-lKt*&U#CQAw2q>I_05pbQpj1F|C=qmn zF>{Tzz+{*)K~SkkRKNr->ri~?2NOhvov1T`nc%3evp}J6I1Ku2bOIWMhKvz(1fdT= zKbS};*1#{IPlyoe56~yZ2=$dwpMd@#N>DEJ9n1lJV~kMEab$oykQMsC4~V7@><9e< zWCKwe^NFz*f&%Q0L0kANLa42U-yzRef_?$53R|zQ!9g_BgE%@`H5LY503@1rKwurM z{=(RcUQ$6N7(BuJ0-r!wCZN?@3<$lz*k~^rvI(P^3k}x5{OA`xLJ($-@gOA{dM$yW zg`DHxMU$f`9;6Ep3Qa*~BaemF@j5uxmx+E@vP2{Zil{k0smRG-yi>G}0TZllD4QdQ z06P(teVlJBs-mKB1t3*`++)M`gSiX%I8+p*+wod@gordzJeEHOggku=*f66%5O2u9 zI{wJlKA2wN58;gWQ2-DV`zXZk`G9KyHNN4)gN^)c9|8EscYPo!e%A*I```582+&#J zPeeWv<-2upL=f!1;loo%-}RAbB;aHd=OaYS_#4-kKm+^in?53r^4(Yv*nqoC97}}x<=Z~m_c)XAAUS^J z{{z>Z Bk&XZW literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/polar_units.pdf b/lib/matplotlib/tests/baseline_images/test_axes/polar_units.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6f5228bf7ff80772c1ce4b74f953441b54eb3ae6 GIT binary patch literal 14256 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_180.pdf b/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_180.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e14c95cb7997a0f102a8e6c3325b9aa9374bed86 GIT binary patch literal 12119 zcmb`t2RxPSA3v^;I*IHVCnEbS2gk_X*)w|`Bl|e^N`(}O?6M-GL}o@&B%4UYL8v4v zqwMj!Z>p!B=lOsC&+GU49j}k;KA-ElKi6m7pX)l;{pQkEP!dE42}8JwMxYOCAqXfO z>TYupA}I-l>HB+Np)h%CytRwF0~Drh?SS=yqJROq&~xV?ST{RxAo8~xS=1}Ta}Akhd6KOA)y4nNBafobF1?YwQVI4F;+HQvL;9q-~~1NE@8 zhuT=%Is1xCuZV@pun$80@c`g}m&A+^~4w-}J)#rkAmn%|)y& z9xAr4J75SNkHxt`MZmB7+Sux0@laF1L`@<^UBv5U=F!hKCC8U;pJM#P5!k2S#As@Lo^^{NR=YPlFDI!gR4- z?%p_Cz}27$x}e{2z~BSNLtq+MJ11*7cRxT~@Mg5A2vit_1oZlCF0kWg5S5%<0Aryr zB^N+r1+1;R9WcjvteXSg5sCnVw;xO|JP=4-)YfT553*kL%AMG z517XKWk0kp7^T z(`Sd$`#Dci?!w+CKU?RlVGi(;LY9>%yL4eKP2UGdrmaa;j_>UHYZbCrqEfyV=Z;3= zNGy?8!jo2C5(jxlI>66%d^L=vBxF+?=XMOfb55X?X@n8>=PaMKUBCEDj3oVd?j<(zNoXJ=2f zocrwRF)Tdx@k4JCLXsdHgLqu>=A7r^;oCi1nN`v*p+ljEa8(G$hNBq5rMo-MapfAN zY4dyR91dGYFX!z*t_##U>EA_Domz(HGd~_H8eaw1j)9%B^~l)W6IC4i`St< zMkM4-#TA>)4{SEguMM3GYP?djzUkkNeI)Nd_zEri%6?^Mi``eUcCTUwyAm54;bIL#n|77kx_FN3Mv9zn|VVxU;u+Q@8Z$ zg^80tsWPYV@mjHiB+g(C}>A3=JycF>LaB ze=+KqQP5H`eu|cf?zo9{eOGa06B%oQJnzU@?CZdZF-IeFiHjbU{-2qBucXs5A4yER zXWm2BBiFvJO`!Kk;-?C~eUaa1lsMwL80=-z7EKtQt8O8otvY4;5M8ooQ(i}9xI)tx zfj*)||Uri)?m5&fX|iHcpjlD&!-f zX~euW)7XRpnwkMJf#R(ChKQO@o*-gVYI#(vT3Mv1hP%M*rn|3{sz z%CZczK%Y-5%Au>|P{+8;(kJV>hEs(`mqx$T2;6U+x7HZ*3~dT64G?-0o7&O%Vx>)p zgTmQ&(kIY(aAhLUrPMp4&L2BAZ*BfL0+N$^y|SC(GPCI_Vh{A$x;QLJ)Df8kw)F3~zN9?~|D4QY zMRJvU`6*wr#t+B&L6haA0>ZOw<`_G?&p%I#FpFvDO7zf8oV0ut!QC6jxn@&}vn7-X zQ4_ltCKbH6r5ZM$_Etq*donoo-UVF_YU{_uH?Ai=xa`xx7cP4C!aH82GnM8o5nIGZ z&JBO}?$DZ^#IT`>eL^dZF{TBk$p&Xf69_JeaX2kCJZbvqD)nYSodT=zi^exjhFX*J zx^DTeuM)l-lDsN$#*$6;ZObRw_4>w}ovP

    YsfPXV0P^x65aika86bm+2z2Oq;PQ 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 C4we@H literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_360.pdf b/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_360.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2d34095460722e80af95447c3e2be117a8423f6e GIT binary patch literal 12145 zcmb`t2Rv5oA3sirZX|mo?vg$3h1<+tN%jim#%*u6l@S?HWQ0&iMpk5pP@(LV$X+3` zm67l}hkB~#dH&!3^ZLDhx7X!5=W{;ibA8tNT-UkIn_WX*ksl!-2w^W6f#z335KuVO z$;=iaApwQycspaEFgXkkWA9`Ig=t`{ux?Nkz@P=aZ~=mKv;Y~Azuh3`ipAh;oE+sb zI4qP)UJMC`i^4^bXe0tDgb?M0qd4JkPHqTH!_~>c-5l!*<#NE_ob8=(_BLivXA4WH z8OGcWkPEOJigNms10etxaPx5FgIeQo&SEgwubTzjECn2~IPTx{68%jt19dZ7tT_%U za;Q6C2o8sJb%Y9or-#~@Yh!UxBfvy?MZj#V7Y+(jaRAJf{n5+)=vAO5P?&-jPDvXF znkaN6K-(H)VdH28MIVV*baKQ&1rLvZxe4*RW90x2tRv11ihv*8a^z{y!BChM*3HS? z)f{j&Xo42#cUOS<$ng-E8rH%FBkSY^s0-dKgcgPhqL6@Izl{Z6_!&e+8+*W5C`{2F z&{!U8?qmUsaS7{ag|mhtz~CJQ(+vlN&H>`}a4AKtNU+i+WNVN2dJ^Br?AF_U<#W=~ zbhn8tC@t6zk&ddavf_L@}nZjsdD2iyT>cVm|I+Md_e zxL^Ijx3tlHiUV(xgM8yCU#VsN8RwpOh8@PM0tc46mN#y_6eskzB*D|$y1_))KPgT& zhFLw}B)i<~M@2ZsTDxh?E46DS)6I}Pjr9M;YTn;?zc1BgP98Uf>bd`?npywp@R#JpUoa#nz?5U>)u8i;dtCq8dziLb-pAL!H ziQaO$QMs40yHY=1zxQrGYP@b{_jHNWnG%$-QqI1zq~mJJ#KLaRx&2SMI)&;}gI8O3 z@}(cFpDuUm^T+hn3GDjb?CoBUIa3&_lXRfDr}*=Z{xfFp?Zqb>+6Z7WF!8L zrU@x?UDolkZ=p-{x0cHN_f9B_Yui@^>puCmIopR8xnX$u49kAK29JmHerDg5s8g<8 zqMy-$3D?FS`2}s#Q|5UzJQ1UHxZc_~p^1miLT;eN#y@>mxN}f1pBoWuhzZtCD2!v; zd!RM`Xpibqgeb>$u$leb}G z@tqIP)go`|B|4REI&TLAx^jgK?^0fejhue^zC7c&{sYfK7xV{}bi^Yq?XpeZRldv! zigE{h^C~J$k=zQiB^J0&qxY-Iku>K_-a+>#%5NIIC~}@hFbWF|&`}XRak4@MH9$K; zE*a<7j?iVF!G$thTnMKeoZfZ7lyfpKvo$!IL{TW!@)vk;;(~Jg88^*ISCwK7)5u_HL<1A2!&tVmKK<^cE1P;Cf8fQf>IZPZtj&n2<;0BlctHWl z{s7~nv5h2~%rbm~51&e&nUdJo9J`IbVtcYO@O}G4p>pN$v;&3+pR10|B+9cgqzk&B zpXpX_wp#LRNL=xYPSrAUk@5N7U0i`@Z%&w&&gaRV=g`418>w3vlGIXZ+N!x;p_F{Z1h42ArKu#FE)fyY zhcyxu(=7Dx64IJmJu5>ID!z-(*DTJYxttUGJ%6VAyqIg_RlWpAdm}w7lGsWO)sGX| zY(%StGs>hI-~F~88^)faa(vcMvz}0L)1!?i9L*W|>|O+kt(_Iw7Cp|l?6d0~^-oiS ztfB-SH_jBBRYX@7YNp_{modDNaXwm)c|R?(zzT~hRT=|n`6MDOcg~M-%y>|#J&$C0 zDfirDea$(qPJrU|7OjWH<&r_?uh|}T()=%5E{l3xA992QKBTAMq4G01*{2hlo{U#juvV;&ihtQ$N#MSl?{^8GPxx!3;K7&i1xi@^ z$Vp=f9>~VP3@MA(HtEMyhV}1X2A&hP<9oLscdg0(8eOp!<}Ld?vSeaxu8{IVWb2ao z$SP}7<4l}Y-2CS+rw(8U(W|xm2uUdiR&ET-qA;RWLf<@n@B*7thj5C4(^_+5@*O3m z&XhIy`WFJZ;l^du`s_zIzUKqCw%}cMbcc)ETyfOW*A1Qu<*<(nI<}Drqn@A)+gGu* zQjH0oPQ_p8jIK%B=hpe$=D&bq;rX5%fA7>D%}so5$vD-f+z3w8d#~Bdt6Xn$3RP+6 zPnBst5qRuYk$H-18R2s0O+d_0s`YJ}%odgH)iQY<>}?*zqY>Ev?Cfw{NDcc9_uJw+#%$W(mJxY3N8 zz0WXVdslh)iwn7lkbOO;hX8uCHYfCJrJ;OX^f*=o8e-&FdeJ$HZ6uU_U~8DaOXpGV z)+N4GXB%C;F!$=~;zYD@vBzex5pC}-$zq8^KV|X-De&d?=9_5Sxg_Olt(mcgGxLA5 zu>ZJgrgP%%2Wc&V3KGFx`Oi)%Rp{pW^7l`US-wz`kdvL8%?N!fI8Ci|`qY!WbG2V$?ttvblC&f1A_2ls6U9WE5SWn4V(fSB)ua=>z=f}d^WVI8 zAScrBmOdwzCibY7O1xn=J=we=@oMy)nEr<2gc%duixK;(HmZBZLFYu_Sx3|ChSAGa zg!-S}8lETrXR-_sQ*_WJH`@s>H2U39=U6uO71LTd79LZ?Dl){8kk*6d3_tN=IL_R1 z5hiMTH$^?NFO<$9BFw z^9Yq2z4w)lk@ozWbo0y=w_wlMnb>}&o>2!m`E;coI{skB#q{K8hGRn&?cLlZvbi1o zvG@AlnnzxlFE7xi_@3?BNVd2>$E1%J{(!A_|hP`8^44Iq!0c7_#~lGCAy+VluW*ycxWEjz%wnb0v`dVrSm`@%(g!GgD72 z%3A2TdoTl2)$^zBn?kt6(r6TP?&oDWF-E*%gnKzMCHz>P2 z?)s9U86IRbZ&(FCx3XX<^z9W>yp=|bW}jk=1)Gh0yQNC8-RNYX`Z0Zb-*o+@R*eBt zBRlbv<^mRSeVT*)`wpc%)Y>Ut!*i21#Qb@Dg~$4Y)h}P6xcC;^y;GN{n6D@=WAVLs z#-X@iDRA?uwQd1_swjO2#|=j<#fbE_GbFc&h#-d9A#LzsPOe^F*Rkn^kJ=_OIVO$G z(I~CAMW-qVo28RCGTViYmDPL{xW|Y8(dT{AP6EQy+U~o}XH`39)0W&_QUCZlpX0gD zWour#efN>qQ#a_gNy5%h6q#7~CRM$=_$K^DS+|^CfTCGf+Uk9@sPr{{n|!-$sa%TI zJ5(B%OU7QNTJ6fQw(C<72Tq*f4cA_u87- zaizjE59Y;>c0CZG`;VVik4k+o%(uJHB+%rLf9qaa*`on=$C!H+8KOIk&w5Pa2zm92 z@50x@&gN=6SYOZ(d~`{y%<9Cb*K2FS+$h8R9t8E?>3WR1fk0xrN$LTVXTIaml?znpyE7dy=<0pUAoA^t4qkkE>X9tVzw6IZQ^W%yoQ6%{Mws7HL{`enIEaaNyBzk22bG33^n!)dx0S#&6XpZPO8KTyFXZv6mh(~w-NNV% zOn7wz416A|RMUoD@_5ue`H3r`&-GNe0h!9awaIXw*jq)ivv_9WD|4i->X)sXY<(Kf z+yY|LlDv&O)hJezlT1Ay*f@>(jJ=S@%kuz4#NBzo!9&f1r% zIG*xAidsJO^_p@k3)}D@MSB5d z+ts4Ssm{>bYJM++K!!n|Y@r>x@P=Du_nDaicfyF#!<_OW1m2Un4;FW!Z1tAqR(I1H zS=%24-8B^GDQsu1A1WSr)k`-2MSbcT@v&$N9X1*}hZ%~rrx$g%DWC8jD8GbjzIZJ+ z)p`x8G?gT+G#L_qP(~LyAs=<|g8KIzYl^O3`)WO{(D6I3hi&uM3_X~rhw@z;MH4Uu zJmt(bw-za1?-XDPdoN!ZP->(RCx#DRoMXxBEQ+;VEaV#z!_E>DeV;$^j8eBh zVMudcew8btc>dG0dEg}bjLvM6oyfYVnGL>46{1K%Drj3VFDdaC2PwadQC`CtTBJ zd)&R<>@Q+9zU`gEHxs#Qy22jxy{dqEXwjplh#gA!*O1%~M29%AW&Ay2-1(wIoY)F} zdjxk)k^=|!IlsLScU#gD2ez8u-aCI}a)T4*kI}zvDCp6b7s0>B9=|C4xk`?1Ox$8c zYf&}MY{nb!;R}Zq)A>kBA9l_c`{9)oc1l`-E0(hCTm!G+b6QkqXcfe(&*{`^-Rqoj zF``Bab6pvXb-tJ#RC2QGrNUkAv@JQ-#%lqkjZvWbq2vWkobw63Z_$fwI3viB}aW(=tdPAbIHwYI;_Ra zoVUHLIhwZZ?`?_o2az}pJ;R&!2xbcxU24zXZ@%pKA&5t2F0N#(X)=^!-8;^OyoGs* zKep5|9i4+t-cY-8 zi`=S)xH^;cEEk-+wmWkpBWCfNFF(wfqlh=il$<%B8Nx zY?pd=x?R4f{xq>QShrZNiI?ijSb{`Cs!9=7X`c$T%K_Z9XI6q~nYd{p! z!#szj`5zTk zbDiI@4#b~zNHQxa8@NDlSy0>3?PGq1#77lPd1;g~udR}lop7wjpt)*|U%-j+$KodL z+v^3H$D?h!gOVGzy-Vj~`&Y zbLPN)QRgPsXHs0aHe_tk#9sf4Uh$ZYf1K&s5IO1Yz{-Jk^X>u7I`zK#+4|9n1N>(d z?$O}3`;X1q9~m|+ z#olU(x|*PBTlw9@5)s2sAkY(ZAXo)^8oPd~gFj0+@kt^^Cr3fyTT*IS2$>-jt6_#* zj-0&Zz(%hXkMZXv7whPzhFk8=I0nrmTHNc@x2Fw1B@|5Wr_80ch@9sbR<|HOUr(jf zbEP5>eNp)8nY{NI&(m=_-!pY&iYK9o;aOT0R^jC=zQ&gc&qzhKT$C^}8_1{rR8b)s zpg`fO-lbC3sgrX`ss3rJ3Cklj-sfAaCY;2Ky;ys=L zrw*)c8kdqTJrB2WUe%7adwRtz{GN)M>&)<^oSzo?GK2F!R|QG}G6I|D{-FO>NJ?F4@KuXU{q0xV!Xim974K_A>8GOT_fK{WHW$arou^s%D}Ncr zW*9%%E*(#{r|sAP?lYt|4ohqBBR3 zipYjV2IQSq`Mdhvk?9R$bMxx~{}PDbzux@s6#nyh;@1?7C6FO$o1?uh>-KJ?xGiSu zU>?$n9~3GF72|i&c%yzQfp=`ZS+{I*C5hpc=d1MbR`=6%qNiw;dl_`pa!g*Z)Dn9z zTOQlU6yghF{7fKa4nbdc@w)V8aLJufh|p)iPTf)i$xH9j(nzH3{-HUkK|MQybji4j zyt#_9AIp&WApT86Fq_(0E#>qDj$D*XG+{=*W=14)lmC1hTM9;(&6aG}Sao>7jk=Rb zP@FDbLNrTB|6yB86Dcq8-iwZx3OY>r5~rw~>xbp`9xi@FkM&lSHhtN?>Q?dsPHV6> zTYfrPt$Z5|o7$F~{=D;@AScU+?q3}E`)9)c3D2pscV@D!Hr{1dV zMP2_xN~mf)HV z3GfIUQYI5ErK`z-eKU+pJb_!fb8h+ZODdK2hh`>X-zYBN_;Tunr`w9|Ui_xaYj98{h7{6mza*Mr?>Db26FWTjpEs)DpK) zRB>PYxcslFa#VB0NS!24zj2KvBjVw4Cw#Y_w2IpV^lO8dB4*Q&-lpV_e$qVD*G<12 z3~YPve+%QWtJaI<)+_bswp6DJArsPbEQ6$(l=0ugdPG%XPf` zz3azEDSDaD8T^Ze;K$Veq9GFap87`_)Mz7@Lx2+qT@KB$K#NqpTK5Axhi-8U<$z+IpPpaivA}l?uLPAfZ-Zk?>Z?cAhHj_k1r%)n`e1IRU@$vQ)%L zJkxVm4FeVn0nFd?~E(j-%RScC* zhzXayeU@Gsud#jR=84$=!{gFSk41q6WR$|+b8npHa*aCu=RW|+tRhMM@q|O%=0h)1Hl6S#eX7yrnEvt4LPtT zlK06rCG_X8Oyi0#y>S|Pal~1@+UL0#6;gW)6MBm}X^B@-KS**M%cW6!}M7CACx?i4Y{iUEI&5vsTqyQ*+0b zM{gKCXxGVuzz8Z3aren`*`*d@!%&y}zq*=CX|C7W+gi<@T^10|-ZpT(Rvr4mwI|uE zSe>~A)?B7zkghkHA-5L7MNNUnKM_bYS;u^^MxXO);8}=kgO9~A(~EtM(r@H?7?llW zC^5S+w4X9HitHy>xS;xd1tIA;voP`mJnp)D^6h@cS+zclCoEQVEmT%mI6)A3oa7>0U2r+UxTJCiwt?sGW>ov>i5>{r^u*YcP_!#z20~a zj?tFQev!A%kZ0+;ODV}!(lqms_Suu~1s%oAsT3SOPGwPX?d>_iw0$1eb1J&b&-8hw z?tc4@FMyZM_|JeM{&-LU;E6oe&D_<-83%xC5QhL3DC{!E0RV-_+Tf1f1N5-27;TKB z8^4y51I7^o0|6~+7@VukA?QQ^4hL65z~5g-04PQl*pfr=tUp(YTRf+K))0Ubpu>j;HmZLF*TXpp0gBNl=HfHyD; ztQE)(jCiE$U*iI^5bP4>hsH=i1VH%tzV>^`27>{Ddk!r)boBqQ3kuW5VIA}U*Mn#t zD*%gyguo1xkF*j3>g*3KK#%LClx)53y(zFq#U00JAZd zakR3>f`iK(=?wb%H?w|D(ne5WIQ;)bgZ$shK>=^Sf`B@7W2fnNZB=rJ^K zKPXdFL=@1&l0fryR0C<6M506oTfFnc>n-E&`uop!G z`T}%e1QIatXk0;HTp=Xj7@*dJ*Mxvx1aKDEA2uY&Cw%Axum{IK3>xS_KnK9Fht3iL z?m2YIPvyY=Fw?-11i=$H=ps;U&@`|I+F@M4;f@+a=ts={5_NO{D0n0S30Mr=CIo5) zXbx%wroqo}{p^8|L4GQ7C_xYnFag^rp!#4Q{3Rdc0*Qyo1V{qU|B?bK1&2cpul*1p zDl7{9*}z0N$^kGB{%nW72J!;TiQn2`K7cv#vmNHjkDLJW;r9mWb$AZQ0CVGKJG2}w z1o$1$70iKuX`&)P{J^{bCV=1D&z$(#gH8eB4ms?>@nJ>-r(#e=ZCEnl=@kTpfNPIR$~bd^89B0J}n9f6XKUK*<3x zzQF%q{|@n@e{K8uMHiD3AV?H|RV6-O82JYWy($j1O((Xr(-WD32@w;L+Y#s0*6xga zTW@LjqVv3}$kDE()+39;uyx4qk)W`!xl5At+AaF*%NOG!vnHy9w!&n2h-L8!bvI>g zE`^zmtmvWxtL-GFqeQF-goOQ$`&hctFv`YL1q-bxInC;zQ>LX>Ls^x+V0!+!fcgFP zRL;pAm@E-cn5vBhIGG=!YPCR6?vd?B5anO)^m4^oLV%(#3IR&;j~`HRg@F9Dg#JYX zgAD$lj=yNaK%oDiArOLK8vTt12b1paG@zpYgN6pu;qQDv1^7D+0Ve(*d~i4tTo3(? zCJ5}?{+)&brn|qUk=@!BnE@C1iUc_K*F&JY{mXZ`@&zj1T(u$HTRCWnT zQPCn&AxqK5|2~6~xBvUSzwh_)J9D4s+cTa}9t3Bl9=mgnQ z9QFgcU{Q@GFxW2U98ovH~J%>jJT<0SpMK?*YWsTxhixT7Ad{Lh1xCc9=3?5%Kc` zOkF6Bt~6(eI8R>Jlg5B>%;#TfLN8UU78pULF?=92YJSSRreOs`NE51$r!U7Vf0|2}5WIT}o;jkFM*OIm1jzuHty1D~lA*8N5;8>gL;OPj~ zFr?C)87>eSHXhTMJ`7+w4@5v_UOM??-z}bou~~ubert2|1U~uMFhtL&uN_{~>vP@n zt$lG_zU;&&gQ^}OIg;)w4JYx3B~yupyF=dz7tfW~&OUzrp}Ku;I-~E?thayd!?FHm z&l2_Qsqu^tPfG`;)3#UjulUey@g{`c7rr_*o3LAgIM;n2eNk`km)h5_>$6I;OV#{( z2RF#~?6>}Y&$!G4yQkAnqkg`m$Ts=cAsA}6;n=1Ot<(g$N5jCZ6RRg5!!Y$EUuHSkyg| zu;172_*gpYK;P^W`gvqvy4V)ai0CQ$<^0?Ie|KVyit-s3TE<bbG%Z`pIjA!kCV zb{TSsQuUAS+q;bDirQ3{3!e!uFlq0uvC=(itES09X4oHouAuvbR>J$aFoQQDKmW49 zXY$y(KGYr8ef<@dCq9b2eNK+?Vu|8x)|%M1>riQTmyl?6+xM;Gdu84yP9$8&U^lJk zNd5XqG0|5eJo1T@0j9R`uyXX2n}BNFGnaQmRzf952p4?*G7u88%y)YsusULB3;&wZ zV43q-$5!32Z9BO!Er0c{%6nX~xed|xEXMzwqEt6#nA z;h~Vk3~66g`C1PB#3Hqu8=6D%`!)++c`P2aVp7TfB<+F0lgLTSW~UxKhcbZ%7V|Rn z)N$OUsR$NV!-d82@G5w2#_{d*&gJY-UB8tRGHh9EM`$5M?Gcod9&g8GoE-st3KW$?h7u*Y zax>|c6E`-sd;z34Qm2(ODwXBeoXW@z%gFzFcTOS`d!p+RX4_^7*MWQq&50G8ISwWM zHP=$aAuHKxL23Lu-lJVG)}wbb)9iD%&0CSH8bq|Zj~PmtVe&UqF617oOL`bxmnE7qRb42kA1X&oSzlx> z7WsFb$c?A^b=IOuA7?eQ^a@YC!|ab4-g88OztH#+j*Jx-7%_kU<5sZkiWMX4yyP&B zKZqAQdOyh;8?7AdH9kCTGr|#GWE(cP4f!Kg;EJK4xNVV)56!GIbkD2?BR4=YXsX9| z-<DmwKgzAUhHP(y2Ys9UoQnJmzU)HIz5JK5sP;k_0#AX*m&o$!lt_wIhnJH`d7w znLSk6TX-h(%44Z;RY!(ON1N@No|T;+rExZoB+ZN}o4mXd4s-`JKSJv55Z;vHHz?^r zZMnJQE=^Ri*yh$PpVtYq@>ha5?e)&NzFrs8wAS#Hk5kU3y0vX-BX{bvL^GyruP5id zOz3pUJkfBW%;HX(g7GQ8q|L2<60h504ZmJ(e7Cnkrv1{F7YSIK+@sWt9=_OALAh2x z3g{+(MM_>a_Qum;CRWDcZ>$U;c374SB_V0)}JQTADhUhlH-LAG}~rRO82t2 zY>`%YDc-ObuY;-v`NsE zr6gr%S~T{#gq($_}5a*P&)#u>Z+^d&9>s?qeDF$86NUf%2p*I_Ccw4!Kp(Z!Rn#rE2QaxbPzQgF- z&LjC>)Di3n&%IRwzgV@ntnNBoN!+T#FDyrH)!#Q^8O1hI5EfgpH~x;os>>WhYl|np z3pso-HTJsqeuKfDYn>)l^^dE#ZU48|qJP?cmv4XWQM*qG2$0P2mTnDBjT3?cpCBiC}T0bJA%;rlw`nDh%M zv0{7Yw81(lIkin?$7)!qGIL*>UBi7e#liw|N31NJr7llRzHpQow$3$sN*wDQc2Nl) zx+16*)ZapK7JTz5mCtD|Ih`vd+npzc{}{1I<+3wJI@8_JRw4lW3 zeU9Z%A4T$`C#avCV(xP!g}n)&o$X86AE-ebh>U)0ZOlWI*>Y^ubB;r+st^xn$P0PZ zLaxlrx0p#YRvEpRK%?QT^uJ_l1Z6nK`u>@0;@io*6zWn?nh(X;HgxnEp_3cNK zTiE$qSc_W~TEi8jxZ+a8l(e`UP#*T~xpq$Ws~jyMG*sTnLZ9J_{{w?dv*v%x9I+VG zZ_MC#S9sTMzZLJ1C^zj+3Esfja!)nygatVz_!fIOlA9b|7CAZ1`Br{a4vIg#yslqO zy?7JK)$5~a-2Tgd+efcaRS>c$mT$c*B4^gP=fGA%83#MvySV+lSh_&zvxtw>qmDb= zu3v4T%1u;!TD{@0;NVdsf#}Gg@HI}7syUdius{fkhL4H-w1+T?@_mwA$1wye+jl&zZ>gr3|fTUfAYPO1E`gjxLMb>SqO*c4B)=S!^ z|6Tsgr`%*5FdPVdqqWRIjxV;Gt&eAf% z>z>P8CzsT`ewJKvI4xC^eb6H85u>>LtC*q1>uZO{w@`#09U`B`UpVYka>Bv!Zou>% z!|2E(clnGnLXuZsJazKnv(-}hJIH<`cZ#eCV-ngqU$6>EwGFbHSfh41Y(jKi3*!wZ zRb4w)HONI0syRx{N>||aaFMPEIuTjZo>`nnsegR>@#HLrj#Y5ZAFQzSOWVI~2Mq4_ zy{WjHl)$FJ*)k*;r0Mf;?0QT5^xQC_nf1^SEl5St+qm9nU5b3)MB|>4mt$!gYW-`^ z_BZ>A3X#?c>UC}~BNy0IidS*?i8-y9%*87l5`NF7=71muc?THQ_l)=o<5vbh-f!e& zjFDgO-E@!L)b~ka+Fhgk7_JfP2Rw~syxr6dxf#jzF^8qd5+-_Q-^pCSYQ(L~DcqeC zD^_=KxJ4?9vPa5|`LWQcNyd8TpTbk;)zkFva$g>jqg94XU2mVcg z%D;ybotO%q8Wg8?aK7EjgECIpvdP7vqR`G~UPk4?w^aBrrhSwnQ7cb#D;zN$UzL_) zhrgw35}WlQ=Niq{H+(S2wD8k3#}*?$Kkse#TZE_nz!zM__%AV+^gCbVSPi}!h?8xs zQqss+yM2xk)H!Ec*tMprX4i^nA)SaRyqf`P^cF^Nzp-3u(y5v~C~L0X(R0nS7=6R6 zBM*a1*$x$rdmrl5|MuBCh^6pH(5mNaJH;d|{=gwzK=>~lVn7XH>9K$}Zs7p|pu!m; zR3NY--0`$|mG9hskM^w;-Z@Q+#w5!d%X9qe zi48gIS34=?zb(jaPt0LH))oQ&oc)$66?fBPzpLi6s=eZ+U$H0^a}dO2!+QQ5N>KGBz_lk)%jt}z-@73cb6$@1qAir8BrLJa- z9G4tDSHq{@nrUyN@^$TYhC)F#;dRT^6Fa}^$?rGp_0Q3FZIw*Ca!SXO=ozx@minYp zbLhVNkcMfutm}dHi&+k`>B7`Vf3b9KT!UCtE5B+KmM>{4ME0PqflRqSU>dmg_Fqhc z!To+-l6O~lXrsB`_X}9RV0phk@HCf+&1X-oCeFA!&{?G1d1;}~^#JF_4n-%^dwFsoXwo(=T$?owAd` z*Z=_x771KlIf=}^o>3bwaREUyNE!t-9#sy;=UlQ_AcQl*6`pb zy3MQI6IJeR&Vv%8N`(9w3%YIjktg(ybo=W@Vok`#5;Kdl=FfAq#v^6<*Rm+S2xotJ zTWoH8eL?NxYmxN3!Hz5Jc6QO!>$N(B^(-}bDc|A+-{u-$b$>Y~3+?T?6nU0mf0QSM zMecSXPjqTQ&zY#h$q5(#>Ku>B{b*Hd6HPI;vU<8Qz^Q#*PhWg2FLtCu*xQnKzuLCp zoZXlkyM@=1oezvZ$CylZ0J5Ep&zrTJA82m2+cc=3I^-qw^7K;;F7%Z5)f6N5=~OxM z_>b&cn_1bae)J{8J_vrH5M%xHgW=|n9j@oa_%GiUxBqcS&D|iwxy;dgJv*ct_Yiq$_!7jg`f}0N<{_65S{q5^_Rwb6R!hbO6|Cq^}`r0#? z1%6#my2sCwFqXJj_g^TQBaoW&)n-MsG7eJ2U*{?W|(I)vOs z@c=bzO;^VJQsz`T#gszxQ8e-NpwJLVxZX~tFzBw#nz#}Q1!ryG|K}5^*=tgKsLZkLzy++QCAMXf z{T~cVrUWpJ0->=u415vgwLq4L1*_?UYbjR;4Vtq%6<%Cpo@dxCmx#5PMOi@v6zcy1 z5dT{`Snxd`2V4_JKtakNKOkTU2ofFz5kcyUA>tt{NHt-=13uw?cs!PXo^Qdf1mph= z5R3g-Fct=w#vk1KAOfBM;qib7 z0Sgg<9}<-T11Rtew{Sle0Jzd3g848_k}?Uj^EkL=3WFsg;1*^A777Le8q1uE2ZGPj z0Asx3zV6&g3 z<{toq^CU1pVlWL4a|JkuIfC6_(OioyFd1Tz5hev35exzaBba^I4}Q{zN5M#@GXYBQ z`%fw`Qz#UI*|$J|L?A(n06W6G55Ru#J1}((`~vogCBXCt*e4c&=_?C90sF&Jfcav+ z0~)YzECN$<6dvdu@Cy6DAAqC`><9Y=2>VN6(I*yLSSi5n2xbdEF9D{l=lkI?KLPd& z*s5@A^E2ix%^4SBF0c~w&UHSX0&UK}fe_2A$e7HBVPIS)9*)Zx<{c_xJ|qKUGdq}J z8?$hdFrzVg;WBqVfMb|f&kGS8!#qzA^T8X!%&++?hAoCL_(onA_`&?tU;RrW_b=p< zQ}q{eiM+p%OA|jbyaDDVfDc(k4_BJ64=_9v^=k@q%)chvKM&8}atkz;w0Ii)Be}pT z0o5xqKYx8NFSUQ>7a_)FJZvCU$43gqoo(>U*z+v6Y1U&GxsA`umAm~FTS7dyS|jyR zcVL>9+~xa}!sF(f6hnILU+&)Q#w%!g)9twtF(NixzxK^Ul@zydX?1nB>1vG)E7+c- z9*xpzEjljxYIt{=N?y$^oy?|JNBZL0y46Dm&kor<9~yAVPTINeGY@iRMa-y`$Un1~ zrR4-IPhW6$q9LS#t0R1(GjIM);2#eBy5;v-az+KvsZIzGS5OELp%?x@0LBA%b%K84 zV6(%25bYO^08IZoP8p6$%W){Msh8u>U?ctmhX-yA|NUA+8BGN4y&OjZ;{J|9Vc?`_ z84d>u*2{5NaQZF7VMy?%`+cr51_#{!cN{?(91hEI1aLqt$ARCQEXNT^An+|4harJn zYZ(rU0*B*r91a{t%W=ves4m0d(BLFkj)N1IMl4g;AS&>|`R{fVI)mwz%6OtO MLRwnKNEh+{08DJZ2mk;8 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/single_date.pdf b/lib/matplotlib/tests/baseline_images/test_axes/single_date.pdf new file mode 100644 index 0000000000000000000000000000000000000000..92537d977d99a6179f6d61750615a142f11fab30 GIT binary patch literal 10203 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/single_point.pdf b/lib/matplotlib/tests/baseline_images/test_axes/single_point.pdf new file mode 100644 index 0000000000000000000000000000000000000000..454494789a286fad6d668c5525e10a0447384d08 GIT binary patch literal 7011 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 Lu-WeZ9;|-@;O0iK literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_dates/RRuleLocator_bounds.pdf b/lib/matplotlib/tests/baseline_images/test_dates/RRuleLocator_bounds.pdf new file mode 100644 index 0000000000000000000000000000000000000000..dc23e9324ad50ca5f42836b2cb77fb78f5439590 GIT binary patch literal 6798 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_dates/date_axhline.pdf b/lib/matplotlib/tests/baseline_images/test_dates/date_axhline.pdf new file mode 100644 index 0000000000000000000000000000000000000000..a96a7e4017ad77a6380bde4ebe428e3fbcbcc770 GIT binary patch literal 8878 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 X=hPD@3>Mq-)j`Nd$jKR7n;`xR@d|F5 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_dates/date_axhspan.pdf b/lib/matplotlib/tests/baseline_images/test_dates/date_axhspan.pdf new file mode 100644 index 0000000000000000000000000000000000000000..2af0cfc877a331e266f2afbfc2de8c4219a93727 GIT binary patch literal 7008 zcmb_h2|UzW`&UQ}$r2)UeN~@BR*K%)?N+E5yE#7l}Lniv)f1mgBj?eQsGv_?#InVMv&pGFz?_uvamtsmI z=^txC3eS@$2#N?pB1sk&2-#;vG!G%$am1V`VK_qe;DqyH5h`HtLaeMvJV7XA#H1$J ziFh0_UnsEWhj;$~Os0%0K3_3!iVn8pcwcx-|5FPnZz*vOr7zH%8=W&Ih zU=3HEAY2@QP+;(gV8)6;=$4TZ_NQi62$~R;v~G(k-F-JxIOXM(owf6m3L^`iEm$_& zp~_{M5h3SBDl@(QlJ2e8F#+?_Pi8%7fgt zRSUWo?L3XG3(K+}6W&8tR35WF-*{?=b%|h=C@BNEA;hEocGtXuAk&yE_pMn zZ;y1TBDE1KG{4oK0^0(+qIU8K9^PZ^1FjqrXKOspT|p~rG)tT#O#lw z9Dh?+zr!&suca~Sq8`^wrXk7qf%(ghptf^ol$>6ghc}wNRf*0gpUZExc-b2Gw19eH zV?{t$*@lOWn+mB_7xG&zU$zE4EjYv5Y;`tg&6Aw>i!(irA8EaKB7f=elio{?=-o)4 z)a-lz!yfjvg&o4*c4XCrn@5ExUZvOX>^!)^zj#U7eYXVLhBAyZ^TMZ<3OaeSw^+_7 za(XFxvhM5z(=9>qX-(HJ**F)ka;(?Zpy~#9t<16=2r}Li6n_;Aq-tA6282&`&E1YF zIAT_~AEogxQtUoU?uUK`%AS42EH@-e)|IaOq`bhhqDjv0ebMbZd(6RD!<2VE;XbZO zDaNTUxL@9;7N?(fxOnG)_Jvmg8!K{3c((dcg-)iu?IDq-?F;Hwigs75Z!DX(D5wkj z?Taj$f8rS2_Jd#Xi5>`em%o2=8vEz0XR}?j&nRYBo=$(Zd)1Xm3|hWI+*X&%6Pq7I zEF#^GjvFv9b81+QTWIa`>8R7%uH~uG-ao_r;D#3qT31>a%?M0F9W~Y3yzg0WD+xUQ zX0h!D(nHx+2zR+$uf&Zp1K^Ht|v>L0HbOt4h@{jq=7D)X$O z7drcxuU2$URIlEe^=?JxvxLuMqTa@ue?q?KFL_6=y|d@is%&v_WY?wRDTXGe=33jDk{8vwtgh2ijVeY^(Zf9{dOArs^2 zv(zoq=NF607`_`@cKGeO7Orogt!hZsUelCiGr*O;1g$RP)%kDs#foU$))(D+a0p1s{Z16551)Tbz~2UeN-y<5lPf3Nnab#7jD0m)F!sZl9qdZ!@LF!WsalSV zm+$uN(TR3MH`e{^>XtXK)SBxy=U4eha`KDD@4aQ6=Rpt5IOd*Mdt$4z)j6boTt`=0 ze1hA9XoG_t`DwlnZ&)a5mJQtM+wm{tm#w!p&&u%1u{y+w|5I=5!1a%+f%AGd>ot?J ziu8rwQC#}?`zMdkSl{SPc*Fyxp$fYk)2w&zOt;-MLuiem?1} znHuKZ!b#g8m#s7>&AVsZ-rQjPtfSY~1Fv#V36{jIZBO(reBY}u+dV!$#`5+}?RVeN z3*MuCWTUda)r-B=Mhyf~w)^5tcMto!1LDNmfhC1?%4OwlW79Pq*1f|cUC^$xn8s2M z<2@O_lrKaB7609J@WvO++4Vr${iHLp>x+A0*4H|J{1B5UQ}{V?T=S$_-I@O1(GXr? zendkI++w7$hI`zc2vW&~aFS;J>o) zlYTe7R5VlZc%1&L8(B!UNq5fP;-Y(xT7#o?3>GJAGJ>D;x9Z^H$LsP;Gi}#a>A&8) zGA`-)AMV--k=mkoIaRys!4o3SYqI@IEq>kMHl}r8b!FGwwwzsWZ)8vHpSr*EwRwr) zv0-HV%zGjYtgeK1ZOV9chv^n89P*-DOCBzNKvSy=Q*_%s=7ih4Ey^;%GZ!yPes#j0 z4a zYCJ#WaWd+0w-Mr3cPuqW9I|oZZW-f03MZ!T$#3{=LrUhZqtj}8wj6pLP!W{Q@dyZL zluHP^tJ2W2bE_(~^PYChBGskyEMMe$Vy8W|C$Ym<_B3N&Z|?!Iwbjix?80ko4TER3 zJMVcGt@k*)(MFN-F6QKJ_o&`I#=bjW%bVXABU|>lW!Ki4q`&5D32c1jYWVsd|A?;o z@js@Ad|p2<%4J{RHIoevlk+bcjbB}FqaL%;zp6Jh*M52Fn1_1m4~@iE_9TNOVd?gaTetF4H0t6L^M9}5 zPODp<{qgTlV@zdow7(Nj_!Rh&fMPV}H&~zR$=W4rGydi?jYQkn``tx1clHjvAl(?V zKFtm>n;YYC)m>$`Nz0q+g{6ShK+rD z2%ocF`=#tWE{TyCli+%_p)*b!mrJT&>K^8SnP|mazasA)_o#YrrF-5M#m>N*iPh&+ zAM&Og+Lw8CONt(QhS&U@4ub-!%?`QTLeJc-x>c)R+|)b3S*RDO^fAz-u|8J)jtgz%I}ZHe3m-VbzDX9I7hmZw>fR-n9T0C3eNka{C>xi=hGWzocDgXJ88=Jn^!Cj zZ}VsGPC6^UmaN21KbQKpcl>jcak;4a+VfR^&a*C=h4Q0cd+%6!{9hsI$`*4p{Yy-4 z9oI4Tsb09!oPJJ0UKCSu_lR!RH>*yUZ`6xQR?Ttm)KlRhG>6`r zb<_{LsI{{pGVS(&c2L7?(zu0-e)`oh+F-pi^KED@>Au(L`*-`451)3}w{;`0l-FCCx3E=fL8WIb-Vpr9AYha!S~H%ffG->eLg-Y40r1FR0tHa;9ky_s3J8?P7+^k>$zrlVE9rwRVGNZ)f-O`68U=|C z_8Xjw1H&aU054dV_)et(M=%M(87!h@0bJ8TKb?XB110Oyz`8gF90TrYa0~}66F3XD z1YwYmPB;O!aD5_Z(1Ab);84O@IG95?Wk@;L5=et9(cljhx(KQbO@l2UA|7x#36b!@ zn0*x``2rM_h`@lwU>Xj!0-8gOAPk1WHPnKTk%kl@B+wXu3A_lQ`Va?S${;2n9;6BCMf?Ub zAU1}GupGsK-+`_W1K%MQ6T}bV0vr<3G=zzv7CHsQokXGR#J&l$`!+6rS6Brolu;khV{K58yX1=)WD9|iosWn>?Xg^se9 zMrV!EnTCN)GeRED!bj;xfp>xtd=whkyd(RVjM058`Y2s63O-5~;J#71U^EDR_!;&K zhJyoWWFK?1PpMR}fk*IB0WL=N(NO6aiA5ZK6i-C_FU(mG2KJa_S9uAA5R}B$^X4al Y{W@5*;)uiq0zrB}N&5N@?vAAY0E2FIbpQYW literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_dates/date_axvline.pdf b/lib/matplotlib/tests/baseline_images/test_dates/date_axvline.pdf new file mode 100644 index 0000000000000000000000000000000000000000..33ab237e4a288d36201150040c87750a6ab8d1c5 GIT binary patch literal 6570 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_dates/date_empty.pdf b/lib/matplotlib/tests/baseline_images/test_dates/date_empty.pdf new file mode 100644 index 0000000000000000000000000000000000000000..23f04453c6715161c09aa1cccf374a8a9382a285 GIT binary patch literal 7004 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_image/image_interps.pdf b/lib/matplotlib/tests/baseline_images/test_image/image_interps.pdf new file mode 100644 index 0000000000000000000000000000000000000000..848e15fe909994c0c16eee9dcd54bdce6de09735 GIT binary patch literal 116976 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 RC>+chHu^1&4~YQ*=`8M-E$k24FV1xWFTG znWN{**mrou1-(^7-D9J=Kd^Xoqe`PmIA<#9kFw(%>0(xiZ&?Kgs^11IkB+31nR7f3 z7pT3Hag5gDZyaE-IbyoO*6BoP zU+{?CYL)wyNDppB;cZ>FN?Wi@#ym?^bkGqCA7JQRDEweKKAgR@ zrtMyg867Z#1#xBK?0Hqf!~)F8-(&==NmBgS#w7>Nxk^l{P<4`dJIT#y1djWdPClfO z$#?g$Hdtvv&NHoa3Wa~5Sw4%aQKysdQ^h@NPl9yXLh9ZLR=Qlcehmkbnk_<5BL^C2 zXn@FQXh46aM2O(qq#6ySr5sR?6-0?t_ZAS0To#w!1$J0nkGETrf4HO~LR0>NTv|gG zlf>fB@PVWjpNbcNl46Hwzc+&LuVwQ7m+9I=O0^?yQT3xHfm@!j=RV7fMy`i6YCo9Zp~=@_4{6)dKlr2%@8i>PyN@7*zxsTH^H6tz_-Xo-5rm=5Vns^?Z^m!AhMyGJhbt8E(BQ`Tg3X*VvCoA zf&NHpt3J(pLS>EwvYajLo`5-mx?g6im2InGBkxl&SI|@kb-yOYSW$9_^pLM$;v)7V zhl}?Pf9K$EE}v$LFV)-Zh{zE6f#4y4K@E(vpvM1SNaz0;4H&^zdP=m>qYAG55c`yd zlRhbAW|PiZQR2R+13^w#3s0+8mk&}yHhcs*FmMtOp^=rz$rHvqH}9fjkFccRaLz+U z>*BI71#2vY8<@-uFw4fhbWxess0k32Bf1zi2t-@WF=)+*C9z^l0vSF4YH^wDU6IEY zTUzcA(f)bkM*VtF-oa)A5Eg?f)~Gd^c&#Tz5L#NV5P(|DVj^cAlY)8Nbmh4!`FQ3x zgP1D$vlcfK-fyB|Y3$hUpGNhwehnxswFeXdk#`i~l;C zzG?cK;jpWa^RK@?-6Zp$<~epqctbR|11YTa*NP0$qJhv&?>}J&d+eJ)CnHJ=gK2U_ zwyN*jl^NaR6C=uIuvMTH87m(u)nr2EzryBQnM;HH(2LYC0wh1vEXzxKTRvx{G{*@$ zMyhh2we&;mN%`#t>cM^otW9Pk%FXh*Z}RPz$K(X%iKzU+7~Z`P*)n>)nI%UMjxV-q z`kv{U3#M34MyjZ_JiHyL$Ea$Eq2K-a)qG?x)xnH+=(%e8S$tA12pWnKd67NxNR#%_ zrhiL9Tm(1~yob`{8M8=7@F2jr{;W7s?D-lLT=q%^b*@AzMx_*vm81p+!UlcPH&}*8 zKV!i2d+%$Q95g!!q^r=98!>?wZy6}iU6FBKcTeK!>;B|Ngy=l9q|A!omN4Wd+pvgLS#3??K2+p)xSGKrjK{YgRiaDSsS@$e_C6!2*<(B(=Km#)EB*VeE%}=W*b&u|2b83=J2Y+B?GIsoDucz& z!uBqA3~Yf(yvmk5!ii+$|D@$oHTWI{2hvHkW>e)PtPBV1PMa7dS@~pRsk8_+y)nNT z?v~xMDzH8i-C-$x-RZ{=%vgNiE1 zHjE|LZWt5S#&J)T{1#keN`mo(;)FUYP=d1>7;Ur zQyL^U3tWOn<~HJj{HpvzAT{JZP=hAdgNR;s=E4}tWO~7di7NQ1lBLwp%3MD@vnFT| z4H|=Z86z@(B&n@fu)TWp&?=uQo7!2vH)aCqZI|>-h&@V#Ys_!UaHv z*kKMn$y-xDOF1t>D$KWVtI{R;qkjW*b)*Mw(Y8Fi^5<18C#Ko9y4L*%^;YP_gFwd4>i z{G$ZI7NSqw$1rvVu36pYj);>@3F+{Oe=!{yF(fPJmsROspm2Od?c1y3NNT7MruGgh z6&i^pE+0dEE@Nejy;UT4Z}CAY?C|kKCN8a zGHDTYfZ^E*>a$Tzmg$jEE4P*#4*SNaW>HJXCs2ULl+#0qX0e7;Fk@MglF*cTS4tg{ zbT#D%O!b*iqP;5&F{pGVW8MlxW@aD=fDH-41uzYF7^L5C)xzYdOcOY-_41XGpVFlBab7;JPha zenQ7u<8`?i;gLB=cun@-X9TwMq)_@CmCV90zWKnXto}pnY`)Sp#m!Dr2md8}n5p7{ z&Qqjmmuguu@92+_gVnMzrJ01mg-miP!8TZ>AedC*OGRB~x0ji1*t|-PL&Yq=vJG6< z_gu!#7Kx*3L`*E3HV%W~GL`WkwM0*7Fgjs;a3qoe49D5!>WMm(ZkvJg+(ntB2OiRV}{zt@%{yhSZ8~dL@ zpUYP|v&i$N2d|ZsO+@ZN6))-r`K|%iOUw-vw>jL_doeHC2K$wPkC)Fzt%z2L)N78= zi47|MGQn>`(mmtL@skBcT;*)a@3F`n@TCy%TX!AkrPxlLRT^ob`@YQ!;R%69OBqP>5#;)>DJ7$w<6rYSEXN2d9sLp2$n9xlXk{GD}pEMj6b0QPjaN`&kFHhvXbO| z-;x`d24oAc3T`vh*OQS0S=jU;^SlXdOiIWb#>E7xBb4u=LR?*YIf<_U@ zESptnNhO7Mg3H%<+EH*PJ)yn7La>8hmD+9x&HPS@EsmRb7z8c_(ba*d@(4vVA(WVL zZcK5`N=X6}c=Rr~ZA7AzRGF+|e(h>>R2k%D6Dsz4P(uP~JXE#VchXo6O7D=c-Zrl( z9>}(s3S(v>$kr};w(ccPu98eRt4ri_8GgY2o|Mrf`Sr3Jmct$q9b3%Z zc*~`3wlWVWO;Na~SgQ}z-I}7M8n(g@FHCDud=ZVO(yRBMrCHZgX47d8aaJd^qpcJ> ztJ>yjK!o0cSUxB;4xa`Y1LA3%&|{ew5c5;G`fvFKNdkAc2^hYR^|M7*#D^$Ey=8pN zLWxGYE+k0T={Jcz0Mi@V_3Wv@`NVcjA{P_2-;#rW^7NBhh8lS~sUewC5=SDVF>j(0 zO`4QB1qFJkv>G4i_sUl_|=(MymsthE1q#X={!XSwf<}@$@Hqf^0tkhtuNKkf@PW|AfP@_6_X-5flF!6%m1MPS8n(EJr<3P zEw3#S2jHq0BLR?+@ORG5<=V~0kVlL2UXFEPk;v1qF4y>2q;cB)qr@ek{<0uax+zY|$KPq^Y;eK^#2jTK7WtiYiO$m z$7C#=YlqP4FM>VYv3Oa2xnk*>4hHJKd3<9zjx3vok&Yck!X$@x2qc2w_U0)%M-~He zODvMOkp0kGkZwnqv`hL;VaSB!i6|wb`%2#w8K$Dr5u9ULGcs+AIBRs&Th)FovJmH) zJyi-$ammUlX%WH(`9Cx;ku+S=9zU~IGCImjh!NXV29yVzYT&vp2saYspHS zYw~y-!s^TocWcZocL#o!vR)L`WGzRH)j4*gW-Ym7t;i_eEhKylu8ow23V-%o`4C=t zKxek3c#c({e_rC`6P)blrZv^raagrIDmka#)a<;n+*OME-Xu2p%mgP}4D*8jy%YH$ z*(IVSg2h@8^o&^?y|b;&c8uKz?NqUPkneh(6PjO$5OcD;-dlAc#rV^&B^gD{al4cGShOt({4PrIhVmGp6JFJ>O*p&Nny!1^TDd;hg zOOW<UwU$X1pyzn2I@qpp$kK8^F$&n%=qc6>S1vcWg6W#>-6qO z$viW(K42DWSW<-JL_Ar0m0udfE*H2&RN6|D2=*Ejr^F`C%n;N7?&X?d==~-SjhW}R z*VaVHN%JHnuX3)O%jS@~LNq|p1c~L=T}9>D>H>;vB{>PD2XHd<0|g9rMX@t6n`}in z+4+18NxuzRW~l!TTCOWNSif{1q;}IGkLuzYQ<4|)Hf^xbe{oPtZf`$maW$JMcf6?B zzo4r#Ui?vi>PlZCx&5kc^wMYK6lfBSwp1umrwor^OB?c9UCU}>6CeHTL)+R*AA7fd z#AUfr!)bf%{$!Q$_O(+0rn?I=`2^ey8(xMw?{DIK*9U`r0zUaUu|FWdUE(Rp>I=94 zC3qDR`iEE?@4m&}R#vL_UspN$DmeO7Kpch_Is7#`dJ97eA*JP>UVueW;3c*x?&QIh9z>r&5&d!cf6`_W%gFzblg6od96IP{%L)Iu{nop!P%5t3M z=&`^DVB&*zql)T{bW`bUD_41$$%A491M?95L_mkG?wt`sVW(H=$732IsRKg#3UpEX z=`yBrKf&k$dC%Nxyxr)=YJr2U`sn8k^BdOK$FUYChPYybA7^l(h=BAHhjPDU5vz4r z6IT8jWM;-4ySJgcy+f%Rqq7v-A(&g-Q@ks>y%1Gujk2}=?6xVu$FaU{If;ZLiKUJt|)7%5O>m9;RhQ?XWj8s}ggsLU42I<7YOS779K z_urH*V`eVT5}mjO&K85Hov4-$`TQ+fTSDs?O;Fsex^_CtjAigiUPm3ZaW9+WKQPZW zyO9su5u0PgIfK#%)G#OhaBZcpsz)X0YRLR=b+o7s@8ls^AL|zk2AcJS4i&7USmsRB zQC_SuF-v485Uy+^NYK%ouv%;hCYS`HXUaY~)RztDrYkTF3c%mwN!J)s;ZQz^t5x2Q zt*haTa*U>L(9e%D+r|wmQ6H^LtF0$vGvN(Wq)8<7W>8N0E>J)DZa6WI0>0MU+gm|2 zKgxXx25hpe1uc{8u}t%4Yi+lx>P!q_X;`K)o3cohaD5s%#WZ935`>ebo;ogcnI+9K z#rnLz#_k9lpbDUFfOtgum!xc4<2vC6`hNDF6Q1V!mkE zATGm}-vv$!OLrZ@*98|-@Y?A~@jB`4F7WBo@o2N~=pGqp#JSF7mES~#j;&dHMV(1- zhWrRkI76yln-yM2X>*qn|3kfoHrv*?g|zOY_XCHoMJu~9*`xy3WbLC@awGD}+7If5 zy!-`MFAZ~44-M`KTI$mVe~l@DBadP3+o%_wK9;W-M@J=}Zjo+T_~ob$Su3M{Zjq`X zepR2S(1}Y^d{PI63KKu8VOGc{UKEqczD+=aNHX%f(7ZH>D8nDbTrJ=V@$Uvq-VBS|(8 zR{t01Dc4|Ll_fA$H)25G47_%j_MxhxiLbp$ba5ACRX$7PB^VcnMm6J;$$&9Tk zG3CiBVrb+^jjcQ-G*k8tx=G`4zIQ7%>3$Mzb#oy8j3t`!#O;9n8K<*Vqh@HGlITL2+jY&J$y2zboGVu52V<%}QK2&={)zA6Tns zUXVugl~qZv!bViFRXAG577KOj3zJgmn^rC(GAU7ivt+#C0o|gmF@SIF;b={O$kCwULIitJrb6)}X@e~Mc{p}@ zwj2|wEW@TK6xvur6BuO5%2DzJ>dI=2H5?8AY&QD}1_81!Y>~DFBnYD#uf(c?SNR-| z+6!I=6xKL5#%6q=pjs$TWf9jD(Juu@v;EKYJnJE1a_$x%egn-qFtXk!eq?jXvnj~@ zE?@v$?9Q14PEHcflNe}a9g1vM8BUa}PGe=G$`G73>_(kq*3VfPCL5Pa4N>{!FKt*) zd4T;-*@8bUms8i_o=Q560GU6txdTnWr&FYM*u6aNO4;L`AAP{?D&*sM0Y#@MxWC8w z0j{&^FNIztNqj%4F`PsLC@scLnw^9+c%74AzI(dBnECG(yYvIJ{B_%_C>+h+f96rQtn+ME>WcASQa5w; zXi^c2!9A1=4h&`PWpkG|G0LBZ%ycY}`I&V4X zz>ujO0Y?HM8o5$^9EnoPik^aAg#eCHP25*JdTX9!4m@HwX2wL4bu5Y$$x#y&B!H^S zWL{j7(NYAVew+tv;k3gS3@QEK$;+beCylP3LplxIHu{p_N=n zQyWY6THbG8zciwZAR}$IoBAR+d9UW$IQZ&K0;Bu2dLXMe-#N0{BfZecn@M5av5I}{ zV*2SjR&n$usivG+ zrRIV>5=ONBv^%g1jn0}*82IA)?y6%#4=bQwUt_!wXl3UH@I+~d@kD4y@yeNpz;VM3 zSC@Kzs^W2YSYy=qHQEtXFLfDO&zjmIXCe}t?J8Z*NpoMY3ml~;B-*13JbyN=1|YUa zG;T4iBk{G&Yzh5-(;|Kv*Ne(w5sl%?=s0Pu>df2luwdPAvEbZz z-$s1i(MWLK#mkQWBMbBXy@nC~dKLwlEYexl*Y}C^UA#m^?Yty3Kgcjr-rvMlzrTrb ze(#G~-6;{}yY9Xnw9W(3Sl3+S>gk+)V8{JH`$vcBK{CL$MQxfv>(+K8EuBMYPj>{G zj$w>7^od(J6V5oY;#!3Obv%k9y*#FbfVj-^mi@?t2=9ce{nuUY)fg;UJ78?HK@vtVmDSjO zrWsvapOl<*$WAVeb5cBFF{kS2>tICTJ-vfn(E5IU)AtsOlN=|Iymc;k^St3uD=5&a zGKFh&z-Q@xV8Pq0GrpCgvriaaV$Hg#EA04f_}TTFIz^^%9o!kZ@=H3FIgLp2J#+FU zMBj}WemYLY`ZQ0tt@>iO?Dg<&m~opzl7q%moT1>|Du03Ev*~WXL2|HBHT9pGS-`od z#Co@ef0K9h#N#OK?|j2`{&$^`iSFDzF`a2s@7la7UA{w{TCeKbx2Y`fo7(*M(9AVF zIwM4e8nc#$&a#Y#Xxq~_lmhnX%;nC@_xI$uO_fjQ^{=7+pvxM6!Js5EOdWG_EWAc+ zl(FTdmEF$zPT20vM|Cm=l~w|Y zG^JBaQ_C9%!I#FMFN!zsYEwL@>JM96T$N^!Nv&`)k`nDE@1UP2H=$Boq0!+QCAf(* zG8!tOV6B!@<3(cVjHvbiUv7t8ub*Kg-dGR$ini9{rR`l~j9Lwj#Gy)&Zy z$8^!n1b2L30hT-|WeP(rPtkR|cjz(1ch5%bCx0-jkN*_8+E&9?4LHwvY`YKhZCeg& zFFnT5)?wqWSB{>MQ+FM8S_`fFthwKi&Q#UsC2vu!BQ&+$?J4g{ZaeM%$k#eG{!TUQ z>XqM!6u7GHmAwWIeuvtVnuU#@Hz)*5%}W2|jv2K0B}ZC0ah$k4O}qpZMmWQ+GcSFO zGsCL=4$oV;E%x_2GH*Fy5O-c=UK(|t_QpJ5C$fr22N3(AbOJ`LC7(Qwu0;~EhT;~M zcQtf5c_~Yztc+pAK$4UxKfu9Bk>n(2J59~#)j%SkeT}}G`|F`AjF`nnK<^qcgXLnP zg6cyg=QOdVBb_akFZy@4c+JlPq~sk4Su0$U?Dc6Vvlxr&rtZ}4 zp>VRqH^_ddx_dE#KaH6Q>1(mpBj+Z+9Z5JMnD#>oSUyHMOCI@R2$fjVv%x#` z-fp14TcS0hZIUXJ)DNU^(UNcgPA1gyWOe&3lWQmK_`T3=YreptdEr~?c`6)we4-tS zeL5RbYS-#sgc@~kK$ZL}?b?oAhuJnq-Fi=OsWm+S4J(bGYt67dT156lEpX3EjD|Mj zAVYmC69z%!Dr>vAZM}Mmodb z;V$Xr{5@U;IaghJo@8f)4cSu^^8pHik!vA@mCz-zzq-?4*xJXw6&+<6H!oCr$(dgo z>_o{;0wcw?@E|1Fzt)U~OWz<9=kVu@hYYYBB>xQ3QMPu#xMb91G81&P{-WbO@ zz;Y5I7f6&rZ&NE2&KWKku!O4{>~#i14lu|TiP2jLWEc}y?V&j`Od6{SP{URmHW^dC zO`B3^{Z|#^vd<2rpOKB*)@_shu;Jwh%j%w%pQle~w4oDaKMcc-Ses}(MbD|RL-tqY zH_(MWVy$#NVhc^0VrrkC+PFe17q;IxdiFhTP5B)=hF&^`-rw=haQ<6NTX-x03bR(_ znTqY>PXXbNh1z6xmoyITKk*Jho@R!Yp0w)R?xh4I--nBN}-)U)ET*n6*&)7f`mwMv?!S+gU~c z$WU4Z8RC=C2DfM_QRP=viMWyphTJJUg!-3%k;%Fd=QP6^0Y*leSZ>l6wv|%O@r?ho z2=?z_>Rdg1%L&Z`d8g9f4x&D6zB$CX>j*{QphM2wRGLAgy|-j#><)U&A2i9zRU9zk z<{%W@iX+1?H6Pj4EOfmJ}+)wBW|`P><`bV2``)+P|afROtyGmJv8{7JS0KU3&~&*Xx{<1 z9lIgW%=5=ezVZF&&TIVHh|DAT@62#-)fNx+-*PP;37p)^-aR#=l_^$D>t((AU1r_p zU26V~9_3zr9?@Rq9(`VI9)-uoo95dAn^a4My-P!zy+(Dx{@g}?PEIxH78?axnk|}Y zt?qT(Zoy8NA9#4tbXJ+R2FQq1+9RZuZYG2QI$m{!^*Or@xi6M^`(?RDb-CMYT7lVB zL8=Bazc39VvH@!rd3(%Sw-B}mm(gczk=?fu08w3GHdQLzs7gJ?3aTU=h;oce+$W9U zw=j#PIn_2smO6tU3Zvuo%m!)fecsdjw9NQ+=Fy+u;_IeUjzgvu`Gl$Gd2S0#i_m=8 zve1VLVtSIl#lX=RthUIbiAB}I8yc!&A1bRF8``N-fn9%o!UyfE+?`Db-A3?u_VYKq z>t|mT`9*46Cgnidt7Tknf%Hn_c%#)yw#jg^dUvDbjip3U!BrR#eRir_%5d0SN{;rul_vE zH1rWWvpOfc|mDQ!Ye0=dL#wrN=Che!@9w`oJl#h76`JGC<5%LO04Ha*a^^+7oVN- z*tc8td&qq+DX;K11G~JZt}DNu`Lt&M2^m1D<}gyA;tS#Ew;0N-c4?BV&QF=h*Q_vk+y8F%Jbpp;NjN;;yUER?x)JV z!7BS9MnA*D!{Ds)Th_!c{tea=Z)$8Le*Q za&(4okz2I$eP*Pgrszs;2{VtVDio}IS^e)oJ&o+6bwcXzel~vjH>>^O(j(UPzexX! zmzb{4f(s6kA^#MSudyr3SY9lfjvHA`QRyR_w#bdHh;LJo+x3@^DZtJ|r>uGaad!*l z0PPpl?;!L%W$AgtL2NC(ps$5I4<%|`zr=`*!aUh9UOh+ak$xr-BmGLkZ2-!>!@*Q8 zk4>x7ljooUap{@vV;Ftd_cBu47cg?zpBu;GtOLdqB%@&ql1A%FBq$-rc3&gbJ+!{o zp)7tgXF6U7t?|wl`sCRUxAjnkU3{?S&ii#-lZH>v?;gs;;~L6Ck*Zh5x}!F^{7J*& z%q;(7W%d4B^_G%QU>jKiGt#`7qYL&U%^5=6TNaG;RN8 zI?M1Hx9|Sl=?9;sA%C1miH3W9KdkHLZhj}PqE&ZJ03Wp!=aiNV zch~e7Fe{@aWsFS2puGY9Fr3K9JJ4e_w*hh%R;pVThRz&tCt?vs0jafqAmJr|!xlxX z-zKEvnUD_Y8b_TG^$wMqf}Ndd-p2KO%`MG8FU>vR)VfQrLb%`(%6)*U4P19o|J?Yzmxp4x{0%IZ9M(QCsK9J;3oLBEBMHZ4f&~{q{?)n5mgxsV3 z9Lw##KTn}uB~7u0jgEYna6Addp3>l3|B1bWe*gYuw11@OPj&3(A<0@ak8J2hm=C`s z;(g2RGb#F|3g`Tws8=QpP-VdG=#tRrq_n)(z7gGMY#wn5v;Ci9q94&2v36 zFDBZN{SYm#!43tIlK1$Um7iMjNah(gq>S*e+mCMNEdPH*eT7%l-S;)!9W$g-Lw7gK z&@f0#IDj-rHz-KQP|`3%w{%JgNJ|VzNh4jNNF!jp7KKpadzWdM^ zJ&l(gq?n``3T1s^3(abdu4IrYjfrGns2BA-lq(4yrk|oMWMA|4u4w78@o=u3*r?%u z1wFj?61exeMWQ{TE8r&H_c?!KSF@auXaQ@WU1&521;b_}|^}B>)aaw0NqLU#G zWsr(Aj-+Ia?Q%b9`12u64hHQ~?J)|fWV{SI$@pPFMg&I+DaDR?*j0BJ)`g?D|)Lz(V`vp@s%jl>|N{N}P!!>`dl&Dd9r4*+~6Cf2zA2llIzk8vv{?6GA($Xjlr zKF(lz<$uTL5`TEou2r>qgUt6>E0dkq4j^_~5!_~SS<#wqW!}SDOF?#6+pmp*+OlAd zSBSlAJ~y$>3CT29H}=ja3{rDW{8HuDdz{ZSJknzQM;&(Gb%4D0gQl4E^@d4B20A%n zi9^`{_ruEvwGP__lSB@O5Lto*dHQ+sk5`q>=I9X+^Ua86Qe9F;@&roE^nldIrWMX- zNNs0a`Jz%T4=k@A=WvddHP6k>>@;GSO*EdPYj_uN0q6aDL0A)habDBk;$2hR(wrbN zfShHm804nlP3EwHj1y1@l5$bb2~(K!lYk7|2;%V?$DdQMlVUZOJF~=R;DrZOD`|4m z+()QZ3u$5DmXm8`zsBW(y!K3=c$p@izC_)V`ZC-PJ(^|}swf)gOK11%;2HY)erMOx zH9&Hmm9Jv$c@~;fXL~f*NcCF;{FA3F>X=Gtno4TtNQJf-AIyWA5Gx@#D;H!JRhMha zGED{W4xUd8obrr$o`jJMi%%U&F{7(U2t6cnO!70`Rdtj zm9fpWPIUt6zMMu3FTMGWyI-@c;zGX@)3<)Cls!DC_Uyg1u+_d?jgxJUFYCnWNH-6| zemqJYb_E_)x3zZ`7BP9w*=$0u-;P&ZKL>Verl|V z{vg&=`cNJLr z{?2Y*nGPwY^>URfaDmQqCr{@e2d0U+aY^eaev@{Re$$>oy!Bhs%V71TR$y0XqF0PN zpdnJS1rE!QOh2g~#Pd)9VW&(c1#7ScZD)_ zSuhPfs?|#z60baDK$*zTP?^BXz)MS(EXY)v zz{6C>Lr3H4cm=Yi!`PAdy?c4j<$MoHhs{Z8&2!Q35qzk0ep%&M`?A92Wu?P)NXaqg zoC)GXcn-2?fG-`~9Ys>jI2KZI&!ZDW*d6Jn3rx*uxHlO4K1S@a>uD^YYlX+X2lb16B(n_}wcLUR8%8z&-bV#i;x@rq}by^`yVs#AYYbUd zZD>LFc7pUIVW#WKC!TGsd2R(>#BFKsw%S*aYxSm&ep~SD6Pt7S|z1elO>g zd#I#M*e5qho_yqzt+>b^Jomh18QeNn@;a?-Ww5IJi5W&=^$Vbxq7ULn`AexHK~_1} zGu{hdQY*~>%+G^vrlbPrCY>{ZToVT)Dq;oMLWK<>JGo4Sv=GW z!(I+pI=CY3W5dtQwc~jNZ5^BSC#X1+X}k$Lc!@_V;z>-^(g$rIG>j8OvFfd?5E6!@ z3j=QmQNh}uTnjS0wp=Z zOrI~`KLoq3p{5DfvWC%;>m2P+kyGY|6gpnlVugYEE6D2Mp zFYHs26OHv4fr{>_g%bS2-Ze#yJ`F`x)heG(4v?Rxy_;`5+G_aH1L0VjBbgKbwh>33~b7~s> z&aBYJwFI}Dqwh`WJ>_1y{RQ?Ib$b6Ti}k&r5+$wXX8IsbhNrO_q=)qVAMYCK_Yz#= zkB)Kfs#JUzXpm6_F$evBCB?a9iIZ0uYG<0 zAH>m?R`I4@-UU|&%47kQYjb9rW&7xOLnC0Xdqi)+A}tYl$9p&${5C>C!xtB*ucWb` z;Mm%|;^CYPeMe^1z@=PnjHSAqag4^WU(X!bU_NfyDq*QirbYD{rwhV%hq;H~2+_N!_;Imo z5OF1t@X)S*A4@YrWKG;?7u{$)!m+xVQ}bJtO%(Jkj9=CK4?YtmS~;>uA%{cO`k$bu z^!Fa!>i+~iIBVEXN;mdsR&k%S7HpBMf~QNrZ!xX?CrDVu5^R~;qFPlIEKA-ZLbsz! zulH7!`u}gt&ES>stM4B03~kPtwMF)mba_K!{lOi#1x+v?Z(n{SAN%NV6C3BubKi7D z`Ru|h=)>Ol!$>5yGk#)tnbz81)ziXvg2LWx0+%M!<-vt#`BR}^hGEN0IqC-!j%Bec z9&XuNR(g(9&uT#PIGz_CH4||QP?2-o&(B*9zS}E_YrP!$HLGeof;EF< z%!B(hMT6Fmf+23AV(X&04obws$ez_QGdF7pe_@o=DHtq|Sr$2!9f) z99KKhDg53!e29K38(FL?hzH`!z8e{Iv=)6x=%j-mXQX4kHmQg-?bVeQ6av)?9c#Wx z93eJ>@z1HkNUDn;YK_zA5@}`x*kh>d(x9)g%sJqGxGNC0BP^e2oHO<@laap|7vh^` zoj)!mHcQNmi|?{&M&I_as?82A@qay8`o>oxogPxn3#aIti4HS(anq%%VGo9q>{HLPx5$uV&>b+t0LhLPL%-jS+SdW`9f1X1T*WyW zW4RGiB=lFmoT%0rzJxs+AR3xlQ)AT4LhJq!p*ooR*%+J@L%Ya5`Dp8_GU*TozH%7K{C-^&q8qV3)NBZ=7Z#n*Il09+#_@wm` zrcNy8AXY|v9l7QV>Wca{X4!_dt};2Rl)b4jIfmUvv)l^WVzu~nc02NBne8lBAmk#i zsefSWr%T`2)x7-0H+IB{z1JV%IC-ugPT0UGKIbB}_2_oQsqCAl!YccO7Gr(`#Nx#B z@qroR#y>`@6*)kw;L$ zs`6U+df$O}?&0FHmZtm~gg6d8&PL!sy;-$kooFYW9h2;dVfZkeZ5Tz9sL0+c!0*t$ zE9L|U?pz0MT3u?W5gjXS+F7HnRa8@B9c^5s&=f>pYYd2d{*>XD3^COoD|IZBqO2$k zzCU5uw32se9|Ba9csUQn*NhL{IYz~2{lpjCer=LTNd0ks+g0CokTS37_l-PdsyUH@}?Cw z1KlA~45#B9{HDd%6guL~}BwPmN zFbVz|5;fuqdu~2@26j?7k7M(m1YKPMA6t|eYoZhOE-{KqS&^=I+zuZ6y8@(Muf`%_2dtF0k;^3h?jH7Sj5 zUe#`8LEl++eW4DoBUf6%h4;58> zUfi}P1kPz#T9-kr@#2KLky>R9HZaX0GhGGZ`o~dU#ckd_Z#&pH@)A$@+!T*Y zdux%P%Fed=qIBl$trYS|YN)gpWy?FDuZx>lPZv4i?_lr6#Pc~T9L({E=ERDegRodr zf~AB4M1))XArc@e2?n*do*z z|0st9Vm|9oNpX1rO01p)x<@xl^w90p-&1kXWx-9%si@0t_T$LzFM7L#476ca!!)A4 zwnRg@NID*z@d=#TK7O(}+(@AWY#u@DOdNuu48yRD4>|YEqFF*ep}UvnT~|^E0wx%Z zACSR+-ckLI3Dz_@`ebtYbbW@g`l zihS&FNOgz!iyp>nyuUZ+5DaHVd@NFM{d0aoJOO(sfs1;Ho1Zf^k{*{DGsm>Tn| z#*44|9E_CaweXi3v8@a=0>|@Bn8wWy-cAyP>B&!i4oq?i6Il&MSE!g zBK^TpzXw=A`qUKC!Ys;Myx5a=5r61_F~cKlA_Mtfawt5_0ZGK1oW{j*4-mS3JK)4m zF@T_n!UxsdPeOQAr&Oac>~Qa(1p+&nk(o|oMD7z4j!L6%6)8+wNeir}kt`73LRa!> zLc+O~0OK8c!u#|fi;Us?7j~!R{S$2YO$R}IoNBV_?{GApRT^sK0$>cjxi1O>G&81| zGm$387_Z62cXb?W8&TatrY2QK+5j8>%XE`SVK_Xa7-R8_6L&&g?-YUeC+(U zM&hZ89ZEtf$hpQNc^fAPA;Z(-*K$!|G?<8TIm7aet$tqUG)?rWfG?*|;Zv5vtCDZ@ zr))v@w#V~1nN@;01g8Dvd?OhR+G^B|B_~kUOAfnFv>5opn0we7Jmk{*3aop)(@-)g zt1$ptZ{(4mDl?rmLC4o6ay&=ZA-*M8;Zr8_hUP`4hUi&&y1KR%j7{P4jH&SYdqH)2zB6`_C|$$inc3U6XMhH97{ zJwj057ea==87kTb5I_FL`3%!uWJ|%Z=uEKHI`vS(v-T3n=qVD1bB(S05T|Zo_Xw$7 znb1`^_rg`vqyN&WE8&nuYOoa*yp153w4tN&^F4sP;}_=&NAoV zZD~n4nY_to+VtDHAm1VSB6M#6iHj%zgm7J`&v=hvd9*+@W z_){5_M1Tt}!B!@qL|q?7M#U>P6j5M6IKmnlx2i6`GxAIAK&Da z^=fVK8}<{YAE!gtVncE$%kSs{EF0PHc3{=B%K9vDGUGHh=z8GP(7zcy=sL7KiX z?eT#G-<6-uX|;wqV?BN`?96_Mtg*oE+P+#>Mtex+$iz<%^9^R8Ok&ll{01fV;U}QT z(D9(@l3eKxooW1IP15l7~6<;;5u|=IS!)7Dj3g{WjGOqTeUM8xeqf z?#b7-*1o>4z{s{LMArr&Ktgv7M1>t-u{^7~@`WR6byWOmJ1+tSs7!Ob{NPo*<1U6@ zdj$y8yyWyX3*HqLETOkjs_6-U244qt;k?H@+Rqr&siN_=vJ1l0bN`1~i?7SFlzjWv zSDlS+7Su#n-yT=Gm1eDDC`e5NJs4W$dnZK+FQ)Mvj7oc}+2tpy`wBw0xu>)E=#FF8 zFEunDK_7{&XG}7mf=DhW=nn)O$S)~lMf=QE5A>C6;;m!1K2@B|;fZ0wY6Nj{BEb>k z-5jj(TK0HEgxX&6QW(Q75ZkUlEb71wC7LVhQopp{gUZ&d5TM{SAvrq)PEj3*b}!~o z6^<}$jK>&!e5a+r9_p_c9f;lnq=WXy#eXCl=sWANA>JShY^V*-;j^RT8t;T1zZJWu zBL4Xf2pJja{OdCnxt}1)&qbXhmpcy_U(NGOvt&5}E1?a6QJ-vA|Kx;H!d>c9hqr#T zJiW3;*gisL8)|2jxUi~V-|$sGNPh-8yjkG?EYH_nperG#Ec>p&rPQspDa#e*;5O@? z&EViR=kAuNc0Uu@l86 zg|K{J3ZFxvLZiGdIGmmFY5|1%r=$eF=fqIt`bcsE_VG9ti0>;lod&Fm-or}@$WBo2 z;%2u*K(?MrNBRoU2?h(_4bkb@ymk7bFSJ)67kz2t6Ye?vJeBlUXC3&D;XyG5kKJ>Y zEV9T>aYqbbevJ+#B-g(3L%J%*4S5#TJDb6tmd47zd(`#JJ9<_GtRcUu>wJhx`z{f z1~9*A*{W$nrro!`XtDLLo9J%q6`n#$DLztD|EoX5>%pvo-g|$D;W}&|r7|imyM5iK zwgKjI=7|ELEs&?5&BNx#7cF2<+9Z|If;FvGZ7qB*Xhv5bw*t0`r`g1JtPvwDb_Vp6 z3=Y8lVXqpY!GMD6x?%yColR?uF43Dr$0!elC4I9h`v%aW_)J}UllHiUiM6?TMMj0t zvmm(4wXjg3a98?aywfMXPcUVmPGPoSmV6AS?1Z|LhBTrC%Rq`bwqNhT!^buB8}JhiucTVrj3^CtP3V;F2Z!Kf zC=cI0-BIQM>I`2QmcCNcGBEt~Rud!}NpScwT$nYMxT5=GGSlpSql_ibdAa++E9KRrfaa+67s~}u#n}fqE1*S0&(X?clleF}_;ke;zgP$gi z)a@FV6{n!V{k}FkpVnM(Wxeg|zawK4=03y+Nw~{;9`$B!JQ@BiPm#MgH@N85G*6h$ zz$#ejSch2cM`8ex3Yl%4v3hhRq9txwH#<%$OPBR6FOyQ`0K%Mv!csw?Zh8ZaZe{~Ofya^$8D7|F#k~wn$zdY;sFf09H%rIm(AFxd z{YTH2C%nid{n-G4R*`p;bV$DlUrPM+bJ~I)u(F>M%VCa~@`Y2&0~&gseo$uPZWRKe z?1e)ioqiM(EJPzMko$xJke< zN@ZSk<%#hIvP~eli&v#JEm~bKspZLw+`gyPrTpnufNzP8xF$+=GR@GAOf$nbi(87|>i z-|5E!U3+iRVV4@(9(U~P7dW>)+vyr#gvZ4^-`f8&WMm6IB+CwRMJ4R!*#Qdv$jhn+ z-g~Qi-}``}j*mHWCy%D0i)XH^49ytkGYIu)*>W=) zJ(>;kDLxMSSb~$N9_y-7rWxk^j29#{l%|Y@fNh_(>7p&^oCwPX@%I|Rs)3zdGQS0r%+ODeC#EugcZcF^ zfY#=XFOT}fDTM_u>Na;&E1R24Ix3p4l^j!Z)d$sgC`(+N0mv%}w2`?9_9>-<`Lu}v zptV!knu9=h)OLey1G4j@dje}m2)(1b0P6Vq^MQGwK-eJr9^q097iu}`JUvP{#TUm8 zR0VS+IV3?B+UGQfMCv{s&vC}+(QcH!k7S0V^@KAou~ayI~YjArB#ZJorp=w`Y~7FdBbb5N(m7(hyDT!6PtA)@DV6aZSgMYOs!<1#;^6|6$nftAU!l%DHA-Ih18fMyXYiJie@s>GAsvR`b zc``vaftY+W)kRPyZEC}Dh^Ov#3SIP?R-qdWiY&)lZ2wwbl$wbtNLBc<_IC z%Sr#r|CQhSDe>ulvHmvW&h^}&E3GLD?N|%VZOo7`mONTKS%5>ao3hQyTBTE1>#K$8 zShAPGG+q0t8XlQJ`Pl$eVLE>+`OAf3WuF&%GAhoDfZi!8IQj8&z)2Lx{fc zJZBU!8x|acb-w5?`=v-HP8ZL^#Jq?KIG#{^gxd|zR>A>UWa{CXvA~RqL;Wlm3%_I{rH4-Smn6iORAasXrgQEsQh} z)^V|%$$2`cS$O9H-d{_Ysz%|6ub z3=bKlm!V78+fUsfewy^6v2j%$|CkBM1DW0uk{ zS9(}tLTQ;>Pd5C9`XRn|_>u0Z2O58MI*dA0#%$V8+9{tQ@CE_4tsd0P2IG#B3rpxn z8?8-G$88tAuA@H>qaO^sM9dM{{^KESf;j{Hv*ss>EvezHe`F^jWseuERX>+(Uo9>? z$x}gb)(|DD*&50eW@(H%)Wq<-GklAV^Oh;I7W4ugV)P!WH-@BVQKzqnHx&SXqcPv` zU|dN7$+31H5QGUoba2JIL(3^)KQ!zz5H^L}==`Gm=ONobrcbJym9`SqQp{rp@#u1J;6Ek)U%D}I@ z#EXs@f~M*zhd+#T|$!=xjoy3q~bgV60x9>%j(Xilm9 zxF_uD?;8IZ@RV?6UAwZOWpMDK+k8%R!_by+Y!9I0-_K@SQkpdqpLl>KAjaRX?uO+z zU>i)^%_>HTTKkSvCNY%>6Gz_F)oAAUbjNlPh@SDCYE;HvV4o|T7o?Ac=!BF#AZy6_ zYF2X&B5fZO4TY(PuA6DFUK*9m!i0E8t}+M9avvGu98If)kIHfDI!@H^BI^Bj0y)jyFg zVlAa7Wm@7*>9{n9V*B$pOa1o~)PjPnxP(#FA~da%g1jCodVAElfHAsk+spqFM%DGh zZ}SBedgtDh3BEO@HSakJID80DY(1EdBTW8wt!Z=cl8BN8cFd|qu)#hUqglcT9EtJY zFO3m|k^ol`iL|mJ-jI)-6cpsLUWAZW6zhrx&L2U9?p=E<4au2oZFmv&MltBKjj@!j zb@=O<7k$39uVBWx15(61iF`hD{N|}o4^p$M5Vi|@Ga8&PH+HzrAcC7ztA7-k52kcB z+lyvm1o)CgD{$MOL3_r;FUGY$(@H&OMr{X6_FuSTF`S+<=;a;Uqze>=`I#^-$4aztm>gJ z1V!-ey;}WS#rXx%YwyHj+7J>0Bpc}3sF_tsWt164k7U^5vTeCA8=Ab8Za3p2X11d0 zs}@8;()xydt-oqI>?kgUs)y9Tf2-C29-2?tT@^#x;+q~J^{d|_H2J!{4Okt!MQ06# z=VRaovSQ6piX}MQNLKVb!VsSm?EHxXPxE_vW;;}L_tQHYL-Bfqu~Ic{hWcH*{ah9R z8vAA;f84&O%Ml9L9g&!Fl<(q%ro=5sFEMvXOk*d9yOxDa$GDjFOB2T=QTw>*56gtx zPFrzzr8Im#)NZ6Qo!P&4SO@K}b^oJ!$}+xy0-LW9^TRxTR0YZ(XGM0nWh2R!YE#Kd zqM(-B7^`~UR9>BA`@V|baQ+wU1%ci6GWXbe$T6U;E2W9hokm--_V}ZAYFCvLEbb5FGnlo*Bdm&u`TFCZsMePJV#!~+psn5JqNv4y2x``y? z8Lov|!NOB5+_#l0na?tqCf<2B?9EAks-X13yDPTo%h2za7A4Jv;M;E&6D;5_odA88 zqSI@k3SPLGJ~=ThI!C4Y=x-QnQ|Y+r#ro9$$cR=xI@ZnIS?dOVILw@6BL4kgKaB5O zHzmE!3v!#^Ace8DLBYR50IjeKO+f}1Xxn9glns=)6C z^p=6IjteN`7xqs~MJtahiH=b;8=eq`+uBngYu1DLZAL1aF6ZmIX$~EwqrS#Mj?k)F zUh&cG$*{kPsGp30TXTtRqYW)TST&k6Rb-9+?#|&i#vfg8<}-v2?EWvLiOqSx%BHNp_CX?|M|P;u@165&PLWOTUk* zUU@R6#le}!A`-B~n+5Qe&;b&GP@BV86+h8MvRD(@NF#d5kE%CknVOwyK~@6PYB*E-?>h*Uy1Bbb1l2qY@Ec^>u&(B-xfkb z8@2vS4|YJPZj(=4DH&R$UbBmT&J>CcI`G|a>eqHqG(b_8{iV+sN<53u|NP4q06c53 z^N6kYTmd>o`@b?fjXlM^+x7$7`FBP#9#K~aC5T;ijU4MTnW{92>Y0@{gB#q;kFM5meh!T$ip zb#p6)Qe!sFLaJ-%h{BtKS@~gBu?_eg{N8nACxB9JmaL80UFF#FNTUad0UTU zDwh;P6l#%XYVJ2CQT1jFmIoSCl0#m|iqxw=k}w%Buuuq0h}o<;)c-)VGAE=BxNS`z z|6OkHm67Flps|CW${E^NF1mT#S6|3xjJ?S{zP{AmSOY@b8EWqJ&2WS?JV3YV;eRuK zsuJt2e~b)vIExD#H3sztJ?;aR*^C7%`_&i|4dG z&s6`l;|jz`Fz)@R__j|)E!0j>&m}VucaM+sQYZ?m0z3fHAG5Uo>Z^vrZLpfXdpR=K z)eR-|eOhDm60e}ah;u2)%@n@Zi&8&1pH+``gQjo@bJ`>_m zW7rR!{f&1~VVxy^0NnV*VtTJNzRl^{!eu)7#~@?mSMj)g-;%xXCeJad11WyMsQYzk z*c3u^Tak_mEz!DPA9P|#yEoR{QY`tlqtt$uX32ET8o#eNb2d!y0~1NN&nzHf;K?_W z)8Xfdb&dax6t^;WNg{hFF^M<^-kep;lS!G$a;&DiMcjQjg)46w%FdrBGU9Xo)mBjGplu$zhsB}N)Bn>3qwX! zMu~bbAc?dqcp!wAj7G_P=zb!N$OmVlFiF$13=f}oA!16A^2hkPr?=fdl*z6I#wz&EwiG8ROG}^9D@dY+-7+%BeN!O z^p|PEPR%#O+Fv^sN*+EesOYw^{eH=}zq;#+@P0>Rs(g?Im~db{@$ubGPYrdhnXzcYt5>g`(Qb=0OUW*&a3-{X^4r!##2k6HDR*81@2RIWE^9Up z4oYRV7Tv^kI`8oBEjvZ#g|T%TpN{LQ7}c718O3kbWchyJb@)(Rlr>i*4$AOXddgS% z`t8$lzF%Kp1A)k2o&q6uIU1n?d)n57GV3|olD9GGpinZ=>QBmeY11J!<=#aE)pH+N z)b2Gk4-{$A%gL2XuliD1dbx&me(-v)%W3o9N;*vrdwKHAqVlw9Zeyv&dm2=Q8(qw7 zGfi*C^{PdTMV&hj=$Pff29 zEkU!{wo!jb^|({t%wDL6;H{Xi zOwm`x=E?Td>*nV}QW>iR-!v3bGcl1VRTB{N@QMr(c|9$5D!s)f$9B9#y5 zbulj6c7zmgfBB6D*|OgWQ`36Fv(?@ta@|Ic+Vx26;som0Jyw4ex6^SiE&3T6iW*kk9mQ60%=}K#d=!VT zi*=-{0}t%+t)I8;KSXMy5dbI7vUwGmI|qL9`s>+-@muZJzg##ABH7pTk{wHwW_~zx zB3ai9QYuTT0|GmFj-=kNp&E~XUWs?~zwHAv5J|7w-Vgj{F@F7~kD9j+)Q7o`LIZz* z!(2{r<^zO#TM?L0@#$Lv&9llgBVEi(c>1SM{ynY7gk5uSkd!OTvC1#_<_oXd5vs9Q zf|^`&xq+F+$L?!1Y=~eTt(`A8@CC+p!tS3-65c3R^bM(@Q0c`gtj>8Os9;_Pl7f zLq;QXv88plsoAubEYsZrybW+I^LmAC@n+HFJ^S*8Ip4Zv)YCGPEpH#+B6Ds2f7xiG zP$-xF%PDp1RAzpJE(UhQn~3%a5^-iU6wT7Cy;}D?LSKUKmIqE()SW|6b*0rWj<1zB z*S_rZQG2|0{i)u0E^$v}ENWdUq>OvprT>TioQHc?ky0D+CWh*iy~ON(rd`wYXM`b3 zuV-H4`Ep1ySu@M3LzgwZYe_j>@Z1Cx@d|g? zNN8=8vKbwEl#b+<8Y}YU0H-!^T)t6N^HYS^SMxk!OYX}g3N{6_lSGv=g~T{#Dgk~OD^P_gOdM{>ECS_hKghBYRu0Vi{t)| zeXaIk`OD#Jb)}N=BMo$B$d6um-O61FbPk0?^|kj-g@D%YsX{S5M2pHkxp{gOF(@|I zXDZ^+qBM?F)_jh!^+$V!GDUyzfKcxt%~vVzlm=rx0yO%bD+koU>v<5t>sa@c=R*!3 z&>w(SMxqs_V00zv#hQyZK6OZiaQF&EaImEX8)&9lHNiE!=Pp^Y;qES6I(R(<4i>f*~V$ocLlao?QufCd9`Pqm1om8_m)+ZMR< z&0MDzyE}{!=n|dWn({HG6$;0epjpnNXM=T!FL%2}Kc)CK#?FKh6PcF#8*mfB2JUNc zS!Sn+x*tLFpkkb(#-i_arrlB1wQj(qK$owX?(^>TMr1FDpNWs2V7?R2i`Ld}^A_D&T;lY<C5 z9|-ngsJk_Jo<916F}YWGY_Chh5hR!~H_3IsPR!=GFEC z!7GN`wR#%g_vQB^auOi9`0rnvr_$Z8wJYlVt6KyN3tFbMWm@62mQNnNtxlB`ewTS2 zF3+NG)CyQnU0l$A8kM)sTZ!hR>$XodKYIuOJ%m(r=;fM*Psuvy1h4{uE0O4`?DfVx z{0}4y;vIeG{0QlK8J-vA_#Yf0;f~>9xyQ~7$b`z`%^7qlxDvZ3)KyoaQljhQ>QmW_ z#79XTxn9xU&z<3RehNuZq&^KzP{a&WQh$st?Qw(O$w__?cYIO#vAVwZ1yd@wWA+(3 zHF?F6!PvbXMuNR~6P>1Do?9aBG^=(V&V<~YXozut5BDB*Fp3x=m^LKeXs`2W#r{|n z;gm&kOrPh+ru%Z0GfR^-9Z{uBl{Ti^qQ$afu&xRMj0o!y&8jZofDB&_az+y5jIKpf zmdr{2OAXrVfi0Du9f#si8Lg5_X0p)sP%_S!=p}*?BL*`0w>FZe(Tq~YULaU5YZ5%H zAdOng%!`Am6Wm|eIZY~V$=;xi9Ug3S?<(m1TO3&3ha`Su*wZ>-*WdSTh7LaKo>43f zdKP2onCRhaS?xyMoK`)Q<;k+>yQ9^X;6IG^cs1^dHJkcO^Ya8VJxIMcwyAVf_l1lp zGe34mCz_xdCBN^b6WICYA%qi{`(YMq`xI;KeOQUoYzP`;?K6JFGMM{nyDqUoJj@x#5aQSEsp07dCH@F zhZ2K4N}H4?_3>NL<3Y>+ICNvhXE_TrGYZ?ZK!)*qgb=E2yrGwBvl=T>;*?7SuuAGq&zETEeQkd|E`yXUV4_j5Zy4$Toyj z*49y{jt&PjW8_|MhpTo+BKJE2tILs|Slu%+xDo8C|M?bNQ*5DklaF;JxM7r0AS=0} zJ+k#DRF?Ws{@$M9%AQm6%VvGD!*=oMCxMCCsKEDt_{wiPM{H3Zv6P7Lrj=yL@}K8l zrMOJ&Vg|7#HzZDTslY$hd>+3y_hSz;ns_1c(F(Nf(S0>W;?4)5@nwlJj6i?Mm_N_? zx3qUX5Yj1;8(+i7Fyg6~Ps&mdV?uSqQ`W+t!7ykJ)QLuS!W^!~ciBo`GI)C9sLGn= zfL2_aFr;jtpaLEur7(HI-83J19#sdtM|Aao+8IY%;h^*rV27Su*+2q1N3qVfS}3$u zBA4DK2?1wFbafYT;0^`g&LDJ&f5qD1_NE)HDqcMyr9$RQphr_*VcSFqm+O9Xo*};3 z;1;C&zdN#3%xd3D)9nc%onh$#McP__+8W=7N9`4~TOBB0@rB!U%X8DOyGrURyb7D5 zZYU}S`pw3r-Uc3+zbYV;awqe^880pkqdPj6q#sd~oR8=@qmATdYQ<;5WkId-KZ;Xs zr*yXRLrjyU*3Kjnm)1tj?(K=6P)5I4);D_O_0^{B^PbYdXN)p6MrAHd(w*Bj474G- z*<|KV!qI_|mc4UB_H@t}#nTyoqBj?vzx-I^|02HDz9PO>!m_ATcbc!u*Zy3oIk9SMSFqv|s8fzchZ9_JXm4<}FJ~HJmzsSFm!M!{h z6?n0HMQ~$wxfxw}lOHus0!RprF1pF>-g)}15nK1u*%97lAQ>&){T=m;{nA$O-kR!L zUAEQ+Pe8(tHH8iE>9oD}s#W3>g3Qxwl_a?baM;+duwjZtq&b zyd4lUR&C$z&zlgl5@i{o6_PRL(IV(LJ9}+GRuJ8P%lz|)=CV*A{z1>fpI%jDBI>H zOu!CBwgTtaN-`ks#vq$2hNZiZt5eNZ_7A;I!amqi+8Jj^KDk^Qh(kzPsH z3*B4V?Z0ga$#VP{ z=yL_aOmrFPBAftKfR@I@yOhSnN_XPl3KPi+1|GRKL3kO4yt|2!A|8B|DqJ|6A%9Qgh#cI~jA;_elZUoFzF&L{>a7HtRsx7HSJpt|)h4)s= zgU?qJf|J#FGHT$>mD=D8>S6Hoej!`#^kmhp3oCYeaYwt#R;(+04dzlA!bZ*YgEH-q zux3G`H6UhK5_>;!?A1Y|1)bQ8rN|DPuev_cuap0knQ7MOaoJyWnrBWXsesnZ6y$J5 z!%dL*l&;qFfVlE0+%Pe_&Q0%1Z@ZNqaw&KIv6;U}=_%r@T; zyI9xNDs=G)jy{w2m2{Bez`HH-J7uWhqPixvQ}j6Y&(v8z|cc4RJ2#529w=K$)t zJ+DoyEJ=r!E+bsh?hW(Jk4k5Ln!}*P7=e9hWyA8_;Zve9l*R%jVI6=v;$ngjPe8Ew`$l(5CSkbL2Wq`I)~+;GJq> z&L41D+2kJX#%nhog1)INWO{pFh4w|p?5++%yg%?kth8T#{pMu3Vk?kPa@;FglrNQf5OavdID6#lcZvvRbe;AB}+}Nuy;{_R-FMRaGIrD%ND79Wy`UzJ7;f( zpJRy`JtvhZ@W&uDy6~at#Gp2UiHNA7C(#DCz&K3k6GawbdGT5eCsN#c*n$}iDJ;QN zSCyfVjWiC*3D7CQU@A#nwC-;&Hv%%hhs|@wmM6y{7Uv>y77!Gxf$ZYUagv!tFyLyT znOSg@kaa4I>uZAa_dJ8u{EpK5`Esk8W_c&&y3P~r^at8+&Dk2O3pN)Hs`xno<#n1y zo3*d~r8coS^$tsbOrGn8O#pg^nNbp`+;*1;Q1orS#^RKHYixSDFm&!fi<{T)gkH}u z4?U=T?+URnr1$D>ug#Eomz_>y*Af{)wEh)`^DlghW)V1tsiv3QUT1^8oc|)j;P(Uz zR@>mbmN&!0*7bPiIkVQWQ$fyCynk8)D+fIp<$@eI*FzVismB&?eg^$W&R1DMCxP(R z(%fjK6S`}KPf=V2{(AfXFc(FAZU!9 z8LQmZ-pO^hE8Qmd!$LPw)EiqHC1j}I{jF7o4Bx=btuRB@B{1?*0M;P_#u+?ki!>>Y zn#5V$Czu$AJfgD$JJKA%0YVM|uxSZ8iMtCnAd$_JmmCHpH0r8vMvfs9)m+|KwQ02G zrs>Y7UCx)D>3WmRQRU<|-;o0V%tUrf?`zN2r>+5d;a?g)oYMR+u^Cf-N>SNR*(z&7 zjg)sJWJ@U0aatHogfF*2;1UX?Fy!OaPkif`9TKILtA zJVX^;Q8#~BeW=rKIjnJr$=HDgCmfUJzIekX=r;I~Ae36kqw5%q9-;@NUg4 z10k%MmV9%PcJ$7s!89<@DqdC5}p&<(x7dv)* zg^CkuD2S}qTWwqrlw^am77)EwTVyng}WNK<9}=AReq*ElmddIi+A zE|XUrrCE&DW$RsMq?yL1Po$LX0Bs0KXeU~E?qD&X#R)ffZu360lnjXZX2qIHB2LQO zHJ|=qVyF^*H^bZ1(dF^O+1)&(Fw-Xv{0$rB+P+2W?Ll6ZmE&(BJ&!qjQ8}EDeN;=A z#eJyCAn~-wA?jGZ$T%?Nv0Xk7QmqE2{Lp#xmF$dnO*1ckSQvjZYuQUTM$4Y(9;Z%( zQvx&^f{acTU$yrikWQ3mlwbh8BtQ*- zZ~LF*kh^{nLvs-e)NxL~>TD)ZvUQ$Uj^(f~piljU-yQ_b#5gBc9-sv##PsmfF*Glr zD(n8Gazf&}!~*x+#J3h5sg6pF@{9o=*zk)FgCfYqxis(S@op$&?UTcfy!rk}FCNXM zAVc$)5{KfGlFn@i9pXB>AyHZF5*3odcdD)PV9M2(YWyFIjdfW!JA9+t4{iQjbZQ5KsqOK% zgignf1)LF~k0gV=C!~c7BMcwov1_xE9I$piu}V35Od#ih*_r~|#=8axdBu9tq-n46dMu*ZSx}!924-H>6HNCj*Dmp2iLW@kEUygey zb)iUYOriiH4T!{MUbJDCoiR_Uw{(`9|7E`o$D~n18XZ}zKls_jREH0oZK>b1c=4(N`ZtyOs;}KgR zq1b;8GbPOkOiC%6%}|=P)S8mCt~9=q=t$y8a>cET*b;(Xjy zhU`pmO755;WN@_zCC1UF@mdC$a;|`&j)lA`@q%m-?)hqwd>CC~^bR^hfs-}J^DFSU zrgXiW%R1%5rTXUleUXZR?zvn>+gm6{1(`1$XDc?K;&&9v(LlL8)CMcOX|GAajxCT@fccu#4m|hCdaoKN5Y@ufai^-qfa!f z%P#M`PQzV!?lB9VO)gaXaEM|4h?m+wIKDrdZ(wMwwO>3hJa67cSdsK|BA(!>(2}?U zO(NfV0(r#c{otcb^Y`y-c>>;{%%6`<91X+M6UjeNU{NbFe@RucKs5kTI{A+VgSMA~ z>jIyXgcDAJ5|ZRQ$S-h401ZTT3?4(w9yTRoY0?dcP1E9<$&KfZ9MxHPUV?cuWkUZNBDAUI8Nnc1x(14gfd5{(d~b`|Ax{BK5x?{S;lN_l z)6U0&OL|vNQtqTDhF{$nu`W_*x!1p$4y{q0NOn~p9zUHV!p?h0{D~(=eN67m7ua+` z1+UE=o3ET{%Nn)vL=Sx580&VZ>ert5X_dL#zAEby(}FC*JHch?%yzM`IW#S3b~s5X zDfJu9W!_)hCV_Z~C9n+l>-wNizcxxA*_WA1Q_36?v$i`~b-$d@cbmTsr$nIN5$N^R zb(hqM(gst%%Ri_lkp+wZICIu<}Vrk=y;+U~HPLsim-lORR)50*rU9z}8x&TeaPRD}CFE z`ufsH?r+s2KktV6sMiPfNa3S*1!o_fR|Zx>6-s{;zYhz)sa5*pj%E;BcVj_mM~nr0 zByUjFwfuqn##bpUTe?hY^XW|~y<)X8DJRwO3ltMX%YB!RPDrPZ^gTn9baw3O(;CvR?W@h2C)ap^hEb zg(=Guvs@t_iw4W%*`qFuOdqs}QN+N0#dPit?wLl_jfP7}4P_k-Qx2>x|Fzlckz|_3 zL)!R8NRp*q7~#sARDYvD6H9()olaA&2C-O&DX}v> z?tHz6eI3ENmtdPgu>4AKXs6VC%4^X+i_|7hYKyvQXB4QNk(y5#_0zO8>$Te5Yl*gV z)wCtFS;>E>oQMAH{o+W_g&^9G^|$x`y!)xhP@zUHT|{dg ze=#%-crC)SlmUD2)N-jee%2JhJ!Tzn?L?E0Mn&gqiG_*C5VHdcJKR(Ru;L`{$cUV3qSS50CrYd1>yV?J(DDfjOI zjD4oc$omi85c@}egx&55>Zn_HOuF<|GeS37&D^OhqENH@wj?IoX*S8bPHsu_8g|U4 zPI%-X>zU$0L^j*@*1@E!!WUH{(rRPzRQW0X>@3sdPbtgav_GT&ob*#%cU@-Q?-gRu zeBf6<6~xdbMCn`%>e9H&X+@U_XY*;i-?-Dx>3z}D*qH|Y=1G}0+$E}lei95%ZCuZLY{qceB|}F z#NiLQ*UB-+hw+oQmv=nhS2<|1AQ1YI~B z>(s)^&nP=3J5}@3xj>nf-|ggfH`TkKb|j}lGeRRO&$Hl(bKw$2u4-uQ&JBAU)4B&W z8~MpYdUpjgttZHjdV=pY_fYY}>I_y@CEN0~?(EFh?31MZul3HSdDZRlpA?#Xaw2Cd zUWEh#I&Ip2#jD&_ycU{L%bzzCHM1CYXS2d%<@U2czBK1?5xGWT{mw*Vhp;NiQA^(P zOn0KxK7#qQtDbT~VPr#TZkKCQHP)0Tt1(S%!U|T8)X9+2$yC>wZp+~r$}$_uP#&V~ z9;y|=)}yf*U@WaYAkI|^Qt=8R8wgXZh7_nnF4My;KGZzW-=P_C*Xl~`$HmX(C9HB? z*&E$`mjv!Q#dToczI=^>VT*qCL?rth(WKfBag0K!J5|G1SZXU~vV%^TDzTfkC)aDiYU% z=N@W%hBV@^7@hRes$^G5wd{z2Qgv-vpQ zZ+Z)B9&C)ny z;*aMJCj%~Y#gP33a)Sq$KD;GLQvxG18bJlhO_QhYxh(paFOFXgp7@^nhxkL(4RedFTBlz&#(QqC;`R?>aM$ArNDtP6Y^gL2e=DFs#B;I{o`Fp&t~EsB+_FUq z)8TkN=N7yb@E2925DZc2)<_OvxG1a@1(%(w6*N7n03CE@Xgq@gy3pkljvAUT-ssP6 z4W)1~H`c{Xw3E@ecaQuHR`X?L}UU)=5 z#OuEj+DQW$+X^;b9->mP)Z!d!9tcvo>Wh0$iJpZP!mqha!iwBrB^(MP@buUy_gaf6 zyZ}eE;@2`F?&5WOW1fesJh<~Q>eLcfRuZ}u`vp94oZSABJZHbGl{H9*d;dt+d?sGF z89R6vD^@W#k~x@qQmekNE~KRBqAuO&z4fUoC zb*~A$k4YjNj_P=N#J%^`^V?W3Ku(r>7p(LbEHNRj(BSc<@F}eJuW(Z4gcJF}?JQZ5 z!q=V~eZ%kjKfeD$FO4X^cpZPyCAbLuEdUukrCU-g`)w}Z$C-#vWohqSaF62dv6IF= zy-jy&F&RQ-Iw3O$JMiwA82r2FgLaP5)`Fv^E}K2}UL1T%Q(VG4d)pWXb-6<6CRhP^6vbVk$XZzDdTF$K{;@L9`@7m< ztmuQ<1=_&q&!x3B_CLF;J#-a6fBh(iQ7%?b z5csqD0F|e%fzG&iVV1*g*`^ISDy<-&&aG_cI5F9u%-)vp4c$eJmLAzg> z5AyC{qnY7@A+wU)eTG+TIl)h`D+-P(e4VIs4C>;nSnidx73gYH7?a|9`CDctNYfAT zP?z`@>?c=`MxT0}@{@Z8|FsMh5)&LxiVF#d=4>4ej0B-gAaDq0!w`+cp#HI<{$(^X zgBaKxJr+ZPARq?L5y9~g9|!^geCY=9gBW-u5^ z@PB_G7(+vpAtV&?ZyN#w+4>d|^B)_=@V{*cgrPBN+kPfUr15|62Zx&=G4Sm+W8g|T zpZ~OBf`TKr+mOKR{`Y=xB*JK$4UO5>E*!PJU4$`Wdm9*|->(IMFxqxL3<8Bg|K6?< zaKqbdM(}OdXM{A`W-~T1`pu_sIKmjU?S7F+#5VsS4H4V-Gv4ki6axMGy}?mv~?8OTf2QAl+4ba-A?V!Y-Ub%H7+Tl z2~Q<1L6kHiq2i?k5idnN2!cqeO*B;Fl8}bPHQ}7utzEnGGBe-&|2g0H{ok3Q29I|+ zZ?Q2&y+d&M7Q+JvTA+ogr~tNcXAA-Bmar7j!oW62VPt@n6!@UBl0j;a77A$%ZXHQj z(NvFw5tMjV2ps3)T!KU31<__*##xIwuDFz88+0w$DkB|Aq7sfpG#pU^5DSJNAj#Xw zx}?NhO8dWpw{R9?hgt^B7{^wyY^vE}ge)q;rD?oeX}mVp2U?Jf!D(_QLNG?U3U>Nx zvXT7=!)7AU<0Z0D90OY&C306M@9yNi8k&HuisLnYOeKnm1^mrYP*KC+NG$KwR17xr zIb{={ZmgSBAQc!JP?1(^aYC0iiw-;3 ztODVcwio>{K18n)A!32`MhIgMlC>b&V;xe%xEXjlJad=^CZmfo@iWm4wRQKn=|jKr zDm!NHJsKHk3`{9=PJr|I)9jyr-gy74XE&NLu%KR$JI7|_EbJOv{5WTFuH~I5JX(CJ zCiFIcR%ho(lW_W6jeYHl@}URU19$RY7F_E+(pT$XZuft?A{;)Z)^)7Xz8~7Aj0$(> zbQceAU0Z&+J@;z=qPD^l2Vd8yRhx#;u~D_LV&*NpMT`rvp!FFYIAQ9_E!7o~&#P<8%4S;QixomLBaJ{BrZh zpSF1gd%L^1-xI%fp(ssmQg1TDrVnPA1=o14=>U@+rkte%&jM+TvOt=JERg0e3#11s z39@djl}wrkwpIxmWWr`@d^B{agcxa)j_WAIaKKv`?%xG=QM8H>f`1rK7}5*W6lNz< zGBBr$@XNp)E=6qbw;nlk;V_}k`h6> q`R}S$LmDLF&H6Nrnra>=FALWtb9ck^`Kjk|ZTqHj@= zeJG z&B0ji%)szth6fI`U?)>i0c`W}I0DuqV>zZpf%VBzWPqI%_@T0rL28&53Rw*v9m!bH zRIiK?6no1Bj&pNv!6op5)8W|5*{vLBEn!%nu7wjJq(gDHjN>s4$CMz%!x0F|p)N9) zl$fKm|0{SKXETne`=A5kcsa{vnr%kJrXpODwU;|_qlBVYBD7Hw16$Wk=vJrCp7gm6+JLP|;@SYF6rHI7fetyWs8MjG#!H%t!C_u! zWa6`h^^gjrVgqQ7Fa1pHuj>B7AEg#Kx!0s08h;`%``BvuA50->-O&~8ljYV&Q<;IMOkGd)oT&QoZ$M^H8sI?()quUk6VOID+j9%Ix@)SB2x9 zOLK!oqXVap%uY=&d@MaM99RL|i+z}p#a z^#IZ7v^yaJs~ArY+$0F_17V(jKCR=p`u1UV`+ge2{vuduLa7+ihNE=FIoqd%knd9ZQSb zvx~QijOF1ccrd~6z=0O%U}|cBJ$NdPfOW}Oj%g8KTjU5bz(xvuP+Q9&HAD-Aj0TsE zWUOeaTgC{=-PHoeRdH2&VAvL23v~sN4&|LPj>j|{QvwhVg&`mZ zPmpyaZv}7VtVXw52~mvW)hwHCwi;opif}~+uc{1QhnoW(D2TynawmgejC2(o z^wne&^dk&M$cSza85<=qu-;BGZe8l`O5MG14A}YvZt!C|qCL5QKPrb5H3Cv{d5@-I z5Y6YbOnj!WE>eM1Yyi(CTarpsfr0fQL+jFmL~1&MkLs?I;-v5l+k`@jT&E=nUD|Ay z93a{R!YgAh`eDUHj}jxp0_%wp#%>hULS&BvNR8kq@YFohOal|^I+?_9XY=m$FS)|c zXPD#X-kcn6J~XsHHZ@g{S8#XV=;H6LL0|jyz|x*SAJ2|2<;|>Ve?C8dejvVg+l85< zcbskR#t$_Mt1%j@oUjqm&VA5T`kjb8IxW`9b{8;gp1W;c|+D(?Ta*zuxj>-bRX z*u?i|OUnyQb3J4C)2F~{BszKrM}t2`~}V~ZJ+=E literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_simplification/simplify_curve.pdf b/lib/matplotlib/tests/baseline_images/test_simplification/simplify_curve.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b179d7b5542ed8c05d203a14f9dd9f354a3175a4 GIT binary patch literal 1235 zcmZuxOK1~O6z!&dW?mFA<>YU9L$V53YjFX_}|CeFN;C>BJp zn<8$l3Q~2`j|&mBD2UKap+Yw<#EJ+-5D~?N7W}_ANt>8Bo0*)s_rCMF6IUV{-;2F| z!8Q9DW*!R|L@?7sLT4wSJo^d@j_osL&PE~)lDO+ zQUYz!4xcE7#jr2v!#>$Bdql}Citcs+B`i}L&JYXQ3Mwt;O`6x!P}H)JRx@YVTvpUeRlh7<*ul(qacf)n>1q^%{h>*YFD0@H)|#9wHeEA%{B?LMgEf2=Jc{n@o~W zILRbN<4iUwQ9wNfCbzqCk5ukGkOCAd(E~}!CCcRi$w5`qjT{8ah^ZfpEX^Z-+>EXNPu9pX2@a?N`uI!ak$sykNNT z+z@8Q)b;xQgZTrET%-Wo&AQ$ouHi>5RnHU4`TyxLvL=*Q6e*_3O?5tqq<)?-zqp4s SRW0f`7z&33mn+s67ybe;ab=wV literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_spines/spines_axes_positions.pdf b/lib/matplotlib/tests/baseline_images/test_spines/spines_axes_positions.pdf new file mode 100644 index 0000000000000000000000000000000000000000..0d3029b1515abd202870dfdccd81d410019b3fc4 GIT binary patch literal 10809 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 literal 0 HcmV?d00001 From b096a6ebd295215bed372e5b9d79e001775998e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Mon, 28 Sep 2009 17:40:49 +0000 Subject: [PATCH 0292/1000] Make it not an error if the system does not have gs svn path=/trunk/matplotlib/; revision=7831 --- lib/matplotlib/testing/compare.py | 28 +++++++++++++++++++++++----- lib/matplotlib/testing/decorators.py | 7 ++++++- 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/lib/matplotlib/testing/compare.py b/lib/matplotlib/testing/compare.py index 71f67c3f4fe5..5e0705328a94 100644 --- a/lib/matplotlib/testing/compare.py +++ b/lib/matplotlib/testing/compare.py @@ -3,18 +3,21 @@ """ #======================================================================= +import matplotlib import math import operator import os import numpy as np import shutil import subprocess +import sys #======================================================================= __all__ = [ 'compare_float', 'compare_images', + 'comparable_formats', ] #----------------------------------------------------------------------- @@ -77,17 +80,32 @@ def compare_float( expected, actual, relTol = None, absTol = None ): # A dictionary that maps filename extensions to functions that map # parameters old and new to a list that can be passed to Popen to # convert files with that extension to png format. -converter = { 'pdf': lambda old, new: \ - ['gs', '-q', '-sDEVICE=png16m', '-dNOPAUSE', '-dBATCH', - '-sOutputFile=' + new, old], - } +converter = { } + +if matplotlib.checkdep_ghostscript() is not None: + # FIXME: make checkdep_ghostscript return the command + if sys.platform == 'win32': + gs = 'gswin32c' + else: + gs = 'gs' + cmd = lambda old, new: \ + [gs, '-q', '-sDEVICE=png16m', '-dNOPAUSE', '-dBATCH', + '-sOutputFile=' + new, old] + converter['pdf'] = cmd + converter['eps'] = cmd + +def comparable_formats(): + '''Returns the list of file formats that compare_images can compare + on this system.''' + return ['png'] + converter.keys() + def convert(filename): '''Convert the named file into a png file. Returns the name of the created file. ''' base, extension = filename.rsplit('.', 1) if extension not in converter: - raise KeyError, "Don't know how to convert %s files to png" % extension + raise NotImplementedError, "Don't know how to convert %s files to png" % extension newname = base + '_' + extension + '.png' cmd = converter[extension](filename, newname) pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index f95c832ac17a..d3652ab90d10 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -4,7 +4,7 @@ import nose import matplotlib import matplotlib.tests -from matplotlib.testing.compare import compare_images +from matplotlib.testing.compare import comparable_formats, compare_images def knownfailureif(fail_condition, msg=None): """ @@ -88,6 +88,11 @@ def decorated_compare_images(*args,**kwargs): for fname in baseline_images: actual = os.path.join(result_dir, fname) + '.' + extension expected = os.path.join(baseline_dir,fname) + '.' + extension + if (extension not in comparable_formats() + or not os.path.exists(expected)): + # FIXME: Should it be a known fail if this format + # cannot be compared in this environment? + continue # compare the images tol=1e-3 # default tolerance From 7f806767ea5d7961b5181cb969d1f0fe57a3a0ba Mon Sep 17 00:00:00 2001 From: Ryan May Date: Mon, 28 Sep 2009 21:58:10 +0000 Subject: [PATCH 0293/1000] Update a couple of remaining uses of gci._current to sci(). svn path=/trunk/matplotlib/; revision=7832 --- lib/matplotlib/pyplot.py | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index 8ba3eb44f9ba..9ae2818434e7 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -401,7 +401,7 @@ def figimage(*args, **kwargs): # allow callers to override the hold state by passing hold=True|False ret = gcf().figimage(*args, **kwargs) draw_if_interactive() - gci._current = ret + sci(ret) return ret def figlegend(handles, labels, loc, **kwargs): @@ -1444,7 +1444,7 @@ def matshow(A, fignum=None, **kw): ax = fig.add_axes([0.15, 0.09, 0.775, 0.775]) im = ax.matshow(A, **kw) - gci._current = im + sci(im) draw_if_interactive() return im @@ -2629,7 +2629,3 @@ def spectral(): if im is not None: im.set_cmap(cm.spectral) draw_if_interactive() - - - - From 71f62f140fe84e8ca45122ff3986187dbb4043df Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 30 Sep 2009 13:28:37 +0000 Subject: [PATCH 0294/1000] Merged revisions 7834 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7834 | mdboom | 2009-09-30 09:26:36 -0400 (Wed, 30 Sep 2009) | 2 lines Fix Grouper docstring -- it only supports weak-referenceable objects. ........ svn path=/trunk/matplotlib/; revision=7835 --- lib/matplotlib/cbook.py | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index 24d5b09e9124..fc51b854ab95 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -1287,21 +1287,28 @@ class Grouper(object): using :meth:`joined`, and all disjoint sets can be retreived by using the object as an iterator. - The objects being joined must be hashable. + The objects being joined must be hashable and weak-referenceable. For example: - >>> g = grouper.Grouper() - >>> g.join('a', 'b') - >>> g.join('b', 'c') - >>> g.join('d', 'e') + >>> class Foo: + ... def __init__(self, s): + ... self.s = s + ... def __repr__(self): + ... return self.s + ... + >>> a, b, c, d, e, f = [Foo(x) for x in 'abcdef'] + >>> g = Grouper() + >>> g.join(a, b) + >>> g.join(b, c) + >>> g.join(d, e) >>> list(g) - [['a', 'b', 'c'], ['d', 'e']] - >>> g.joined('a', 'b') + [[d, e], [a, b, c]] + >>> g.joined(a, b) True - >>> g.joined('a', 'c') + >>> g.joined(a, c) True - >>> g.joined('a', 'd') + >>> g.joined(a, d) False """ def __init__(self, init=[]): From 231379171c2574d68d8097b9de60e4e81ee3ad14 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Thu, 1 Oct 2009 02:28:14 +0000 Subject: [PATCH 0295/1000] Add scale_units kwarg, additional 'xy' units option. svn path=/trunk/matplotlib/; revision=7836 --- lib/matplotlib/quiver.py | 75 +++++++++++++++++++++++++++++++--------- 1 file changed, 59 insertions(+), 16 deletions(-) diff --git a/lib/matplotlib/quiver.py b/lib/matplotlib/quiver.py index 64991d672613..3c9cd0d09212 100644 --- a/lib/matplotlib/quiver.py +++ b/lib/matplotlib/quiver.py @@ -72,7 +72,7 @@ * 'dots' or 'inches': pixels or inches, based on the figure dpi - * 'x' or 'y': *X* or *Y* data units + * 'x', 'y', or 'xy': *X*, *Y*, or sqrt(X^2+Y^2) data units The arrows scale differently depending on the units. For 'x' or 'y', the arrows get larger as one zooms in; for other @@ -81,6 +81,7 @@ height of the axes, respectively, when the the window is resized; for 'dots' or 'inches', resizing does not change the arrows. + *angles*: ['uv' | 'xy' | array] With the default 'uv', the arrow aspect ratio is 1, so that if *U*==*V* the angle of the arrow on the plot is 45 degrees @@ -90,10 +91,20 @@ of values in degrees, CCW from the *x*-axis. *scale*: [ None | float ] - data units per arrow unit, e.g. m/s per plot width; a smaller + data units per arrow length unit, e.g. m/s per plot width; a smaller scale parameter makes the arrow longer. If *None*, a simple autoscaling algorithm is used, based on the average vector length - and the number of vectors. + and the number of vectors. The arrow length unit is given by + the *scale_units* parameter + + *scale_units*: None, or any of the *units* options. For example, + if *scale_units* is 'inches', *scale* is 2.0, and (u,v) = (1,0), + then the vector will be 0.5 inches long. If *scale_units* is + 'width', then the vector will be half the width of the axes. + If *scale_units* is 'x' then the vector will be 0.5 x-axis + units. To plot vectors in the x-y plane, with u and v having + the same units as x and y, use + "angles='xy', scale_units='xy', scale=1". *width*: shaft width in arrow units; default depends on choice of units, @@ -390,6 +401,7 @@ def __init__(self, ax, *args, **kw): self.minshaft = kw.pop('minshaft', 1) self.minlength = kw.pop('minlength', 1) self.units = kw.pop('units', 'width') + self.scale_units = kw.pop('scale_units', None) self.angles = kw.pop('angles', 'uv') self.width = kw.pop('width', None) self.color = kw.pop('color', 'k') @@ -418,7 +430,8 @@ def on_dpi_change(fig): def _init(self): - """initialization delayed until first draw; + """ + Initialization delayed until first draw; allow time for axes setup. """ # It seems that there are not enough event notifications @@ -429,14 +442,15 @@ def _init(self): sx, sy = trans.inverted().transform_point( (ax.bbox.width, ax.bbox.height)) self.span = sx - sn = max(8, min(25, math.sqrt(self.N))) if self.width is None: + sn = max(8, min(25, math.sqrt(self.N))) self.width = 0.06 * self.span / sn @allow_rasterization def draw(self, renderer): self._init() - if self._new_UV or self.angles == 'xy': + if (self._new_UV or self.angles == 'xy' + or self.scale_units in ['x','y', 'xy']): verts = self._make_verts(self.U, self.V) self.set_verts(verts, closed=False) self._new_UV = False @@ -460,27 +474,46 @@ def set_UVC(self, U, V, C=None): self.set_array(C) self._new_UV = True - def _set_transform(self): + def _dots_per_unit(self, units): + """ + Return a scale factor for converting from units to pixels + """ ax = self.ax - if self.units in ('x', 'y'): - if self.units == 'x': + if units in ('x', 'y', 'xy'): + if units == 'x': dx0 = ax.viewLim.width dx1 = ax.bbox.width - else: + elif units == 'y': dx0 = ax.viewLim.height dx1 = ax.bbox.height + else: # 'xy' is assumed + dxx0 = ax.viewLim.width + dxx1 = ax.bbox.width + dyy0 = ax.viewLim.height + dyy1 = ax.bbox.height + dx1 = np.sqrt(dxx1*dxx1+dyy1*dyy1) + dx0 = np.sqrt(dxx0*dxx0+dyy0*dyy0) dx = dx1/dx0 else: - if self.units == 'width': + if units == 'width': dx = ax.bbox.width - elif self.units == 'height': + elif units == 'height': dx = ax.bbox.height - elif self.units == 'dots': + elif units == 'dots': dx = 1.0 - elif self.units == 'inches': + elif units == 'inches': dx = ax.figure.dpi else: raise ValueError('unrecognized units') + return dx + + def _set_transform(self): + """ + Sets the PolygonCollection transform to go + from arrow width units to pixels. + """ + dx = self._dots_per_unit(self.units) + self._trans_scale = dx # pixels per arrow width unit trans = transforms.Affine2D().scale(dx) self.set_transform(trans) return trans @@ -503,8 +536,18 @@ def _make_verts(self, U, V): else: amean = a.mean() scale = 1.8 * amean * sn / self.span # crude auto-scaling - self.scale = scale - length = a/(self.scale*self.width) + # scale is typical arrow length as a multiple + # of the arrow width + if self.scale_units is None: + if self.scale is None: + self.scale = scale + widthu_per_lenu = 1.0 + else: + dx = self._dots_per_unit(self.scale_units) + widthu_per_lenu = dx/self._trans_scale + if self.scale is None: + self.scale = scale * widthu_per_lenu + length = a * (widthu_per_lenu / (self.scale * self.width)) X, Y = self._h_arrows(length) if self.angles == 'xy': theta = self._angles(U, V) From a4389830f95c0168d5bc64db32f7f0dd849fc427 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Thu, 1 Oct 2009 12:57:39 +0000 Subject: [PATCH 0296/1000] Handle trailing whitespace in text. svn path=/trunk/matplotlib/; revision=7838 --- src/ft2font.cpp | 3 +++ 1 file changed, 3 insertions(+) diff --git a/src/ft2font.cpp b/src/ft2font.cpp index fd838bb35495..6d94426cf2a3 100644 --- a/src/ft2font.cpp +++ b/src/ft2font.cpp @@ -894,6 +894,7 @@ FT2Font::compute_string_bbox( ) { bbox.xMin = bbox.yMin = 32000; bbox.xMax = bbox.yMax = -32000; + int right_side = 0; for ( size_t n = 0; n < glyphs.size(); n++ ) { FT_BBox glyph_bbox; FT_Glyph_Get_CBox( glyphs[n], ft_glyph_bbox_subpixels, &glyph_bbox ); @@ -901,6 +902,8 @@ FT2Font::compute_string_bbox( ) { if ( glyph_bbox.yMin < bbox.yMin ) bbox.yMin = glyph_bbox.yMin; if ( glyph_bbox.xMax > bbox.xMax ) bbox.xMax = glyph_bbox.xMax; if ( glyph_bbox.yMax > bbox.yMax ) bbox.yMax = glyph_bbox.yMax; + right_side += glyphs[n]->advance.x >> 10; + if ( right_side > bbox.xMax ) bbox.xMax = right_side; } /* check that we really grew the string bbox */ if ( bbox.xMin > bbox.xMax ) { From fb02ecd44edf2a0b2d3bb8fb9308a26ab7a8f98c Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Thu, 1 Oct 2009 14:07:59 +0000 Subject: [PATCH 0297/1000] Fix bug in last commit that caused unit test to fail. svn path=/trunk/matplotlib/; revision=7839 --- src/ft2font.cpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/src/ft2font.cpp b/src/ft2font.cpp index 6d94426cf2a3..cf101557b2d7 100644 --- a/src/ft2font.cpp +++ b/src/ft2font.cpp @@ -898,12 +898,15 @@ FT2Font::compute_string_bbox( ) { for ( size_t n = 0; n < glyphs.size(); n++ ) { FT_BBox glyph_bbox; FT_Glyph_Get_CBox( glyphs[n], ft_glyph_bbox_subpixels, &glyph_bbox ); - if ( glyph_bbox.xMin < bbox.xMin ) bbox.xMin = glyph_bbox.xMin; - if ( glyph_bbox.yMin < bbox.yMin ) bbox.yMin = glyph_bbox.yMin; - if ( glyph_bbox.xMax > bbox.xMax ) bbox.xMax = glyph_bbox.xMax; - if ( glyph_bbox.yMax > bbox.yMax ) bbox.yMax = glyph_bbox.yMax; - right_side += glyphs[n]->advance.x >> 10; - if ( right_side > bbox.xMax ) bbox.xMax = right_side; + if (glyph_bbox.xMin == glyph_bbox.xMax) { + right_side += glyphs[n]->advance.x >> 10; + if ( right_side > bbox.xMax ) bbox.xMax = right_side; + } else { + if ( glyph_bbox.xMin < bbox.xMin ) bbox.xMin = glyph_bbox.xMin; + if ( glyph_bbox.yMin < bbox.yMin ) bbox.yMin = glyph_bbox.yMin; + if ( glyph_bbox.xMax > bbox.xMax ) bbox.xMax = glyph_bbox.xMax; + if ( glyph_bbox.yMax > bbox.yMax ) bbox.yMax = glyph_bbox.yMax; + } } /* check that we really grew the string bbox */ if ( bbox.xMin > bbox.xMax ) { From c03d2b181ae54bffeca93c43f02a6b7c53185954 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Thu, 1 Oct 2009 16:12:04 +0000 Subject: [PATCH 0298/1000] Merged revisions 7837 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7837 | mdboom | 2009-10-01 08:37:49 -0400 (Thu, 01 Oct 2009) | 2 lines Fix alpha of Shadow patch. ........ svn path=/trunk/matplotlib/; revision=7840 --- lib/matplotlib/patches.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 3fd14385480c..6bf2651d0a6d 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -421,6 +421,7 @@ def _update(self): self.set_facecolor((r,g,b,0.5)) self.set_edgecolor((r,g,b,0.5)) + self.set_alpha(0.5) def _update_transform(self, renderer): ox = renderer.points_to_pixels(self._ox) From eab892e8c55c97e741afff92f140e07a05d92019 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Fri, 2 Oct 2009 18:58:20 +0000 Subject: [PATCH 0299/1000] add framon option for legend svn path=/trunk/matplotlib/; revision=7841 --- lib/matplotlib/axes.py | 3 +++ lib/matplotlib/legend.py | 20 ++++++++++++++++++-- 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index 2e94764357de..d83dd5ed3687 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -3925,6 +3925,9 @@ def legend(self, *args, **kwargs): The relative size of legend markers vs. original. If *None*, use rc settings. + *frameon*: [ True | False ] + if True, draw a frame. Default is True + *fancybox*: [ None | False | True ] if True, draw a frame with a round fancybox. If None, use rc diff --git a/lib/matplotlib/legend.py b/lib/matplotlib/legend.py index 1d59f5792cb3..9aa753bddcc6 100644 --- a/lib/matplotlib/legend.py +++ b/lib/matplotlib/legend.py @@ -115,6 +115,7 @@ def __init__(self, parent, handles, labels, title = None, # set a title for the legend bbox_to_anchor = None, # bbox that the legend will be anchored. bbox_transform = None, # transform for the bbox + frameon = True, # draw frame ): """ - *parent* : the artist that contains the legend @@ -132,6 +133,7 @@ def __init__(self, parent, handles, labels, numpoints the number of points in the legend for line scatterpoints the number of points in the legend for scatter plot scatteryoffsets a list of yoffsets for scatter symbols in legend + frameon if True, draw a frame (default is True) fancybox if True, draw a frame with a round fancybox. If None, use rc shadow if True, draw a shadow behind legend ncol number of columns @@ -303,7 +305,7 @@ def __init__(self, parent, handles, labels, self._set_artist_props(self.legendPatch) - self._drawFrame = True + self._drawFrame = frameon # init with null renderer self._init_legend_box(handles, labels) @@ -687,7 +689,7 @@ def _auto_legend_data(self): def draw_frame(self, b): 'b is a boolean. Set draw frame to b' - self._drawFrame = b + self.set_frame_on(b) def get_children(self): 'return a list of child artists' @@ -737,6 +739,20 @@ def get_window_extent(self): return self.legendPatch.get_window_extent() + def get_frame_on(self): + """ + Get whether the legend box patch is drawn + """ + return self._drawFrame + + def set_frame_on(self, b): + """ + Set whether the legend box patch is drawn + + ACCEPTS: [ *True* | *False* ] + """ + self._drawFrame = b + def get_bbox_to_anchor(self): """ return the bbox that the legend will be anchored From 0b800d34c06a0648ca235cbd0f02c726e5c56a98 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Sat, 3 Oct 2009 18:11:09 +0000 Subject: [PATCH 0300/1000] add PathPatch3d in mplot3d.art3d svn path=/trunk/matplotlib/; revision=7842 --- examples/mplot3d/pathpatch3d_demo.py | 52 ++++++++++++++++++++++++++++ lib/mpl_toolkits/mplot3d/art3d.py | 34 ++++++++++++++++++ 2 files changed, 86 insertions(+) create mode 100644 examples/mplot3d/pathpatch3d_demo.py diff --git a/examples/mplot3d/pathpatch3d_demo.py b/examples/mplot3d/pathpatch3d_demo.py new file mode 100644 index 000000000000..d2bdb7582fd2 --- /dev/null +++ b/examples/mplot3d/pathpatch3d_demo.py @@ -0,0 +1,52 @@ +import matplotlib.pyplot as plt +from matplotlib.patches import Circle, PathPatch +from mpl_toolkits.mplot3d import Axes3D +import mpl_toolkits.mplot3d.art3d as art3d +from matplotlib.text import TextPath +from matplotlib.transforms import Affine2D + + +def text3d(ax, (x, y, z), s, zdir="z", size=None, angle=0, usetex=False, + **kwargs): + + if zdir == "y": + xy1, z1 = (x, z), y + elif zdir == "y": + xy1, z1 = (y, z), x + else: + xy1, z1 = (x, y), z + + text_path = TextPath((0, 0), s, size=size, usetex=usetex) + trans = Affine2D().rotate(angle).translate(xy1[0], xy1[1]) + + p1 = PathPatch(trans.transform_path(text_path), **kwargs) + ax.add_patch(p1) + art3d.pathpatch_2d_to_3d(p1, z=z1, zdir=zdir) + + +fig = plt.figure() +ax = Axes3D(fig) + +p = Circle((5, 5), 3) +ax.add_patch(p) +art3d.pathpatch_2d_to_3d(p, z=0, zdir="x") + + +text3d(ax, (4, -2, 0), "X-axis", zdir="z", size=.5, usetex=False, + ec="none", fc="k") +text3d(ax, (12, 4, 0), "Y-axis", zdir="z", size=.5, usetex=False, angle=.5*3.14159, + ec="none", fc="k") +text3d(ax, (12, 10, 4), "Z-axis", zdir="y", size=.5, usetex=False, angle=.5*3.14159, + ec="none", fc="k") + +text3d(ax, (1, 5, 0), + r"$\displaystyle G_{\mu\nu} + \Lambda g_{\mu\nu} = \frac{8\pi G}{c^4} T_{\mu\nu} $", + zdir="z", size=1, usetex=True, + ec="none", fc="k") + +ax.set_xlim3d(0, 10) +ax.set_ylim3d(0, 10) +ax.set_zlim3d(0, 10) + +plt.show() + diff --git a/lib/mpl_toolkits/mplot3d/art3d.py b/lib/mpl_toolkits/mplot3d/art3d.py index cec906e42360..a9dfae7742ae 100644 --- a/lib/mpl_toolkits/mplot3d/art3d.py +++ b/lib/mpl_toolkits/mplot3d/art3d.py @@ -217,6 +217,31 @@ def do_3d_projection(self, renderer): def draw(self, renderer): Patch.draw(self, renderer) + +class PathPatch3D(Patch3D): + ''' + 3D PathPatch object. + ''' + + def __init__(self, path, **kwargs): + zs = kwargs.pop('zs', []) + zdir = kwargs.pop('zdir', 'z') + Patch.__init__(self, **kwargs) + self.set_3d_properties(path, zs, zdir) + + def set_3d_properties(self, path, zs=0, zdir='z'): + Patch3D.set_3d_properties(self, path.vertices, zs=zs, zdir=zdir) + self._code3d = path.codes + + def do_3d_projection(self, renderer): + s = self._segment3d + xs, ys, zs = zip(*s) + vxs, vys,vzs, vis = proj3d.proj_transform_clip(xs, ys, zs, renderer.M) + self._path2d = mpath.Path(zip(vxs, vys), self._code3d) + # FIXME: coloring + self._facecolor2d = self._facecolor3d + return min(vzs) + def get_patch_verts(patch): """Return a list of vertices for the path of a patch.""" trans = patch.get_patch_transform() @@ -233,6 +258,15 @@ def patch_2d_to_3d(patch, z=0, zdir='z'): patch.__class__ = Patch3D patch.set_3d_properties(verts, z, zdir) +def pathpatch_2d_to_3d(pathpatch, z=0, zdir='z'): + """Convert a PathPatch to a PathPatch3D object.""" + path = pathpatch.get_path() + trans = pathpatch.get_patch_transform() + + mpath = trans.transform_path(path) + pathpatch.__class__ = PathPatch3D + pathpatch.set_3d_properties(mpath, z, zdir) + class Patch3DCollection(PatchCollection): ''' A collection of 3D patches. From ef5506b970e1cc12a0e4bbced2d2f80ac1944874 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Sun, 4 Oct 2009 18:55:18 +0000 Subject: [PATCH 0301/1000] @image_comparison now makes a generator that yields a test case for each file format (currently png, pdf) svn path=/trunk/matplotlib/; revision=7843 --- lib/matplotlib/testing/decorators.py | 128 +++++++++++++++------------ 1 file changed, 73 insertions(+), 55 deletions(-) diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index d3652ab90d10..bcc849761ff0 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -42,66 +42,84 @@ def image_comparison(baseline_images=None): compare images generated by the test with those specified in *baseline_images*, which must correspond else an ImageComparisonFailure exception will be raised. - """ if baseline_images is None: raise ValueError('baseline_images must be specified') - def compare_images_decorator(func): - def decorated_compare_images(*args,**kwargs): - # compute baseline image directory - module_name = func.__module__ - if module_name=='__main__': - # FIXME: this won't work for nested packages in matplotlib.tests - import warnings - warnings.warn('test module run as script. guessing baseline image locations') - script_name = sys.argv[0] - basedir = os.path.abspath(os.path.dirname(script_name)) - subdir = os.path.splitext(os.path.split(script_name)[1])[0] - else: - mods = module_name.split('.') - assert mods.pop(0)=='matplotlib' - assert mods.pop(0)=='tests' - subdir = os.path.join(*mods) - basedir = os.path.dirname(matplotlib.tests.__file__) - baseline_dir = os.path.join(basedir,'baseline_images',subdir) - result_dir = os.path.join(basedir,'current_images',subdir) - if not os.path.exists(result_dir): - try: - # make the current_images directory first - os.mkdir(os.path.join(basedir,'current_images')) - except OSError: - pass # probably exists already - os.mkdir(result_dir) + # The multiple layers of defs are required because of how + # parameterized decorators work, and because we want to turn the + # single test_foo function to a generator that generates a + # separate test case for each file format. + def compare_images_decorator(func): + baseline_dir, result_dir = _image_directories(func) + # Only run the test if there is a baseline image in the + # correct format for comparison. + extensions = [ext for ext in ['png', 'pdf'] + if os.path.exists(os.path.join( + baseline_dir, baseline_images[0] + '.' + ext))] - for extension in ['png', 'pdf']: - # set the default format of savefig - matplotlib.rc('savefig', extension=extension) - # change to the result directory for the duration of the test - old_dir = os.getcwd() - os.chdir(result_dir) - try: - last_result = func(*args,**kwargs) # actually call the test function - finally: - os.chdir(old_dir) - for fname in baseline_images: - actual = os.path.join(result_dir, fname) + '.' + extension - expected = os.path.join(baseline_dir,fname) + '.' + extension - if (extension not in comparable_formats() - or not os.path.exists(expected)): - # FIXME: Should it be a known fail if this format - # cannot be compared in this environment? - continue + def compare_images_generator(): + for extension in extensions: + @knownfailureif(extension not in comparable_formats(), + 'Cannot compare %s files on this system' % extension) + def decorated_compare_images(): + # set the default format of savefig + matplotlib.rc('savefig', extension=extension) + # change to the result directory for the duration of the test + old_dir = os.getcwd() + os.chdir(result_dir) + try: + result = func() # actually call the test function + finally: + os.chdir(old_dir) + for fname in baseline_images: + actual = os.path.join(result_dir, fname) + '.' + extension + expected = os.path.join(baseline_dir,fname) + '.' + extension - # compare the images - tol=1e-3 # default tolerance - err = compare_images( expected, actual, tol, - in_decorator=True ) - if err: - raise ImageComparisonFailure( - 'images not close: %(actual)s vs. %(expected)s ' - '(RMS %(rms).3f)'%err) - return last_result - return nose.tools.make_decorator(func)(decorated_compare_images) + # compare the images + tol=1e-3 # default tolerance + err = compare_images( expected, actual, tol, + in_decorator=True ) + if err: + raise ImageComparisonFailure( + 'images not close: %(actual)s vs. %(expected)s ' + '(RMS %(rms).3f)'%err) + return result + yield (decorated_compare_images,) + return nose.tools.make_decorator(func)(compare_images_generator) return compare_images_decorator + +def _image_directories(func): + """ + Compute the baseline and result image directories for testing *func*. + Create the result directory if it doesn't exist. + """ + module_name = func.__module__ + if module_name=='__main__': + # FIXME: this won't work for nested packages in matplotlib.tests + import warnings + warnings.warn('test module run as script. guessing baseline image locations') + script_name = sys.argv[0] + basedir = os.path.abspath(os.path.dirname(script_name)) + subdir = os.path.splitext(os.path.split(script_name)[1])[0] + else: + mods = module_name.split('.') + assert mods.pop(0)=='matplotlib' + assert mods.pop(0)=='tests' + subdir = os.path.join(*mods) + basedir = os.path.dirname(matplotlib.tests.__file__) + + baseline_dir = os.path.join(basedir,'baseline_images',subdir) + result_dir = os.path.join(basedir,'current_images',subdir) + + if not os.path.exists(result_dir): + try: + # make the current_images directory first + os.mkdir(os.path.join(basedir,'current_images')) + except OSError: + pass # probably exists already + os.mkdir(result_dir) + + return baseline_dir, result_dir + From b64efafcfae3e7d2bd1f08f852f112c31a70a4fc Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Mon, 5 Oct 2009 02:12:36 +0000 Subject: [PATCH 0302/1000] Merged revisions 7840-7844 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7844 | leejjoon | 2009-10-04 22:05:16 -0400 (Sun, 04 Oct 2009) | 1 line image created by imshow support remove method ........ svn path=/trunk/matplotlib/; revision=7845 --- lib/matplotlib/axes.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index d83dd5ed3687..a605562f383c 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -6257,6 +6257,7 @@ def imshow(self, X, cmap=None, norm=None, aspect=None, if self._autoscaleYon: self.set_ylim((ymin, ymax)) self.images.append(im) + im._remove_method = lambda h: self.images.remove(h) return im From 720c94aba09ad34614096f2bcc8c7035402c2517 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Mon, 5 Oct 2009 23:46:36 +0000 Subject: [PATCH 0303/1000] Merged revisions 7846-7847 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7846 | efiring | 2009-10-05 12:44:38 -1000 (Mon, 05 Oct 2009) | 8 lines Tk directory-finding patch by Benjamin Drung. Fixes the following: Guess the correct directory in Debian/Ubuntu fails. Replacing all tcl by tk does not lead to a correct directory: /usr/share/tcltk/tcl8.5 -> /usr/share/tktk/tk8.5 The correct directory is /usr/share/tcltk/tk8.5 ........ r7847 | efiring | 2009-10-05 13:11:10 -1000 (Mon, 05 Oct 2009) | 2 lines Add more platforms to setupext.py; patch by Benjamin Drung ........ svn path=/trunk/matplotlib/; revision=7848 --- setupext.py | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/setupext.py b/setupext.py index 0c6e888dc5fe..d0b316561dfe 100644 --- a/setupext.py +++ b/setupext.py @@ -47,6 +47,10 @@ basedir = { 'win32' : ['win32_static',], + 'linux2-alpha' : ['/usr/local', '/usr'], + 'linux2-hppa' : ['/usr/local', '/usr'], + 'linux2-mips' : ['/usr/local', '/usr'], + 'linux2-sparc' : ['/usr/local', '/usr'], 'linux2' : ['/usr/local', '/usr'], 'linux' : ['/usr/local', '/usr',], 'cygwin' : ['/usr/local', '/usr',], @@ -65,6 +69,8 @@ 'sunos5' : [os.getenv('MPLIB_BASE') or '/usr/local',], 'gnukfreebsd5' : ['/usr/local', '/usr'], 'gnukfreebsd6' : ['/usr/local', '/usr'], + 'gnukfreebsd7' : ['/usr/local', '/usr'], + 'gnukfreebsd8' : ['/usr/local', '/usr'], 'aix5' : ['/usr/local'], } @@ -850,7 +856,11 @@ def query_tcltk(): else: tcl_lib_dir = str(tcl.getvar('tcl_library')) # Guess Tk location based on Tcl location - tk_lib_dir = tcl_lib_dir.replace('Tcl', 'Tk').replace('tcl', 'tk') + (head, tail) = os.path.split(tcl_lib_dir) + tail = tail.replace('Tcl', 'Tk').replace('tcl', 'tk') + tk_lib_dir = os.path.join(head, tail) + if not os.path.exists(tk_lib_dir): + tk_lib_dir = tcl_lib_dir.replace('Tcl', 'Tk').replace('tcl', 'tk') else: # Obtain Tcl and Tk locations from Tk widget tk.withdraw() From 2331935ad498b3776dcb545389ce72f4c0967dad Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 6 Oct 2009 14:08:30 +0000 Subject: [PATCH 0304/1000] Merged revisions 7849 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7849 | mdboom | 2009-10-06 10:07:08 -0400 (Tue, 06 Oct 2009) | 2 lines Don't do "make.py clean" in terms of svn-clean, since that doesn't work with a tarball. ........ svn path=/trunk/matplotlib/; revision=7850 --- doc/make.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/doc/make.py b/doc/make.py index 666490a7d076..37c886a2df92 100755 --- a/doc/make.py +++ b/doc/make.py @@ -65,7 +65,18 @@ def latex(): print 'latex build has not been tested on windows' def clean(): - os.system('svn-clean') + shutil.rmtree("build") + shutil.rmtree("examples") + for pattern in ['doc/mpl_examples/api/*.png', + 'doc/mpl_examples/pylab_examples/*.png', + 'doc/mpl_examples/pylab_examples/*.pdf', + 'doc/mpl_examples/units/*.png', + 'doc/pyplots/tex_demo.png', + 'doc/_static/matplotlibrc', + 'doc/_templates/gallery.html']: + for filename in glob.glob(pattern): + if os.path.exists(filename): + os.remove(filename) def all(): #figs() @@ -86,6 +97,10 @@ def all(): small_docs = False +# Change directory to the one containing this file +current_dir = os.getcwd() +os.chdir(os.path.dirname(os.path.join(current_dir, __file__))) + if len(sys.argv)>1: if '--small' in sys.argv[1:]: small_docs = True @@ -99,3 +114,4 @@ def all(): else: small_docs = False all() +os.chdir(current_dir) From 4d4378b0586236bb01f73223ae0b33bf3c7025fb Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Tue, 6 Oct 2009 15:01:19 +0000 Subject: [PATCH 0305/1000] docs: update git instructions for re-built git/svn mirror svn path=/trunk/matplotlib/; revision=7851 --- doc/devel/coding_guide.rst | 82 +++++++++----------------------------- 1 file changed, 19 insertions(+), 63 deletions(-) diff --git a/doc/devel/coding_guide.rst b/doc/devel/coding_guide.rst index 83f8044700b5..1911078a52df 100644 --- a/doc/devel/coding_guide.rst +++ b/doc/devel/coding_guide.rst @@ -169,15 +169,18 @@ There is an experimental `matplotlib github mirror`_ of the subversion repository. To make a local clone of it in the directory ``mpl.git``, enter the following commands:: - # This will create your copy in the mpl.git directory - git clone git://github.com/astraw/matplotlib.git mpl.git + + # Download the entire git repository into "mpl.git", name the source repository "svn". + git clone --origin svn git@github.com:astraw/matplotlib.git mpl.git + + # Change into the newly created git repository. cd mpl.git - git config --add remote.origin.fetch +refs/remotes/*:refs/remotes/* - git fetch - git svn init --branches=branches --trunk=trunk/matplotlib --tags=tags https://matplotlib.svn.sourceforge.net/svnroot/matplotlib - # Now just get the latest svn revisions from the SourceForge SVN repository - git svn fetch -r 6800:HEAD + # Setup the subversion mirroring. + git svn init --trunk=trunk/matplotlib --prefix=svn/ https://matplotlib.svn.sourceforge.net/svnroot/matplotlib + + # Tell git svn to analyze the subversion history + git svn rebase -l .. _matplotlib github mirror: http://github.com/astraw/matplotlib @@ -193,9 +196,9 @@ Using git The following is a suggested workflow for git/git-svn. Start with a virgin tree in sync with the svn trunk on the git branch -"master":: +"trunk":: - git checkout master + git checkout trunk git svn rebase To create a new, local branch called "whizbang-branch":: @@ -209,72 +212,25 @@ Do make commits to the local branch:: git commit -m "modified a bunch of files" # repeat this as necessary -Now, go back to the master branch and append the history of your branch -to the master branch, which will end up as the svn trunk:: +Now, go back to the trunk branch and append the history of your branch +to the git trunk branch, which will end up as the svn trunk:: - git checkout master + git checkout trunk git svn rebase # Ensure we have most recent svn - git rebase whizbang-branch # Append whizbang changes to master branch + git rebase whizbang-branch # Append whizbang changes to trunk branch git svn dcommit -n # Check that this will apply to svn git svn dcommit # Actually apply to svn Finally, you may want to continue working on your whizbang-branch, so -rebase it to the new master:: +rebase it to the new trunk:: git checkout whizbang-branch - git rebase master - -If you get the dreaded "Unable to determine upstream SVN information -from working tree history" error when running "git svn rebase", try -creating a new git branch based on subversion trunk and cherry pick -your patches onto that:: - - git checkout -b work remotes/trunk # create a new "work" branch - git cherry-pick # where will get applied to new branch + git rebase trunk Working on a maintenance branch from git ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ -The matplotlib maintenance branches are also available through git. -(Note that the ``git svn init`` line in the instructions above was -updated to make this possible. If you created your git mirror without -a ``--branches`` option, you will need to perform all of the steps -again in a new directory). - -You can see which branches are available with:: - - git branch -a - -To switch your working copy to the 0.98.5 maintenance branch:: - - git checkout v0_98_5_maint - -Then you probably want to (as above) create a new local branch based -on that branch:: - - git checkout -b whizbang-branch - -When you ``git svn dcommit`` from a maintenance branch, it will commit -to that branch, not to the trunk. - -While it should theoretically be possible to perform merges from a git -maintenance branch to a git trunk and then commit those changes back -to the SVN trunk, I have yet to find the magic incantation to make -that work. However, svnmerge as described `above `_ can be -used and in fact works quite well. - -A note about git write access -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ - -The matplotlib developers need to figure out if there should be write -access to the git repository. This implies using the personal URL -(``git@github.com:astraw/matplotlib.git``) rather than the public URL -(``git://github.com/astraw/matplotlib.git``) for the -repository. However, doing so may make life complicated in the sense -that then there are two writeable matplotlib repositories, which must -be synced to prevent divergence. This is probably not an -insurmountable problem, but it is a problem that the developers should -reach a consensus about. Watch this space... +The matplotlib maintenance branches are not available through git. .. _style-guide: From d538367dd6fdafd7bacbd0126f1be95262c4e8fb Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Tue, 6 Oct 2009 15:13:44 +0000 Subject: [PATCH 0306/1000] testing: add trivial comment (Really this is a test commit to debug the buildbot testing infrastructure.) svn path=/trunk/matplotlib/; revision=7852 --- lib/matplotlib/testing/decorators.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index bcc849761ff0..3c9a20b3982b 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -28,6 +28,7 @@ def failer(*args, **kwargs): result = f(*args, **kwargs) except: if fail_condition: + # (Keep the next ultra-long comment so in shows in console.) raise KnownFailureTest(msg) # An error here when running nose means that you don't have the matplotlib.testing.noseclasses:KnownFailure plugin in use. else: raise From 6ac5e37d65094759044d610e5c47c7eee709c66a Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Tue, 6 Oct 2009 15:42:19 +0000 Subject: [PATCH 0307/1000] trivial: delete trailing whitespace from source code lines (This is really an excuse to make an SVN commit to trigger the buildbot.) svn path=/trunk/matplotlib/; revision=7853 --- lib/matplotlib/artist.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/artist.py b/lib/matplotlib/artist.py index 23b47a9be5d9..0bea625bd2be 100644 --- a/lib/matplotlib/artist.py +++ b/lib/matplotlib/artist.py @@ -88,7 +88,7 @@ def __init__(self): self._contains = None self._rasterized = None self._agg_filter = None - + self.eventson = False # fire events only if eventson self._oid = 0 # an observer id self._propobservers = {} # a dict from oids to funcs @@ -581,7 +581,7 @@ def get_agg_filter(self): def set_agg_filter(self, filter_func): """ set agg_filter fuction. - + """ self._agg_filter = filter_func From 18c62db4537b85a268a1abac40b59013d308e3a5 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Tue, 6 Oct 2009 15:47:13 +0000 Subject: [PATCH 0308/1000] trivial: delete trailing whitespace from source code lines (This is really an excuse to make an SVN commit to trigger the buildbot.) svn path=/trunk/matplotlib/; revision=7854 --- lib/matplotlib/transforms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/transforms.py b/lib/matplotlib/transforms.py index 63dba7d396d4..edbd978060b0 100644 --- a/lib/matplotlib/transforms.py +++ b/lib/matplotlib/transforms.py @@ -956,7 +956,7 @@ def mutatedy(self): self._points[1,1]!=self._points_orig[1,1]) - + class TransformedBbox(BboxBase): """ From 3e5ae2d979cb85059ebc20a9380e2719cefba81f Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Tue, 6 Oct 2009 15:53:34 +0000 Subject: [PATCH 0309/1000] trivial: delete trailing whitespace from source code lines (This is really an excuse to make an SVN commit to trigger the buildbot.) svn path=/trunk/matplotlib/; revision=7855 --- lib/matplotlib/backend_bases.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index f7f861a30f8b..8a6ad9ee2dad 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -390,18 +390,18 @@ def _draw_text_as_path(self, gc, x, y, s, prop, angle, ismath): *s* text to be converted - + *usetex* If True, use matplotlib usetex mode. *ismath* If True, use mathtext parser. If "TeX", use *usetex* mode. """ - + text2path = self._text2path color = gc.get_rgb()[:3] fontsize = self.points_to_pixels(prop.get_size_in_points()) - + if ismath == "TeX": verts, codes = text2path.get_text_path(prop, s, ismath=False, usetex=True) else: From b95eefb85f07550ea3fc221bbb14b81dd021041a Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Wed, 7 Oct 2009 16:03:08 +0000 Subject: [PATCH 0310/1000] fix savefig not to raise an error when file object is given svn path=/trunk/matplotlib/; revision=7856 --- lib/matplotlib/figure.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index 3ce71840aaf4..0efe4267980f 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -16,7 +16,7 @@ import artist from artist import Artist, allow_rasterization from axes import Axes, SubplotBase, subplot_class_factory -from cbook import flatten, allequal, Stack, iterable +from cbook import flatten, allequal, Stack, iterable, is_string_like import _image import colorbar as cbar from image import FigureImage @@ -1038,7 +1038,7 @@ def savefig(self, *args, **kwargs): kwargs[key] = rcParams['savefig.%s'%key] extension = rcParams['savefig.extension'] - if args and '.' not in args[0] and extension != 'auto': + if args and is_string_like(args[0]) and '.' not in args[0] and extension != 'auto': fname = args[0] + '.' + extension args = (fname,) + args[1:] From b7479ef74f25e5824affde59d2a094311f9b95d1 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Wed, 7 Oct 2009 16:03:23 +0000 Subject: [PATCH 0311/1000] patches.Arc.get_path returns the original arc path (instead of ellipse or truncated arc) svn path=/trunk/matplotlib/; revision=7857 --- lib/matplotlib/patches.py | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 6bf2651d0a6d..ceb9b3373007 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -1219,6 +1219,9 @@ def __init__(self, xy, width, height, angle=0.0, theta1=0.0, theta2=360.0, **kwa self.theta1 = theta1 self.theta2 = theta2 + self._path = Path.arc(self.theta1, self.theta2) + + @allow_rasterization def draw(self, renderer): """ @@ -1278,7 +1281,7 @@ def draw(self, renderer): inv_error = (1.0 / 1.89818e-6) * 0.5 if width < inv_error and height < inv_error: - self._path = Path.arc(self.theta1, self.theta2) + #self._path = Path.arc(self.theta1, self.theta2) return Patch.draw(self, renderer) def iter_circle_intersect_on_line(x0, y0, x1, y1): @@ -1360,15 +1363,22 @@ def iter_circle_intersect_on_line_seg(x0, y0, x1, y1): last_theta = theta1 theta1_rad = theta1 * DEG2RAD inside = box_path.contains_point((np.cos(theta1_rad), np.sin(theta1_rad))) + + # save original path + path_original = self._path for theta in thetas: if inside: - self._path = Path.arc(last_theta, theta, 8) + _path = Path.arc(last_theta, theta, 8) Patch.draw(self, renderer) inside = False else: inside = True last_theta = theta + # restore original path + self._path = path_original + + def bbox_artist(artist, renderer, props=None, fill=True): """ This is a debug function to draw a rectangle around the bounding From 02b98725e4faf9a70da9e1fef0cc852b8190509a Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Fri, 9 Oct 2009 15:31:59 +0000 Subject: [PATCH 0312/1000] Merged revisions 7858 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7858 | mdboom | 2009-10-09 11:24:25 -0400 (Fri, 09 Oct 2009) | 2 lines Don't perform path simplification when hatch is drawn. ........ svn path=/trunk/matplotlib/; revision=7859 --- src/_backend_agg.cpp | 384 ++++++++++++++++++++++--------------------- 1 file changed, 193 insertions(+), 191 deletions(-) diff --git a/src/_backend_agg.cpp b/src/_backend_agg.cpp index ccaf1976dbe3..48ade9e85e76 100644 --- a/src/_backend_agg.cpp +++ b/src/_backend_agg.cpp @@ -57,7 +57,7 @@ (GCAgg::dash_t) */ void convert_dashes(const Py::Tuple& dashes, double dpi, GCAgg::dash_t& dashes_out, - double& dashOffset_out) { + double& dashOffset_out) { if (dashes.length()!=2) throw Py::ValueError(Printf("Dash descriptor must be a length 2 tuple; found %d", dashes.length()).str()); @@ -299,7 +299,7 @@ const size_t RendererAgg::PIXELS_PER_INCH(96); RendererAgg::RendererAgg(unsigned int width, unsigned int height, double dpi, - int debug) : + int debug) : width(width), height(height), dpi(dpi), @@ -325,7 +325,7 @@ RendererAgg::RendererAgg(unsigned int width, unsigned int height, double dpi, _VERBOSE("RendererAgg::RendererAgg"); unsigned stride(width*4); - pixBuffer = new agg::int8u[NUMBYTES]; + pixBuffer = new agg::int8u[NUMBYTES]; renderingBuffer.attach(pixBuffer, width, height, stride); pixFmt.attach(renderingBuffer); rendererBase.attach(pixFmt); @@ -338,7 +338,7 @@ RendererAgg::RendererAgg(unsigned int width, unsigned int height, double dpi, void RendererAgg::create_alpha_buffers() { if (!alphaBuffer) { unsigned stride(width*4); - alphaBuffer = new agg::int8u[NUMBYTES]; + alphaBuffer = new agg::int8u[NUMBYTES]; alphaMaskRenderingBuffer.attach(alphaBuffer, width, height, stride); rendererBaseAlphaMask.attach(pixfmtAlphaMask); rendererAlphaMask.attach(rendererBaseAlphaMask); @@ -429,9 +429,9 @@ RendererAgg::restore_region(const Py::Tuple& args) { agg::rendering_buffer rbuf; rbuf.attach(region->data, - region->width, - region->height, - region->stride); + region->width, + region->height, + region->stride); rendererBase.copy_from(rbuf, 0, region->rect.x1, region->rect.y1); @@ -466,14 +466,14 @@ RendererAgg::restore_region2(const Py::Tuple& args) { throw Py::ValueError("Cannot restore_region from NULL data"); agg::rect_i rect(xx1-region->rect.x1, (yy1-region->rect.y1), - xx2-region->rect.x1, (yy2-region->rect.y1)); + xx2-region->rect.x1, (yy2-region->rect.y1)); agg::rendering_buffer rbuf; rbuf.attach(region->data, - region->width, - region->height, - region->stride); + region->width, + region->height, + region->stride); rendererBase.copy_from(rbuf, &rect, x, y); @@ -513,21 +513,21 @@ bool RendererAgg::render_clippath(const Py::Object& clippath, const agg::trans_a Py::Object RendererAgg::draw_markers(const Py::Tuple& args) { - typedef agg::conv_transform transformed_path_t; - typedef PathQuantizer quantize_t; - typedef agg::conv_curve curve_t; - typedef agg::conv_stroke stroke_t; + typedef agg::conv_transform transformed_path_t; + typedef PathQuantizer quantize_t; + typedef agg::conv_curve curve_t; + typedef agg::conv_stroke stroke_t; typedef agg::pixfmt_amask_adaptor pixfmt_amask_type; - typedef agg::renderer_base amask_ren_type; + typedef agg::renderer_base amask_ren_type; typedef agg::renderer_scanline_aa_solid amask_aa_renderer_type; typedef agg::renderer_scanline_bin_solid amask_bin_renderer_type; args.verify_length(5, 6); - Py::Object gc_obj = args[0]; - Py::Object marker_path_obj = args[1]; + Py::Object gc_obj = args[0]; + Py::Object marker_path_obj = args[1]; agg::trans_affine marker_trans = py_to_agg_transformation_matrix(args[2].ptr()); - Py::Object path_obj = args[3]; - agg::trans_affine trans = py_to_agg_transformation_matrix(args[4].ptr()); + Py::Object path_obj = args[3]; + agg::trans_affine trans = py_to_agg_transformation_matrix(args[4].ptr()); Py::Object face_obj; if (args.size() == 6) face_obj = args[5]; @@ -542,15 +542,15 @@ RendererAgg::draw_markers(const Py::Tuple& args) { PathIterator marker_path(marker_path_obj); transformed_path_t marker_path_transformed(marker_path, marker_trans); quantize_t marker_path_quantized(marker_path_transformed, - gc.quantize_mode, + gc.quantize_mode, marker_path.total_vertices()); curve_t marker_path_curve(marker_path_quantized); PathIterator path(path_obj); transformed_path_t path_transformed(path, trans); quantize_t path_quantized(path_transformed, - gc.quantize_mode, - path.total_vertices()); + gc.quantize_mode, + path.total_vertices()); curve_t path_curve(path_quantized); path_curve.rewind(0); @@ -574,7 +574,7 @@ RendererAgg::draw_markers(const Py::Tuple& args) { agg::render_scanlines(theRasterizer, slineP8, scanlines); fillSize = scanlines.byte_size(); if (fillSize >= MARKER_CACHE_SIZE) - fillCache = new agg::int8u[fillSize]; + fillCache = new agg::int8u[fillSize]; scanlines.serialize(fillCache); } @@ -616,24 +616,24 @@ RendererAgg::draw_markers(const Py::Tuple& args) { // Cull points outside the boundary of the image. Values // that are too large may overflow and create segfaults. - // because they can create segfaults of they overflow; eg - // http://sourceforge.net/tracker/?func=detail&aid=2865490&group_id=80706&atid=560720 + // because they can create segfaults of they overflow; eg + // http://sourceforge.net/tracker/?func=detail&aid=2865490&group_id=80706&atid=560720 if (!clipping_rect.hit_test(x, y)) { continue; } - pixfmt_amask_type pfa(pixFmt, alphaMask); - amask_ren_type r(pfa); - amask_aa_renderer_type ren(r); - - if (face.first) { - ren.color(face.second); - sa.init(fillCache, fillSize, x, y); - agg::render_scanlines(sa, sl, ren); - } - ren.color(gc.color); - sa.init(strokeCache, strokeSize, x, y); - agg::render_scanlines(sa, sl, ren); + pixfmt_amask_type pfa(pixFmt, alphaMask); + amask_ren_type r(pfa); + amask_aa_renderer_type ren(r); + + if (face.first) { + ren.color(face.second); + sa.init(fillCache, fillSize, x, y); + agg::render_scanlines(sa, sl, ren); + } + ren.color(gc.color); + sa.init(strokeCache, strokeSize, x, y); + agg::render_scanlines(sa, sl, ren); } } else { while (path_curve.vertex(&x, &y) != agg::path_cmd_stop) { @@ -645,21 +645,21 @@ RendererAgg::draw_markers(const Py::Tuple& args) { // Cull points outside the boundary of the image. Values // that are too large may overflow and create segfaults. - // because they can create segfaults of they overflow; eg - // http://sourceforge.net/tracker/?func=detail&aid=2865490&group_id=80706&atid=560720 + // because they can create segfaults of they overflow; eg + // http://sourceforge.net/tracker/?func=detail&aid=2865490&group_id=80706&atid=560720 if (!clipping_rect.hit_test(x, y)) { continue; } - if (face.first) { - rendererAA.color(face.second); - sa.init(fillCache, fillSize, x, y); - agg::render_scanlines(sa, sl, rendererAA); - } + if (face.first) { + rendererAA.color(face.second); + sa.init(fillCache, fillSize, x, y); + agg::render_scanlines(sa, sl, rendererAA); + } - rendererAA.color(gc.color); - sa.init(strokeCache, strokeSize, x, y); - agg::render_scanlines(sa, sl, rendererAA); + rendererAA.color(gc.color); + sa.init(strokeCache, strokeSize, x, y); + agg::render_scanlines(sa, sl, rendererAA); } } } catch(...) { @@ -883,12 +883,12 @@ RendererAgg::draw_image(const Py::Tuple& args) { template void RendererAgg::_draw_path(path_t& path, bool has_clippath, - const facepair_t& face, const GCAgg& gc) { - typedef agg::conv_stroke stroke_t; - typedef agg::conv_dash dash_t; - typedef agg::conv_stroke stroke_dash_t; + const facepair_t& face, const GCAgg& gc) { + typedef agg::conv_stroke stroke_t; + typedef agg::conv_dash dash_t; + typedef agg::conv_stroke stroke_dash_t; typedef agg::pixfmt_amask_adaptor pixfmt_amask_type; - typedef agg::renderer_base amask_ren_type; + typedef agg::renderer_base amask_ren_type; typedef agg::renderer_scanline_aa_solid amask_aa_renderer_type; typedef agg::renderer_scanline_bin_solid amask_bin_renderer_type; @@ -898,25 +898,25 @@ void RendererAgg::_draw_path(path_t& path, bool has_clippath, if (gc.isaa) { if (has_clippath) { - pixfmt_amask_type pfa(pixFmt, alphaMask); - amask_ren_type r(pfa); - amask_aa_renderer_type ren(r); - ren.color(face.second); - agg::render_scanlines(theRasterizer, slineP8, ren); + pixfmt_amask_type pfa(pixFmt, alphaMask); + amask_ren_type r(pfa); + amask_aa_renderer_type ren(r); + ren.color(face.second); + agg::render_scanlines(theRasterizer, slineP8, ren); } else { - rendererAA.color(face.second); - agg::render_scanlines(theRasterizer, slineP8, rendererAA); + rendererAA.color(face.second); + agg::render_scanlines(theRasterizer, slineP8, rendererAA); } } else { if (has_clippath) { - pixfmt_amask_type pfa(pixFmt, alphaMask); - amask_ren_type r(pfa); - amask_bin_renderer_type ren(r); - ren.color(face.second); - agg::render_scanlines(theRasterizer, slineP8, ren); + pixfmt_amask_type pfa(pixFmt, alphaMask); + amask_ren_type r(pfa); + amask_bin_renderer_type ren(r); + ren.color(face.second); + agg::render_scanlines(theRasterizer, slineP8, ren); } else { - rendererBin.color(face.second); - agg::render_scanlines(theRasterizer, slineP8, rendererBin); + rendererBin.color(face.second); + agg::render_scanlines(theRasterizer, slineP8, rendererBin); } } } @@ -989,14 +989,14 @@ void RendererAgg::_draw_path(path_t& path, bool has_clippath, } else { dash_t dash(path); for (GCAgg::dash_t::const_iterator i = gc.dashes.begin(); - i != gc.dashes.end(); ++i) { - double val0 = i->first; - double val1 = i->second; - if (!gc.isaa) { - val0 = (int)val0 + 0.5; - val1 = (int)val1 + 0.5; - } - dash.add_dash(val0, val1); + i != gc.dashes.end(); ++i) { + double val0 = i->first; + double val1 = i->second; + if (!gc.isaa) { + val0 = (int)val0 + 0.5; + val1 = (int)val1 + 0.5; + } + dash.add_dash(val0, val1); } stroke_dash_t stroke(dash); stroke.line_cap(gc.cap); @@ -1007,25 +1007,25 @@ void RendererAgg::_draw_path(path_t& path, bool has_clippath, if (gc.isaa) { if (has_clippath) { - pixfmt_amask_type pfa(pixFmt, alphaMask); - amask_ren_type r(pfa); - amask_aa_renderer_type ren(r); - ren.color(gc.color); - agg::render_scanlines(theRasterizer, slineP8, ren); + pixfmt_amask_type pfa(pixFmt, alphaMask); + amask_ren_type r(pfa); + amask_aa_renderer_type ren(r); + ren.color(gc.color); + agg::render_scanlines(theRasterizer, slineP8, ren); } else { - rendererAA.color(gc.color); - agg::render_scanlines(theRasterizer, slineP8, rendererAA); + rendererAA.color(gc.color); + agg::render_scanlines(theRasterizer, slineP8, rendererAA); } } else { if (has_clippath) { - pixfmt_amask_type pfa(pixFmt, alphaMask); - amask_ren_type r(pfa); - amask_bin_renderer_type ren(r); - ren.color(gc.color); - agg::render_scanlines(theRasterizer, slineP8, ren); + pixfmt_amask_type pfa(pixFmt, alphaMask); + amask_ren_type r(pfa); + amask_bin_renderer_type ren(r); + ren.color(gc.color); + agg::render_scanlines(theRasterizer, slineP8, ren); } else { - rendererBin.color(gc.color); - agg::render_scanlines(theRasterizer, slineBin, rendererBin); + rendererBin.color(gc.color); + agg::render_scanlines(theRasterizer, slineBin, rendererBin); } } } @@ -1059,8 +1059,8 @@ RendererAgg::draw_path(const Py::Tuple& args) { trans *= agg::trans_affine_scaling(1.0, -1.0); trans *= agg::trans_affine_translation(0.0, (double)height); - bool clip = !face.first; - bool simplify = path.should_simplify() && !face.first; + bool clip = !face.first && gc.hatchpath.isNone(); + bool simplify = path.should_simplify() && clip; transformed_path_t tpath(path, trans); nan_removed_t nan_removed(tpath, true, path.has_curves()); @@ -1081,11 +1081,11 @@ RendererAgg::draw_path(const Py::Tuple& args) { template Py::Object RendererAgg::_draw_path_collection_generic - (agg::trans_affine master_transform, - const Py::Object& cliprect, - const Py::Object& clippath, + (agg::trans_affine master_transform, + const Py::Object& cliprect, + const Py::Object& clippath, const agg::trans_affine& clippath_trans, - const PathGenerator& path_generator, + const PathGenerator& path_generator, const Py::SeqBase& transforms_obj, const Py::Object& offsets_obj, const agg::trans_affine& offset_trans, @@ -1098,8 +1098,8 @@ RendererAgg::_draw_path_collection_generic typedef PathNanRemover nan_removed_t; typedef PathClipper clipped_t; typedef PathQuantizer quantized_t; - typedef agg::conv_curve quantized_curve_t; - typedef agg::conv_curve curve_t; + typedef agg::conv_curve quantized_curve_t; + typedef agg::conv_curve curve_t; GCAgg gc(dpi); @@ -1111,34 +1111,34 @@ RendererAgg::_draw_path_collection_generic offsets = (PyArrayObject*)PyArray_FromObject (offsets_obj.ptr(), PyArray_DOUBLE, 0, 2); if (!offsets || - (PyArray_NDIM(offsets) == 2 && PyArray_DIM(offsets, 1) != 2) || - (PyArray_NDIM(offsets) == 1 && PyArray_DIM(offsets, 0) != 0)) { + (PyArray_NDIM(offsets) == 2 && PyArray_DIM(offsets, 1) != 2) || + (PyArray_NDIM(offsets) == 1 && PyArray_DIM(offsets, 0) != 0)) { throw Py::ValueError("Offsets array must be Nx2"); } facecolors = (PyArrayObject*)PyArray_FromObject (facecolors_obj.ptr(), PyArray_DOUBLE, 1, 2); if (!facecolors || - (PyArray_NDIM(facecolors) == 1 && PyArray_DIM(facecolors, 0) != 0) || - (PyArray_NDIM(facecolors) == 2 && PyArray_DIM(facecolors, 1) != 4)) + (PyArray_NDIM(facecolors) == 1 && PyArray_DIM(facecolors, 0) != 0) || + (PyArray_NDIM(facecolors) == 2 && PyArray_DIM(facecolors, 1) != 4)) throw Py::ValueError("Facecolors must be a Nx4 numpy array or empty"); edgecolors = (PyArrayObject*)PyArray_FromObject (edgecolors_obj.ptr(), PyArray_DOUBLE, 1, 2); if (!edgecolors || - (PyArray_NDIM(edgecolors) == 1 && PyArray_DIM(edgecolors, 0) != 0) || - (PyArray_NDIM(edgecolors) == 2 && PyArray_DIM(edgecolors, 1) != 4)) + (PyArray_NDIM(edgecolors) == 1 && PyArray_DIM(edgecolors, 0) != 0) || + (PyArray_NDIM(edgecolors) == 2 && PyArray_DIM(edgecolors, 1) != 4)) throw Py::ValueError("Edgecolors must be a Nx4 numpy array"); size_t Npaths = path_generator.num_paths(); size_t Noffsets = offsets->dimensions[0]; - size_t N = std::max(Npaths, Noffsets); + size_t N = std::max(Npaths, Noffsets); size_t Ntransforms = std::min(transforms_obj.length(), N); size_t Nfacecolors = facecolors->dimensions[0]; size_t Nedgecolors = edgecolors->dimensions[0]; size_t Nlinewidths = linewidths.length(); size_t Nlinestyles = std::min(linestyles_obj.length(), N); - size_t Naa = antialiaseds.length(); + size_t Naa = antialiaseds.length(); if ((Nfacecolors == 0 && Nedgecolors == 0) || Npaths == 0) return Py::Object(); @@ -1151,7 +1151,7 @@ RendererAgg::_draw_path_collection_generic transforms.reserve(Ntransforms); for (i = 0; i < Ntransforms; ++i) { agg::trans_affine trans = py_to_agg_transformation_matrix - (transforms_obj[i].ptr(), false); + (transforms_obj[i].ptr(), false); trans *= master_transform; transforms.push_back(trans); @@ -1163,7 +1163,7 @@ RendererAgg::_draw_path_collection_generic dashes.resize(Nlinestyles); i = 0; for (dashes_t::iterator d = dashes.begin(); - d != dashes.end(); ++d, ++i) { + d != dashes.end(); ++d, ++i) { convert_dashes(Py::Tuple(linestyles_obj[i]), dpi, d->second, d->first); } @@ -1183,16 +1183,16 @@ RendererAgg::_draw_path_collection_generic typename PathGenerator::path_iterator path = path_generator(i); if (Ntransforms) { - trans = transforms[i % Ntransforms]; + trans = transforms[i % Ntransforms]; } else { - trans = master_transform; + trans = master_transform; } if (Noffsets) { - double xo = *(double*)PyArray_GETPTR2(offsets, i % Noffsets, 0); - double yo = *(double*)PyArray_GETPTR2(offsets, i % Noffsets, 1); - offset_trans.transform(&xo, &yo); - trans *= agg::trans_affine_translation(xo, yo); + double xo = *(double*)PyArray_GETPTR2(offsets, i % Noffsets, 0); + double yo = *(double*)PyArray_GETPTR2(offsets, i % Noffsets, 1); + offset_trans.transform(&xo, &yo); + trans *= agg::trans_affine_translation(xo, yo); } // These transformations must be done post-offsets @@ -1200,56 +1200,58 @@ RendererAgg::_draw_path_collection_generic trans *= agg::trans_affine_translation(0.0, (double)height); if (Nfacecolors) { - size_t fi = i % Nfacecolors; - face.second = agg::rgba(*(double*)PyArray_GETPTR2(facecolors, fi, 0), - *(double*)PyArray_GETPTR2(facecolors, fi, 1), - *(double*)PyArray_GETPTR2(facecolors, fi, 2), - *(double*)PyArray_GETPTR2(facecolors, fi, 3)); + size_t fi = i % Nfacecolors; + face.second = agg::rgba(*(double*)PyArray_GETPTR2(facecolors, fi, 0), + *(double*)PyArray_GETPTR2(facecolors, fi, 1), + *(double*)PyArray_GETPTR2(facecolors, fi, 2), + *(double*)PyArray_GETPTR2(facecolors, fi, 3)); } if (Nedgecolors) { - size_t ei = i % Nedgecolors; - gc.color = agg::rgba(*(double*)PyArray_GETPTR2(edgecolors, ei, 0), - *(double*)PyArray_GETPTR2(edgecolors, ei, 1), - *(double*)PyArray_GETPTR2(edgecolors, ei, 2), - *(double*)PyArray_GETPTR2(edgecolors, ei, 3)); - - if (Nlinewidths) { - gc.linewidth = double(Py::Float(linewidths[i % Nlinewidths])) * dpi/72.0; - } else { - gc.linewidth = 1.0; - } - if (Nlinestyles) { - gc.dashes = dashes[i % Nlinestyles].second; - gc.dashOffset = dashes[i % Nlinestyles].first; - } + size_t ei = i % Nedgecolors; + gc.color = agg::rgba(*(double*)PyArray_GETPTR2(edgecolors, ei, 0), + *(double*)PyArray_GETPTR2(edgecolors, ei, 1), + *(double*)PyArray_GETPTR2(edgecolors, ei, 2), + *(double*)PyArray_GETPTR2(edgecolors, ei, 3)); + + if (Nlinewidths) { + gc.linewidth = double(Py::Float(linewidths[i % Nlinewidths])) * dpi/72.0; + } else { + gc.linewidth = 1.0; + } + if (Nlinestyles) { + gc.dashes = dashes[i % Nlinestyles].second; + gc.dashOffset = dashes[i % Nlinestyles].first; + } } + bool do_clip = !face.first && gc.hatchpath.isNone(); + if (check_snap) { gc.isaa = bool(Py::Int(antialiaseds[i % Naa])); - transformed_path_t tpath(path, trans); + transformed_path_t tpath(path, trans); nan_removed_t nan_removed(tpath, true, has_curves); - clipped_t clipped(nan_removed, !face.first, width, height); + clipped_t clipped(nan_removed, do_clip, width, height); quantized_t quantized(clipped, gc.quantize_mode, path.total_vertices()); - if (has_curves) { - quantized_curve_t curve(quantized); - _draw_path(curve, has_clippath, face, gc); - } else { - _draw_path(quantized, has_clippath, face, gc); - } + if (has_curves) { + quantized_curve_t curve(quantized); + _draw_path(curve, has_clippath, face, gc); + } else { + _draw_path(quantized, has_clippath, face, gc); + } } else { - gc.isaa = bool(Py::Int(antialiaseds[i % Naa])); + gc.isaa = bool(Py::Int(antialiaseds[i % Naa])); - transformed_path_t tpath(path, trans); + transformed_path_t tpath(path, trans); nan_removed_t nan_removed(tpath, true, has_curves); - clipped_t clipped(nan_removed, !face.first, width, height); - if (has_curves) { - curve_t curve(clipped); - _draw_path(curve, has_clippath, face, gc); - } else { - _draw_path(clipped, has_clippath, face, gc); - } + clipped_t clipped(nan_removed, do_clip, width, height); + if (has_curves) { + curve_t curve(clipped); + _draw_path(curve, has_clippath, face, gc); + } else { + _draw_path(clipped, has_clippath, face, gc); + } } } @@ -1294,7 +1296,7 @@ RendererAgg::draw_path_collection(const Py::Tuple& args) { Py::Object gc_obj = args[0]; GCAgg gc(gc_obj, dpi); - agg::trans_affine master_transform = py_to_agg_transformation_matrix(args[1].ptr()); + agg::trans_affine master_transform = py_to_agg_transformation_matrix(args[1].ptr()); Py::SeqBase path = args[2]; PathListGenerator path_generator(path); Py::SeqBase transforms_obj = args[3]; @@ -1302,9 +1304,9 @@ RendererAgg::draw_path_collection(const Py::Tuple& args) { agg::trans_affine offset_trans = py_to_agg_transformation_matrix(args[5].ptr()); Py::Object facecolors_obj = args[6]; Py::Object edgecolors_obj = args[7]; - Py::SeqBase linewidths = args[8]; + Py::SeqBase linewidths = args[8]; Py::SeqBase linestyles_obj = args[9]; - Py::SeqBase antialiaseds = args[10]; + Py::SeqBase antialiaseds = args[10]; // We don't actually care about urls for Agg, so just ignore it. // Py::SeqBase urls = args[11]; @@ -1357,7 +1359,7 @@ class QuadMeshGenerator { public: inline unsigned vertex(double* x, double* y) { if (m_iterator >= total_vertices()) - return agg::path_cmd_stop; + return agg::path_cmd_stop; return vertex(m_iterator++, x, y); } @@ -1408,14 +1410,14 @@ RendererAgg::draw_quad_mesh(const Py::Tuple& args) { //segments, trans, clipbox, colors, linewidths, antialiaseds GCAgg gc(args[0], dpi); - agg::trans_affine master_transform = py_to_agg_transformation_matrix(args[1].ptr()); + agg::trans_affine master_transform = py_to_agg_transformation_matrix(args[1].ptr()); size_t mesh_width = Py::Int(args[2]); size_t mesh_height = Py::Int(args[3]); - PyObject* coordinates = args[4].ptr(); + PyObject* coordinates = args[4].ptr(); Py::Object offsets_obj = args[5]; agg::trans_affine offset_trans = py_to_agg_transformation_matrix(args[6].ptr()); Py::Object facecolors_obj = args[7]; - bool antialiased = (bool)Py::Int(args[8]); + bool antialiased = (bool)Py::Int(args[8]); bool showedges = (bool)Py::Int(args[9]); bool free_edgecolors = false; @@ -1747,8 +1749,8 @@ RendererAgg::tostring_bgra(const Py::Tuple& args) { //todo: how to do this with native CXX PyObject* o = Py_BuildValue("s#", - buf_tmp, - row_len * height); + buf_tmp, + row_len * height); delete [] buf_tmp; return Py::asObject(o); } @@ -1781,10 +1783,10 @@ RendererAgg::tostring_rgba_minimized(const Py::Tuple& args) { for (int y = 0; y < (int)height; ++y) { for (int x = 0; x < (int)width; ++x) { if (*pixel) { - if (x < xmin) xmin = x; - if (y < ymin) ymin = y; - if (x > xmax) xmax = x; - if (y > ymax) ymax = y; + if (x < xmin) xmin = x; + if (y < ymin) ymin = y; + if (x > xmax) xmax = x; + if (y > ymax) ymax = y; } pixel += 4; } @@ -1800,9 +1802,9 @@ RendererAgg::tostring_rgba_minimized(const Py::Tuple& args) { xmax = std::min(xmax, (int)width); ymax = std::min(ymax, (int)height); - newwidth = xmax - xmin; - newheight = ymax - ymin; - int newsize = newwidth * newheight * 4; + newwidth = xmax - xmin; + newheight = ymax - ymin; + int newsize = newwidth * newheight * 4; unsigned char* buf = new unsigned char[newsize]; if (buf == NULL) { @@ -1813,7 +1815,7 @@ RendererAgg::tostring_rgba_minimized(const Py::Tuple& args) { unsigned int* src = (unsigned int*)pixBuffer; for (int y = ymin; y < ymax; ++y) for (int x = xmin; x < xmax; ++x, ++dst) - *dst = src[y * width + x]; + *dst = src[y * width + x]; // The Py::String will take over the buffer data = Py::String((const char *)buf, (int)newsize); @@ -1886,7 +1888,7 @@ RendererAgg::~RendererAgg() { /* ------------ module methods ------------- */ Py::Object _backend_agg_module::new_renderer (const Py::Tuple &args, - const Py::Dict &kws) + const Py::Dict &kws) { if (args.length() != 3 ) @@ -1927,18 +1929,18 @@ void BufferRegion::init_type() { add_varargs_method("set_x", &BufferRegion::set_x, - "set_x(x)"); + "set_x(x)"); add_varargs_method("set_y", &BufferRegion::set_y, - "set_y(y)"); + "set_y(y)"); add_varargs_method("get_extents", &BufferRegion::get_extents, - "get_extents()"); + "get_extents()"); add_varargs_method("to_string", &BufferRegion::to_string, - "to_string()"); + "to_string()"); add_varargs_method("to_string_argb", &BufferRegion::to_string_argb, - "to_string_argb()"); + "to_string_argb()"); } @@ -1948,41 +1950,41 @@ void RendererAgg::init_type() behaviors().doc("The agg backend extension module"); add_varargs_method("draw_path", &RendererAgg::draw_path, - "draw_path(gc, path, transform, rgbFace)\n"); + "draw_path(gc, path, transform, rgbFace)\n"); add_varargs_method("draw_path_collection", &RendererAgg::draw_path_collection, - "draw_path_collection(gc, master_transform, paths, transforms, offsets, offsetTrans, facecolors, edgecolors, linewidths, linestyles, antialiaseds)\n"); + "draw_path_collection(gc, master_transform, paths, transforms, offsets, offsetTrans, facecolors, edgecolors, linewidths, linestyles, antialiaseds)\n"); add_varargs_method("draw_quad_mesh", &RendererAgg::draw_quad_mesh, - "draw_quad_mesh(gc, master_transform, meshWidth, meshHeight, coordinates, offsets, offsetTrans, facecolors, antialiaseds, showedges)\n"); + "draw_quad_mesh(gc, master_transform, meshWidth, meshHeight, coordinates, offsets, offsetTrans, facecolors, antialiaseds, showedges)\n"); add_varargs_method("draw_gouraud_triangle", &RendererAgg::draw_gouraud_triangle, - "draw_gouraud_triangle(gc, points, colors, master_transform)\n"); + "draw_gouraud_triangle(gc, points, colors, master_transform)\n"); add_varargs_method("draw_gouraud_triangles", &RendererAgg::draw_gouraud_triangles, - "draw_gouraud_triangles(gc, points, colors, master_transform)\n"); + "draw_gouraud_triangles(gc, points, colors, master_transform)\n"); add_varargs_method("draw_markers", &RendererAgg::draw_markers, - "draw_markers(gc, marker_path, marker_trans, path, rgbFace)\n"); + "draw_markers(gc, marker_path, marker_trans, path, rgbFace)\n"); add_varargs_method("draw_text_image", &RendererAgg::draw_text_image, - "draw_text_image(font_image, x, y, r, g, b, a)\n"); + "draw_text_image(font_image, x, y, r, g, b, a)\n"); add_varargs_method("draw_image", &RendererAgg::draw_image, - "draw_image(gc, x, y, im)"); + "draw_image(gc, x, y, im)"); add_varargs_method("write_rgba", &RendererAgg::write_rgba, - "write_rgba(fname)"); + "write_rgba(fname)"); add_varargs_method("tostring_rgb", &RendererAgg::tostring_rgb, - "s = tostring_rgb()"); + "s = tostring_rgb()"); add_varargs_method("tostring_argb", &RendererAgg::tostring_argb, - "s = tostring_argb()"); + "s = tostring_argb()"); add_varargs_method("tostring_bgra", &RendererAgg::tostring_bgra, - "s = tostring_bgra()"); + "s = tostring_bgra()"); add_varargs_method("tostring_rgba_minimized", &RendererAgg::tostring_rgba_minimized, - "s = tostring_rgba_minimized()"); + "s = tostring_rgba_minimized()"); add_varargs_method("buffer_rgba", &RendererAgg::buffer_rgba, - "buffer = buffer_rgba()"); + "buffer = buffer_rgba()"); add_varargs_method("clear", &RendererAgg::clear, - "clear()"); + "clear()"); add_varargs_method("copy_from_bbox", &RendererAgg::copy_from_bbox, - "copy_from_bbox(bbox)"); + "copy_from_bbox(bbox)"); add_varargs_method("restore_region", &RendererAgg::restore_region, - "restore_region(region)"); + "restore_region(region)"); add_varargs_method("restore_region2", &RendererAgg::restore_region2, - "restore_region(region, x1, y1, x2, y2, x3, y3)"); + "restore_region(region, x1, y1, x2, y2, x3, y3)"); } extern "C" From ca5d8fa69acec91fd716853b690a3bc09f6f95ba Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Fri, 9 Oct 2009 16:10:28 +0000 Subject: [PATCH 0313/1000] Don't skip running tests if a baseline image is missing svn path=/trunk/matplotlib/; revision=7860 --- lib/matplotlib/testing/decorators.py | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index 3c9a20b3982b..15932030f57c 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -54,11 +54,7 @@ def image_comparison(baseline_images=None): # separate test case for each file format. def compare_images_decorator(func): baseline_dir, result_dir = _image_directories(func) - # Only run the test if there is a baseline image in the - # correct format for comparison. - extensions = [ext for ext in ['png', 'pdf'] - if os.path.exists(os.path.join( - baseline_dir, baseline_images[0] + '.' + ext))] + extensions = ['png', 'pdf'] def compare_images_generator(): for extension in extensions: From 255b1aeabb6ad9c20d42b1c8e5d9a44711cdb2ee Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Fri, 9 Oct 2009 16:32:29 +0000 Subject: [PATCH 0314/1000] Add regression test for Agg backend hatch clipping svn path=/trunk/matplotlib/; revision=7861 --- .../test_simplification/hatch_simplify.pdf | Bin 0 -> 5963 bytes .../test_simplification/hatch_simplify.png | Bin 0 -> 19851 bytes lib/matplotlib/tests/test_simplification.py | 11 +++++++++++ 3 files changed, 11 insertions(+) create mode 100644 lib/matplotlib/tests/baseline_images/test_simplification/hatch_simplify.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_simplification/hatch_simplify.png diff --git a/lib/matplotlib/tests/baseline_images/test_simplification/hatch_simplify.pdf b/lib/matplotlib/tests/baseline_images/test_simplification/hatch_simplify.pdf new file mode 100644 index 0000000000000000000000000000000000000000..84215a07ca4b3b6d8a41d15d524927ce767c45c0 GIT binary patch literal 5963 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 Z;seHv1m}uzB4RKa3nQ7Cx%s-2{s)*w!Ycp( literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_simplification/hatch_simplify.png b/lib/matplotlib/tests/baseline_images/test_simplification/hatch_simplify.png new file mode 100644 index 0000000000000000000000000000000000000000..a4f3edee0b106d0083aeab2798fc80a4d03330c2 GIT binary patch literal 19851 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 J`s&*Q{{^*NbtnJ; literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_simplification.py b/lib/matplotlib/tests/test_simplification.py index cbfc1aa1d30f..f7dcf3ccbf7b 100644 --- a/lib/matplotlib/tests/test_simplification.py +++ b/lib/matplotlib/tests/test_simplification.py @@ -106,6 +106,17 @@ def test_simplify_curve(): fig.savefig('simplify_curve') +@image_comparison(baseline_images=['hatch_simplify']) +def test_hatch(): + fig = plt.figure() + ax = fig.add_subplot(111) + ax.add_patch(Rectangle((0, 0), 1, 1, fill=False, hatch="/")) + ax.set_xlim((0.45, 0.55)) + ax.set_ylim((0.45, 0.55)) + + fig.savefig('hatch_simplify') + + if __name__=='__main__': import nose nose.runmodule(argv=['-s','--with-doctest'], exit=False) From b3b9cc284dc53c4dc3fcf2f21dc101a180fd37e6 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Fri, 9 Oct 2009 17:20:23 +0000 Subject: [PATCH 0315/1000] testing: don't compare images if baseline does not exist svn path=/trunk/matplotlib/; revision=7862 --- lib/matplotlib/testing/decorators.py | 20 +++++++++++++++----- 1 file changed, 15 insertions(+), 5 deletions(-) diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index 15932030f57c..40f778aff39f 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -4,6 +4,7 @@ import nose import matplotlib import matplotlib.tests +import numpy as np from matplotlib.testing.compare import comparable_formats, compare_images def knownfailureif(fail_condition, msg=None): @@ -58,8 +59,19 @@ def compare_images_decorator(func): def compare_images_generator(): for extension in extensions: - @knownfailureif(extension not in comparable_formats(), - 'Cannot compare %s files on this system' % extension) + expected_fnames = [os.path.join(baseline_dir,fname) + '.' + extension for fname in baseline_images] + actual_fnames = [os.path.join(result_dir, fname) + '.' + extension for fname in baseline_images] + have_baseline_images = [os.path.exists(expected) for expected in expected_fnames] + have_baseline_image = np.all(have_baseline_images) + is_comparable = extension in comparable_formats() + if not is_comparable: + fail_msg = 'Cannot compare %s files on this system' % extension + elif not have_baseline_image: + fail_msg = 'Do not have baseline images %s' % expected_fnames + else: + fail_msg = 'No failure expected' + will_fail = not (is_comparable and have_baseline_image) + @knownfailureif(will_fail, fail_msg ) def decorated_compare_images(): # set the default format of savefig matplotlib.rc('savefig', extension=extension) @@ -70,9 +82,7 @@ def decorated_compare_images(): result = func() # actually call the test function finally: os.chdir(old_dir) - for fname in baseline_images: - actual = os.path.join(result_dir, fname) + '.' + extension - expected = os.path.join(baseline_dir,fname) + '.' + extension + for actual,expected in zip(actual_fnames,expected_fnames): # compare the images tol=1e-3 # default tolerance From 80525bd5f767351064e83fb6efc01623d693adcc Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Fri, 9 Oct 2009 17:38:48 +0000 Subject: [PATCH 0316/1000] testing: allow limiting the extensions to test on image comparison svn path=/trunk/matplotlib/; revision=7863 --- lib/matplotlib/testing/decorators.py | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index 40f778aff39f..d49cb8007343 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -39,23 +39,42 @@ def failer(*args, **kwargs): return nose.tools.make_decorator(f)(failer) return known_fail_decorator -def image_comparison(baseline_images=None): +def image_comparison(baseline_images=None,extensions=None): """ - compare images generated by the test with those specified in + call signature:: + + image_comparison(baseline_images=['my_figure'], extensions=None) + + Compare images generated by the test with those specified in *baseline_images*, which must correspond else an ImageComparisonFailure exception will be raised. + + Keyword arguments: + + *baseline_images*: list + A list of strings specifying the names of the images generated + by calls to :meth:`matplotlib.figure.savefig`. + + *extensions*: [ None | list ] + + If *None*, default to all supported extensions. + + Otherwise, a list of extensions to test. For example ['png','pdf']. """ if baseline_images is None: raise ValueError('baseline_images must be specified') + if extensions is None: + # default extensions to test + extensions = ['png', 'pdf'] + # The multiple layers of defs are required because of how # parameterized decorators work, and because we want to turn the # single test_foo function to a generator that generates a # separate test case for each file format. def compare_images_decorator(func): baseline_dir, result_dir = _image_directories(func) - extensions = ['png', 'pdf'] def compare_images_generator(): for extension in extensions: From 787d3feeddcf935ad57e34cf89b99e1b69274ec4 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Sun, 11 Oct 2009 02:55:42 +0000 Subject: [PATCH 0317/1000] Merged revisions 7864 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7864 | efiring | 2009-10-10 16:51:06 -1000 (Sat, 10 Oct 2009) | 2 lines docstring fixup: LinearSegmentedColormap.from_list ........ svn path=/trunk/matplotlib/; revision=7865 --- lib/matplotlib/colors.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index cf0ae0585529..00e30882bbab 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -630,6 +630,10 @@ def __init__(self, name, segmentdata, N=256, gamma=1.0): .. seealso:: + :meth:`LinearSegmentedColormap.from_list` + Static method; factory function for generating a + smoothly-varying LinearSegmentedColormap. + :func:`makeMappingArray` For information about making a mapping array. """ @@ -661,8 +665,8 @@ def set_gamma(self, gamma): def from_list(name, colors, N=256, gamma=1.0): """ Make a linear segmented colormap with *name* from a sequence - of *colors* which evenly transitions from colors[0] at val=1 - to colors[-1] at val=1. N is the number of rgb quantization + of *colors* which evenly transitions from colors[0] at val=0 + to colors[-1] at val=1. *N* is the number of rgb quantization levels. Alternatively, a list of (value, color) tuples can be given to divide the range unevenly. From 6b06be552f901dea8c539637c27f2485e687b140 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 11 Oct 2009 19:03:14 +0000 Subject: [PATCH 0318/1000] Merged revisions 7866-7867 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7866 | astraw | 2009-10-11 11:54:22 -0700 (Sun, 11 Oct 2009) | 2 lines allow already transformed clip path in artist set_clip_path() ........ r7867 | astraw | 2009-10-11 11:55:18 -0700 (Sun, 11 Oct 2009) | 2 lines imshow: only apply axes patch clipping if image doesn't clip itself ........ svn path=/trunk/matplotlib/; revision=7868 --- lib/matplotlib/artist.py | 3 +++ lib/matplotlib/axes.py | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/artist.py b/lib/matplotlib/artist.py index 0bea625bd2be..a7c9a72521b7 100644 --- a/lib/matplotlib/artist.py +++ b/lib/matplotlib/artist.py @@ -494,6 +494,9 @@ def set_clip_path(self, path, transform=None): elif isinstance(path, Path): self._clippath = TransformedPath(path, transform) success = True + elif isinstance(path, TransformedPath): + self._clippath = path + success = True if not success: print type(path), type(transform) diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index a605562f383c..f62813459628 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -6239,7 +6239,9 @@ def imshow(self, X, cmap=None, norm=None, aspect=None, im.set_data(X) im.set_alpha(alpha) self._set_artist_props(im) - im.set_clip_path(self.patch) + if not im.get_clip_on(): + # image does not already have clipping set, clip to axes patch + im.set_clip_path(self.patch) #if norm is None and shape is None: # im.set_clim(vmin, vmax) if vmin is not None or vmax is not None: From b3dd2ccfc9985cf6f573c19ba2bb527ee73f09e9 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 11 Oct 2009 19:08:32 +0000 Subject: [PATCH 0319/1000] testing: add test_axes.test_imshow() svn path=/trunk/matplotlib/; revision=7869 --- lib/matplotlib/tests/test_axes.py | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index cc2b38ed4cc8..f1744974d949 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -364,6 +364,22 @@ def test_nonfinite_limits(): ax.plot(x, y) fig.savefig('nonfinite_limits') +@image_comparison(baseline_images=['imshow']) +def test_imshow(): + #Create a NxN image + N=100 + (x,y) = np.indices((N,N)) + x -= N/2 + y -= N/2 + r = np.sqrt(x**2+y**2-x*y) + + #Create a contour plot at N/4 and extract both the clip path and transform + fig = plt.figure() + ax = fig.add_subplot(111) + + ax.imshow(r) + fig.savefig('imshow') + if __name__=='__main__': import nose nose.runmodule(argv=['-s','--with-doctest'], exit=False) From af8148ce918a7185c837c7512963b2daa516d82f Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 11 Oct 2009 19:09:30 +0000 Subject: [PATCH 0320/1000] testing: add test_imshow_clip() based on report by Gellule Xg svn path=/trunk/matplotlib/; revision=7870 --- lib/matplotlib/tests/test_axes.py | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index f1744974d949..e98dfd4f8f85 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -380,6 +380,34 @@ def test_imshow(): ax.imshow(r) fig.savefig('imshow') +@image_comparison(baseline_images=['imshow_clip']) +def test_imshow_clip(): + # As originally reported by Gellule Xg + + #Create a NxN image + N=100 + (x,y) = np.indices((N,N)) + x -= N/2 + y -= N/2 + r = np.sqrt(x**2+y**2-x*y) + + #Create a contour plot at N/4 and extract both the clip path and transform + fig = plt.figure() + ax = fig.add_subplot(111) + + c = ax.contour(r,[N/4]) + x = c.collections[0] + clipPath = x.get_paths()[0] + clipTransform = x.get_transform() + + from matplotlib.transforms import TransformedPath + clip_path = TransformedPath(clipPath, clipTransform) + + #Plot the image clipped by the contour + ax.imshow(r, clip_path=clip_path) + fig.savefig('imshow_clip') + + if __name__=='__main__': import nose nose.runmodule(argv=['-s','--with-doctest'], exit=False) From 849933dacfb0d64dae292b7d50e17a4b86a3e39d Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 11 Oct 2009 19:10:30 +0000 Subject: [PATCH 0321/1000] testing: allow limiting of known failure to known exception class svn path=/trunk/matplotlib/; revision=7871 --- lib/matplotlib/testing/decorators.py | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index d49cb8007343..b07dda14d557 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -7,7 +7,7 @@ import numpy as np from matplotlib.testing.compare import comparable_formats, compare_images -def knownfailureif(fail_condition, msg=None): +def knownfailureif(fail_condition, msg=None, known_exception_class=None ): """ Assume a will fail if *fail_condition* is True. *fail_condition* @@ -15,6 +15,9 @@ def knownfailureif(fail_condition, msg=None): *msg* is the error message displayed for the test. + If *known_exception_class* is not None, the failure is only known + if the exception is an instance of this class. (Default = None) + """ # based on numpy.testing.dec.knownfailureif if msg is None: @@ -27,8 +30,12 @@ def failer(*args, **kwargs): try: # Always run the test (to generate images). result = f(*args, **kwargs) - except: + except Exception, err: if fail_condition: + if known_exception_class is not None: + if not isinstance(err,known_exception_class): + # This is not the expected exception + raise # (Keep the next ultra-long comment so in shows in console.) raise KnownFailureTest(msg) # An error here when running nose means that you don't have the matplotlib.testing.noseclasses:KnownFailure plugin in use. else: From 28fd5be4e09b403cd31c00b07f6ab6c97cc214ae Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sun, 11 Oct 2009 19:11:16 +0000 Subject: [PATCH 0322/1000] testing: raise errors that are not real known failures on image comparison svn path=/trunk/matplotlib/; revision=7872 --- lib/matplotlib/testing/decorators.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index b07dda14d557..e9faf1c26eb5 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -97,7 +97,8 @@ def compare_images_generator(): else: fail_msg = 'No failure expected' will_fail = not (is_comparable and have_baseline_image) - @knownfailureif(will_fail, fail_msg ) + @knownfailureif(will_fail, fail_msg, + known_exception_class=ImageComparisonFailure ) def decorated_compare_images(): # set the default format of savefig matplotlib.rc('savefig', extension=extension) @@ -109,6 +110,9 @@ def decorated_compare_images(): finally: os.chdir(old_dir) for actual,expected in zip(actual_fnames,expected_fnames): + if not os.path.exists(expected): + raise ImageComparisonFailure( + 'image does not exist: %s'%expected) # compare the images tol=1e-3 # default tolerance From 6c62ee625d16d05ef62fc25d5800bb5f1afd04e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Mon, 12 Oct 2009 05:41:42 +0000 Subject: [PATCH 0323/1000] Raise ImageComparisonFailure instead of NotImplementedError if unable to convert images svn path=/trunk/matplotlib/; revision=7873 --- lib/matplotlib/testing/compare.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/testing/compare.py b/lib/matplotlib/testing/compare.py index 5e0705328a94..a992a72d4f0e 100644 --- a/lib/matplotlib/testing/compare.py +++ b/lib/matplotlib/testing/compare.py @@ -4,6 +4,7 @@ #======================================================================= import matplotlib +from matplotlib.testing.noseclasses import ImageComparisonFailure import math import operator import os @@ -105,7 +106,7 @@ def convert(filename): ''' base, extension = filename.rsplit('.', 1) if extension not in converter: - raise NotImplementedError, "Don't know how to convert %s files to png" % extension + raise ImageComparisonFailure, "Don't know how to convert %s files to png" % extension newname = base + '_' + extension + '.png' cmd = converter[extension](filename, newname) pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) From 2a1891fd090edf91c2606930eec4c6fe48b871c2 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 12 Oct 2009 13:30:32 +0000 Subject: [PATCH 0324/1000] Add SVG tests. Fix a hatching bug found in the process of this. svn path=/trunk/matplotlib/; revision=7875 --- lib/matplotlib/__init__.py | 24 + lib/matplotlib/backends/backend_pdf.py | 2 +- lib/matplotlib/backends/backend_ps.py | 4 +- lib/matplotlib/backends/backend_svg.py | 23 +- lib/matplotlib/testing/compare.py | 46 +- lib/matplotlib/testing/decorators.py | 2 +- .../test_axes/axhspan_epoch.svg | 322 + .../test_axes/axvspan_epoch.svg | 318 + .../baseline_images/test_axes/const_xy.svg | 872 + .../baseline_images/test_axes/fill_units.svg | 1461 + .../test_axes/formatter_ticker_001.svg | 266 + .../test_axes/formatter_ticker_002.svg | 407 + .../test_axes/formatter_ticker_003.svg | 407 + .../test_axes/formatter_ticker_004.svg | 371 + .../test_axes/formatter_ticker_005.svg | 373 + .../test_axes/hexbin_extent.svg | 46517 ++++++++++++++++ .../test_axes/nonfinite_limits.svg | 284 + .../test_axes/offset_points.svg | 343 + .../baseline_images/test_axes/polar_axes.svg | 472 + .../test_axes/polar_coords.svg | 347 + .../baseline_images/test_axes/polar_units.svg | 481 + .../test_axes/polar_wrap_180.svg | 425 + .../test_axes/polar_wrap_360.svg | 430 + .../baseline_images/test_axes/shaped data.svg | 1072 + .../baseline_images/test_axes/shaped_data.pdf | Bin 9256 -> 9256 bytes .../baseline_images/test_axes/shaped_data.png | Bin 32896 -> 36399 bytes .../baseline_images/test_axes/shaped_data.svg | 1072 + .../baseline_images/test_axes/single_date.svg | 665 + .../test_axes/single_point.svg | 562 + .../DateFormatter_fractionalSeconds.svg | 183 + .../test_dates/RRuleLocator_bounds.svg | 335 + .../test_dates/date_axhline.svg | 362 + .../test_dates/date_axhspan.svg | 305 + .../test_dates/date_axvline.svg | 297 + .../test_dates/date_axvspan.svg | 394 + .../baseline_images/test_dates/date_empty.svg | 340 + .../test_image/image_interps.svg | 996 + .../test_simplification/clipping.svg | 49 + .../test_simplification/clipping_diamond.svg | 48 + .../test_simplification/hatch_simplify.pdf | Bin 5963 -> 5981 bytes .../test_simplification/hatch_simplify.svg | 237 + .../test_simplification/overflow.svg | 47 + .../test_simplification/simplify_curve.svg | 47 + .../test_spines/spines_axes_positions.svg | 332 + lib/matplotlib/tests/test_axes.py | 4 +- 45 files changed, 61524 insertions(+), 20 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/axhspan_epoch.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/axvspan_epoch.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/const_xy.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/fill_units.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_001.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_002.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_003.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_004.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_005.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/hexbin_extent.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/nonfinite_limits.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/offset_points.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/polar_axes.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/polar_coords.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/polar_units.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_180.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_360.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/shaped data.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/shaped_data.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/single_date.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/single_point.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_dates/DateFormatter_fractionalSeconds.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_dates/RRuleLocator_bounds.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_dates/date_axhline.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_dates/date_axhspan.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_dates/date_axvline.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_dates/date_axvspan.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_dates/date_empty.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_image/image_interps.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_simplification/clipping.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_simplification/clipping_diamond.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_simplification/hatch_simplify.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_simplification/overflow.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_simplification/simplify_curve.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_spines/spines_axes_positions.svg diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index a8b467f712f1..111262d968a2 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -301,6 +301,30 @@ def checkdep_pdftops(): except (IndexError, ValueError, UnboundLocalError, OSError): return None +def checkdep_inkscape(): + try: + s = subprocess.Popen(['inkscape','-V'], stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + for line in s.stdout: + if 'Inkscape' in line: + v = line.split()[1] + break + return v + except (IndexError, ValueError, UnboundLocalError, OSError): + return None + +def checkdep_xmllint(): + try: + s = subprocess.Popen(['xmllint','--version'], stdout=subprocess.PIPE, + stderr=subprocess.PIPE) + for line in s.stderr: + if 'version' in line: + v = line.split()[-1] + break + return v + except (IndexError, ValueError, UnboundLocalError, OSError): + return None + def compare_versions(a, b): "return True if a is greater than or equal to b" if a: diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index bdd98847c986..c4a851b61d36 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -1344,7 +1344,7 @@ def draw_image(self, gc, x, y, im): def draw_path(self, gc, path, transform, rgbFace=None): self.check_gc(gc, rgbFace) - self.file.writePath(path, transform, rgbFace is None) + self.file.writePath(path, transform, (rgbFace is None and gc.get_hatch_path() is None)) self.file.output(self.gc.paint()) def draw_markers(self, gc, marker_path, marker_trans, path, trans, rgbFace=None): diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py index 471de46d5da8..1a3c53017724 100644 --- a/lib/matplotlib/backends/backend_ps.py +++ b/lib/matplotlib/backends/backend_ps.py @@ -471,7 +471,9 @@ def draw_path(self, gc, path, transform, rgbFace=None): """ Draws a Path instance using the given affine transform. """ - ps = self._convert_path(path, transform, clip=(rgbFace is None)) + ps = self._convert_path( + path, transform, + clip=(rgbFace is None and gc.get_hatch_path() is None)) self._draw_ps(ps, gc, rgbFace) def draw_markers(self, gc, marker_path, marker_trans, path, trans, rgbFace=None): diff --git a/lib/matplotlib/backends/backend_svg.py b/lib/matplotlib/backends/backend_svg.py index b898281ad960..867338c5c7f2 100644 --- a/lib/matplotlib/backends/backend_svg.py +++ b/lib/matplotlib/backends/backend_svg.py @@ -61,7 +61,7 @@ def __init__(self, width, height, svgwriter, basename=None): RendererBase.__init__(self) self._glyph_map = dict() - + svgwriter.write(svgProlog%(width,height,width,height)) def _draw_svg_element(self, element, details, gc, rgbFace): @@ -241,7 +241,8 @@ def _convert_path(self, path, transform, clip=False): def draw_path(self, gc, path, transform, rgbFace=None): trans_and_flip = self._make_flip_transform(transform) - path_data = self._convert_path(path, trans_and_flip, clip=(rgbFace is None)) + path_data = self._convert_path(path, trans_and_flip, + clip=(rgbFace is None and gc.get_hatch_path() is None)) self._draw_svg_element('path', 'd="%s"' % path_data, gc, rgbFace) def draw_markers(self, gc, marker_path, marker_trans, path, trans, rgbFace=None): @@ -412,7 +413,7 @@ def draw_image(self, gc, x, y, im): def _adjust_char_id(self, char_id): return char_id.replace("%20","_") - + def draw_text_as_path(self, gc, x, y, s, prop, angle, ismath): """ draw the text by converting them to paths using textpath module. @@ -422,26 +423,26 @@ def draw_text_as_path(self, gc, x, y, s, prop, angle, ismath): *s* text to be converted - + *usetex* If True, use matplotlib usetex mode. *ismath* If True, use mathtext parser. If "TeX", use *usetex* mode. - + """ # this method works for normal text, mathtext and usetex mode. # But currently only utilized by draw_tex method. - + glyph_map=self._glyph_map - + text2path = self._text2path color = rgb2hex(gc.get_rgb()[:3]) fontsize = prop.get_size_in_points() write = self._svgwriter.write - + if ismath == False: font = text2path._get_font(prop) _glyphs = text2path.get_glyphs_with_font(font, s, glyph_map=glyph_map, @@ -460,7 +461,7 @@ def draw_text_as_path(self, gc, x, y, s, prop, angle, ismath): write('\n') glyph_map.update(glyph_map_new) - + svg = [] clipid = self._get_gc_clip_svg(gc) if clipid is not None: @@ -508,7 +509,7 @@ def draw_text_as_path(self, gc, x, y, s, prop, angle, ismath): write('\n') glyph_map.update(glyph_map_new) - + svg = [] clipid = self._get_gc_clip_svg(gc) if clipid is not None: @@ -800,7 +801,7 @@ def get_text_width_height_descent(self, s, prop, ismath): w, h, d = texmanager.get_text_width_height_descent(s, fontsize, renderer=self) return w, h, d - + if ismath: width, height, descent, trash, used_characters = \ self.mathtext_parser.parse(s, 72, prop) diff --git a/lib/matplotlib/testing/compare.py b/lib/matplotlib/testing/compare.py index a992a72d4f0e..38ca02387a43 100644 --- a/lib/matplotlib/testing/compare.py +++ b/lib/matplotlib/testing/compare.py @@ -95,23 +95,32 @@ def compare_float( expected, actual, relTol = None, absTol = None ): converter['pdf'] = cmd converter['eps'] = cmd +if matplotlib.checkdep_inkscape() is not None: + cmd = lambda old, new: \ + ['inkscape', old, '--export-png=' + new] + converter['svg'] = cmd + def comparable_formats(): '''Returns the list of file formats that compare_images can compare on this system.''' return ['png'] + converter.keys() def convert(filename): - '''Convert the named file into a png file. + ''' + Convert the named file into a png file. Returns the name of the created file. ''' base, extension = filename.rsplit('.', 1) if extension not in converter: raise ImageComparisonFailure, "Don't know how to convert %s files to png" % extension newname = base + '_' + extension + '.png' + if not os.path.exists(filename): + raise IOError, "'%s' does not exist" % filename cmd = converter[extension](filename, newname) pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) stdout, stderr = pipe.communicate() - if not os.path.exists(newname): + errcode = pipe.wait() + if not os.path.exists(newname) or errcode: msg = "Conversion command failed:\n%s\n" % ' '.join(cmd) if stdout: msg += "Standard output:\n%s\n" % stdout @@ -120,6 +129,33 @@ def convert(filename): raise IOError, msg return newname +verifiers = { } + +def verify(filename): + """ + Verify the file through some sort of verification tool. + """ + if not os.path.exists(filename): + raise IOError, "'%s' does not exist" % filename + base, extension = filename.rsplit('.', 1) + verifier = verifiers.get(extension, None) + if verifier is not None: + cmd = verifier(filename) + pipe = subprocess.Popen(cmd, stdout=subprocess.PIPE, stderr=subprocess.PIPE) + stdout, stderr = pipe.communicate() + errcode = pipe.wait() + if errcode != 0: + msg = "File verification command failed:\n%s\n" % ' '.join(cmd) + if stdout: + msg += "Standard output:\n%s\n" % stdout + if stderr: + msg += "Standard error:\n%s\n" % stderr + raise IOError, msg + +if matplotlib.checkdep_xmllint(): + verifiers['svg'] = lambda filename: [ + 'xmllint', '--valid', '--nowarning', '--noout', filename] + def compare_images( expected, actual, tol, in_decorator=False ): '''Compare two image files - not the greatest, but fast and good enough. @@ -134,7 +170,7 @@ def compare_images( expected, actual, tol, in_decorator=False ): - expected The filename of the expected image. - actual The filename of the actual image. - tol The tolerance (a unitless float). This is used to - determinte the 'fuzziness' to use when comparing images. + determine the 'fuzziness' to use when comparing images. - in_decorator If called from image_comparison decorator, this should be True. (default=False) ''' @@ -151,10 +187,12 @@ def compare_images( expected, actual, tol, in_decorator=False ): else: return msg + verify(actual) + # Convert the image to png extension = expected.split('.')[-1] if extension != 'png': - expected, actual = convert(expected), convert(actual) + actual, expected = convert(actual), convert(expected) # open the image files and remove the alpha channel (if it exists) expectedImage = Image.open( expected ).convert("RGB") diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index e9faf1c26eb5..d9284ff8e0f8 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -74,7 +74,7 @@ def image_comparison(baseline_images=None,extensions=None): if extensions is None: # default extensions to test - extensions = ['png', 'pdf'] + extensions = ['png', 'pdf', 'svg'] # The multiple layers of defs are required because of how # parameterized decorators work, and because we want to turn the diff --git a/lib/matplotlib/tests/baseline_images/test_axes/axhspan_epoch.svg b/lib/matplotlib/tests/baseline_images/test_axes/axhspan_epoch.svg new file mode 100644 index 000000000000..deef32495db3 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_axes/axhspan_epoch.svg @@ -0,0 +1,322 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_axes/axvspan_epoch.svg b/lib/matplotlib/tests/baseline_images/test_axes/axvspan_epoch.svg new file mode 100644 index 000000000000..4bcfb50113f5 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_axes/axvspan_epoch.svg @@ -0,0 +1,318 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_axes/const_xy.svg b/lib/matplotlib/tests/baseline_images/test_axes/const_xy.svg new file mode 100644 index 000000000000..a9a4ae04cec4 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_axes/const_xy.svg @@ -0,0 +1,872 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_axes/fill_units.svg b/lib/matplotlib/tests/baseline_images/test_axes/fill_units.svg new file mode 100644 index 000000000000..9656bb78b147 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_axes/fill_units.svg @@ -0,0 +1,1461 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_001.svg b/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_001.svg new file mode 100644 index 000000000000..03fdfe45abd7 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_001.svg @@ -0,0 +1,266 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_002.svg b/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_002.svg new file mode 100644 index 000000000000..553662a69bfd --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_002.svg @@ -0,0 +1,407 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_003.svg b/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_003.svg new file mode 100644 index 000000000000..e93ba79806b7 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_003.svg @@ -0,0 +1,407 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_004.svg b/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_004.svg new file mode 100644 index 000000000000..2bea37497f1e --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_004.svg @@ -0,0 +1,371 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_005.svg b/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_005.svg new file mode 100644 index 000000000000..d358d2909310 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_005.svg @@ -0,0 +1,373 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_axes/hexbin_extent.svg b/lib/matplotlib/tests/baseline_images/test_axes/hexbin_extent.svg new file mode 100644 index 000000000000..912891759f25 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_axes/hexbin_extent.svg @@ -0,0 +1,46517 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_axes/nonfinite_limits.svg b/lib/matplotlib/tests/baseline_images/test_axes/nonfinite_limits.svg new file mode 100644 index 000000000000..003dfa990281 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_axes/nonfinite_limits.svg @@ -0,0 +1,284 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_axes/offset_points.svg b/lib/matplotlib/tests/baseline_images/test_axes/offset_points.svg new file mode 100644 index 000000000000..a603f49692d3 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_axes/offset_points.svg @@ -0,0 +1,343 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_axes/polar_axes.svg b/lib/matplotlib/tests/baseline_images/test_axes/polar_axes.svg new file mode 100644 index 000000000000..57e99d896df3 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_axes/polar_axes.svg @@ -0,0 +1,472 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_axes/polar_coords.svg b/lib/matplotlib/tests/baseline_images/test_axes/polar_coords.svg new file mode 100644 index 000000000000..9ba8d8431b47 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_axes/polar_coords.svg @@ -0,0 +1,347 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_axes/polar_units.svg b/lib/matplotlib/tests/baseline_images/test_axes/polar_units.svg new file mode 100644 index 000000000000..9914c8e45221 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_axes/polar_units.svg @@ -0,0 +1,481 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_180.svg b/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_180.svg new file mode 100644 index 000000000000..1b855e906d48 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_180.svg @@ -0,0 +1,425 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_360.svg b/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_360.svg new file mode 100644 index 000000000000..7cfe7db99453 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_axes/polar_wrap_360.svg @@ -0,0 +1,430 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_axes/shaped data.svg b/lib/matplotlib/tests/baseline_images/test_axes/shaped data.svg new file mode 100644 index 000000000000..db955c8667db --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_axes/shaped data.svg @@ -0,0 +1,1072 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_axes/shaped_data.pdf b/lib/matplotlib/tests/baseline_images/test_axes/shaped_data.pdf index 40a836c6b17d0c85ff2c4480b59ab6e1ef40da5e..dc4ceed0a083368e45f62a37f160b4ed7be52e41 100644 GIT binary patch delta 300 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 V;_K4~K9TRdPf1-dS>D+5{{j9g!~p;R literal 32896 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 CPe025 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/shaped_data.svg b/lib/matplotlib/tests/baseline_images/test_axes/shaped_data.svg new file mode 100644 index 000000000000..db955c8667db --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_axes/shaped_data.svg @@ -0,0 +1,1072 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_axes/single_date.svg b/lib/matplotlib/tests/baseline_images/test_axes/single_date.svg new file mode 100644 index 000000000000..5df25e22cba6 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_axes/single_date.svg @@ -0,0 +1,665 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_axes/single_point.svg b/lib/matplotlib/tests/baseline_images/test_axes/single_point.svg new file mode 100644 index 000000000000..43cae3870773 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_axes/single_point.svg @@ -0,0 +1,562 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_dates/DateFormatter_fractionalSeconds.svg b/lib/matplotlib/tests/baseline_images/test_dates/DateFormatter_fractionalSeconds.svg new file mode 100644 index 000000000000..c49292e8a38c --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_dates/DateFormatter_fractionalSeconds.svg @@ -0,0 +1,183 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_dates/RRuleLocator_bounds.svg b/lib/matplotlib/tests/baseline_images/test_dates/RRuleLocator_bounds.svg new file mode 100644 index 000000000000..32a4279af84c --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_dates/RRuleLocator_bounds.svg @@ -0,0 +1,335 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_dates/date_axhline.svg b/lib/matplotlib/tests/baseline_images/test_dates/date_axhline.svg new file mode 100644 index 000000000000..b91c69db8ad9 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_dates/date_axhline.svg @@ -0,0 +1,362 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_dates/date_axhspan.svg b/lib/matplotlib/tests/baseline_images/test_dates/date_axhspan.svg new file mode 100644 index 000000000000..de857aa3518f --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_dates/date_axhspan.svg @@ -0,0 +1,305 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_dates/date_axvline.svg b/lib/matplotlib/tests/baseline_images/test_dates/date_axvline.svg new file mode 100644 index 000000000000..d63347ba635d --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_dates/date_axvline.svg @@ -0,0 +1,297 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_dates/date_axvspan.svg b/lib/matplotlib/tests/baseline_images/test_dates/date_axvspan.svg new file mode 100644 index 000000000000..53fc4b714167 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_dates/date_axvspan.svg @@ -0,0 +1,394 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_dates/date_empty.svg b/lib/matplotlib/tests/baseline_images/test_dates/date_empty.svg new file mode 100644 index 000000000000..5b47f7e1d10f --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_dates/date_empty.svg @@ -0,0 +1,340 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_image/image_interps.svg b/lib/matplotlib/tests/baseline_images/test_image/image_interps.svg new file mode 100644 index 000000000000..2bbec3cdc518 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_image/image_interps.svg @@ -0,0 +1,996 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_simplification/clipping.svg b/lib/matplotlib/tests/baseline_images/test_simplification/clipping.svg new file mode 100644 index 000000000000..a434483f809e --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_simplification/clipping.svg @@ -0,0 +1,49 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_simplification/clipping_diamond.svg b/lib/matplotlib/tests/baseline_images/test_simplification/clipping_diamond.svg new file mode 100644 index 000000000000..dc25c951cbf6 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_simplification/clipping_diamond.svg @@ -0,0 +1,48 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_simplification/hatch_simplify.pdf b/lib/matplotlib/tests/baseline_images/test_simplification/hatch_simplify.pdf index 84215a07ca4b3b6d8a41d15d524927ce767c45c0..f121d878c7c20d8ee30ac37cf396cf32a2ee2931 100644 GIT binary patch delta 1254 zcmX@DcUNyhGP|LXfu*6j!N#l=jP^*Nk(ft4v?MPnZ2?V&3-+zr7Yn-?Eq7)O4+z_szk`CnsI`f7?Hs z?8-Sm@jp-ew`Fe*Z1`%?>-=`r<=OAPD6YS(-mX{SUN8Nn#A&|Gxer=wyH7Ocz0#T~ zocus@Nrl_DGT(FBp08f4v)cWVPyUnET~{|HKk3ryxXY?mI^}yW?0)rSnRV@n)g_!Q zM<#B|nr<39-?69ir1*vXQqM|XYrmSNF8Ru6s^QhH(#d(N9)9x;)_S?ydu39zO>ukV zLGJ%bm0IR=OulTXcUo?260B{`ZoI`WJgHpoQH^D=+Mx&2c3j>)weV!}OVODTk6E|O z?zR4XJ7cfv!RKC8twuimv*p`4qOwZTFJi)%iI% z*7UJs+}5`@@8rGEPR@I7mHUs`YNj(6S885LaY<2XVlIf4pOiKE4>LEDrRio)7Iluv zX*>#(oq3cef9L7oa7rvrb<58ynJmC3S+AfUQdy9ypbrvI(09&AED9*fPcBw4G*d88 z2;$NYE=?){D*!1ohNyE%Elw`VEGWq@QZO_DDO1o7&rB)F0O~S^aD5VsOF(8R7@3-K z>APhXLAeGBc6Lzbae=k60UgR^V>6kJPnl0aA7pSU&>gx)#%7a0@+d|EU6fehk(!yF zQKDdOY@nd;2vJ~ZWT~L-F7o64Q$njExlZBcNJMP0SVa zJxdaEGLs$i(sNQ33?_fz72ll9cbjE$t*|6x#N=LK@yS8L!U|maKB;->B^e5a20;Bz zPWcrI(Lgf|6wHl4D0cHA;jN5mCO~h3fI^-E7nosSVqtE9A!ca^)QPIj)X2;dL(JH~ z5L3*^X!2fBzj|W~<;LcQ7|M-JEP?TbYL&5}5r#Swb2DIsp{g@9FvYOL(8L5HR*&RI zLsN4M{}@_WVpw8iV2TkwM#jb%4m2_|#Sk;GG)6M7q-ZjyxCNJqfiah=s;j>n7XUCK Bw@Ls2 delta 1164 zcmcbscUo^kGP{ALp%D;l%v!-%@0%@S$kX=zpQzQg_6*&~e>1Wd_?}$3l-YK=iDpa6 zLQjSI{hywnNlE{{A$xC~ZJmnp><1SO?l2vU|9e-0TWsFJ;|m@KOCH_mR@P&czpnJ| zZZ~taO;RU*N_%O9+L%5JI<&+~eC?rKM{H))J9oD1iLqg;*x4Rma3zI{f$x6({=M~g z_scwdC(3u9Bkq0Qvo1C9lHJ;$mSp%oZ(p~UwR_)ER}ljb|Fx?l4%qLGE|%KnJt;Wk z{dAkm` z@9`*~II-ih-`#oJOFH?y_ls49&%IZ&oWF9SUgHFdOL1>EEzQ1;v`D*RQlaANi=iYcsJHuSM{NwkFw^R>4_p*%ascU{FyybI~ zj_BP-thQ&m;(k6~)#q1q)lbc*uvsp4Y5%6q)1h~5Ry6OatP(H&A9zpV^yD>{pV>ba zH#eF5msy6%+3g$*!ll_IIctSFBGV{{G{xICUMR+S?nvto3 z0SGAMDR6-q1|}9}2AE=&M(ARuMy7_CViv&AL^aRU*uZ4+c~QT5BMjxnW|kPrjZMrg z(2X!QG{8`2Vr~MA7F4SY4NNfXFf=iSh}9$c(a_Ws!#{==<`|Y385m=PkCCw + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_simplification/overflow.svg b/lib/matplotlib/tests/baseline_images/test_simplification/overflow.svg new file mode 100644 index 000000000000..9b60778ecb64 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_simplification/overflow.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_simplification/simplify_curve.svg b/lib/matplotlib/tests/baseline_images/test_simplification/simplify_curve.svg new file mode 100644 index 000000000000..d60d25c5342d --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_simplification/simplify_curve.svg @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_spines/spines_axes_positions.svg b/lib/matplotlib/tests/baseline_images/test_spines/spines_axes_positions.svg new file mode 100644 index 000000000000..9df55cbe4c69 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_spines/spines_axes_positions.svg @@ -0,0 +1,332 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index e98dfd4f8f85..39a6bcb58496 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -189,7 +189,7 @@ def test_single_date(): fig.savefig( 'single_date' ) -@image_comparison(baseline_images=['single_date']) +@image_comparison(baseline_images=['shaped_data']) def test_shaped_data(): xdata = np.array([[ 0.53295185, 0.23052951, 0.19057629, 0.66724975, 0.96577916, 0.73136095, 0.60823287, 0.017921 , 0.29744742, 0.27164665], @@ -231,7 +231,7 @@ def test_shaped_data(): plt.subplot( 414 ) plt.plot( xdata[:,1], xdata[1,:], 'o' ) - fig.savefig( 'shaped data' ) + fig.savefig( 'shaped_data' ) @image_comparison(baseline_images=['const_xy']) def test_const_xy(): From 3628d1f5836e70882b77b2038412b944c9f11124 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 12 Oct 2009 13:39:14 +0000 Subject: [PATCH 0325/1000] Merged revisions 7874 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7874 | mdboom | 2009-10-12 09:21:07 -0400 (Mon, 12 Oct 2009) | 2 lines Don't simplify hatched paths in PDF, PS and SVG backends. ........ svn path=/trunk/matplotlib/; revision=7876 --- lib/matplotlib/backends/backend_pdf.py | 6 ++++++ lib/matplotlib/backends/backend_svg.py | 5 +++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index c4a851b61d36..7fe6003e0420 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -1344,7 +1344,13 @@ def draw_image(self, gc, x, y, im): def draw_path(self, gc, path, transform, rgbFace=None): self.check_gc(gc, rgbFace) +<<<<<<< .working self.file.writePath(path, transform, (rgbFace is None and gc.get_hatch_path() is None)) +======= + self.file.writePath( + path, transform, + rgbFace is None and gc.get_hatch_path() is None) +>>>>>>> .merge-right.r7874 self.file.output(self.gc.paint()) def draw_markers(self, gc, marker_path, marker_trans, path, trans, rgbFace=None): diff --git a/lib/matplotlib/backends/backend_svg.py b/lib/matplotlib/backends/backend_svg.py index 867338c5c7f2..e0be67e90f76 100644 --- a/lib/matplotlib/backends/backend_svg.py +++ b/lib/matplotlib/backends/backend_svg.py @@ -241,8 +241,9 @@ def _convert_path(self, path, transform, clip=False): def draw_path(self, gc, path, transform, rgbFace=None): trans_and_flip = self._make_flip_transform(transform) - path_data = self._convert_path(path, trans_and_flip, - clip=(rgbFace is None and gc.get_hatch_path() is None)) + path_data = self._convert_path( + path, trans_and_flip, + clip=(rgbFace is None and gc.get_hatch_path() is None)) self._draw_svg_element('path', 'd="%s"' % path_data, gc, rgbFace) def draw_markers(self, gc, marker_path, marker_trans, path, trans, rgbFace=None): From 5ed248fb740c524ac2c8be569e88870d37f4551c Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 12 Oct 2009 13:43:48 +0000 Subject: [PATCH 0326/1000] Remove conflict markers accidentally committed in last commit. svn path=/trunk/matplotlib/; revision=7877 --- lib/matplotlib/backends/backend_pdf.py | 4 ---- 1 file changed, 4 deletions(-) diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index 7fe6003e0420..d95b034eb9d0 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -1344,13 +1344,9 @@ def draw_image(self, gc, x, y, im): def draw_path(self, gc, path, transform, rgbFace=None): self.check_gc(gc, rgbFace) -<<<<<<< .working - self.file.writePath(path, transform, (rgbFace is None and gc.get_hatch_path() is None)) -======= self.file.writePath( path, transform, rgbFace is None and gc.get_hatch_path() is None) ->>>>>>> .merge-right.r7874 self.file.output(self.gc.paint()) def draw_markers(self, gc, marker_path, marker_trans, path, trans, rgbFace=None): From 1427eb9dea89e1d52e0c2cea4e05626e5ec802c0 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 12 Oct 2009 15:57:19 +0000 Subject: [PATCH 0327/1000] add missing test images for recent imshow tests svn path=/trunk/matplotlib/; revision=7878 --- .../baseline_images/test_axes/imshow.pdf | Bin 0 -> 121625 bytes .../baseline_images/test_axes/imshow.png | Bin 0 -> 114775 bytes .../baseline_images/test_axes/imshow.svg | 1185 ++++++++++++++++ .../baseline_images/test_axes/imshow_clip.pdf | Bin 0 -> 122648 bytes .../baseline_images/test_axes/imshow_clip.png | Bin 0 -> 34337 bytes .../baseline_images/test_axes/imshow_clip.svg | 1218 +++++++++++++++++ 6 files changed, 2403 insertions(+) create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/imshow.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/imshow.png create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/imshow.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/imshow_clip.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/imshow_clip.png create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/imshow_clip.svg diff --git a/lib/matplotlib/tests/baseline_images/test_axes/imshow.pdf b/lib/matplotlib/tests/baseline_images/test_axes/imshow.pdf new file mode 100644 index 0000000000000000000000000000000000000000..91ac11b2f0abb74c3adf2120524bda35a37f2fd4 GIT binary patch literal 121625 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̐L_V;f~HxYS}Sx!%Q* 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

    7RgPfKI=S=kpw&V>tJ+aR0 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 RBAC>LP}G8gx~6*6{||6Szo!5I literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/imshow.png b/lib/matplotlib/tests/baseline_images/test_axes/imshow.png new file mode 100644 index 0000000000000000000000000000000000000000..0b7d8c5edfb655de682ce6e77101e0807aea6830 GIT binary patch literal 114775 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%0ASrF1&6}jYytiE;H?zrV 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 OJbA3CT&igL?*9Px9}B$z literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/imshow.svg b/lib/matplotlib/tests/baseline_images/test_axes/imshow.svg new file mode 100644 index 000000000000..fa6fa21dfc57 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_axes/imshow.svg @@ -0,0 +1,1185 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_axes/imshow_clip.pdf b/lib/matplotlib/tests/baseline_images/test_axes/imshow_clip.pdf new file mode 100644 index 0000000000000000000000000000000000000000..cfec4373b18cc78389191d394614a04d600c2d13 GIT binary patch literal 122648 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 H=}`VZBOaEM literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/imshow_clip.png b/lib/matplotlib/tests/baseline_images/test_axes/imshow_clip.png new file mode 100644 index 0000000000000000000000000000000000000000..44b9e52c22453868b4ff474b5c3c3c54dfdb6a36 GIT binary patch literal 34337 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 Minel@;`7k|2MSY5EdT%j literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/imshow_clip.svg b/lib/matplotlib/tests/baseline_images/test_axes/imshow_clip.svg new file mode 100644 index 000000000000..f8bc5e2bca0c --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_axes/imshow_clip.svg @@ -0,0 +1,1218 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From 0cc6af6081a2c6e33c8e9558a1de870cdb8aed47 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Tue, 13 Oct 2009 05:10:26 +0000 Subject: [PATCH 0328/1000] Merged revisions 7880 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7880 | leejjoon | 2009-10-12 19:02:27 -0400 (Mon, 12 Oct 2009) | 1 line fix plot_directive.py that generated incorrect links for some cases ........ svn path=/trunk/matplotlib/; revision=7881 --- lib/matplotlib/sphinxext/plot_directive.py | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/lib/matplotlib/sphinxext/plot_directive.py b/lib/matplotlib/sphinxext/plot_directive.py index c5c7446244e2..de07a4b97577 100644 --- a/lib/matplotlib/sphinxext/plot_directive.py +++ b/lib/matplotlib/sphinxext/plot_directive.py @@ -291,12 +291,10 @@ def _plot_directive(plot_path, basedir, function_name, plot_code, caption, # the temporary directory, and then sphinx moves the file to # build/html/_images for us later. rstdir, rstfile = os.path.split(state_machine.document.attributes['source']) - reldir = rstdir[len(setup.confdir)+1:] - relparts = [p for p in os.path.split(reldir) if p.strip()] - nparts = len(relparts) outdir = os.path.join('plot_directive', basedir) - linkdir = ('../' * nparts) + outdir - + reldir = relpath(setup.confdir, rstdir) + linkdir = os.path.join(reldir, outdir) + # tmpdir is where we build all the output files. This way the # plots won't have to be redone when generating latex after html. From 4ec0abf2552f64889025eb2625891dfdc0942db7 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Tue, 13 Oct 2009 05:28:55 +0000 Subject: [PATCH 0329/1000] fix axes_grid examples not to use if __name__ == '__main__' svn path=/trunk/matplotlib/; revision=7882 --- examples/axes_grid/demo_axes_divider.py | 4 +--- examples/axes_grid/demo_axes_grid.py | 3 +-- examples/axes_grid/demo_axes_grid2.py | 2 +- examples/axes_grid/demo_axes_rgb.py | 8 +++----- examples/axes_grid/demo_axisline_style.py | 4 ++-- examples/axes_grid/demo_floating_axis.py | 12 +++++------- 6 files changed, 13 insertions(+), 20 deletions(-) diff --git a/examples/axes_grid/demo_axes_divider.py b/examples/axes_grid/demo_axes_divider.py index 5c8a5c5cd05b..a9a890a097cc 100644 --- a/examples/axes_grid/demo_axes_divider.py +++ b/examples/axes_grid/demo_axes_divider.py @@ -126,6 +126,4 @@ def demo(): plt.show() - -if __name__ == "__main__": - demo() +demo() diff --git a/examples/axes_grid/demo_axes_grid.py b/examples/axes_grid/demo_axes_grid.py index ab6d3cc3acf9..c7da6965fcb8 100644 --- a/examples/axes_grid/demo_axes_grid.py +++ b/examples/axes_grid/demo_axes_grid.py @@ -78,8 +78,7 @@ def demo_grid_with_each_cbar(fig): -if __name__ == "__main__": - +if 1: F = plt.figure(1, (5.5, 2.5)) F.subplots_adjust(left=0.05, right=0.98) diff --git a/examples/axes_grid/demo_axes_grid2.py b/examples/axes_grid/demo_axes_grid2.py index 07933dcad5ac..802286eec8f5 100644 --- a/examples/axes_grid/demo_axes_grid2.py +++ b/examples/axes_grid/demo_axes_grid2.py @@ -33,7 +33,7 @@ def add_inner_title(ax, title, loc, size=None, **kwargs): return ao -if __name__ == "__main__": +if 1: F = plt.figure(1, (6, 6)) F.clf() diff --git a/examples/axes_grid/demo_axes_rgb.py b/examples/axes_grid/demo_axes_rgb.py index c9cbfefe5e7d..7f927cd0d828 100644 --- a/examples/axes_grid/demo_axes_rgb.py +++ b/examples/axes_grid/demo_axes_rgb.py @@ -74,9 +74,7 @@ def demo_rgb2(): return ax -if __name__ == "__main__": - demo_rgb() - ax = demo_rgb2() +demo_rgb() +ax = demo_rgb2() - plt.draw() - plt.show() +plt.show() diff --git a/examples/axes_grid/demo_axisline_style.py b/examples/axes_grid/demo_axisline_style.py index 99cd064d4329..1e6ea49a97b2 100644 --- a/examples/axes_grid/demo_axisline_style.py +++ b/examples/axes_grid/demo_axisline_style.py @@ -3,7 +3,7 @@ import matplotlib.pyplot as plt import numpy as np -if __name__ == "__main__": +if 1: fig = plt.figure(1) ax = SubplotZero(fig, 111) fig.add_subplot(ax) @@ -17,5 +17,5 @@ x = np.linspace(-0.5, 1., 100) ax.plot(x, np.sin(x*np.pi)) - + plt.show() diff --git a/examples/axes_grid/demo_floating_axis.py b/examples/axes_grid/demo_floating_axis.py index e00def9b9abc..4fcaf6bfc029 100644 --- a/examples/axes_grid/demo_floating_axis.py +++ b/examples/axes_grid/demo_floating_axis.py @@ -60,14 +60,12 @@ def curvelinear_test2(fig): ax1.grid(True) -if __name__ == "__main__": - import matplotlib.pyplot as plt - fig = plt.figure(1, figsize=(5, 5)) - fig.clf() +import matplotlib.pyplot as plt +fig = plt.figure(1, figsize=(5, 5)) +fig.clf() - curvelinear_test2(fig) +curvelinear_test2(fig) - plt.draw() - plt.show() +plt.show() From 2daf9f5892fb9d44f69849e01985b90dfabb8be6 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 14 Oct 2009 17:37:41 +0000 Subject: [PATCH 0330/1000] Support running of individual tests and multiprocess support. svn path=/trunk/matplotlib/; revision=7883 --- lib/matplotlib/__init__.py | 16 ---------------- lib/matplotlib/testing/compare.py | 3 ++- lib/matplotlib/tests/__init__.py | 13 +++++++++++++ 3 files changed, 15 insertions(+), 17 deletions(-) diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index 111262d968a2..1b2a5d443b22 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -920,19 +920,6 @@ def test(verbosity=0): from testing.noseclasses import KnownFailure from nose.plugins.manager import PluginManager - # Store the current backend and all rcParams for restoration later - backend = rcParams['backend'] - original_params = rcParams.copy() - - use('Agg', warn=False) # use Agg backend for these tests - - # These settings *must* be hardcoded for running the comparison - # tests and are not necessarily the default values as specified in - # rcsetup.py - rcdefaults() # Start with all defaults - rcParams['font.family'] = 'Bitstream Vera Sans' - rcParams['text.hinting'] = False - # store the old values before overriding plugins = [] plugins.append( KnownFailure() ) @@ -945,9 +932,6 @@ def test(verbosity=0): config=config, ) - # restore the old backend and rcParams - use(backend, warn=False) - rcParams.update(original_params) return success test.__test__ = False # nose: this function is not a test diff --git a/lib/matplotlib/testing/compare.py b/lib/matplotlib/testing/compare.py index 38ca02387a43..0fff2a760092 100644 --- a/lib/matplotlib/testing/compare.py +++ b/lib/matplotlib/testing/compare.py @@ -152,7 +152,8 @@ def verify(filename): msg += "Standard error:\n%s\n" % stderr raise IOError, msg -if matplotlib.checkdep_xmllint(): +# Turning this off, because it seems to cause multiprocessing issues +if matplotlib.checkdep_xmllint() and False: verifiers['svg'] = lambda filename: [ 'xmllint', '--valid', '--nowarning', '--noout', filename] diff --git a/lib/matplotlib/tests/__init__.py b/lib/matplotlib/tests/__init__.py index e69de29bb2d1..58fe6d10f81b 100644 --- a/lib/matplotlib/tests/__init__.py +++ b/lib/matplotlib/tests/__init__.py @@ -0,0 +1,13 @@ +from matplotlib import rcParams, rcdefaults, use + +_multiprocess_can_split_ = True + +def setup(): + use('Agg', warn=False) # use Agg backend for these tests + + # These settings *must* be hardcoded for running the comparison + # tests and are not necessarily the default values as specified in + # rcsetup.py + rcdefaults() # Start with all defaults + rcParams['font.family'] = 'Bitstream Vera Sans' + rcParams['text.hinting'] = False From 9968b37609472fbd21da13198235417dc24d84b7 Mon Sep 17 00:00:00 2001 From: Ryan May Date: Wed, 14 Oct 2009 20:33:45 +0000 Subject: [PATCH 0331/1000] Merged revisions 7884 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7884 | ryanmay | 2009-10-14 15:27:07 -0500 (Wed, 14 Oct 2009) | 1 line Add AutoDateFormatter and AutoDateLocator to __all__ and to the module-level documentation. ........ svn path=/trunk/matplotlib/; revision=7885 --- lib/matplotlib/dates.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/dates.py b/lib/matplotlib/dates.py index 6024de51f597..33673db1e43b 100644 --- a/lib/matplotlib/dates.py +++ b/lib/matplotlib/dates.py @@ -72,11 +72,18 @@ arbitrary date tick specifications. See `rrule example <../examples/pylab_examples/date_demo_rrule.html>`_. + * :class:`AutoDateLocator`: On autoscale, this class picks the best + :class:`MultipleDateLocator` to set the view limits and the tick + locations. + Date formatters --------------- Here all all the date formatters: + * :class:`AutoDateFormatter`: attempts to figure out the best format + to use. This is most useful when used with the :class:`AutoDateLocator`. + * :class:`DateFormatter`: use :func:`strftime` format strings * :class:`IndexDateFormatter`: date plots with implicit *x* @@ -109,8 +116,9 @@ __all__ = ( 'date2num', 'num2date', 'drange', 'epoch2num', 'num2epoch', 'mx2num', 'DateFormatter', - 'IndexDateFormatter', 'DateLocator', 'RRuleLocator', - 'YearLocator', 'MonthLocator', 'WeekdayLocator', + 'IndexDateFormatter', 'AutoDateFormatter', 'DateLocator', + 'RRuleLocator', 'AutoDateLocator', 'YearLocator', + 'MonthLocator', 'WeekdayLocator', 'DayLocator', 'HourLocator', 'MinuteLocator', 'SecondLocator', 'rrule', 'MO', 'TU', 'WE', 'TH', 'FR', 'SA', 'SU', 'YEARLY', 'MONTHLY', 'WEEKLY', 'DAILY', From 6bfeb347133005910e294cc4d3150317090fe74e Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Fri, 16 Oct 2009 04:38:36 +0000 Subject: [PATCH 0332/1000] Merged revisions 7887 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7887 | leejjoon | 2009-10-16 00:35:20 -0400 (Fri, 16 Oct 2009) | 1 line fix Text.get_prop_tup omitting _rotation_mode. patch by Stan West ........ svn path=/trunk/matplotlib/; revision=7888 --- lib/matplotlib/text.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/text.py b/lib/matplotlib/text.py index 5482fc31dd1e..d7dd422a03a7 100644 --- a/lib/matplotlib/text.py +++ b/lib/matplotlib/text.py @@ -674,7 +674,8 @@ def get_prop_tup(self): x, y = self.get_position() return (x, y, self.get_text(), self._color, self._verticalalignment, self._horizontalalignment, - hash(self._fontproperties), self._rotation, + hash(self._fontproperties), + self._rotation, self._rotation_mode, self.figure.dpi, id(self._renderer), ) From 7fc78243728830b5de153030f1e737e61cd8ad69 Mon Sep 17 00:00:00 2001 From: Ryan May Date: Fri, 16 Oct 2009 17:31:42 +0000 Subject: [PATCH 0333/1000] Make AutoDateFormatter actually use any specified timezone setting. This was only working correctly when no timezone was specified. svn path=/trunk/matplotlib/; revision=7889 --- CHANGELOG | 14 +++++++++----- lib/matplotlib/dates.py | 2 +- 2 files changed, 10 insertions(+), 6 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 82687d3113e2..18eedfccc9ef 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,10 @@ +2009-10-16 Make AutoDateFormatter actually use any specified + timezone setting.This was only working correctly + when no timezone was specified. - RMM + 2009-09-27 Beginnings of a capability to test the pdf backend. - JKS -2009-09-27 Add a savefig.extension rcparam to control the default +2009-09-27 Add a savefig.extension rcparam to control the default filename extension used by savefig. - JKS =============================================== @@ -15,18 +19,18 @@ against exceptions in case a dvi font is missing some metrics. - JKS 2009-09-15 Implement draw_text and draw_tex method of backend_base using - the textpath module. Implement draw_tex method of the svg + the textpath module. Implement draw_tex method of the svg backend. - JJL 2009-09-15 Don't fail on AFM files containing floating-point bounding boxes - JKS -2009-09-13 AxesGrid : add modified version of colorbar. Add colorbar +2009-09-13 AxesGrid : add modified version of colorbar. Add colorbar location howto. - JJL -2009-09-07 AxesGrid : implemented axisline style. +2009-09-07 AxesGrid : implemented axisline style. Added a demo examples/axes_grid/demo_axisline_style.py- JJL -2009-09-04 Make the textpath class as a separate moduel +2009-09-04 Make the textpath class as a separate moduel (textpath.py). Add support for mathtext and tex.- JJL 2009-09-01 Added support for Gouraud interpolated triangles. diff --git a/lib/matplotlib/dates.py b/lib/matplotlib/dates.py index 33673db1e43b..646261b1ae0e 100644 --- a/lib/matplotlib/dates.py +++ b/lib/matplotlib/dates.py @@ -450,7 +450,7 @@ def __call__(self, x, pos=0): fmt = self.scaled[k] break - self._formatter = DateFormatter(fmt) + self._formatter = DateFormatter(fmt, self._tz) return self._formatter(x, pos) From fc4db3dde7bec8933922d353e836db1a46d6727b Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Mon, 19 Oct 2009 04:17:32 +0000 Subject: [PATCH 0334/1000] Add "use_clabeltext" option to clabel. svn path=/trunk/matplotlib/; revision=7891 --- CHANGELOG | 4 +++ lib/matplotlib/contour.py | 74 ++++++++++++++++++++++++++++++++++++--- 2 files changed, 74 insertions(+), 4 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 18eedfccc9ef..f50bcd0549a9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +2009-10-19 Add "use_clabeltext" option to clabel. If True, clabels + will be created with ClabelText class, which recalculates + rotation angle of the label during the drawing time. + 2009-10-16 Make AutoDateFormatter actually use any specified timezone setting.This was only working correctly when no timezone was specified. - RMM diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index aa4a6e7b0771..802654c0262a 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -29,6 +29,21 @@ # per level. +class ClabelText(text.Text): + """ + Unlike the ordinary text, the get_rotation returns an updated + angle in the pixel coordinate assuming that the input rotation is + an angle in data coordinate (or whatever transform set). + """ + def get_rotation(self): + angle = text.Text.get_rotation(self) + trans = self.get_transform() + x, y = self.get_position() + new_angles = trans.transform_angles(np.array([angle]), + np.array([[x, y]])) + return new_angles[0] + + class ContourLabeler: '''Mixin to provide labelling capability to ContourSet''' @@ -95,6 +110,12 @@ def clabel(self, *args, **kwargs): if *True* (default), label rotations will always be plus or minus 90 degrees from level. + *use_clabeltext*: + if *True* (default is False), ClabelText class (instead of + matplotlib.Text) is used to create labels. ClabelText + recalculates rotation angles of texts during the drawing time, + therefore this can be used if aspect of the axes changes. + .. plot:: mpl_examples/pylab_examples/contour_demo.py """ @@ -117,6 +138,8 @@ def clabel(self, *args, **kwargs): self.labelFmt = kwargs.get('fmt', '%1.3f') _colors = kwargs.get('colors', None) + self._use_clabeltext = kwargs.get('use_clabeltext', False) + # Detect if manual selection is desired and remove from argument list self.labelManual=kwargs.get('manual',False) @@ -435,13 +458,29 @@ def calc_label_rot_and_inline( self, slc, ind, lw, lc=None, spacing=5 ): return (rotation,nlc) - - def add_label(self,x,y,rotation,lev,cvalue): + def _get_label_text(self,x,y,rotation): dx,dy = self.ax.transData.inverted().transform_point((x,y)) t = text.Text(dx, dy, rotation = rotation, horizontalalignment='center', verticalalignment='center') - + return t + + def _get_label_clabeltext(self,x,y,rotation): + # x, y, rotation is given in pixel coordinate. Convert them to + # the data coordinate and create a label using ClabelText + # class. This way, the roation of the clabel is along the + # contour line always. + transDataInv = self.ax.transData.inverted() + dx,dy = transDataInv.transform_point((x,y)) + drotation = transDataInv.transform_angles(np.array([rotation]), + np.array([[x,y]])) + t = ClabelText(dx, dy, rotation = drotation[0], + horizontalalignment='center', + verticalalignment='center') + + return t + + def _add_label(self, t, x, y, lev, cvalue): color = self.labelMappable.to_rgba(cvalue,alpha=self.alpha) _text = self.get_text(lev,self.labelFmt) @@ -453,6 +492,28 @@ def add_label(self,x,y,rotation,lev,cvalue): # Add label to plot here - useful for manual mode label selection self.ax.add_artist(t) + def add_label(self,x,y,rotation,lev,cvalue): + """ + Addd contour label using Text class. + """ + + t = self._get_label_text(x,y,rotation) + self._add_label(t, x, y, lev, cvalue) + + def add_label_clabeltext(self,x,y,rotation,lev,cvalue): + """ + Addd contour label using ClabelText class. + """ + # x, y, rotation is given in pixel coordinate. Convert them to + # the data coordinate and create a label using ClabelText + # class. This way, the roation of the clabel is along the + # contour line always. + + t = self._get_label_clabeltext(x,y,rotation) + self._add_label(t, x, y, lev, cvalue) + + + def pop_label(self,index=-1): '''Defaults to removing last label, but any index can be supplied''' self.labelCValues.pop(index) @@ -462,6 +523,11 @@ def pop_label(self,index=-1): def labels(self, inline, inline_spacing): trans = self.ax.transData # A bit of shorthand + if self._use_clabeltext: + add_label = self.add_label_clabeltext + else: + add_label = self.add_label + for icon, lev, fsize, cvalue in zip( self.labelIndiceList, self.labelLevelList, self.labelFontSizeList, self.labelCValueList ): @@ -493,7 +559,7 @@ def labels(self, inline, inline_spacing): inline_spacing ) # Actually add the label - self.add_label(x,y,rotation,lev,cvalue) + add_label(x,y,rotation,lev,cvalue) # If inline, add new contours if inline: From ae7cdae0a1f6aac3b82231373f731f8fa5a73016 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Mon, 19 Oct 2009 06:50:44 +0000 Subject: [PATCH 0335/1000] Add "path_effects" support for Text and Patch. svn path=/trunk/matplotlib/; revision=7892 --- CHANGELOG | 5 +- examples/pylab_examples/patheffect_demo.py | 37 ++++ lib/matplotlib/backend_bases.py | 28 ++- lib/matplotlib/patches.py | 55 ++++-- lib/matplotlib/patheffects.py | 209 +++++++++++++++++++++ lib/matplotlib/text.py | 48 ++++- 6 files changed, 354 insertions(+), 28 deletions(-) create mode 100644 examples/pylab_examples/patheffect_demo.py create mode 100644 lib/matplotlib/patheffects.py diff --git a/CHANGELOG b/CHANGELOG index f50bcd0549a9..802409c6fb13 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,9 @@ +2009-10-19 Add "path_effects" support for Text and Patch. See + examples/pylab_examples/patheffect_demo.py -JJL + 2009-10-19 Add "use_clabeltext" option to clabel. If True, clabels will be created with ClabelText class, which recalculates - rotation angle of the label during the drawing time. + rotation angle of the label during the drawing time. -JJL 2009-10-16 Make AutoDateFormatter actually use any specified timezone setting.This was only working correctly diff --git a/examples/pylab_examples/patheffect_demo.py b/examples/pylab_examples/patheffect_demo.py new file mode 100644 index 000000000000..665b9dc8fccf --- /dev/null +++ b/examples/pylab_examples/patheffect_demo.py @@ -0,0 +1,37 @@ +import matplotlib.pyplot as plt +import matplotlib.patheffects as PathEffects +import numpy as np + +if 1: + plt.figure(1, figsize=(8,3)) + ax1 = plt.subplot(131) + ax1.imshow([[1,2],[2,3]]) + txt = ax1.annotate("test", (1., 1.), (0., 0), + arrowprops=dict(arrowstyle="->", + connectionstyle="angle3", lw=2), + size=20, ha="center") + + txt.set_path_effects([PathEffects.withStroke(linewidth=3, + foreground="w")]) + txt.arrow_patch.set_path_effects([PathEffects.Stroke(linewidth=5, + foreground="w"), + PathEffects.Normal()]) + + ax2 = plt.subplot(132) + arr = np.arange(25).reshape((5,5)) + ax2.imshow(arr) + cntr = ax2.contour(arr, colors="k") + clbls = ax2.clabel(cntr, fmt="%2.0f", use_clabeltext=True) + plt.setp(clbls, + path_effects=[PathEffects.withStroke(linewidth=3, + foreground="w")]) + + + # shadow as a path effect + ax3 = plt.subplot(133) + p1, = ax3.plot([0, 1], [0, 1]) + leg = ax3.legend([p1], ["Line 1"], fancybox=True, loc=2) + leg.legendPatch.set_path_effects([PathEffects.withSimplePatchShadow()]) + + plt.show() + diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 8a6ad9ee2dad..67ed73c9fbce 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -381,9 +381,9 @@ def draw_text(self, gc, x, y, s, prop, angle, ismath=False): self._draw_text_as_path(gc, x, y, s, prop, angle, ismath) - def _draw_text_as_path(self, gc, x, y, s, prop, angle, ismath): + def _get_text_path_transform(self, x, y, s, prop, angle, ismath): """ - draw the text by converting them to paths using textpath module. + return the text path and transform *prop* font property @@ -399,7 +399,6 @@ def _draw_text_as_path(self, gc, x, y, s, prop, angle, ismath): """ text2path = self._text2path - color = gc.get_rgb()[:3] fontsize = self.points_to_pixels(prop.get_size_in_points()) if ismath == "TeX": @@ -418,6 +417,29 @@ def _draw_text_as_path(self, gc, x, y, s, prop, angle, ismath): fontsize/text2path.FONT_SCALE).\ rotate(angle).translate(x, y) + return path, transform + + + def _draw_text_as_path(self, gc, x, y, s, prop, angle, ismath): + """ + draw the text by converting them to paths using textpath module. + + *prop* + font property + + *s* + text to be converted + + *usetex* + If True, use matplotlib usetex mode. + + *ismath* + If True, use mathtext parser. If "TeX", use *usetex* mode. + """ + + path, transform = self._get_text_path_transform(x, y, s, prop, angle, ismath) + color = gc.get_rgb()[:3] + gc.set_linewidth(0.0) self.draw_path(gc, path, transform, rgbFace=color) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index ceb9b3373007..0514e6cc1344 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -53,15 +53,16 @@ def __str__(self): return str(self.__class__).split('.')[-1] def __init__(self, - edgecolor=None, - facecolor=None, - linewidth=None, - linestyle=None, - antialiased = None, - hatch = None, - fill=True, - **kwargs - ): + edgecolor=None, + facecolor=None, + linewidth=None, + linestyle=None, + antialiased = None, + hatch = None, + fill=True, + path_effects = None, + **kwargs + ): """ The following kwarg properties are supported @@ -89,6 +90,8 @@ def __init__(self, self.fill = fill self._combined_transform = transforms.IdentityTransform() + self.set_path_effects(path_effects) + if len(kwargs): artist.setp(self, **kwargs) def get_verts(self): @@ -324,6 +327,16 @@ def get_hatch(self): 'Return the current hatching pattern' return self._hatch + def set_path_effects(self, path_effects): + """ + set path_effects, which should be a list of instances of + matplotlib.patheffect._Base class or its derivatives. + """ + self._path_effects = path_effects + + def get_path_effects(self): + return self._path_effects + @allow_rasterization def draw(self, renderer): 'Draw the :class:`Patch` to the given *renderer*.' @@ -363,7 +376,11 @@ def draw(self, renderer): tpath = transform.transform_path_non_affine(path) affine = transform.get_affine() - renderer.draw_path(gc, tpath, affine, rgbFace) + if self.get_path_effects(): + for path_effect in self.get_path_effects(): + path_effect.draw_path(renderer, gc, tpath, affine, rgbFace) + else: + renderer.draw_path(gc, tpath, affine, rgbFace) gc.restore() renderer.close_group('patch') @@ -3752,11 +3769,19 @@ def draw(self, renderer): renderer.open_group('patch', self.get_gid()) - for p, f in zip(path, fillable): - if f: - renderer.draw_path(gc, p, affine, rgbFace) - else: - renderer.draw_path(gc, p, affine, None) + if self.get_path_effects(): + for path_effect in self.get_path_effects(): + for p, f in zip(path, fillable): + if f: + path_effect.draw_path(renderer, gc, p, affine, rgbFace) + else: + path_effect.draw_path(renderer, gc, p, affine, None) + else: + for p, f in zip(path, fillable): + if f: + renderer.draw_path(gc, p, affine, rgbFace) + else: + renderer.draw_path(gc, p, affine, None) gc.restore() diff --git a/lib/matplotlib/patheffects.py b/lib/matplotlib/patheffects.py new file mode 100644 index 000000000000..96fa57455387 --- /dev/null +++ b/lib/matplotlib/patheffects.py @@ -0,0 +1,209 @@ +""" +Defines classes for path effects. The path effects are supported in +:class:`~matplotlib.text.Text` and :class:`~matplotlib.patches.Patch` +matplotlib.text.Text. +""" + +from matplotlib.backend_bases import RendererBase +import matplotlib.transforms as transforms + + + +class _Base(object): + """ + A base class for PathEffect. Derived must override draw_path method. + """ + + def __init__(self): + """ + initializtion. + """ + super(_Base, self).__init__() + + + def _update_gc(self, gc, new_gc_dict): + new_gc_dict = new_gc_dict.copy() + + dashes = new_gc_dict.pop("dashes", None) + if dashes: + gc.set_dashes(**dashes) + + for k, v in new_gc_dict.iteritems(): + set_method = getattr(gc, 'set_'+k, None) + if set_method is None or not callable(set_method): + raise AttributeError('Unknown property %s'%k) + set_method(v) + + return gc + + + def draw_path(self, renderer, gc, tpath, affine, rgbFace): + """ + Derived should override this method. The argument is same + as *draw_path* method of :class:`matplotlib.backend_bases.RendererBase` + except the first argument is a renderer. The base definition is :: + + def draw_path(self, renderer, gc, tpath, affine, rgbFace): + renderer.draw_path(gc, tpath, affine, rgbFace) + + """ + renderer.draw_path(gc, tpath, affine, rgbFace) + + def draw_tex(self, renderer, gc, x, y, s, prop, angle, ismath='TeX!'): + self._draw_text_as_path(renderer, gc, x, y, s, prop, angle, ismath="TeX") + + def draw_text(self, renderer, gc, x, y, s, prop, angle, ismath=False): + self._draw_text_as_path(renderer, gc, x, y, s, prop, angle, ismath) + + def _draw_text_as_path(self, renderer, gc, x, y, s, prop, angle, ismath): + + path, transform = RendererBase._get_text_path_transform(renderer, + x, y, s, + prop, angle, + ismath) + color = gc.get_rgb()[:3] + + gc.set_linewidth(0.0) + self.draw_path(renderer, gc, path, transform, rgbFace=color) + + +# def draw_path_collection(self, renderer, +# gc, master_transform, paths, all_transforms, +# offsets, offsetTrans, facecolors, edgecolors, +# linewidths, linestyles, antialiaseds, urls): +# path_ids = [] +# for path, transform in renderer._iter_collection_raw_paths( +# master_transform, paths, all_transforms): +# path_ids.append((path, transform)) + +# for xo, yo, path_id, gc0, rgbFace in renderer._iter_collection( +# gc, path_ids, offsets, offsetTrans, facecolors, edgecolors, +# linewidths, linestyles, antialiaseds, urls): +# path, transform = path_id +# transform = transforms.Affine2D(transform.get_matrix()).translate(xo, yo) +# self.draw_path(renderer, gc0, path, transform, rgbFace) + + +class Normal(_Base): + """ + path effect with no effect + """ + pass + +class Stroke(_Base): + """ + stroke the path with updated gc. + """ + + def __init__(self, **kwargs): + """ + The path will be stroked with its gc updated with the given + keyword arguments, i.e., the keyword arguments should be valid + gc parameter values. + """ + super(Stroke, self).__init__() + self._gc = kwargs + + def draw_path(self, renderer, gc, tpath, affine, rgbFace): + """ + draw the path with update gc. + """ + # Do not modify the input! Use copy instead. + + gc0 = renderer.new_gc() + gc0.copy_properties(gc) + + gc0 = self._update_gc(gc0, self._gc) + renderer.draw_path(gc0, tpath, affine, None) + + +class withStroke(Stroke): + + """ + Same as Stroke, but add a stroke with the original gc at the end. + """ + + def draw_path(self, renderer, gc, tpath, affine, rgbFace): + + Stroke.draw_path(self, renderer, gc, tpath, affine, rgbFace) + renderer.draw_path(gc, tpath, affine, rgbFace) + + +import matplotlib.transforms as mtransforms + +class SimplePatchShadow(_Base): + """ + simple shadow + """ + + def __init__(self, offset_xy=(2,-2), + shadow_rgbFace=None, patch_alpha=0.7, + **kwargs): + """ + """ + super(_Base, self).__init__() + self._offset_xy = offset_xy + self._shadow_rgbFace = shadow_rgbFace + self._patch_alpha = patch_alpha + + self._gc = kwargs + self._offset_tran = mtransforms.Affine2D() + + def draw_path(self, renderer, gc, tpath, affine, rgbFace): + """ + """ + # Do not modify the input! Use copy instead. + + offset_x = renderer.points_to_pixels(self._offset_xy[0]) + offset_y = renderer.points_to_pixels(self._offset_xy[1]) + + affine0 = affine + self._offset_tran.clear().translate(offset_x, offset_y) + + gc0 = renderer.new_gc() + gc0.copy_properties(gc) + + if self._shadow_rgbFace is None: + r,g,b = rgbFace + rho = 0.3 + r = rho*r + g = rho*g + b = rho*b + + shadow_rgbFace = (r,g,b) + else: + shadow_rgbFace = self._shadow_rgbFace + + gc0.set_foreground("none") + gc0.set_alpha(1.-self._patch_alpha) + gc0.set_linewidth(0) + + gc0 = self._update_gc(gc0, self._gc) + renderer.draw_path(gc0, tpath, affine0, shadow_rgbFace) + + +class withSimplePatchShadow(SimplePatchShadow): + """ + simple shadow + """ + + def draw_path(self, renderer, gc, tpath, affine, rgbFace): + + SimplePatchShadow.draw_path(self, renderer, gc, tpath, affine, rgbFace) + + gc1 = renderer.new_gc() + gc1.copy_properties(gc) + gc1.set_alpha(gc1.get_alpha()*self._patch_alpha) + renderer.draw_path(gc1, tpath, affine, rgbFace) + + +if __name__ == '__main__': + clf() + imshow([[1,2],[2,3]]) + #eff = PathEffects.Thicken() + txt = annotate("test", (1., 1.), (0., 0), + arrowprops=dict(arrowstyle="->", connectionstyle="angle3", lw=2), + size=12, ha="center") + txt.set_path_effects([withStroke(linewidth=3, foreground="w")]) + #txt.arrow_patch.set_path_effects([PathEffects.withStroke(width=3, color="w")]) + txt.arrow_patch.set_path_effects([Stroke(linewidth=5, foreground="w"), + Normal()]) diff --git a/lib/matplotlib/text.py b/lib/matplotlib/text.py index d7dd422a03a7..be4d866a361d 100644 --- a/lib/matplotlib/text.py +++ b/lib/matplotlib/text.py @@ -27,6 +27,7 @@ import matplotlib.font_manager as font_manager from matplotlib.ft2font import FT2Font +from matplotlib.backend_bases import RendererBase def _process_text_args(override, fontdict=None, **kwargs): "Return an override dict. See :func:`~pyplot.text' docstring for info" @@ -154,6 +155,7 @@ def __init__(self, rotation=None, linespacing=None, rotation_mode=None, + path_effects=None, **kwargs ): """ @@ -172,6 +174,7 @@ def __init__(self, if fontproperties is None: fontproperties=FontProperties() elif is_string_like(fontproperties): fontproperties=FontProperties(fontproperties) + self.set_path_effects(path_effects) self.set_text(text) self.set_color(color) self._verticalalignment = verticalalignment @@ -274,17 +277,26 @@ def _get_layout(self, renderer): whs = np.zeros((len(lines), 2)) horizLayout = np.zeros((len(lines), 4)) + if self.get_path_effects(): + def get_text_width_height_descent(*kl, **kwargs): + return RendererBase.get_text_width_height_descent(renderer, + *kl, **kwargs) + else: + get_text_width_height_descent = renderer.get_text_width_height_descent + # Find full vertical extent of font, # including ascenders and descenders: - tmp, lp_h, lp_bl = renderer.get_text_width_height_descent( - 'lp', self._fontproperties, ismath=False) + tmp, lp_h, lp_bl = get_text_width_height_descent('lp', + self._fontproperties, + ismath=False) offsety = lp_h * self._linespacing baseline = None for i, line in enumerate(lines): clean_line, ismath = self.is_math_text(line) - w, h, d = renderer.get_text_width_height_descent( - clean_line, self._fontproperties, ismath=ismath) + w, h, d = get_text_width_height_descent(clean_line, + self._fontproperties, + ismath=ismath) if baseline is None: baseline = h - d whs[i] = w, h @@ -387,6 +399,13 @@ def _get_layout(self, renderer): self.cached[key] = ret return ret + def set_path_effects(self, path_effects): + self._path_effects = path_effects + + def get_path_effects(self): + return self._path_effects + + def set_bbox(self, rectprops): """ Draw a bounding box around self. rectprops are any settable @@ -558,8 +577,13 @@ def draw(self, renderer): y = canvash-y clean_line, ismath = self.is_math_text(line) - renderer.draw_tex(gc, x, y, clean_line, - self._fontproperties, angle) + if self.get_path_effects(): + for path_effect in self.get_path_effects(): + path_effect.draw_tex(renderer, gc, x, y, clean_line, + self._fontproperties, angle) + else: + renderer.draw_tex(gc, x, y, clean_line, + self._fontproperties, angle) renderer.close_group('text') return @@ -570,9 +594,15 @@ def draw(self, renderer): y = canvash-y clean_line, ismath = self.is_math_text(line) - renderer.draw_text(gc, x, y, clean_line, - self._fontproperties, angle, - ismath=ismath) + if self.get_path_effects(): + for path_effect in self.get_path_effects(): + path_effect.draw_text(renderer, gc, x, y, clean_line, + self._fontproperties, angle, + ismath=ismath) + else: + renderer.draw_text(gc, x, y, clean_line, + self._fontproperties, angle, + ismath=ismath) gc.restore() renderer.close_group('text') From 1b84dab74393bc144d4378c4b2b598dcafd03e7a Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Mon, 19 Oct 2009 09:04:42 +0000 Subject: [PATCH 0336/1000] Merged revisions 7893 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7893 | leejjoon | 2009-10-19 05:02:08 -0400 (Mon, 19 Oct 2009) | 1 line fix a bug in plot_directive ........ svn path=/trunk/matplotlib/; revision=7894 --- lib/matplotlib/sphinxext/plot_directive.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/sphinxext/plot_directive.py b/lib/matplotlib/sphinxext/plot_directive.py index de07a4b97577..4296bd4cf2b1 100644 --- a/lib/matplotlib/sphinxext/plot_directive.py +++ b/lib/matplotlib/sphinxext/plot_directive.py @@ -113,7 +113,10 @@ def relpath(target, base=os.curdir): i+=1 rel_list = [os.pardir] * (len(base_list)-i) + target_list[i:] - return os.path.join(*rel_list) + if rel_list: + return os.path.join(*rel_list) + else: + return "" template = """ .. htmlonly:: @@ -294,7 +297,7 @@ def _plot_directive(plot_path, basedir, function_name, plot_code, caption, outdir = os.path.join('plot_directive', basedir) reldir = relpath(setup.confdir, rstdir) linkdir = os.path.join(reldir, outdir) - + # tmpdir is where we build all the output files. This way the # plots won't have to be redone when generating latex after html. From fa037549ef09fc4480c38a0bc99f706922ef25cd Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 21 Oct 2009 13:23:47 +0000 Subject: [PATCH 0337/1000] Fix bug in simplification code that was clipping peaks. svn path=/trunk/matplotlib/; revision=7895 --- .../baseline_images/test_axes/polar_axes.png | Bin 77912 -> 77855 bytes .../test_simplification/fft_peaks.pdf | Bin 0 -> 1355 bytes .../test_simplification/fft_peaks.png | Bin 0 -> 4017 bytes .../test_simplification/fft_peaks.svg | 50 ++++++++++++++++++ lib/matplotlib/tests/test_simplification.py | 21 +++++++- src/path_converters.h | 14 +++-- 6 files changed, 78 insertions(+), 7 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.png create mode 100644 lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.svg diff --git a/lib/matplotlib/tests/baseline_images/test_axes/polar_axes.png b/lib/matplotlib/tests/baseline_images/test_axes/polar_axes.png index bb1d3ca68749007e4355f681821748d751fac9e3..6ef2a7b4e327f6379e8712854c2b89c95ae9eee5 100644 GIT binary patch literal 77855 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 >91lok~PZ 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 y)+v7=IA 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 F{|8w4vZnw5 diff --git a/lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.pdf b/lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.pdf new file mode 100644 index 0000000000000000000000000000000000000000..55ada6d5502e0f98da4bd5f8a488b6ba6f636220 GIT binary patch literal 1355 zcmZWpTWAwm7*D^pN7MoxI6Ieq_lzp^poFss1T4}jUvQH`dtbry#OOvEJKv;=lCP5&ogj6j8?o4{0 zt`Trr?>U)-d|@RTfi+@+z-N|Zlx6}0@?%p^7(psEE5XlnH)wE1cn&ScAyrwTCn;UF zSaiF<>9A8?d3&)RKbq)MW3*U6z8GaJhrLZTqB=2^`&32j{~mprh;zpPH4 zJ*nH|>K4DRioK|PUDuQxAqtM)(*O3Z>FevLbzXZrYTw6?^V5e14|-lj?&)7Ap6c0G z|Lo?4S?}6!KJD6ZdrMk+IrWOfjc!QBPfmHU>kXH>)H!MPhn6eHQcwCXSGQMocKz}0 zT-)G*s`Wh;x67(N&rfXsl=^ENO8M?}>>Ax(J0rY2dUu$3vBuH3saKxRHCFB&9zImI zf3@`Ywdmx;-U(Ll`j>HHHoA*sIaPI%FmT`E{L%YRzFl-HNGROhc0>2C)i1B%QlYbpRzEX7WqAsj$Z!;#Vf4nJ@F#*W;|lxbnLtLcr;B4q#hkZy4D)2Kh_zjOJVEKDZr1XW*=9m(k8)@{%5*p= zk|5#Jc*s=MHg7^sRX5)owI8A#;+m(b)f9hjI~%!r;SQyoNROTK*L;@0bMM|gJqCt` z1B+iW1F2dL0R{#IWd|U$hk=oS!H9{4f#JlcAhrPcT=9z`ZuhQTQR(UFuV1{#u&w=7 z@=Jz+;a)*)?Or{7{p%-Bp0u*DnPd0dQApwYiJLcXTG`spwPR*zu&()jxBT_f)6*}f z+juZNk*oan=4RCE^Zyt2_xHE2XJmNb`~3Oy*I&MT*?<3bML9^prza<)ve!O-{P^pi zpPwIQGcf#!|M%FfdFIRA69maBE;-V31_|==y896JG#J`(BK%?HE^aui)p0H+Ox3nch;+A!z%^WQ=Wh*AS3(LsG7MUgKcz8wPTA6~|h8D022`ee`F8=!QZaOU8_ zFRWKU1xoTCwG^Cry1`Ix;d@F-jG>YQAsLWXdClS6?S61obW8?VS339ti(rFe`A*=< z4r}>A+f)FnoQHjJKbqXhud6AjS{&Z>+yDFX{NTYivR^<&%+CExPbT}PyefL1)LMApFDb$w07&Y^Y-)ief=z7rvYsHXY6@veeU`E@8x^CPoF;h z_0iGpm&S5Snr}zHKK=dZ)vH&ntgWNn-Q8cmyuAGKa|VVFZL??3E-ftF=;!Bm?cu|R zUo812f!n8Y3xWMPN&Jm2+yyxzA0k!8!&PwRe}*Z+)e9egb#7(=0#8>zmvv4FO#q7| Bf$IPO literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.svg b/lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.svg new file mode 100644 index 000000000000..5f1b95c7027f --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_simplification/fft_peaks.svg @@ -0,0 +1,50 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/test_simplification.py b/lib/matplotlib/tests/test_simplification.py index f7dcf3ccbf7b..6c3ea6bde57a 100644 --- a/lib/matplotlib/tests/test_simplification.py +++ b/lib/matplotlib/tests/test_simplification.py @@ -70,7 +70,7 @@ def test_noise(): path = transform.transform_path(path) simplified = list(path.iter_segments(simplify=(800, 600))) - assert len(simplified) == 2662 + assert len(simplified) == 2675 def test_sine_plus_noise(): np.random.seed(0) @@ -87,7 +87,7 @@ def test_sine_plus_noise(): path = transform.transform_path(path) simplified = list(path.iter_segments(simplify=(800, 600))) - assert len(simplified) == 279 + assert len(simplified) == 628 @image_comparison(baseline_images=['simplify_curve']) def test_simplify_curve(): @@ -116,6 +116,23 @@ def test_hatch(): fig.savefig('hatch_simplify') +@image_comparison(baseline_images=['fft_peaks']) +def test_fft_peaks(): + fig = plt.figure() + t = arange(65536) + ax = fig.add_subplot(111) + p1 = ax.plot(abs(fft(sin(2*pi*.01*t)*blackman(len(t))))) + ax.set_xticks([]) + ax.set_yticks([]) + + fig.savefig('fft_peaks') + + path = p1[0].get_path() + transform = p1[0].get_transform() + path = transform.transform_path(path) + simplified = list(path.iter_segments(simplify=(800, 600))) + + assert len(simplified) == 13 if __name__=='__main__': import nose diff --git a/src/path_converters.h b/src/path_converters.h index adf6df40937f..de677743041d 100644 --- a/src/path_converters.h +++ b/src/path_converters.h @@ -568,11 +568,15 @@ class PathSimplifier : protected EmbeddedQueue<9> } m_after_moveto = false; + /* NOTE: We used to skip this very short segments, but if + you have a lot of them cumulatively, you can miss + maxima or minima in the data. */ + /* Don't render line segments less than one pixel long */ - if (fabs(*x - m_lastx) < 1.0 && fabs(*y - m_lasty) < 1.0) - { - continue; - } + /* if (fabs(*x - m_lastx) < 1.0 && fabs(*y - m_lasty) < 1.0) */ + /* { */ + /* continue; */ + /* } */ /* if we have no orig vector, set it to this vector and continue. this orig vector is the reference vector we @@ -649,7 +653,7 @@ class PathSimplifier : protected EmbeddedQueue<9> } else { - if (paradNorm2 > m_dnorm2Min) + if (paradNorm2 < m_dnorm2Min) { m_dnorm2Min = paradNorm2; m_nextX = *x; From 9fcf8dbd649c355ca25a364608b00470565690f7 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 21 Oct 2009 13:28:26 +0000 Subject: [PATCH 0338/1000] Merged revisions 7896 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7896 | mdboom | 2009-10-21 09:24:33 -0400 (Wed, 21 Oct 2009) | 2 lines Fix bug in simplification code that was clipping peaks. ........ svn path=/trunk/matplotlib/; revision=7897 From 139e546f796859e9f7800b3a836899295d399986 Mon Sep 17 00:00:00 2001 From: Ryan May Date: Wed, 21 Oct 2009 18:09:45 +0000 Subject: [PATCH 0339/1000] Make AutoDateLocator more configurable by moving hard-coded behavior to a structure the user can tweak. svn path=/trunk/matplotlib/; revision=7898 --- CHANGELOG | 10 +- lib/matplotlib/dates.py | 196 ++++++++++++++++++++++++---------------- 2 files changed, 125 insertions(+), 81 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 802409c6fb13..5d8011be59c9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,7 +1,13 @@ -2009-10-19 Add "path_effects" support for Text and Patch. See +2009-10-21 Make AutoDateLocator more configurable by adding options + to control the maximum and minimum number of ticks. Also + add control of the intervals to be used for ticking. This + does not change behavior but opens previously hard-coded + behavior to runtime modification`. - RMM + +2009-10-19 Add "path_effects" support for Text and Patch. See examples/pylab_examples/patheffect_demo.py -JJL -2009-10-19 Add "use_clabeltext" option to clabel. If True, clabels +2009-10-19 Add "use_clabeltext" option to clabel. If True, clabels will be created with ClabelText class, which recalculates rotation angle of the label during the drawing time. -JJL diff --git a/lib/matplotlib/dates.py b/lib/matplotlib/dates.py index 646261b1ae0e..b1c1deab5d85 100644 --- a/lib/matplotlib/dates.py +++ b/lib/matplotlib/dates.py @@ -603,10 +603,78 @@ class AutoDateLocator(DateLocator): :class:`MultipleDateLocator` to set the view limits and the tick locations. """ - def __init__(self, tz=None): + def __init__(self, tz=None, minticks=5, maxticks=None, + interval_multiples=False): + """ + *minticks* is the minimum number of ticks desired, which is used to + select the type of ticking (yearly, monthly, etc.). + + *maxticks* is the maximum number of ticks desired, which controls + any interval between ticks (ticking every other, every 3, etc.). + For really fine-grained control, this can be a dictionary mapping + individual rrule frequency constants (YEARLY, MONTHLY, etc.) + to their own maximum number of ticks. This can be used to keep + the number of ticks appropriate to the format chosen in + class:`AutoDateFormatter`. Any frequency not specified in this + dictionary is given a default value. + + *tz* is a :class:`tzinfo` instance. + + *interval_multiples* is a boolean that indicates whether ticks + should be chosen to be multiple of the interval. This will lock + ticks to 'nicer' locations. For example, this will force the + ticks to be at hours 0,6,12,18 when hourly ticking is done at + 6 hour intervals. + + The AutoDateLocator has an interval dictionary that maps the + frequency of the tick (a constant from dateutil.rrule) and a + multiple allowed for that ticking. The default looks like this:: + + self.intervald = { + YEARLY : [1, 2, 4, 5, 10], + MONTHLY : [1, 2, 3, 4, 6], + DAILY : [1, 2, 3, 7, 14], + HOURLY : [1, 2, 3, 4, 6, 12], + MINUTELY: [1, 5, 10, 15, 30], + SECONDLY: [1, 5, 10, 15, 30] + } + + The interval is used to specify multiples that are appropriate for + the frequency of ticking. For instance, every 7 days is sensible + for daily ticks, but for minutes/seconds, 15 or 30 make sense. + You can customize this dictionary by doing:: + + locator = AutoDateLocator() + locator.intervald[HOURLY] = [3] # only show every 3 hours + """ DateLocator.__init__(self, tz) self._locator = YearLocator() self._freq = YEARLY + self._freqs = [YEARLY, MONTHLY, DAILY, HOURLY, MINUTELY, SECONDLY] + self.minticks = minticks + + self.maxticks = {YEARLY : 16, MONTHLY : 12, DAILY : 11, HOURLY : 16, + MINUTELY : 11, SECONDLY : 11} + if maxticks is not None: + try: + self.maxticks.update(maxticks) + except TypeError: + # Assume we were given an integer. Use this as the maximum + # number of ticks for every frequency and create a + # dictionary for this + self.maxticks = dict(zip(self._freqs, + [maxticks]*len(self._freqs))) + self.interval_multiples = interval_multiples + self.intervald = { + YEARLY : [1, 2, 4, 5, 10], + MONTHLY : [1, 2, 3, 4, 6], + DAILY : [1, 2, 3, 7, 14], + HOURLY : [1, 2, 3, 4, 6, 12], + MINUTELY: [1, 5, 10, 15, 30], + SECONDLY: [1, 5, 10, 15, 30] + } + self._byranges = [None, range(1, 13), range(1, 32), range(0, 24), + range(0, 60), range(0, 60)] def __call__(self): 'Return the locations of the ticks' @@ -659,89 +727,59 @@ def get_locator(self, dmin, dmax): numMinutes = (numHours * 60.0) + delta.minutes numSeconds = (numMinutes * 60.0) + delta.seconds - numticks = 5 - - # self._freq = YEARLY - interval = 1 - bymonth = 1 - bymonthday = 1 - byhour = 0 - byminute = 0 - bysecond = 0 - - if ( numYears >= numticks ): - self._freq = YEARLY - elif ( numMonths >= numticks ): - self._freq = MONTHLY - bymonth = range(1, 13) - if ( (0 <= numMonths) and (numMonths <= 14) ): - interval = 1 # show every month - elif ( (15 <= numMonths) and (numMonths <= 29) ): - interval = 3 # show every 3 months - elif ( (30 <= numMonths) and (numMonths <= 44) ): - interval = 4 # show every 4 months - else: # 45 <= numMonths <= 59 - interval = 6 # show every 6 months - elif ( numDays >= numticks ): - self._freq = DAILY - bymonth = None - bymonthday = range(1, 32) - if ( (0 <= numDays) and (numDays <= 9) ): - interval = 1 # show every day - elif ( (10 <= numDays) and (numDays <= 19) ): - interval = 2 # show every 2 days - elif ( (20 <= numDays) and (numDays <= 49) ): - interval = 3 # show every 3 days - elif ( (50 <= numDays) and (numDays <= 99) ): - interval = 7 # show every 1 week - else: # 100 <= numDays <= ~150 - interval = 14 # show every 2 weeks - elif ( numHours >= numticks ): - self._freq = HOURLY - bymonth = None - bymonthday = None - byhour = range(0, 24) # show every hour - if ( (0 <= numHours) and (numHours <= 14) ): - interval = 1 # show every hour - elif ( (15 <= numHours) and (numHours <= 30) ): - interval = 2 # show every 2 hours - elif ( (30 <= numHours) and (numHours <= 45) ): - interval = 3 # show every 3 hours - elif ( (45 <= numHours) and (numHours <= 68) ): - interval = 4 # show every 4 hours - elif ( (68 <= numHours) and (numHours <= 90) ): - interval = 6 # show every 6 hours - else: # 90 <= numHours <= 120 - interval = 12 # show every 12 hours - elif ( numMinutes >= numticks ): - self._freq = MINUTELY - bymonth = None - bymonthday = None - byhour = None - byminute = range(0, 60) - if ( numMinutes > (10.0 * numticks) ): - interval = 10 - # end if - elif ( numSeconds >= numticks ): - self._freq = SECONDLY - bymonth = None - bymonthday = None - byhour = None - byminute = None - bysecond = range(0, 60) - if ( numSeconds > (10.0 * numticks) ): - interval = 10 - # end if + nums = [numYears, numMonths, numDays, numHours, numMinutes, numSeconds] + + # Default setting of bymonth, etc. to pass to rrule + # [unused (for year), bymonth, bymonthday, byhour, byminute, bysecond] + byranges = [None, 1, 1, 0, 0, 0] + + # Loop over all the frequencies and try to find one that gives at + # least a minticks tick positions. Once this is found, look for + # an interval from an list specific to that frequency that gives no + # more than maxticks tick positions. Also, set up some ranges + # (bymonth, etc.) as appropriate to be passed to rrulewrapper. + for i, (freq, num) in enumerate(zip(self._freqs, nums)): + # If this particular frequency doesn't give enough ticks, continue + if num < self.minticks: + # Since we're not using this particular frequency, set + # the corresponding by_ to None so the rrule can act as + # appropriate + byranges[i] = None + continue + + # Find the first available interval that doesn't give too many ticks + for interval in self.intervald[freq]: + if num <= interval * (self.maxticks[freq] - 1): + break + else: + # We went through the whole loop without breaking, default to 1 + interval = 1 + + # Set some parameters as appropriate + self._freq = freq + + if self._byranges[i] and self.interval_multiples: + byranges[i] = self._byranges[i][::interval] + interval = 1 + else: + byranges[i] = self._byranges[i] + + # We found what frequency to use + break else: + # We couldn't find a good frequency. # do what? # microseconds as floats, but floats from what reference point? - pass + byranges = [None, 1, 1, 0, 0, 0] + interval = 1 + unused, bymonth, bymonthday, byhour, byminute, bysecond = byranges + del unused - rrule = rrulewrapper( self._freq, interval=interval, \ - dtstart=dmin, until=dmax, \ - bymonth=bymonth, bymonthday=bymonthday, \ - byhour=byhour, byminute = byminute, \ + rrule = rrulewrapper( self._freq, interval=interval, + dtstart=dmin, until=dmax, + bymonth=bymonth, bymonthday=bymonthday, + byhour=byhour, byminute = byminute, bysecond=bysecond ) locator = RRuleLocator(rrule, self.tz) From 46e9f6f1c01528fc10c14503e968caf43c254a9a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Wed, 21 Oct 2009 18:41:35 +0000 Subject: [PATCH 0340/1000] Raise an error in the pdf backend instead of outputting an invalid path if a Path object lacks initial moveto svn path=/trunk/matplotlib/; revision=7899 --- lib/matplotlib/backends/backend_pdf.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index d95b034eb9d0..4eefa0869ebf 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -1206,8 +1206,12 @@ def pathOperations(path, transform, clip=None): last_points = None for points, code in path.iter_segments(transform, clip=clip): if code == Path.MOVETO: + # This is allowed anywhere in the path cmds.extend(points) cmds.append(Op.moveto) + elif last_points is None: + # The other operations require a previous point + raise ValueError, 'Path lacks initial MOVETO' elif code == Path.LINETO: cmds.extend(points) cmds.append(Op.lineto) From 142dbe288b1fa3a6cdecafd55d2cd76d27d08a5d Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Thu, 22 Oct 2009 13:43:31 +0000 Subject: [PATCH 0341/1000] Fix path simplification so the path always starts with a MOVETO. svn path=/trunk/matplotlib/; revision=7900 --- lib/matplotlib/path.py | 2 ++ lib/matplotlib/tests/test_simplification.py | 35 +++++++++++++++++++-- src/path_converters.h | 10 ++++-- 3 files changed, 43 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/path.py b/lib/matplotlib/path.py index 39c267f97d35..a19f3b4d8c1b 100644 --- a/lib/matplotlib/path.py +++ b/lib/matplotlib/path.py @@ -115,6 +115,8 @@ def __init__(self, vertices, codes=None, _interpolation_steps=1): codes = np.asarray(codes, self.code_type) assert codes.ndim == 1 assert len(codes) == len(vertices) + if len(codes): + assert codes[0] == self.MOVETO assert vertices.ndim == 2 assert vertices.shape[1] == 2 diff --git a/lib/matplotlib/tests/test_simplification.py b/lib/matplotlib/tests/test_simplification.py index 6c3ea6bde57a..d5ba0b639ead 100644 --- a/lib/matplotlib/tests/test_simplification.py +++ b/lib/matplotlib/tests/test_simplification.py @@ -2,11 +2,10 @@ import matplotlib from matplotlib.testing.decorators import image_comparison, knownfailureif import matplotlib.pyplot as plt -from matplotlib import patches, path from pylab import * import numpy as np -from matplotlib import patches, path +from matplotlib import patches, path, transforms nan = np.nan Path = path.Path @@ -134,6 +133,38 @@ def test_fft_peaks(): assert len(simplified) == 13 +def test_start_with_moveto(): + # Should be entirely clipped away to a single MOVETO + data = """ +ZwAAAAku+v9UAQAA+Tj6/z8CAADpQ/r/KAMAANlO+v8QBAAAyVn6//UEAAC6ZPr/2gUAAKpv+v+8 +BgAAm3r6/50HAACLhfr/ewgAAHyQ+v9ZCQAAbZv6/zQKAABepvr/DgsAAE+x+v/lCwAAQLz6/7wM +AAAxx/r/kA0AACPS+v9jDgAAFN36/zQPAAAF6Pr/AxAAAPfy+v/QEAAA6f36/5wRAADbCPv/ZhIA +AMwT+/8uEwAAvh77//UTAACwKfv/uRQAAKM0+/98FQAAlT/7/z0WAACHSvv//RYAAHlV+/+7FwAA +bGD7/3cYAABea/v/MRkAAFF2+//pGQAARIH7/6AaAAA3jPv/VRsAACmX+/8JHAAAHKL7/7ocAAAP +rfv/ah0AAAO4+/8YHgAA9sL7/8QeAADpzfv/bx8AANzY+/8YIAAA0OP7/78gAADD7vv/ZCEAALf5 ++/8IIgAAqwT8/6kiAACeD/z/SiMAAJIa/P/oIwAAhiX8/4QkAAB6MPz/HyUAAG47/P+4JQAAYkb8 +/1AmAABWUfz/5SYAAEpc/P95JwAAPmf8/wsoAAAzcvz/nCgAACd9/P8qKQAAHIj8/7cpAAAQk/z/ +QyoAAAWe/P/MKgAA+aj8/1QrAADus/z/2isAAOO+/P9eLAAA2Mn8/+AsAADM1Pz/YS0AAMHf/P/g +LQAAtur8/10uAACr9fz/2C4AAKEA/f9SLwAAlgv9/8ovAACLFv3/QDAAAIAh/f+1MAAAdSz9/ycx +AABrN/3/mDEAAGBC/f8IMgAAVk39/3UyAABLWP3/4TIAAEFj/f9LMwAANm79/7MzAAAsef3/GjQA +ACKE/f9+NAAAF4/9/+E0AAANmv3/QzUAAAOl/f+iNQAA+a/9/wA2AADvuv3/XDYAAOXF/f+2NgAA +29D9/w83AADR2/3/ZjcAAMfm/f+7NwAAvfH9/w44AACz/P3/XzgAAKkH/v+vOAAAnxL+//04AACW +Hf7/SjkAAIwo/v+UOQAAgjP+/905AAB5Pv7/JDoAAG9J/v9pOgAAZVT+/606AABcX/7/7zoAAFJq +/v8vOwAASXX+/207AAA/gP7/qjsAADaL/v/lOwAALZb+/x48AAAjof7/VTwAABqs/v+LPAAAELf+ +/788AAAHwv7/8TwAAP7M/v8hPQAA9df+/1A9AADr4v7/fT0AAOLt/v+oPQAA2fj+/9E9AADQA/// ++T0AAMYO//8fPgAAvRn//0M+AAC0JP//ZT4AAKsv//+GPgAAojr//6U+AACZRf//wj4AAJBQ///d +PgAAh1v///c+AAB+Zv//Dz8AAHRx//8lPwAAa3z//zk/AABih///TD8AAFmS//9dPwAAUJ3//2w/ +AABHqP//ej8AAD6z//+FPwAANb7//48/AAAsyf//lz8AACPU//+ePwAAGt///6M/AAAR6v//pj8A +AAj1//+nPwAA/////w==""" + + verts = np.fromstring(data.decode('base64'), dtype=' { if (m_origdNorm2 != 0.0) { - queue_push(agg::path_cmd_line_to, m_nextX, m_nextY); + queue_push((m_moveto || m_after_moveto) ? + agg::path_cmd_move_to : agg::path_cmd_line_to, + m_nextX, m_nextY); + m_moveto = false; } - queue_push(agg::path_cmd_line_to, m_lastx, m_lasty); + queue_push((m_moveto || m_after_moveto) ? + agg::path_cmd_move_to : agg::path_cmd_line_to, + m_lastx, m_lasty); + m_moveto = false; queue_push(agg::path_cmd_stop, 0.0, 0.0); } From e51847ce1603e98ee91e8d7c89f0a9229e2a4991 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Fri, 23 Oct 2009 02:44:32 +0000 Subject: [PATCH 0342/1000] Fixed two bugs involving reversal of colormaps. svn path=/trunk/matplotlib/; revision=7902 --- lib/matplotlib/cm.py | 23 +++++++++++++++++------ 1 file changed, 17 insertions(+), 6 deletions(-) diff --git a/lib/matplotlib/cm.py b/lib/matplotlib/cm.py index 45b2c45e4cc7..a1d61a23ac39 100644 --- a/lib/matplotlib/cm.py +++ b/lib/matplotlib/cm.py @@ -19,11 +19,20 @@ # reverse all the colormaps. # reversed colormaps have '_r' appended to the name. +def _reverser(f): + def freversed(x): + return f(1-x) + return freversed + def revcmap(data): data_r = {} for key, val in data.iteritems(): if callable(val): - valnew = lambda x: 1 - val(x) + valnew = _reverser(val) + # This doesn't work: lambda x: val(1-x) + # The same "val" (the first one) is used + # each time, so the colors are identical + # and the result is shades of gray. else: valnew = [(1.0 - a, b, c) for a, b, c in reversed(val)] data_r[key] = valnew @@ -43,13 +52,15 @@ def revcmap(data): cmap_d[cmapname_r] = colors.LinearSegmentedColormap( cmapname_r, datad[cmapname_r], LUTSIZE) else: - datad[cmapname] = list(cmapspec) - datad[cmapname_r] = list(datad[cmapname]) - datad[cmapname_r].reverse() + revspec = list(reversed(cmapspec)) + if len(revspec[0]) == 2: # e.g., (1, (1.0, 0.0, 1.0)) + revspec = [(1.0 - a, b) for a, b in revspec] + datad[cmapname_r] = revspec + cmap_d[cmapname] = colors.LinearSegmentedColormap.from_list( - cmapname, datad[cmapname], LUTSIZE) + cmapname, cmapspec, LUTSIZE) cmap_d[cmapname_r] = colors.LinearSegmentedColormap.from_list( - cmapname_r, datad[cmapname_r], LUTSIZE) + cmapname_r, revspec, LUTSIZE) locals().update(cmap_d) From 032edeeab2996823337b215eb7ca3a4f637083f7 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Fri, 23 Oct 2009 16:43:08 +0000 Subject: [PATCH 0343/1000] Merged revisions 7901,7903 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7901 | mdboom | 2009-10-22 09:46:08 -0400 (Thu, 22 Oct 2009) | 2 lines Fix path simplification so the path always starts with a MOVETO. ........ r7903 | mdboom | 2009-10-23 11:02:21 -0400 (Fri, 23 Oct 2009) | 2 lines Support \# in mathtext. ........ svn path=/trunk/matplotlib/; revision=7904 --- lib/matplotlib/_mathtext_data.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/matplotlib/_mathtext_data.py b/lib/matplotlib/_mathtext_data.py index 8dcbfafb0d8c..56f437c0bcdf 100644 --- a/lib/matplotlib/_mathtext_data.py +++ b/lib/matplotlib/_mathtext_data.py @@ -118,6 +118,7 @@ r'%' : ('cmr10', 48), r'\$' : ('cmr10', 99), r'@' : ('cmr10', 111), + r'\#' : ('cmr10', 39), r'\_' : ('cmtt10', 79), r'\Gamma' : ('cmr10', 19), r'\Delta' : ('cmr10', 6), @@ -401,6 +402,7 @@ r'\}' : ('pncr8a', 125), r'\backslash' : ('pncr8a', 92), r'\ast' : ('pncr8a', 42), + r'\#' : ('pncr8a', 35), r'\circumflexaccent' : ('pncri8a', 124), # for \hat r'\combiningbreve' : ('pncri8a', 81), # for \breve @@ -2288,6 +2290,7 @@ '{': 123, '}': 125, '_': 95, +'#': 35, 'imath': 0x131, 'circumflexaccent' : 770, 'combiningbreve' : 774, From cce139d71d2cee1cbda0aa03ed8f380c2c38ed14 Mon Sep 17 00:00:00 2001 From: James Evans Date: Fri, 23 Oct 2009 17:44:29 +0000 Subject: [PATCH 0344/1000] Changed the algorithm that determines what converter to use for unitized data to allow for strings and numpy arrays of types other than 'object'. The new algorithm takes into account the possibility of infinite recursion for strings or any other type. svn path=/trunk/matplotlib/; revision=7905 --- lib/matplotlib/units.py | 18 +++++++----------- 1 file changed, 7 insertions(+), 11 deletions(-) diff --git a/lib/matplotlib/units.py b/lib/matplotlib/units.py index 50323c96688d..700363a2ca5a 100644 --- a/lib/matplotlib/units.py +++ b/lib/matplotlib/units.py @@ -128,18 +128,14 @@ def get_converter(self, x): if classx is not None: converter = self.get(classx) - # Check explicity for strings here because they would otherwise - # lead to an infinite recursion, because a single character will - # pass the iterable() check. - if converter is None and iterable(x) and not is_string_like(x): - # if this is anything but an object array, we'll assume - # there are no custom units - if isinstance(x, np.ndarray) and x.dtype != np.object: - return None - + if converter is None and iterable(x): for thisx in x: - converter = self.get_converter( thisx ) - return converter + # Make sure that recursing might actually lead to a solution, if + # we are just going to re-examine another item of the same kind, + # then do not look at it. + if classx and classx != getattr(thisx, '__class__', None): + converter = self.get_converter( thisx ) + return converter #DISABLED self._cached[idx] = converter return converter From 58568d60f2ccc2fdf2a6020eec6a0a91d06c8d56 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Sun, 25 Oct 2009 19:33:49 +0000 Subject: [PATCH 0345/1000] Merged revisions 7906 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7906 | leejjoon | 2009-10-25 15:30:43 -0400 (Sun, 25 Oct 2009) | 2 lines axes_divider.py : fix a bug that axes has a wrong size when pack_start is True. ........ svn path=/trunk/matplotlib/; revision=7907 --- lib/mpl_toolkits/axes_grid/axes_divider.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/mpl_toolkits/axes_grid/axes_divider.py b/lib/mpl_toolkits/axes_grid/axes_divider.py index cabd1f182297..4354f5f94030 100644 --- a/lib/mpl_toolkits/axes_grid/axes_divider.py +++ b/lib/mpl_toolkits/axes_grid/axes_divider.py @@ -441,7 +441,7 @@ def new_horizontal(self, size, pad=None, pack_start=False, **kwargs): fraction_ref=self._xref) if pack_start: - self._horizontal.insert(0, pad) + self._horizontal.insert(0, size) self._xrefindex += 1 locator = self.new_locator(nx=0, ny=0) else: @@ -489,7 +489,7 @@ def new_vertical(self, size, pad=None, pack_start=False, **kwargs): fraction_ref=self._yref) if pack_start: - self._vertical.insert(0, pad) + self._vertical.insert(0, size) self._yrefindex += 1 locator = self.new_locator(nx=0, ny=0) else: From a0c08dbcb3a030b80652f2ccfdbce798b584ed61 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Sun, 25 Oct 2009 23:29:31 +0000 Subject: [PATCH 0346/1000] add example multiple_yaxis_with_spines.py svn path=/trunk/matplotlib/; revision=7908 --- .../multiple_yaxis_with_spines.py | 61 +++++++++++++++++++ 1 file changed, 61 insertions(+) create mode 100644 examples/pylab_examples/multiple_yaxis_with_spines.py diff --git a/examples/pylab_examples/multiple_yaxis_with_spines.py b/examples/pylab_examples/multiple_yaxis_with_spines.py new file mode 100644 index 000000000000..1f55e0127ab7 --- /dev/null +++ b/examples/pylab_examples/multiple_yaxis_with_spines.py @@ -0,0 +1,61 @@ +import matplotlib.pyplot as plt + +def make_patch_spines_invisible(ax): + par2.set_frame_on(True) + par2.patch.set_visible(False) + for sp in par2.spines.itervalues(): + sp.set_visible(False) + +def make_spine_invisible(ax, direction): + if direction in ["right", "left"]: + ax.yaxis.set_ticks_position(direction) + ax.yaxis.set_label_position(direction) + elif direction in ["top", "bottom"]: + ax.xaxis.set_ticks_position(direction) + ax.xaxis.set_label_position(direction) + else: + raise ValueError("Unknown Direction : %s" % (direction,)) + + ax.spines[direction].set_visible(True) + + +if 1: + fig = plt.figure(1) + + host = fig.add_subplot(111) + + host.set_xlabel("Distance") + + par1 = host.twinx() + par2 = host.twinx() + + par2.spines["right"].set_position(("axes", 1.2)) + make_patch_spines_invisible(par2) + make_spine_invisible(par2, "right") + + plt.subplots_adjust(right=0.75) + + + p1, = host.plot([0, 1, 2], [0, 1, 2], "b-", label="Density") + p2, = par1.plot([0, 1, 2], [0, 3, 2], "r-", label="Temperature") + p3, = par2.plot([0, 1, 2], [50, 30, 15], "g-", label="Velocity") + + host.set_xlim(0, 2) + host.set_ylim(0, 2) + par1.set_ylim(0, 4) + par2.set_ylim(1, 65) + + host.set_xlabel("Distance") + host.set_ylabel("Density") + par1.set_ylabel("Temperature") + par2.set_ylabel("Velocity") + + host.yaxis.label.set_color(p1.get_color()) + par1.yaxis.label.set_color(p2.get_color()) + par2.yaxis.label.set_color(p3.get_color()) + + lines = [p1, p2, p3] + host.legend(lines, [l.get_label() for l in lines]) + plt.draw() + plt.show() + From 7bde3b8f827e940c6c7378ac3534adfb25e4f4e4 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 26 Oct 2009 14:19:04 +0000 Subject: [PATCH 0347/1000] Support Python file-like objects in readpng svn path=/trunk/matplotlib/; revision=7909 --- lib/matplotlib/image.py | 30 +++++-- lib/matplotlib/tests/test_image.py | 21 +++++ src/_png.cpp | 126 ++++++++++++++++++++--------- 3 files changed, 131 insertions(+), 46 deletions(-) diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index 8477f646fb42..63a9e3bdaad1 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -938,9 +938,14 @@ def draw(self, renderer, *args, **kwargs): -def imread(fname): +def imread(fname, format=None): """ - Return image file in *fname* as :class:`numpy.array`. + Return image file in *fname* as :class:`numpy.array`. *fname* may + be a string path or a Python file-like object. + + If *format* is provided, will try to read file of that type, + otherwise the format is deduced from the filename. If nothing can + be deduced, PNG is tried. Return value is a :class:`numpy.array`. For grayscale images, the return array is MxN. For RGB images, the return value is MxNx3. @@ -959,11 +964,15 @@ def pilread(): image = Image.open( fname ) return pil_to_array(image) - - handlers = {'png' :_png.read_png, - } - basename, ext = os.path.splitext(fname) - ext = ext.lower()[1:] + handlers = {'png' :_png.read_png, } + if format is None: + if cbook.is_string_like(fname): + basename, ext = os.path.splitext(fname) + ext = ext.lower()[1:] + else: + ext = 'png' + else: + ext = format if ext not in handlers.keys(): im = pilread() @@ -972,6 +981,13 @@ def pilread(): return im handler = handlers[ext] + + # To handle Unicode filenames, we pass a file object to the PNG + # reader extension, since Python handles them quite well, but it's + # tricky in C. + if cbook.is_string_like(fname): + fname = open(fname, 'rb') + return handler(fname) diff --git a/lib/matplotlib/tests/test_image.py b/lib/matplotlib/tests/test_image.py index bc9d48535f0a..ffa8cbd07d7d 100644 --- a/lib/matplotlib/tests/test_image.py +++ b/lib/matplotlib/tests/test_image.py @@ -4,6 +4,9 @@ import matplotlib.pyplot as plt from nose.tools import assert_raises +import cStringIO +import os + @image_comparison(baseline_images=['image_interps']) def test_image_interps(): 'make the basic nearest, bilinear and bicubic interps' @@ -26,6 +29,24 @@ def test_image_interps(): fig.savefig('image_interps') +def test_image_python_io(): + fig = plt.figure() + ax = fig.add_subplot(111) + ax.plot([1,2,3]) + buffer = cStringIO.StringIO() + fig.savefig(buffer) + buffer.seek(0) + plt.imread(buffer) + +def test_image_unicode_io(): + fig = plt.figure() + ax = fig.add_subplot(111) + ax.plot([1,2,3]) + fname = u"\u0a3a\u0a3a.png" + fig.savefig(fname) + plt.imread(fname) + os.remove(fname) + if __name__=='__main__': import nose nose.runmodule(argv=['-s','--with-doctest'], exit=False) diff --git a/src/_png.cpp b/src/_png.cpp index 352a4169dd89..dab1de4fd5ba 100644 --- a/src/_png.cpp +++ b/src/_png.cpp @@ -130,12 +130,12 @@ Py::Object _png_module::write_png(const Py::Tuple& args) png_init_io(png_ptr, fp); } else { png_set_write_fn(png_ptr, (void*)py_fileobj.ptr(), - &write_png_data, &flush_png_data); + &write_png_data, &flush_png_data); } png_set_IHDR(png_ptr, info_ptr, - width, height, 8, - PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE, - PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); + width, height, 8, + PNG_COLOR_TYPE_RGB_ALPHA, PNG_INTERLACE_NONE, + PNG_COMPRESSION_TYPE_BASE, PNG_FILTER_TYPE_BASE); // Save the dpi of the image in the file if (args.size() == 5) { @@ -157,14 +157,14 @@ Py::Object _png_module::write_png(const Py::Tuple& args) png_write_image(png_ptr, row_pointers); png_write_end(png_ptr, info_ptr); } catch (...) { - if (fp && close_file) fclose(fp); - delete [] row_pointers; - /* Changed calls to png_destroy_write_struct to follow - http://www.libpng.org/pub/png/libpng-manual.txt. - This ensures the info_ptr memory is released. - */ - if (png_ptr && info_ptr) png_destroy_write_struct(&png_ptr, &info_ptr); - throw; + if (fp && close_file) fclose(fp); + delete [] row_pointers; + /* Changed calls to png_destroy_write_struct to follow + http://www.libpng.org/pub/png/libpng-manual.txt. + This ensures the info_ptr memory is released. + */ + if (png_ptr && info_ptr) png_destroy_write_struct(&png_ptr, &info_ptr); + throw; } png_destroy_write_struct(&png_ptr, &info_ptr); @@ -174,39 +174,85 @@ Py::Object _png_module::write_png(const Py::Tuple& args) return Py::Object(); } +static void _read_png_data(PyObject* py_file_obj, png_bytep data, png_size_t length) { + PyObject* read_method = PyObject_GetAttrString(py_file_obj, "read"); + PyObject* result = NULL; + char *buffer; + Py_ssize_t bufflen; + if (read_method) + result = PyObject_CallFunction(read_method, (char *)"i", length); + if (PyString_AsStringAndSize(result, &buffer, &bufflen) == 0) { + if (bufflen == (Py_ssize_t)length) { + memcpy(data, buffer, length); + } + } + Py_XDECREF(read_method); + Py_XDECREF(result); +} + +static void read_png_data(png_structp png_ptr, png_bytep data, png_size_t length) { + PyObject* py_file_obj = (PyObject*)png_get_io_ptr(png_ptr); + _read_png_data(py_file_obj, data, length); +} Py::Object _png_module::read_png(const Py::Tuple& args) { args.verify_length(1); - std::string fname = Py::String(args[0]); - - png_byte header[8]; // 8 is the maximum size that can be checked + png_byte header[8]; // 8 is the maximum size that can be checked + FILE* fp = NULL; + bool close_file = false; - FILE *fp = fopen(fname.c_str(), "rb"); - if (!fp) - throw Py::RuntimeError(Printf("_image_module::readpng could not open PNG file %s for reading", fname.c_str()).str()); + Py::Object py_fileobj = Py::Object(args[0]); + if (py_fileobj.isString()) { + std::string fileName = Py::String(py_fileobj); + const char *file_name = fileName.c_str(); + if ((fp = fopen(file_name, "rb")) == NULL) + throw Py::RuntimeError( Printf("Could not open file %s for reading", file_name).str() ); + close_file = true; + } else if (PyFile_CheckExact(py_fileobj.ptr())) { + fp = PyFile_AsFile(py_fileobj.ptr()); + } else { + PyObject* read_method = PyObject_GetAttrString(py_fileobj.ptr(), "read"); + if (!(read_method && PyCallable_Check(read_method))) { + Py_XDECREF(read_method); + throw Py::TypeError("Object does not appear to be a 8-bit string path or a Python file-like object"); + } + Py_XDECREF(read_method); + } - if (fread(header, 1, 8, fp) != 8) - throw Py::RuntimeError("_image_module::readpng: error reading PNG header"); - if (png_sig_cmp(header, 0, 8)) + if (fp) { + if (fread(header, 1, 8, fp) != 8) { + throw Py::RuntimeError("_image_module::readpng: error reading PNG header"); + } + } else { + _read_png_data(py_fileobj.ptr(), header, 8); + } + if (png_sig_cmp(header, 0, 8)) { throw Py::RuntimeError("_image_module::readpng: file not recognized as a PNG file"); - + } /* initialize stuff */ png_structp png_ptr = png_create_read_struct(PNG_LIBPNG_VER_STRING, NULL, NULL, NULL); - if (!png_ptr) + if (!png_ptr) { throw Py::RuntimeError("_image_module::readpng: png_create_read_struct failed"); + } png_infop info_ptr = png_create_info_struct(png_ptr); - if (!info_ptr) + if (!info_ptr) { throw Py::RuntimeError("_image_module::readpng: png_create_info_struct failed"); + } - if (setjmp(png_jmpbuf(png_ptr))) + if (setjmp(png_jmpbuf(png_ptr))) { throw Py::RuntimeError("_image_module::readpng: error during init_io"); + } - png_init_io(png_ptr, fp); + if (fp) { + png_init_io(png_ptr, fp); + } else { + png_set_read_fn(png_ptr, (void*)py_fileobj.ptr(), &read_png_data); + } png_set_sig_bytes(png_ptr, 8); png_read_info(png_ptr, info_ptr); @@ -272,26 +318,28 @@ _png_module::read_png(const Py::Tuple& args) { for (png_uint_32 y = 0; y < height; y++) { png_byte* row = row_pointers[y]; - for (png_uint_32 x = 0; x < width; x++) { - size_t offset = y*A->strides[0] + x*A->strides[1]; - if (bit_depth == 16) { - png_uint_16* ptr = &reinterpret_cast (row)[x * dimensions[2]]; + for (png_uint_32 x = 0; x < width; x++) { + size_t offset = y*A->strides[0] + x*A->strides[1]; + if (bit_depth == 16) { + png_uint_16* ptr = &reinterpret_cast (row)[x * dimensions[2]]; + for (png_uint_32 p = 0; p < (png_uint_32)dimensions[2]; p++) + *(float*)(A->data + offset + p*A->strides[2]) = (float)(ptr[p]) / max_value; + } else { + png_byte* ptr = &(row[x * dimensions[2]]); for (png_uint_32 p = 0; p < (png_uint_32)dimensions[2]; p++) - *(float*)(A->data + offset + p*A->strides[2]) = (float)(ptr[p]) / max_value; - } else { - png_byte* ptr = &(row[x * dimensions[2]]); - for (png_uint_32 p = 0; p < (png_uint_32)dimensions[2]; p++) - { - *(float*)(A->data + offset + p*A->strides[2]) = (float)(ptr[p]) / max_value; - } - } + { + *(float*)(A->data + offset + p*A->strides[2]) = (float)(ptr[p]) / max_value; + } + } } } //free the png memory png_read_end(png_ptr, info_ptr); png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL); - fclose(fp); + if (close_file) { + fclose(fp); + } for (row = 0; row < height; row++) delete [] row_pointers[row]; delete [] row_pointers; From 2c99aec6879990ccbd5ead09f657331f5516461a Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 26 Oct 2009 17:08:35 +0000 Subject: [PATCH 0348/1000] Disable test that's failing on the build bots for (probably) environmental reasons. svn path=/trunk/matplotlib/; revision=7910 --- lib/matplotlib/tests/test_image.py | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/lib/matplotlib/tests/test_image.py b/lib/matplotlib/tests/test_image.py index ffa8cbd07d7d..73f28b4f5a11 100644 --- a/lib/matplotlib/tests/test_image.py +++ b/lib/matplotlib/tests/test_image.py @@ -38,14 +38,14 @@ def test_image_python_io(): buffer.seek(0) plt.imread(buffer) -def test_image_unicode_io(): - fig = plt.figure() - ax = fig.add_subplot(111) - ax.plot([1,2,3]) - fname = u"\u0a3a\u0a3a.png" - fig.savefig(fname) - plt.imread(fname) - os.remove(fname) +# def test_image_unicode_io(): +# fig = plt.figure() +# ax = fig.add_subplot(111) +# ax.plot([1,2,3]) +# fname = u"\u0a3a\u0a3a.png" +# fig.savefig(fname) +# plt.imread(fname) +# os.remove(fname) if __name__=='__main__': import nose From 2263896038147bee8224f33f2790cbe46b45ddcc Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Thu, 29 Oct 2009 19:04:42 +0000 Subject: [PATCH 0349/1000] fix patheffect to work w/ MixedModeRenederer svn path=/trunk/matplotlib/; revision=7911 --- lib/matplotlib/patheffects.py | 4 ++++ lib/matplotlib/text.py | 12 +++++++++--- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/patheffects.py b/lib/matplotlib/patheffects.py index 96fa57455387..067fb50dedf4 100644 --- a/lib/matplotlib/patheffects.py +++ b/lib/matplotlib/patheffects.py @@ -5,6 +5,7 @@ """ from matplotlib.backend_bases import RendererBase +from matplotlib.backends.backend_mixed import MixedModeRenderer import matplotlib.transforms as transforms @@ -57,6 +58,9 @@ def draw_text(self, renderer, gc, x, y, s, prop, angle, ismath=False): def _draw_text_as_path(self, renderer, gc, x, y, s, prop, angle, ismath): + if isinstance(renderer, MixedModeRenderer): + renderer = renderer._renderer + path, transform = RendererBase._get_text_path_transform(renderer, x, y, s, prop, angle, diff --git a/lib/matplotlib/text.py b/lib/matplotlib/text.py index be4d866a361d..4486ee137a6a 100644 --- a/lib/matplotlib/text.py +++ b/lib/matplotlib/text.py @@ -278,9 +278,15 @@ def _get_layout(self, renderer): horizLayout = np.zeros((len(lines), 4)) if self.get_path_effects(): - def get_text_width_height_descent(*kl, **kwargs): - return RendererBase.get_text_width_height_descent(renderer, - *kl, **kwargs) + from matplotlib.backends.backend_mixed import MixedModeRenderer + if isinstance(renderer, MixedModeRenderer): + def get_text_width_height_descent(*kl, **kwargs): + return RendererBase.get_text_width_height_descent(renderer._renderer, + *kl, **kwargs) + else: + def get_text_width_height_descent(*kl, **kwargs): + return RendererBase.get_text_width_height_descent(renderer, + *kl, **kwargs) else: get_text_width_height_descent = renderer.get_text_width_height_descent From 2c707de137dce2b470fc9f32fc337b4d3d39c7eb Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Sun, 1 Nov 2009 04:37:56 +0000 Subject: [PATCH 0350/1000] Fix LineCollection not setting color correctly svn path=/trunk/matplotlib/; revision=7912 --- lib/matplotlib/collections.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index d579832ef48c..34c30f788457 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -856,7 +856,7 @@ def set_color(self, c): ACCEPTS: matplotlib color arg or sequence of rgba tuples """ - self._edgecolors = mcolors.colorConverter.to_rgba_array(c) + self.set_edgecolor(c) def color(self, c): """ From babb0826d95acf8fb25b5e429345c3244bbbd683 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 2 Nov 2009 18:31:42 +0000 Subject: [PATCH 0351/1000] [2890784] documentation bug in ellipse svn path=/trunk/matplotlib/; revision=7915 --- lib/matplotlib/patches.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 0514e6cc1344..2e34ad76805b 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -1091,10 +1091,10 @@ def __init__(self, xy, width, height, angle=0.0, **kwargs): center of ellipse *width* - length of horizontal axis + total length (diameter) of horizontal axis *height* - length of vertical axis + total length (diameter) of vertical axis *angle* rotation in degrees (anti-clockwise) From 2c5f4b9a61d91dfa1a0e95f7b80e40e7ac7ae129 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 2 Nov 2009 18:58:46 +0000 Subject: [PATCH 0352/1000] Merged revisions 7916 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7916 | mdboom | 2009-11-02 13:54:29 -0500 (Mon, 02 Nov 2009) | 2 lines [2890345] pylab.thetagrids() does not accept fmt ........ svn path=/trunk/matplotlib/; revision=7917 --- lib/matplotlib/projections/polar.py | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/projections/polar.py b/lib/matplotlib/projections/polar.py index 089acbd4ba50..dd9521c7f9e0 100644 --- a/lib/matplotlib/projections/polar.py +++ b/lib/matplotlib/projections/polar.py @@ -11,7 +11,7 @@ from matplotlib import docstring from matplotlib.patches import Circle from matplotlib.path import Path -from matplotlib.ticker import Formatter, Locator +from matplotlib.ticker import Formatter, Locator, FormatStrFormatter from matplotlib.transforms import Affine2D, Affine2DBase, Bbox, \ BboxTransformTo, IdentityTransform, Transform, TransformWrapper import matplotlib.spines as mspines @@ -318,7 +318,7 @@ def set_yscale(self, *args, **kwargs): set_rticks = Axes.set_yticks @docstring.dedent_interpd - def set_thetagrids(self, angles, labels=None, frac=None, + def set_thetagrids(self, angles, labels=None, frac=None, fmt=None, **kwargs): """ Set the angles at which to place the theta grids (these @@ -348,6 +348,8 @@ def set_thetagrids(self, angles, labels=None, frac=None, self.set_xticks(angles * (npy.pi / 180.0)) if labels is not None: self.set_xticklabels(labels) + elif fmt is not None: + self.xaxis.set_major_formatter(FormatStrFormatter(fmt)) if frac is not None: self._theta_label1_position.clear().translate(0.0, frac) self._theta_label2_position.clear().translate(0.0, 1.0 / frac) @@ -356,7 +358,8 @@ def set_thetagrids(self, angles, labels=None, frac=None, return self.xaxis.get_ticklines(), self.xaxis.get_ticklabels() @docstring.dedent_interpd - def set_rgrids(self, radii, labels=None, angle=None, rpad=None, **kwargs): + def set_rgrids(self, radii, labels=None, angle=None, rpad=None, fmt=None, + **kwargs): """ Set the radial locations and labels of the *r* grids. @@ -389,6 +392,8 @@ def set_rgrids(self, radii, labels=None, angle=None, rpad=None, **kwargs): self.set_yticks(radii) if labels is not None: self.set_yticklabels(labels) + elif fmt is not None: + self.yaxis.set_major_formatter(FormatStrFormatter(fmt)) if angle is None: angle = self._r_label1_position.to_values()[4] if rpad is not None: From 07c863d008976acea09a07bb058f8f209c757477 Mon Sep 17 00:00:00 2001 From: Michiel de Hoon Date: Tue, 3 Nov 2009 13:53:57 +0000 Subject: [PATCH 0353/1000] Make sure that the FigureCanvas and the View are deallocated. Previously, the Py_INCREF ensured that the reference count of FigureCanvas never reaches zero. The FigureCanvas was therefore never deallocated, and the View remained in memory. See bug #2889570 on bugzilla, reported by Nicholas Lederer. svn path=/trunk/matplotlib/; revision=7918 --- src/_macosx.m | 35 +++++++++++++++++++++++------------ 1 file changed, 23 insertions(+), 12 deletions(-) diff --git a/src/_macosx.m b/src/_macosx.m index ee0c02d5a99e..7d1c1265c658 100644 --- a/src/_macosx.m +++ b/src/_macosx.m @@ -340,7 +340,8 @@ @interface View : NSView - (void)dealloc; - (void)drawRect:(NSRect)rect; - (void)windowDidResize:(NSNotification*)notification; -- (View*)initWithFrame:(NSRect)rect canvas:(PyObject*)fc; +- (View*)initWithFrame:(NSRect)rect; +- (void)setCanvas: (PyObject*)newCanvas; - (BOOL)windowShouldClose:(NSNotification*)notification; - (BOOL)isFlipped; - (void)mouseDown:(NSEvent*)event; @@ -2896,10 +2897,22 @@ static void _data_provider_release(void* info, const void* data, size_t size) if(!PyArg_ParseTuple(args, "ii", &width, &height)) return -1; NSRect rect = NSMakeRect(0.0, 0.0, width, height); - self->view = [self->view initWithFrame: rect canvas: (PyObject*)self]; + self->view = [self->view initWithFrame: rect]; + [self->view setCanvas: (PyObject*)self]; return 0; } +static void +FigureCanvas_dealloc(FigureCanvas* self) +{ + if (self->view) + { + [self->view setCanvas: NULL]; + [self->view release]; + } + self->ob_type->tp_free((PyObject*)self); +} + static PyObject* FigureCanvas_repr(FigureCanvas* self) { @@ -3243,7 +3256,7 @@ static void _data_provider_release(void* info, const void* data, size_t size) "_macosx.FigureCanvas", /*tp_name*/ sizeof(FigureCanvas), /*tp_basicsize*/ 0, /*tp_itemsize*/ - 0, /*tp_dealloc*/ + (destructor)FigureCanvas_dealloc, /*tp_dealloc*/ 0, /*tp_print*/ 0, /*tp_getattr*/ 0, /*tp_setattr*/ @@ -4483,27 +4496,25 @@ - (BOOL)isFlipped return NO; } -- (View*)initWithFrame:(NSRect)rect canvas: (PyObject*)fc +- (View*)initWithFrame:(NSRect)rect { self = [super initWithFrame: rect]; rubberband = NSZeroRect; - if (canvas) - { - Py_DECREF(canvas); - } - canvas = fc; - Py_INCREF(canvas); return self; } - (void)dealloc { FigureCanvas* fc = (FigureCanvas*)canvas; - fc->view = NULL; - Py_DECREF(canvas); + if (fc) fc->view = NULL; [super dealloc]; } +- (void)setCanvas: (PyObject*)newCanvas +{ + canvas = newCanvas; +} + -(void)drawRect:(NSRect)rect { PyObject* result; From 3c21a25fefe5c49a0c8b7bb52d4f4835eb7eddb4 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Tue, 3 Nov 2009 16:00:13 +0000 Subject: [PATCH 0354/1000] support postfixes in recs_join svn path=/trunk/matplotlib/; revision=7920 --- lib/matplotlib/mlab.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/mlab.py b/lib/matplotlib/mlab.py index 5b6db8f70a19..c16401491697 100644 --- a/lib/matplotlib/mlab.py +++ b/lib/matplotlib/mlab.py @@ -1893,7 +1893,7 @@ def mapped_r2field(name): return newrec -def recs_join(key, name, recs, jointype='outer', missing=0.): +def recs_join(key, name, recs, jointype='outer', missing=0., postfixes=None): """ Join a sequence of record arrays on single column key. @@ -1911,11 +1911,15 @@ def recs_join(key, name, recs, jointype='outer', missing=0.): *jointype* is a string 'inner' or 'outer' - *missing" + *missing* is what any missing field is replaced by + *postfixes* + if not None, a len recs sequence of postfixes - returns a record array with columns [rowkey, name1, name2, ... namen]. + returns a record array with columns [rowkey, name0, name1, ... namen-1]. + or if postfixes [PF0, PF1, ..., PFN-1] are supplied, + [rowkey, namePF0, namePF1, ... namePFN-1]. Example:: @@ -1938,7 +1942,9 @@ def extract(r): if None not in row: # throw out any Nones results.append([rowkey] + map(extract, row)) - names = ",".join([key] + ["%s%d" % (name, d) for d in range(len(recs))]) + if postfixes is None: + postfixes = ['%d'%i for i in range(len(recs))] + names = ",".join([key] + ["%s%s" % (name, postfix) for postfix in postfixes]) return np.rec.fromrecords(results, names=names) From dc8eab40ba077839266e3339ecd414af00cdf5aa Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 3 Nov 2009 16:11:07 +0000 Subject: [PATCH 0355/1000] [2890979] Close paths correctly in PolyCollection svn path=/trunk/matplotlib/; revision=7921 --- lib/matplotlib/collections.py | 19 ++++--- .../baseline_images/test_axes/imshow_clip.pdf | Bin 122648 -> 122850 bytes .../test_axes/polycollection_joinstyle.pdf | Bin 0 -> 1231 bytes .../test_axes/polycollection_joinstyle.png | Bin 0 -> 5180 bytes .../test_axes/polycollection_joinstyle.svg | 50 ++++++++++++++++++ lib/matplotlib/tests/test_axes.py | 17 ++++++ src/_backend_agg.cpp | 33 +++++------- src/_backend_agg.h | 14 ++--- 8 files changed, 99 insertions(+), 34 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/polycollection_joinstyle.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/polycollection_joinstyle.png create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/polycollection_joinstyle.svg diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index 34c30f788457..d101b09fd2e2 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -574,14 +574,19 @@ def set_verts(self, verts, closed=True): if closed: self._paths = [] for xy in verts: - if np.ma.isMaskedArray(xy): - if len(xy) and (xy[0] != xy[-1]).any(): - xy = np.ma.concatenate([xy, [xy[0]]]) + if len(xy): + if np.ma.isMaskedArray(xy): + xy = np.ma.concatenate([xy, np.zeros((1,2))]) + else: + xy = np.asarray(xy) + xy = np.concatenate([xy, np.zeros((1,2))]) + codes = np.empty(xy.shape[0], dtype=mpath.Path.code_type) + codes[:] = mpath.Path.LINETO + codes[0] = mpath.Path.MOVETO + codes[-1] = mpath.Path.CLOSEPOLY + self._paths.append(mpath.Path(xy, codes)) else: - xy = np.asarray(xy) - if len(xy) and (xy[0] != xy[-1]).any(): - xy = np.concatenate([xy, [xy[0]]]) - self._paths.append(mpath.Path(xy)) + self._paths.append(mpath.Path(xy)) else: self._paths = [mpath.Path(xy) for xy in verts] diff --git a/lib/matplotlib/tests/baseline_images/test_axes/imshow_clip.pdf b/lib/matplotlib/tests/baseline_images/test_axes/imshow_clip.pdf index cfec4373b18cc78389191d394614a04d600c2d13..f7e7f5f12e174d4d145f60be6fa4b8e4d7d11e33 100644 GIT binary patch delta 117145 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�-I;h^ly->0q3B?xg>y>4`=+0uTn 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 delta 117034 zcmX_ncTkhx^R)_sh!~21AiaZxj?#NCkzNI)3nIOS@+hG69(pJOAs|geK)Om71W7=o z_Y!&_2!!_L^Zm`d|732SXOfw{yL;~LIeVA8NOL+#QyuP!h>D4dOFos5wBl#0_bARZ#;gl>n zmG%x}<-dyS3S#eP>gquWD0p2}{`mTHhWB5$_3R0)`Ti|Y-gjWp&hkd#?5AC@dE@?L z-_ho(wWb693%^-PaAocF^(E&O<8}Nn7&uPsj-`%!VsFI#Ms#CblOjFTfia|F9d+Z| zc=|12^BrS1o3HWvuTbS&HAI}RIQBXVjF*!Ad_VpQ+ejq3>xUfkO_F20|IstmWH6A= z4WZKLZ}ik4eOj{)MoPLT8F2ifU+X{zmhgwVB}t;J^#kI)AD{W2ODfFLoT#L}K@)iV z_LaU`J7Y9e#CsrZNNdRRnPnVtZPjbPWregBN9%81FAM}~YHM9MXc@*ibv3zk@4V2| zEUoU~Q0r@PJiB#hR?+-Ze~B`8h1@4y!yH-VR_H$`C(b5w^5^bIxgq)?M9_DtEd56L zOSa!8@-MU8C4TW$um|*}L@qF3DPK|o--N4kK0H{hAQ6z{2i=TY_VF`4)y(ig6}kr! z@o6MgOGmynvbnXBP8q`wRHbqDDFuOh{vY@a zj8MEcMHV6BZu=a6G>Gr(21XU93n~bBL#8(eyaR}+X;P6A1`5{xe;Bo1N~qeyfa-g7 z;`QxOIy0n6CCtwAvm(ErERx;Gj2Y8pxphY!z84>vG7aVLzL!MvvYv8L@^1Y%;RVt$ zla8g^bpC2Ino9b*nnGiCkT_`F9gBAhf0eJH)?}y}OUC2j?oFPqoA1*y&V(phTy{&O zew~Ougbs0qv%L%Lqx8RJ+Q`Oi^aCh#RIa2lUsV;|T_q(0{Zn|RQN&I1ye@8$>CrusD!(Lz${;)m?_@IR^HDR+Lqr89Y`lo0?}r=k)O z4BZNh2F#V;Uy)GU3Hkh)j+ycHOj+Yn$^}~!BPw&Ro08@St;XNH;_w}^A8y{s-|xD= zdJi12KYk)E(u7}R=sae8Sh`gs`FELTyr~(S2a1`_8EqLp@XAT#r0osY^02{uxBgi| zz3{^1_IvL1Nq<%b5iNnu1F!-NV1gKV+080y{DM@Ak{w=`e$#)X)J8p9HC~rfpmAKURuT&VHy_0zU02M4$wp5bZ2l%m5xT-J; zleobX@-C8C7+S)z3M$+Z!aWI2-4t^D`b$_n=i1|uy zKE4agdzCdy3)pqV?pL~QPsxULbQc{3_bz170G@gm;g=kpzX0ID>@{|qxpP`oYyO~l zt*7V_4dDlgDH4r+X8>mZyr7Z^MWocpEUU8?7;?fc|WjQ(Ta6Bdk5C= zQQq_Q>B(9%ut=j}TgnX7@?Lp9y(m5Qx#-1K($ajTxbD0#3k&67A-xFbSn>+&SF~VV zX>d%J&p1l%%4Y39Svvi(JA^fzjSmgBX@11gKG@bAb|ePsJ77h;G0>4(@kF#n?pH{r84U8@HRZT^9uwJ--`Eli!>sxFTMk%yv@&{<;B5# z3sq(G?oP$H0R^{7+I>_gl`44$1C*^Sbv|?|wCgC`<{z@gWr;^?M+;UC3N9WQ*@RS355cUSOpFSGW3+x2@>h{nxvsKNP+4Hr*Cz}fo_B}f;ZJ;r-$M=IanfHIo&eaCB z>hFi;&##$vY=fcAz}B4CpU?}{{g8~ST?%|qZ=3CYc)>g}cycS8bn7xcC~5xMz2n*x z|K{=WTl1|blFg`VPuqpZIQHJQ=d94&s}3M6d#hV$EQWsHAzTeON^aL;4fvq2bt_yV zbYt6bWU{{ynIb#czH(jujBnoVI1U&C_<)T~MY?^Da3kypiWlIoJ4GG5Hi>BNt*Z#` z6|Omzq^mnUrt8{To)iL9g(UVX5^!m~URKyP(ypZ5eOK)2z9077u6-F)a!SJw*kX~! z7Yww3QE$=Y#QH9fbg3$MC9#y!czOi3#gc}X&R3oK318t7iry~semD*JYPxT9;W6t8 zXvG(0ExVSV4)RAt#G7BReFvFh(E&wQ$Cr3>&{j=CQR}j6-6@%1#QlV#zW$vQXY7$> z`!Z?cX&gAhGofgH+4a=&(ik}B>=^TdmTnxU6iq(rECz5TS4%HCz7OF^>$dhg%Dc{6 zZM%ZKHuu}z=AmBOUR|Y=XLYu(Vr`G)FKa+JM%JwfMbyHnMcosVy2DD_Gx5t~duZ3YaNDThr&Z6i-%% z$h(eWL|p@i+H>8n?oG((H|m=v4Sp2WmgM1+x5d=!q?qB!5t;(>DwxqsmU0|Y2V{z; zK`0vGRS^s3&{!0~&&-GgBfLJs&Kxg^urtIvBkYXu>WCt9Xe#R35Wk?KSc)^&QLMzR z=qQ%sICT`u09=&LLLDw#=UNvN3hUIx$YyrhU}j*QrWior5`^$F!jmBCjG@IS^T*)` zlsR8`E-G6fydHI#*=c|whbcV6bn#!BBSsDJf{5#Ce?`Qo0sfgzQ8{i<=h_fMlc`{f zam-Y(!f<9Ps9?HbR~@JrzBzMD6imSYa|xRVG%*YOm)3|NbLdkpS(W$G! zHN$LGF%y}#`WVwpTXjh@qus|9O=~9GV(#CK+~>_FX1OPJ6x`RB-JxER&Qy~1KsMu~ zagwKDDU9*M_=Zk+`M3c>!EB2N@t*HE*~m-axYejm;P|tVF#mC+(J23Mwb8T3$7Mz- z{Kv6IApYYwMkoBo!iYVitw4mQ;g$=+(_{;Zs5N#kHZp%KsZ{wG)@o9DrDIb(9-?!p zU)jYM&}0Ps^ZI?wqh^<(f_rlfsQR0;;oGlO{qK%>T>y+@byut<*Fe(C)3fHVtk`)g z4#unVt-EThzolty4qEP)q>!o+{o3Nh4=wxkQ&PZqVj)H{Y>a$1tYbuSC3W#s6tMDG zp{w7ONwe$ zaC3BHL6m9>J5=G}6lz7=RN+lZIR0B>n$DCRipn?^el;&ws*WU-wJT*uy%H|SQ4K(I z;2-g;0s6mOV{OOTp@5!vY{VERKG#TX!JR5R!{{lcnw=%lST9IiZqT)|i1m+kNpz>3 zm+{4h>Y2xq$CWjW_j;JnRg}6yKOO12BV}zVYsLoi)T!@N+Z#%b*cK6!TlL8I_myS(j60ty0fLsGA_Ku+TrxYUm3GczdsQ>vE6}~1S{DXOuJ*eI_kQ} ziiP+t<7@*eY=JZ54wT5{@#t}U(IbO8g8@t$R2sBZmo%ZvVDR)Fg17O6pHIHA=H$yC zbyq3aDq=s{%0ig>jbJO z1bkVKz>(^7x$|Vt1x|6J@w}e zrw7AYE@T^#-^fBPTt}Va*Tj$A27}%!03G=(5oGVT$Gg4em+(7pwwJTRZhgw@^pkH* zSg0o_t~#d)cnxeY*9wz;6|xAAotz+zI`+x@&;KFZ5Yq)c0 z5(o~rJ*MGBntzU;{*?D-dJt3p9%YyN`%|*!`Lgje-D5ua@b4Vr>nC|`tNx?X4WYyN z6OLE+$hRuNH5sNeToVe)jr1^*Zu4D4_QoYwHHt7rqfjf&eBSrRI+jS2?ngLVEi z#v47u9LXb=rdZeYQ%4_+eRI9JA*Rp`I5S9@A4mrlp06*?E>t;(0sK;|LAGUCX@k7w zi3u4a9DF=_3ca_^#&vF8YhRPiWAKSW!0D3q%YM)e7H^9E>f+jh+VcH6mbrP*+ZR}i z7mYz53uqizFQ}M&d<-Tls+g-tgUyI)smA$`H^+NZh@FqY?z^S*_W&;{*s24zbh>dK!+mTz%|DA5HqpxKYYka$;-HG^gfOB zB}5QuSIdiJW%tdqLh~WH5p_n;H@78!Vy^h5DgHgX57u`plaOIKS?3Q=LP|)n(9?h^ zKoRNAY8Dq?XcWYyNEPT)4jJTJNn9U{!bab`T=f&8bCPDu8^$K+tse#759YXe$eIhj z;VtwD2rMrZ4ZofBO!ZcF6iy=C1q+$DY`yr-OYTYP-+wQty1dSg@~^VhimGl8p56Bj zaap6IWOz?!U$p2WembCs4>?xc`Ta`E!mPA*KI(I8Fx$rtcpypRNriOP*kv(Eqievb zVN{7m3gc{w3Z!df4QF+I?8`WZd6rm0Vpg{dD8H6-e`P=uH2o73_e2Sfnh$kvBcpVs z41(?rXNA0j7nWNgKRyvg7RVN4pjkK8{C)dWe`0t)uHtrWA;vm(j{M<>+me}Rdc>+k zDQ-{=q8pTF*s4Z&<%LCR7@qE~_r;NA zW%(i1oLe4yq^vwwAkvO=52tGe8PW#vAl(wR^g$mHb^3!CU1Q%oLpZaoRzKjnf zAC2mMW>k}ejtlDH8dzugRzj=|qhx4!B9)mRNHUzAD)=BL!-t04_8|b8k&vuCmp2x= zx#H?&JH{=Z?$r0FZ9q;mf}nq93mY~pf}k!5K1d`(P-`lHCWMh+P~ON2_nQCUfCQdp zZ4cKKo8^++A3!%g=``!6?RJ0|{RAub#jEWTf@v(fPc-FHjDh1A0dVtm#A$(^Qo=~U zyS!M&bd+voi=ClgmPmO&u2&F2Uk__a?jN9&Y*(kCfoa$=u1Xl-6(z$k`Qn`tWibai zEmY^gXp0l&64R+*{}wU)gkf`O`1B%ZSuS)&TIYtazc+~#Q;-l~uM+j+OmNu|N0TKc zno2b=;Pjx6cKRWoPW=VxWwub*y~#tw4WYU8H+zZlzB10oMcuz+8|tnZHItM)qMu+@ zEyiOV*>7yAR_rTxt0|tpEgkQ2{LTR#m(b$^{Gb(8fc~1lcFsV0Pw=WE(J}+k7 zt<^6(0Sk08>JRqejA{~3c|Wp#1>2N~e#q9z$CRR(k43P{N0Y8=2(Stk&BiW1|FQ9K zHwhVXaamOkBxU*o_y)UaXJr%-amz-3`P~Rg*9Bq~7?1g?h_Jl-p%#Qa!iTf)h)E~y;fyvR^ss;3EFDN; zk>WzhI{JH|!v(i}r(4jAp=x{nwev>H5cGd}Y2_6XISk?Dr|1r5Ljqn}gBUJ^Tm9NF z%0buHov?rKJcto~11nNkhHKTSTUq-8Zjy-2^0c#U1Xo#Q2mZk^sbI7_#-j_}pMzu* zk>dk7sD1upJ7MI)u(4HnOc1O*=3o&ZaXI|{x_Zo&(&plTsEAx@VUKs)lY3cuaO0IW z@7k6cFQK(lqz?oB75d5CbgFwWg5-c()=p|S+^P?Yyqd{APMr^s%Ya+|P|@~^Q~P&p zNmX^NWx+hZ5Xr4_zMees=Z3W0Klztux7TsS7u5AKk_Jg@^iGohXy*7NDQH+@=Rgt_ zmJ{#ZP7h)By9D0LSN{j}`w?2w9qHNVO-Q#EOKyQDE*C&`e$7DF1paljeWoZ|v;M4E zUQJf^HJ|+VR-D>Mi9V~*&qqJ)#GYac90cXM$! zREFOU681IAJM~eX-~cd=%ylabKa)Z4`Zz z=5S^auF&p?yG?#ZYX@7lQUDGMh-$~UKHNHI>f18rIG17EaGc`648Xb8Pv8`h#U%N8 z!x2nb4#(e}_BEl!cnwybK6Uj2r9irZ>~HR==$8hH8mnKJhi9VW-Pw`#(w$e^olmaH zX(xPg?)X9_VQ48?o3{ABL!eMxv1w1!p}_K|WHTxsF5ybV{%e8@`c)faW&&5;H>BDyQx=e!%_g!j41B<7k`XYkALA!Y8#7ekzRl35_H} zx`>!Mb0a+!0kZ{#1*{DAHM1fPzNY}uZ?|lwb_lT50iU04LwDg!=^wgJ!{Xifk)$zC zmV+)ic<#|O_%iAW#R)i+LTKx`4b@@YEX-9Lol4bim|#FIr!F4-jwK!SMPQ`7oB?6k zjDVxgp*q)3$|b;YLpKbKWS)w3Xz;}mA!b(6FiLLw!Cyr|nLe@LHYNn{9l6Hw7*T7qY#k=SSKHPB&4_#iuys4A6;& zr!)S0m|MvKA(5Wz`xp!M{OkBJQh?*9+XiIlVLjkNTOW-|iMN-tqRl=E*23J3Kx#rD zLxsV<;w;Aq5cM3LHfGkUUEjDnco)R*&&l2G3>eYo zfYLr+f^)HG_>JN2WA0vAJ-gQ5w%D~~k$s0VFf+sNq^{^AEc2ro&NY6gzPj=$j!$_m z3EaiWKh)}7Q?l*kDwH8dB8H!!qrv|;gU7}6!oKa{wS=U=O8OcKA{u3{)nt?lUM6>K ztl>1vq;1XA{Syv7XzSBzIS%bXv(5r*fdAl*#QjhMo$Mg%^!)5}SRb_m1fr``RCt#X zAzbjNPj~P6PeVrCW$sQKP;q4AkW+{Ibv9*1q=v7Tr1Y zgjAO*6OrOb&VwWWq`+}|aCwzA3WwiFh98xZ@Q z(|IeW>*@Yy)#Ekt4O+XZ-~o4Re3xYE#Kokq|0hk9@+w)@3}20L^_5?TN4<*43f=be zv)(AiRoq+u15V2b`+{t1F?)^-^a}$;m1!X^y`JxKt>JkP1Kzxq$_aGU`o~yD0$Q3; zCCMh4sy!Uswy%m+hID_@bbQXl349iCKoz*aJevd}vNxMPRk~Ty?iZE#cYU2Pavkzd zM}7Ut`7}`zt@&E~e-BM%AiE0==Z4bX`#Lz(=b~{(NT!w+ot$t@9EH=a(*44Rw33Lo*pMSYC ziGAGJ{muPfY+t8Hu1aKP5@Y^fHs9zv&n7m%+eT!a7bX?nu zoZui8NH=l7%eK_1b}h(xA$dXZypoUuly@8Q)KvZ69gF#E;5_x~rGT&dUmwd6x$;n2Pu_P); z%5%cKDE}2t!8fmr|GCUuQRlGFc6j|w(J%FKBZKwbjr~W9fck>cKET$n5;V9}FYo){ z4B%_k-U${;VtiLyn+g7G3aM_+;qPMF&AD-moG5G@=l-mY-cAtIz+dy!=(5^$6I; zUf}7t;uBBW75roZ;Woj>HqZV(sw6~J6{ z`IsY*&NQv1hH{=k=?9!##DeAT=?Mi7&1Z7&E9tHi4YxsoaQ(r@S8tas9e5RWB5Y1> zV7_fp$8b5P5c~IwJp!ktikE-xZAhQuShONe@a&W+M6ZPY11^ZQRzqVCb#pGiIYVC> ztfaCWS2#*{fb)xa?3dRgo_L{=J;ah^G(J=`t?0~dmd1~^pBE66Wojv-@D-tWFmUjVnT-UwWiZBWro_C2IrR?~Y;NycP z0<1g!ZX$dY59b%y%{yNS#?W}#k#B?#x7A))nt{GlLx2Ygbscl&&3BpZ(Fk>ccs4bx zWogtnstUsOOEt`VVN=W6ScQq79-@FWX=Hrf6T8i2W4ZC$#pP|4Q_eyy+1h#ryw7}m zf@B)sGuE{Zbd<9pWuL1*cW>uuKo1Hm3s!J6y`U8p{Q0PcahzagZFM~FQ{gdc4xzj( z`kR~M5=RI(vU=Y!0;`m^>Od~T!c9u)BW~-N8B>PCcXAb$`HN%hFZb+gCxBaZ(W7i1 zru6@&NAXuWiNv~YDbgt9Q=d%XQ*3DOu#7J4$Zc3i+YK)=S^xZQts!XKc6x(U>F(0o zo!xC)l}ALmCr|eAGNUW4dS2&Gy%!GTpRcSv1xTs=S%)*9kaO@?3IAic)8rzg=aRtC zg%?~hN1p7&d5rP9L+_AutMvg}Lo0LRJMks$>JhJ=2MofOm-i&>3B;V@aYKkA-7g;= zq^yPdFx&?dw}%TOxENf?VWeYj)@w;7YDo*Q1sFXy!ZZ3bbGI<1oS`zigTuv1DT5N$ zzLZJS9=?F}5jCLxHy$6`;+Q z^Y#cK3Rg|lB=&pbH|+G&zDy`|a!u+&_Q>;1b9QI_>XPEWHmJyg^|$9&b8pwDL#UDLxSFmHC|r#aPSNqc3DlJ@@TIk`L-N9MH>%{ZV)R3>9WPT6-OU^5QUQ~ zF>mf99Egk`>5;H$+NzPoocvThZC;-<*~oN+%aI)2z2a19M4j*KxHC`0 z#=cN_9wZ=Zr0(%oz#+6oz=5bLHWB52gbFqF#ka^ISQAIt)`e~@mSECp%l*aY8P14e zJst`NmD2?Z?Q(gJe>P>o;XW`OSs*#&J+_;0lq?qBVywga^hp=4(BF5taNKy2Cd$e( zk>I8cKYEf#%}kO=!JBGQ8@?TvVYM4??-6%?xBzz7$l8%t{Xarr8<`6%c;3x`4V6Kn zDAx2?#ublx#UZ*Beb)qTmOJI8(PBSc7?j!g7 zi119Sx*nD?fJ3iLwxSa5`8ocpuPLohTwLp@lYUh!k7~3)i46=%P3X=r>6LCUbY0pn zK$l?h!;~yaKl+=0MdsgpR7VTSmvw%bT~CuUZgYK)5>q19LAO~wa^kZoWD#OPsU9Gl zp{Its1asjGhY1=DCpBf!Bd3pI(gs^!vK!rV{kdTryXyfd@-L1~CnNSN6#v0s+~xG` zskhzzjcVENCZaF=K;eGaz-G`j>-iNhg%}OLV!1!bod<8@i<}U9mv}*mtJNOJ`9+uF z$zz?^CL&=iH;0Tre3|_m?f)g`ve@2%KqeYLU;bQE)tbt_RimBrwZ$VjL0#`~i>{7? z#}z4VPDSWM>rYod@zrJL7ZftPAhCb5w%L=}xqA-P%W=b5&o>RHUbl!h`tbvVAeOD^ zW~!2wlm5yg~s|q)hwP| z%>HV(UY#*rnC4Ci_s5XA>*z1FQsnd*Pq$LZO1~a&O(mlybaj&r@7+)RU?HIxi03I9E2><>)_t!@G zghR?2T^b%T(dr>(kUta0i|+Qd!@HgDd7IZ7s34oU>iO?~4lCtXILe5WI(ojzT~)+f z^ok_1QhGyYH223DqfC)r$C}jmiZ?`5#Nn`Z$){q^Vg9vjeo!cK;dNV146A3S!=V>3 zu~b;q4|cL@7trqxpzej_BEI+~J`X=pFieLj?1+e{mI?ooKu4QUB++yXv*ktFm(;cH zJZlP5Lw$is>zh9*v49p2<169bM@yx z1~EDBGMc)J=gEmhoutN3mkZT*_hYj(4Br z2MNk*z7JZXXEzokri6)HIWlR?NT%tfCvOe3XK;G|+pXCDtGv(>)%hwkJm`OxKQvn~ zJX0r6hK`+oAK1yQNIC2x`reI|;YeAM)*4q`&5?nr_)qA^Afho{E zn$Z+tKe8bF4IuuNA~g>xK(B3ug9o%#k)`E&w8=j+Y-?<(-lHC}K5vHn7)xQL{)Iqz z+k75?Wl_dB>%@8?bYlO$)-F_bqQALX@*nS1pqq~J7iU4>erSWZ5k5=lcA^wW(4#_> zpAm+A=DF3pd&qZ%wwL~{93OxnO){G)qn1S7O*I8RoF7-=vxFFejNr!eFm$Bx*7vfF zVU=$W;GB#b2wyJa?}49w{C&B?eA<@KxeJB^j`Q*}7$D%3_8RZSRJA|-VOeyLxnubp z*+eKkDn+TSIR>^~kyW+*pVOzb-o@E#)fMGjrrHzO?|RwrR5_qG04&|RHfhi>QI5Nn z4MSV6p5(n3aBvB1^)sj9M_AJrNH09oZ~LWNHe=K|AVH`(IOj2G?E+V7>l{jJC77GJ z_Hs>xh<1|M2!@@am~}xJuds56nXH;nL*4QiFaG}~NcbczDzkT@K3rNm(zjM--A((Q zdDT~mJ32B(-1t6gCqg zh-?}4-9EeXIV{}y*e!bNR(^R{vSuMl60Pbl_dXqW z!0Zt8Ez0pknoRz8;@>f__E`91jt|)N7d8q*kocTgk+51K*DYyQ6WTjj-$Fnj*JS|! z9Rm>)V|a(1OB~FkylMQzC7rT-&!!;3sKu_YOQ4q4gxQo-@l9@N5@VoGIRSIuz? zF@}9Z8zO!QNoj#VsUUEk6FZr&S2qB9- ztg@KZ_fqKysOw`=Ue1`vw_t z-QEp&(2;kRD631@xb{D#WWm_i;M|)(W;V~SpUOpt^og|aW=#bJo3B2hQqutH9n&XF zrdbg2B>5f8CBgh@J~*;uggNp9LDPG0=+4MfDA272w8-yM`@|$*AaZo1U5O zW-uf2YvYL!qzU%z_XYD@WV1J2q=JJJD@J6Zb|AHg^{gYElO=x2DTPejiiAsd4bQp zpJIh`!SO|Nry%3O zzJS}Ai0$>b0H~E=-^r(*`#;_CWW-n|mnEy&$~RfFAi>H9s>M$+YI}dW;mhVPZvR>Y zhX$~dw=CY#8LqrT=yK#henM-hdl|(JcvII)=-{!tc1I{M6i>`O#&!rP+48 zM4#R>FYwaiv@pT0_fpM8^Iw2iNKb{&Mvoe+Yrw{5^^FKvmfcA2TlXhA;Z{%dR`(>T zxYMWFJGm2bdUnC$`9ZRZ>6@##DCSCzh%Vq`d@N^(7G{kf(Vt5j(mq4|+V=Av?v|04 zPqL=(L*dESAvOME{$z-urz?sesMgB#l}oWFfv*ONDHAC<;k)E&Xdl&t4=igya%FUBgcFecPQhGLD#1-v#)- z8tV8sO2_%%U8zS38&d5p5!J!@nEtlo@8ufDd(crZ}{P>9!H#1M+4&m4&4tOE?MyAsv|7G&fjI~I9 zwq*~jhC^YZQlO+%!re_wvSXMY%Yg>sY$4BH`z7ePqSVU^Q4~5DVIx;cKiCNPKNYZZ z_@)}P{@qW^kVF5}pHT%0PL3?0glN`9sZLYYg&XS1upBJ*-(!&v>J8*J zOenqRq}AC(g^8d>`|}1VTFYty6wrj1zDxXAeq*68Q;F`*-h(N|2P1l5fHy4Bj&QQ@ zKTiP5!JnQG7@pHJ^2?slx7=as`EA`KYn^|RrXnKOhKz}5b-bJS@l(B-|O!@KXko2w1Vu)^~q zU?Uzv@2tU730CsKRcnsd4~wv~wDOvp3G>P-y4RLF^pfY>VSpmH1Swh3wF=KRQ<3i7 zs2B@ig>7g<2F)l*^qmP_X#&xRP!mwR&?R!hGr@26?%Y&)I`NEl-xZJXgdUs?xc?Ju zB{x$P==4jS0(mjW{%u(`)JPhy+e`Pr-q<%eIi74wS67!c4rd=9tlY=OSeO)TO@_m% z+Rz(4t~8c8K#p~fMCuo+I^B11I9Sc>t7(FOw^k8nt~~;ScAPpT>>7W8ut2c_ne&0kfl{9 zBmmKIBL#G>G}mm;eAehhmv+HFw;uJF(lZr}{DLT^S8#Y5nX0RyyQNviv#+?UoPM@} zA&?pM@|RF0GSNfC633ga8Hf8G^`1k#4r5;=ZozCf1V*V!2>O$j)@E1ixtSAS13l9ym(ICE>c-1GxUo+3 zUG_G7Kh3-R=%JG1KRGyeh9R%wV2)n>g(7}|d@1wyOoZdXWIqkgFtm&-g!mzAv$n`)oG*U&eGyQkUyeU)X=k@!xZ?slin8uAveby^F^z~6%MG~?8&sSa zjlh5~yItMLO`;?Uv3$#^%D6O2S?cq=^NC8vmEFdM-t93w+X#Ert@L z0y1K%kr}SV3z4*+aX=cGyP$Qae1Y-6x4xpyYmaKua7^9lllYkGtRIh@oAg+Ed+s<( zPO~LXw7Ba%cdQrg7w7-mzb<_sP+6>_PYP3sLbz!WH_29b}f5hj+o= zioU+npwO=YA!h;(y{2l<+yvQCxKvMDtIL&vf0#uM;O7VuvRdjhh_AeX0_2pTc?nEO9pymh40} z%ECfFy@VzIohmtDA1t}6v+0)$`9lSzOuc)1LM_?OO0yT+dSrtLJq` zOd&(xKWwB0h+xz5NQ!xvVn}ty4zIMmjO!Ik58=FgK6qXq(Rt2tZUvjzG0g4I4miA1 zU#iQ}L9=XOlL!9n{4r<;K1!!-NDnOUyr;LZNFvd?>2AaYvM-^X_+H90b2JkFZ1yTH zI!+J5%Dd{{DqWa?j-W!np)hrsZIpPo;9uTQ-|yk!fapcS)zAm z)*0|jnoLU=f#QIJ*f4mdkt%h7!L$+M@T}*Tnbkh2qH9z9!)`%&sMR z-RWenM@S=m@RU?MC7R$h|E&j;MQVN*Jtlq^TJ0HHRYJ%A@?6%w z$gMau;&>8Kfy10zO{?^|MnThn#B*XqHvI42UXxzqIo4&^j?3SA_AR*URURI7=t=JG z27T7k-r=HuZi2(qv%Go%C~c z#5L2=na=OgoO?e_ANfcHZ;#m1*tFE7Q4s4c!V@ljvle^L|4u*C%mM}nG_I*HF5X78 z1TRe1`7cBXfA=m3qg#YcL^;@iGc*Ucc-JiM99LC+R-b=&Q{6_|U{{%0qY^}C&oQ#j zymBHoNVb)+Z2a8+iEzv0`24(YHKFYJ`>M4r6^+}XtK!h;CJeAQIkM~s-B@Uk-ot6y zAE5-&QQj|x0<5R$i-4{DiIL}&$+vzd+_2xEu8J4e8S>QKqf=^txnP#KIpi;1#Sp}* zPXD0t7$vu0a|U4LM(Xd+oBC&hqm_5aY{Sq&3$bI6qGi_1cjT4}(P5o)a5i zxQmOJu~)7_bOZMhx#GC6=ZklupXyg{s&pak!1F=JujX*^AOKk{6hgNGn|K*lmeIco zi%leib%*-TI-x;Aa&HU?Keex%jg(0=8WKqxUO#sAl_~sh_yC3;>?r^DFUwIfI<7>T zjhq*Y?eH|Jq7CvtOStGKrrfrR9 zu?f-0LIy7XPf}Yu^hxnf(aA-XXLQG#pw=Ga7a)?7?S1<|t>CWydn9R!ioc9wg4mqF{io z`C}S55)PR^_|axVJZ=wzUaRE{xE}rG7drJpAiq|?_p-f_AD-+bbJ-d+#bUly^?cH- zjgNJGo(}ux+Vo`5!}hK(K53l8xYaYyXqxr!vMVJ8!n$VVW+(36zV0(oSIV)xWIBCa zol*>tHq(Oh(9!J{VHt4CVwrzn=kWp7nFH(LMs&e&2W>ip3sM2{h?RH2?GuNzlA&ah zem*C){xLJY)QnaFVdh4C@3N@#j-=guM6RVRAyi9?U>_;IGdKlt^8j&Vz~V5I%M!1q zH{=IpCfI>Ns@-?cfhAJyl6NE$444T!5^x}*S7H{FG%M9}VjDtc3(Bh%l!w>f%Ig2iBazmxn<{)J=UyL+dC@Xy zG6K;>M>X}n5)xw`rq8X_B;>fx43Tv*>dLlezv(v`{JO(c&>I%m=`Xkby@oLO2sqcj zqgWBu8AG;}TOI(hHYD znr4UG9itCg_qavQUmwle_O}NCdEvcXFN?Y*+mES7Z^GkWpGUTqn>FdN->xDRHS?mj z05|mZXH0QmtM-q4Wqi65X00XG=&LF?7os4>syPFz5|;fBo)ml*!8!>epMm!LrD(h% zUsGd!@qdRocseH~%n5AiJQ-iX494*Dz=JuAxkC`)3YHb#kswhYdDj7SZQx|o2=-+o z?EV}bVUGK|$)u8=VE<#J1R*d~^xWF3j=kei1eL&m0Ei}pvG$^4ZbZ!ByWoXoS?nVG zPb6Y)+9>#Ul1}X-gt}LgP+ZL;eVxsV@G9M$=zpX&C1I55#au-ht{*F|6T=|4BU7H% z!Buaas*-Ow4fmIc0kKYQ3O91ets-POyzw#Ga<@l4ZuUm4#kFGO>sh z%*`OLuvRlR46ibVqRJMArn(L}h8~g2SBt_BKJUz}9;OulNzuSub4a{Bsr{!j_d6cn zv_O5+YM@y`@F4Cduyf$n_}k6?4BX3+=cw_AT&1 zb@S!hHTFd{yfE!W{LElkr3$F~Y>L%1_{%Ktj)=v4%tDvNTYcT_{<=t9Al?GPu>3Pv zE^Bf#cE_1nx<|PoH&Ai`bdpmraFXL0meYtWO6s>O#|cq?M6J3GRi*mf=KYWgbPSOX z5(tg}XSxMn1{O$5ZN2U_`uFZuHXd15$cAlwajHAD)_}xK(`e8Fy7K@!+ys7zo$=Q={{@d#XuT8kSxTR{;*d7?Z$d=5uz(vfKN9Za#lJ zS>j+5Rvn79YLym=)%=(j%G?ic=zpvQn#3$-+AUDE_t(CM;JeWe_5B)pd`zvOC-2h| zeEHR(h`iZ2#56C;>o5AS&fgLm$jOy254e7t7xZZt*EixeimVs5bg7ey#aF%TlEO3` zI(WF$ww78h37hPevLZOYg`dGO7VFyhGXL7u)4gVey=;euX|G;z`(zqvl_RDt!%T#2?9+6+SQ@Sr$u=cjG6k)eH8v~er2@ZO zl080xl07|Z_^)O#>?}?s#Z&6OPhb@n3L-6>@bX~3HLo2Qqygfi{BvjrsXi_8!2O7v zU-*hKr|&s*Rd7*{|5@!{G>#1QSwI%;+FRpiN}H-Do#_aE##;o@009jYQ(AjHLJY-& zMf3lRCP@3Tseyj3WNA%Gza75W(;|^HmhPj-U6i;&F6Fo6_};H5tVg#1^lc#i^E>~I z2!#QA-Ptdc4}>MEej|mVzS4ocQrckmX=^t7TR&afQp$QScdY#WVz=0*i1f<78sUsu z>sYHpms&!YQ)r2nXICQ6oXI%j5f#USu`#zCzm-bO1vV2UW0_UrU>;Uk{vVRCjnfcu zX})#*Z0CF5v}4b6HShA&w1gJEmIZP?VJ&BiL(f33Zvlh}|2fl@Bdurz8v4`B6uV<@ z4MkFx5o^O!z@yxpvgNP$Dyg31aD!&kIV)UR^oeVN1)8AQIMo{5ay$_aLiT5c@4qgR z4fS=(+EPF2zMSC?!d0IV1x1E!ZGZinrqW_-HgA50?typ$&tTa0=A*)zf}``UAAj6? zCj}m!{)pRIzhw`#IX7T)w=hQJ1oMc>{XSHcXD}w#c63hs{mK==Lj!2!Pn?{eh<;%> zn|eLVELw48>vMP8vU@!f!MEB8`i5tD6uQINrIa@^Z<@Cz^A2lEoX;;m` zkTMEe=D1iiXS-Qgqrt#DuoN%y_Md!(9%j~u;-)4Jz60Gu1UyV<&aF3BXo+~W(@v)G zt(y2M$}k`;@8j-Xghsw5=)^G45_Mv5-T>V%!n;EEQ?xtWT49oyD7LT$rnrqLA zqVlWawkw)tBuE_(4QCm$|E-8zSIZ6_SKIos>ZLXIg#5c7VIGpy?W|2=l}PSBCQDYs z?#^a9-hL;<93)a@wHOmW*7B#*o{9n1k;ftS(D{-*c_v|sHL4UOdQ2Ke&s8x^Y{R79 zA!QruLBw8+sO9Ar&dnKwKcZ*=MxZZXCB=*LVYI+7aLwDb3inY7wpw@K9}GC0=#Jj! zW)3rBf1hrk7G^e3MlccRO`Z;IRg4=ab#^iCZQ8Y9F~ovW9Ei2iimkpCC5|n-B37Cj z(zxF)FK#d&51CY|VD266jfYPcfIfxW2WzT{{ufn;fTFO}81 zv7qxSwSo1g^Y?GEiQQftW$zJPc?@s914R^9+_5jto3IVlRta5Ve8O-bBxgK(Te3Bs zH}7pP&-U1?X^{}!;^8h!Gw>2<%`ODiuB8M)QM>M1(QPq(qIC*JhfznNPQCifzmssk zeGn`iIWb8k_%? zs{s#g^F}QMx5fWm)Gj~BH5vDXOENwTyX8NA$5h@bH*>{xDDZ0r%-8hSC;#{O@ZOZv zxeE!MRUf{Z5nzy-0F>B3r42-Ofqf4ljd|Wg0oqMyvw;GB6F&W(=d+Gh8ZtXh4=4Oh zPzB+8W31jwj71gurak02n_=Bczpm1tazR&@t$z#SL+gV_@4wrU+$8^g*q`|Q44dA~ zlhjxoar7`yB53G0*^syj?=(%5*+u{Bc@>{oCx(~7uMWQUAcq8+6&a814_nL;l19w9 zwd86OmH47RMk#!OIwe~9JlxmPPuQ)OUk`l}Oy(;ot1JWi@Rp|rX*scjmnOE=6YDihkgS3Jn=_7&*M9E z)gL+8k6ToMPE2A>PiL+a`Aee#CX(iwnFfaKIZohp zES%N#&Z8r;z+eHfOmJQ~U@%Rs$Y7Km{%mrd5p?{1%*y)0VWk$@L0dDISQkN?T(}y&*P`SlA2d@ihgA87I8dg z=B4Yf#?UK2C%1`*rZ3j7t3F@oo4~d%kA9L+$H;n&#P1jnOXOC>a6LvB+ z4zzpGsn$bu(!ws9i5Wj|d@lMXW?x^MwYn1~MspYjwCX}}5vgEdOCXX4tSwdCVTAv2 z=ej6UQLe;iJ!1};()w`zC4pwGq;ahy$$OhnxoHIQhy!xS(*7j~JUXf;rddy8R$u2| z60_+*sP`l*PAOm9?qh&W%jNnl*N$`QA>PxjP#cz6(=RUFhb}Azf|X!!it5df?SPGQ z^q&tx*?d%EVN!>(p6i(_+8LT5zuxw6taH}g@~Mq$UVBV!QIGP>*%JjUv;{`y%HCzj z)))lm{(t^{fj6F#^!ieBt#`{!bzqxZS}lCe5pZ{zenGI_oD{e{RARxkH+Nlpb%X$D z!?X+o)Sxvf{`zUKGNgDk7P+4G#ko!pnpuvde_tCC;%E44`8Ruvj))33i!ExSeMpt3yk`7iePe1 z=5mSE|NqDDrpjjL;%nynZT<3Rl^_b3Qvi7%IuvA)0y*OE6?7^DB(8t?$5HlV6diCU z-o%*R^1+}F_pGiAG&+WrKhvR3;<3*q1po>{{9V*;jlEE!+83BLc{7EN;?EwBsZiSm z2Q&PaMz;v^W;;2xD|_K4#KE_jFnsgmnA5tfy}aDX0Jp0J|GT4yRQ>E5v4ydhbI}#f zK8JdGOs2w!*Q2LZ!{Cm!9m3_2?QL=CtC%XHTMbKNH0L^Y(&8;6O|!l2>>Wm$V7@QU zcN#q%2Hg#?w5uk84>%pSgZlG7e5g=>+1HE6rV~;yM6!~tL*Ok+h&>>->rJNbS%o9B zD}ghW3w-#*yzzy(fK)&@eb3uBnaey`74YFwWiz8t0$R;{!4Wvs3E6`raHv8sE_zF& z;iTY4{fFQ6!(Or;BErPD^BD{S)q1TC}epV1})X@O%L6y=lfiB{#1fN zfejx}$LdY+I~>s!LGrJ@jM<}Jh&gH+UV0XL=dXy1*AVRC`BSGzgI6Y!L=raJ9LycQ zWM`5RPZ>q>>H1}yy2wR1%9b7-oeyVCz68l7g%aLsJhNLtZuv&m6EYB1%&UIeOzj&p z3>R{aqJ3KUg&C;1V_pBdyAC0wSb9(0ehV1a_xP6Gup)A!o1i&sDJ$#(u>tJwxY`rcqaa#^95ve{}Eey^a7igEKMA6XCm4YYrGl)E51NWKSnhS7uAjX4^tECr zYmpy_FCDP#Ka^f#uAE6^y#g%1X-B+$1@S!!r_Stoh8mneYl=;NRCu1;pEx`8qwkpn z^|-00m`u5IX4X2R^DoH|41ky8ScDu=A#%k~72sgT(DqfaUx5br2hDB6Wz8n7E8?9d z%s)U(x~tHFsqU&?=Lv5b1>MzWqFf!V%7X$h!>~M9Wb{nH?4+CRq1DQ2E=Ab6VYJuU z$=X^i(3rOUbmF!vuc(NcaaT82w)MN6&}#H3=zShc510=>)Zw7Yh5|hb*o6_no>)I_ z)p~ks1>-7Ga2+Em`^t7subGl_fr870gz=l{tvJlOUtP0|Z1eHtyaX{B62gBLu zrDxa%K0ssUr=`p9p)tp^tB0xsyCs{D027o-ep1!b*UJ0(<`eU3TazIbWoLPgB+$+5 zh_L5BykB;n5EdNz)@tnz;`nmmvfb@?Hk?3Z)tH{GF-R&JFC(xI^Rs*}l& zZRJ@FTWfIhzrXIpZni&sCjGbJ`9VWuNy952?f^)~ogeMs^<5|1zwXWw80U$LDVQ$D z$$GAhdUj#t-uoBoYhlg>;a zKkv-o*QC=$Ht3N_?8BB+{&x0RT3-jh(&`3}l6|7}x zKFAAxHmS_6Wof&Dx1g~1p5l@Fd^)Vmq1-6u=D70Y%~Lb#%7QIp*~M8P$`-nNf8og5 zAnc1PgSwYWGLVSKpRZ|vd9!cC@BbOq;7qw`1j-f`2GdAUMES&PQw&|7vgS<^8a(oX z>}I_8+aE_do> z)oJaDNRU=_@w2qCo1q^Y>eFv==f(qhoPia?1= zji}37@F<$b4B(UI=+$txfl&I2wutz2<=^m_0xLNPZjcsCf(8?(YJWzS)J~r$7V!iblB@GwS~lB5h2-J`+Zg^Nx)dp zSTF*!p#*XS+}4M28m}pnDSNqqNb`D`Lo$xPLA6ZvL&Gm%XbJ@1zdafAF@$wwnkzrOFSxmi;?rCzYl8Do&;IC$oUKA`}*=C-IhRc4+b zM@F&8#M{%aEL+IrY(+S(JWT6Fujn?cJAUoQmnAXj@gdss%e}YiWwu)Y>B)B( z&6g9Jt#iH`h0(nd^!eIzfq}^8P1^?c2jl#5;B_y2K~GQuRSLKqCk?N(NGmuT8kSL? z$b9Ywo>(yBxKwqe$|3PQ<#J#tlFkE#YOjSk0kkVeFP6gio1Zkd7bxUr^4=V=ZrW)2 zKt#4o{ zb#`ys;_W&Ju0DK3BMlSwbAc)iO9%xm|D)J&wms4YJ5BtRJex00jZcr5al|4bjLmRUlCIfo{6i?22O%TLS9K>|y3u=~ObIkhuhX)Yc_ zZ$#%hEsKKuokC;A#=FR)G_(KIe#yjk8HWgEcIfuxZaT;WEA;SuF#UB>NYt;ZoRHIxeO7_s+m>4A( zR`9^wC?LjDikkgfeeBNy0#90kBhOewmakR|*4ekYGKO;vQpH@1JIH(nF92KY{qHpd zLicktL7jO2@j``Clbl5g1XHp172dr`DR2gcK{rn6iOU8rl_P!V5~ZXMq%yz-CepG$ zRZEcrEw#Ti=Kb2?k8?I_y54N9l&@$5=kV~`{qXSmn(^tEKL}?TRrM4R9Q);O!h1)G znHhpv3PHkGJ3U^t>=0*Xi?XRnZGUz(`%Rj>&xxJj2rrP%s6m+&?dns7{>!ufL@PyG z$5N`aLgvaM>nnWW(U5G1-b)o_2Nb`c6>M!0M@lyZ6rml@b;F zGsRYkpm$_bKdv~h#cJCS%H-_zs{>g&FU+QfaQ}b_Te=3=YySZ*{v@nKR;Fq9WE1y_ zvd^a|hrn(VDPG|opjhL7_P!QG>UV-$9u1{&3-Y~xusn0{2krk9bU0m?!h-$y63lZ3 z{JVux)rX2-a)TNx)`M|ifF)(VuCb&N4432u<}0~UjG=E3Ms=)QS3HXFi&1fnoV%`-m-^em*38_ zddAP{daN$dAn{R?O~{CI9O8;m3A6>d$b) zw#)8WPgNJ9Y1U@rv{opFHt6dIkHgxzm1e3vv-9l6x2I@-kpjs#4_E-^)^o&y`R6K-Ul~DBt#RX|y=SiMo5oiY zPmZXwMH{B`W@V`z|Lr}wPQ2ZBpoU;atF%3yFGvk&jTP|1L|PmZrN^|D3Ry@Oobz>t z6~zrX;_QnUP^Kx}4^$i7lrxU}hzkkx%sKAif!9Z0=#`$zc{@)h<5n+wjp5Lw3W;Vt z!qe{q;(ph02y0=_KJt(E)N>%c9@Comc5QcA;6ZRIF|KLga;WqS+_{Pk#JFPdyoG~(qIC7ZN;lh+P7G_LYR!}Ug&``oiup3 zM!5No^PMt08{6o-^X|lLkrSE+nyi2N$=J8|vS!>=mHb?nr>OANKY#e(B115uXCtgi zG#f;IGkY}49#+z&5;9Fi*N3lJ_HuU8k;r6ylROaT?hEsDHVD=PE1rf;23d-qq%d?X zB9($TWGF5cXzk~-=lRgo5(YMt5`nI#br-clkC1U7u_&9rlOH2K@UKDqC$0Y26fj^+ ze^I|_%qXTui76j8TLFJVQxTET@()xk$jci6UjS0poeZn^i5W8jw!hoQ@}kEhnQMsj zO2$F~7g7};c~JaG!U6u<|1wAKoXoG`9wz{oJ`7rU`X~W;z=;~LYki4~bOEcuP01VV z9f>4exY{@+z^t+_;?Hqb0Tn1%AZOnn8USFX(z05K!PfSb8t|nf^l3xj7cuh2{yN;6 z%(QH^#1E-W@&$Q{?iE_%PY4!5c>WX)9Vs}Jbq9m*U-y37Wf4jB`Fi8r{IN&1$1YAF+<93Ol?#}Gd`}&f}c=oRDx)njdIC}PJi0El=dE?4FzXI$A z(~pZVSH8`-A}zTpWX>@d6Y$(h+D=!m!Qv&jY_k0wtgqR;^bAy)QigrKGoI$*ngiO$V^n+Lu_h zLQnv>CkhiPvM8(u2mD1Q%^YP&^L-8ZWKS7{EsCwlk*k3e6oS*g9K}#{|8>Xt@1!?r zI58X==Oq&xTaiy}d3wKxHG0KMS?MXdnU$avRU~r82 z;`G-`_-;2&qCD^FQ7^|X-RQpkPQz+ zlDjUFxETl2HO-ydzoQUl0_-C1!EKKc^cp&UsRm@7zI{YtBT2kze!mYaN;^p?xgh(p zTf>1eSr1sa6E4epwdD}-OqZ+1--r4LvhV#sYlzSerf>{wW&E$(_Uk=5kfpP6vfi8| zcvnNy^*J<5pv@hNW<_}crK}5ACBnqI46keZ2*ed%kztGKXEwkb`wt=&!ylnVB{l(A6h3ayR&OtF_HGSBwU)DxT2~Ro63RQ!y;^ag^NJe*s z@;a^9-81U%be-)^@@$=#g}8a2cW$;)BHCGfyT}zT=K69Vj+b%1_H%D$5bXAJd!8z* zCKm&377w=7Wi-w5s^@@XH8&6r+J23-Vs=Ze5ft)?;c4DIEYXuRH&(7>Deu{-1+DF5W3Y~+FCXF*hK85inG_CTvJp-)BzWvrgJ^xrcmmJbVzEuAEwL49{H z=mH`x+29W`m}wy7hOqVa*VM$VePVkLP_K?DSDt{OTOuL*7qx*=uG>;p1l!@7iZ*gv zSDS`bUa-UKSE*;esQWipibD5n*u~lJNoX$%W|qIM^BFhH%h z&R_K(+vjuD{7H^MmG4U1hWsY+0h^AUzL~xaYbQYAYqh*Wd^{!QdN12Lb?JLX=9J4} zP0e2UizVo|?3wNa4WpPIYdZmmV%NZNj#*WgUS@le>&x^CeK})!q4of-+=$ZScer$j zcsjPFd;#YTfKZ4NR9$KI@qp~1h^uyxYU+acXv<`QpW%>QvL4M(K%DVx2Mnz#hX7Gf z2?~mLyN!tJeF^p*4m-o>21h4~&bfpl+ys>A2k$(n1_5~M z-H?lW*X8NFf8>9N8oV2tm}Z=tB0SlTlw#rvl;2d{u{ggyK%lV)0_b~VgGZf;xkVjs zO`lU!u4IeeHDx5FlN>u}dIPFGi%i-4Rmn1DjOa4{wB8_-m)whI%C?-?UWc_B-mSm| zvDp2cSA=^R1P#r-j-AP8sye-T`^n}Y*UmAn$PEk%9X4Zq6ngr0TT%CU=~hT0ic!;y zw5ywvQ8V00U=4ESSo$YLz9&K&hVDluVaL4nDan2UZabh8o^(itd)FE0%q>*#Swi>_ zS|Am;a9jh|liuI{fogkzuRKY=*?!t=GO#HPGkK7N#$XPTIBuo*!L^zF;Oj*hYc$|f z%yBx)`Qumz=As)FgLxELyidBFeNhD~o{_uAqnls+o)#ZTkPNEi`sh)oJ!rF_De~6? z;c|tqW~!1U6_**L11~s4K3+a#I{Jlx$=iwsJzh``TKg%#|VLzTqHI1auz7c)7quyn(n5J#%lt&`7J~U?&Ie+ zSyWImz8dh?{|}u%r3VdLJ$QDlL!<@55x#*!hyFEs8qoPng<9ihf!qTRwc`SpetD)b z&WX0SRKps-at4-!kJi0dp`>FF@7(nN#xGnLR+G$I6y@_oLh0mdRz451#`e&O3rNgZ z9`5(R~(9JPi*Bc6wuwjLf@#$ z3O`~0f_dc$Fs)SUy7%2B>4Buozfkt@em==drM&!vil|Y%1m~nFv*nyyo^NjEH4UFI zDh(i&Dm6st0&NS>vVI1W{YAT~gXWC`XD&DN?EKR7bLbrrA8YDsQ!wjj4B%20h<5n7 z44U8l5Z=2eo*!iw6{%u14alA5>i-f`+4(vOgu5BBKSl{yZn6&pb}BOlBN-2$EMHoE z+{_F2l1wF_VC;Cdc$6P1U<>{)*nN@dBYK zWr6tV*TZa#| zjc7~>($c7i0!4AJJb~uQtxPi zt7pBLu41x4g_sL2GvS-X3(h(!w5+;l1B%_6^5=5v7M2FHb9O5~AQp7F!sGyNa)b*U zJt!`TZo%T8I4Gq)HQGegCtAFnSG__wN^g69XGALC6GDIRixTChk3aPyyb|UKoM&b_ zDKy+XAs7kaskv-AXj({wcxJzlN3k-5N2tAWHIf)($=xy;;56qZt-P~2eeYjbZhP%r zcG%8^_J-^{Wn$pn1JtU&Maa&Iws{#(ALuadbI?|pYAk^saL znf1yK^PWEg4wP?w^TIK<&Zm?@9<4^>-HGUWQ`7jhL8>_Xs0-f4;D{wMTSQ2wlw;?7v6-ecqEW3-Sjro z`TuJ1qzbeVCK_S&ZgogI8`}syaRj36H8%kPN#peW1XiARdc~5)s@WlFIys=bL+LeX zgJIUZca(4P1ID~3&>$rT5VUQxId6)T>l_vAU=U=`5a<0vRa;66K@6m!E$Glnfyxun z+X8C;_!^!uzn{9YUj z=`vgA-~DsFsFndPs5*B-m9m2@2^2&N)GjIE6F*J`?cA4Rnfu{1|ZSxtRm zO&WK780fPpk6_&cb%pQ<6y=T(7=M0xHvIHmJdA6TF3(F7M*bImQ}Atn048&K_Y|VO zgXqIwYx`9UpNk&}*MigDX~^HMJrCO%x$& zJw3UKJEK$xM+`W2Uq(8tdO}P&(rU)p$aDUj=?`vF;@!Pk=QXx~16`7=kcg1}Kyrz6 zhg(AasYo`t#M#4UIjg1B{GdNfkEgYhJN}yqD$6xmAT_61GQE7ntX#-(-U%|)g_KNU zt%4S<*XCmV@KT9L%3s*d20*U#{J;+kM%9SZSbf7T#&QDQ-(psE+ zhHD2S8a)Unf>?FXzJFd&aBbJ)7Cw7YCRKSmR^?!2tQ!KJmEa5XZ-D7C{l!Z`Q$A;N}GmNan5 zh&wH6(PF7CU)8(DM^Uo>_HUKx7*@#NLgKv79YVZ68{TEaWR7dCh3#lko<4m(-!kzd z$vrgZ!wLt~QenDpC+J0ms?-6vj^WUMDl@1{q&3Kx@6u63f7kDKk9ccv7L8aa?_ihG zG{Z^59g`8RFDq_;C{MZgjeQUvnSIk#djOpgL1Rd^{)E~9hy}V8zK87An-!YaK1^$u zkgH~E;k)8Q6-_B}g;)juJJ5VgX;4=^RDQP(l6g_mS>P2|YZ6$D7syx$$c~|qb^MOH zmH?dbG>IXj9XUh)3?BI38vuC=E!5`Z!vZ1kS>lGOQ}jDzUo~O|l} zdGS~`lk!?BaVy71k-eznH7h>ILNS$0x>4R?&$Nlcu)2qYFJT37RCZ-w04lq*A0L~X z-LhpgA{do)xiq>=8V32D-~PZrY5A_Luj7$HOSU5!dxE=$yjhk+C#8i^)|UNIFR=3u zP3W6d$4QY;v>~Kry9KNtvSs>L!56r#Q!vsTqs|LiK+yHy*a+hXJm`Sn;@8bhYAqJj z`Y7ACL6*Fa5y`l`jN|s&+dfF_^O)ipt2;DH5yo$^7I&_b`gGxWA?D&x zGl!({=Z3!5ksb0ga^J?)62^#%qpCr4+FWA?F>#WzPb1=%~YwxddrpCg40P{sf3uQgj| z;<|#!f4b)xct-`7Cy=iWy3lm3@dJ(c%vscgJeOH;eDV?RjzSVbYw*>in6UKF2|W`k zfJ2ilU>=|mdyet0!85FkU>ZBo?JJ20LW@0%B317%hBQooh~uVA*mkEd3dTrlmM|z~ zWub`X+b{AZB3KJU14aFP!iBfNq?h&sn_mv|yxd3OHiK&fmn|J$Ao+5Vwrtr$qm!Dz zD9c&AF1KcFIi;55M16nI8oHaYe3$UBYJ_2TtR*g{OKJBL{}aFS{IX9`YH)M;<%?EEoARP2Jnbn}>hVcTp}U z4wyloetL>_vUD~9aENgkzG(&2<;Y0PE5FGi?{!5P6~N_&UVEeJIz|4uwm%It^d+LBS$ITWg`|YJtU@sd&9qvK>{Y`UlGF%ha z%%gcFSU`6qvC%boTM4HzT~wNs&lD<#tTU(?8GnT$YUO`gR6>c|J2RigxgXug9nhgl zmM|81MfFxDH6rL<`zSWW-tl7#AaptEjGVVdUVC{XNcT*Q3AGM8XWM0rSQwOU&hm|9 zGUsW>eEu7K!75LhdS-EPU01!>RxovVq2TJrQ?bPCnS+cbZaA@_StRR^jAksqc%OGn zG0FHTzSvd7%31-gMy>#>;$HK9O-W{7&IJTHHKX&|r4fGAw|)Y*c{I(Fe_Bz8uF86( zVGl;xp5r_%n{9B*SgUkoDppSeNIF{uZV5P^Jze>K9oP3cFbKql6+0%%Q!oObE4`FbPq&JxO-`zzEl3DBYBvhbE*HJsR9UyKgo}? zZSQMu8EC1PUtG8zx*9^H43nGaAvOyNU}J`@`SI6VLe zck4`MyOIO&KpBJhq@Ppgh3_ze!dEHR%fJO~TD~9~;O-$nkb0jvg|YI2&p)1$Q?C<& ziuA2sP1?c#O*9~~X}PE;D7O#I8o8CVI?xgU7fY^UoP_EM4Hf<7dt*eA62v^eR;#!+ zrT-z>gy`>ZCB<9?5`DZc3!Rc;-$~2DRVSBqILjb`sj^(wNg-EZ3+3nwZhhW6GW+=b z1lLf%-pVrV!JWNVe=C$=LxK}=dZvlAj~tuT-NJ#v#jy;Qp?t44`+b2k#|H|l6;GFv z@A=n(zB45Tzy!;LWEGL@O5_JDhlzuz7QQ>x^NL(r`_URsCUKg6A%R=dD@~MGO|?vK zka8f6{v5rm5+8jzQr~2b6WGo2P3!Pb$0>|{b}Vvz8ck3trjh9c+}!bXBb_m)nT~t{ zxivI^O0RwcQNe$Xa^Nm%7>S{7c5w6wf(d*AEjLO3@)`n=4bk) zn-3r`?Gzw@I`se*5I7^B58hh>6!(P>bp(!9y(N`FSqCUW6aWp|UCjKquVrA81!RS5 z9DyvI89%YF>fVY~0%qD)Ok>(ZW=DgWcHe43gQu@sS`BnCzk8e*wDi$~#DshJ3+!FA zL-f{uU(NV$C2}cQqFq++Aenoz_H^6!=*>06l>$$ZsgB}Nu%M`ACjQ^=duLS5?xC%% zu=N?$=j+-0{fw+Byn6NmePw8JKl}-M`){<81G}{(S>l7>#fP5FJwx!on4y1nWoVp# zik)|L6yJzwE9=b%Od8X}hGc9g8%cUGfr0?tR4W><_TOGb4zKSW5R%@MI#tk)zYQ+(%P%< zqjrawXul~!ikW!uCl3WAUs(PywA8)Sitl@PGQb$PIc@|Gyx>&!zLF|3w^#iUPemRW znlujh6ZZTr_{RO8h~f2x&k(Oh5%&?RXReV)yHApXW06NACRZ$fUAKYryeYeymLYX^ zVQ_nMXDN)ceAYb6EbFxB0fqTgk881*e!#MGv6pyfM9N)2f5u zC^pGR3m32sWRQ;~?Guh-S z8%4>s$Fok33%EgU>-Ug7VP$Bnh^h9q%v@_)8L)-F^OTY@h^4+wLg8o12~au;N^33G zJxWWx)dK;$J}U~~kT_aQnuM~N*QLQg!1W+gHi+xEcbGwE{yH>6a_ z5`#1Q()geJGZ!?UVvC5Rj0`yUD6iY@PL!U+OBYi_-Oseq7at<~3_I7Q1WGrxAB4DO z-L!FyZt~{oZX8+R5Ucmm8RK67r3Wl%^^d_63I~5b`sIgAiyeJA0?CJyn?7`o{>_iD z|0{Cr_ACv%!>`G&`DhOy>VMvXA?Nwk;GV+Yo3Ym~R_O8uk7}?ki}}a@FmX!QFuk10 zexjELg{LDL@+`5M$(Y*kMiyf$=qRI#sU|4yi<7xZ3ttLGhnxWTzjIYta`(q3Gjwvk zWPRBI+X0P<<)k&ot@Z~RGR1gzMDII`nvK7CA_O}mQ&KOj4ysLnZ~`*SNyp@iNeUWs z2k`l=+2K+bY@*6kYUwr^RlJ`RpN!wkj5N^&--h3xpn0s)wog1rDtq_oQZbB^4c`c$ zKd9PPdBQWsY^t~7`&vSjj4;{*>tU0Kvfw=u2@UFZU1w4UZyN6Gwv-JZ2yP76z7Fvv z^V|N_|K9?5&A{HiT!qJU4UzJ;)&@z^?~jDRm^1p?6tr?y{aHPRF`iZM7s}m$YKiMM zf1{Y^oMvPT<+^&-&JAnGvS3IIXjH}`|A9V%J4;H^A~jb0%j&~1^uNId7L$R}$0%Jj zgk20$@YgaY9|nz3?kBuOshe|#VMAja{3Zp!gCm%MK!49ipqAxhHnMn?T41F|9j^lW z`RMweiqvnJ)en`ZZ=Ck*bw84_L1-q{qpp+26o30uNo9cS!?AN zwb;C`g57nT74+r&2=Y?D^!zR8z0-4N#^UqT%VTrni%x_*Lexq$WSZQXqb)hN`R!Dq zsdBvMxx7$?mld;*{NfSM$9!p*eRpCvQG`BHab;&^{{XyrVq}}rBC}W39GAET0Roya zr(6bPHqeebS4bSvzTN^L*|sWi##7%u6$CduAdNgYPM`+`k^S1oKVmKcC?3zDsU!aP zCncfN2<9eRc06`bDwwE?@PKJRLa%;=TO2z}ZN>}-nygt#Dl;#BF6rjQ>Kj*^A|}cfx2An|NJ`vs756}YQi-c zQUcx>Alx>HtM{QG$Fncd#v$gFwJl*&iR6-e=~lKKga3(oIY5QVPEi<$4kqKePR}i)W_c8YBLzexP9&$bM9ouQm-f@fLuny zbvmoe#Ve_XZZ* z%&k{OaYpSw+lO)xnHQN#CrgCD zb4%5KYl)cxk^Wl(hzr4k07UjlkH4Y-U-_yP$blt?bs}K0Y@2)l2aka!( z^agzJM$9*fotr|E^bAQO_}6v_6-a|qR_QUwOIjm4qg~odLxV&^q~%U+ZHRfegFfF+ zo<_PGTj}D4_ykJ1)`-HWvbOyfA9Y+ALZ;mq(&vk0i|1AOvF8yUk{b!>VRT=^5oNI| zgoViSiv>wS^F{6C;80fdCjVQJBmS%qrtDy@fK134|47G>OfwIC3jgHPdmv3APg?`H zsM?brQc&!9w|JG0IO-p1W;rMjj~sw);-$6LAr;L0vP*ivRiN?9jm%ZSM;O2E4Yrp4 z$CYqH$`iD|>$G?9eW7B!t1As+zs!I5j=+=(+Fu>2!KamxY2bu|?Q~Z(2B~pr1>+oy zXbEJ1ixsV!0G(F?jD1mIzCs4neB}@qdS(=0r57)YM5PYh?EaQ1{%R8SZYSCRm=Ek8|=M}w^G>FbrJjWTRCE#Xrq|NG53g0uQvGgrecBJzF|#Y;Sv zaePFv$z$oGz9$+n3pe_01mw(v}b-*#j#@7X|gR=Wn;=u!$iqj$4-_ee-5kXk&h z&yQaSD!#5!NRRlOwYP$=wxO=GhE_?)%+O2ly3m1g!T$j(T_+N=xHrCP4Nc@k)z(VC z!T1Ej1Jq*Y=)J>`A?EM4LLLw( zZq)~88QY$#eB*{S^JxRsuBOKRV;@s@n*F&PTv6-Hw?_#vic& z5o-exi5j7?0Is~|JG!DN$liOir6UEdcI1-ejbCtYHqQC{uLuxFk-*OiYyHV zF-Z*BnaE_xFk}~Fr_vNfmKj^dmfeu8#*+2>^!fe%@bZt>jOV$}xzBa3bDeWyzQSV* zC3EdmoDZ=2Pw48w@MI&E97smx@1hxFwHsU(BMoPJQd8HA*)?@HW=BrpT;i3l|ogJxeFW|l> zi6aL8wcTF7Rk(BM{PRn?k|j4o+vc+mT^{zfE##K1)%A@oE_57oKWyEc6#h?q=cu=J z>fpU^b4FaGKRycjC#-NANkEkuYzjE@Nd2~|7m0r%w=Q{O9=9-$?p26|(S58>r7F!5 zal^A%+V)0lQ=8_sFPK?>Hey~z9q~iNWFe^t@uAp~=NVS&YP((~dV@y&1|D^G_+>8y z557e7sYTrl^m`+J|j6OO+B z9aqf`5B(zYqJztxH6-k0>mO#V181%p?bUl=8sA9fo=9r*B4%0rhbq`kluZDWE6zV{8hP2U&^Wm<38j>_&MejHVi z6aa3fq%XEV>?AW z2fxXPmznoweH=*txNTMeY6ue=T`0LP^@?b|S>1pw8Q+YksW(B6$@NI&&^G1-oL3d< zYPkwf@#By**~Bru*_mm!ktQ;0MLhNZ)?HhEVVxc0Dgk^v(L6K8mYL*|qmMnz6l_HeN$8OlxVb-E}tOq1*A*r;hoJj)y~X%+xC`afn?^=ok0Di*dfI zZMb*Nm-Ycc?>pT38YJxZ{)dtb?_;1Eodc|B4chdq#%nJo^k7#bnjseaWxlSnq&A}` zH)S{y-5TfmrJyG2gjj3NTR1GcqlTvw)f>}&(d&-IXvP<+KhF!Jhk8TKCzyyM_c)6> zuEGjQ`Di}{NHK{@T%WYeDH+m)Sk3!yIgLUB%mLD=P6w$v_)P4?ZvGW9B1X|p8Q~U( zU6GYB2f?&Pu-dzwVB2D|j}2Ww{y#hU5NZ?;sqd5E23f)=^TWSEL|@gvPM3S@ zgIw?ab$aNa|0DP8`uAt7n9StKMM;~n-(REmUaj5_Ot|wuV`#l2*J|`+u+FI5Gh4YJ zR%Ti99;=Xg|F z5(t2oNhb3yRc7eWWq&}LJ?J=U$A3>poKiDR?&V)8dvM#lxkEfh64I7JtvyQw){&b= zra!{VVFq5>zm&`Zq>$*45`+EQWywLls!<=mWUr6B-WQ$o*K(6U$-OY{m3^2Ecj zV!WWL>#%)1p;i>rHVa~2%T-R|++$0WWU>}}H@?HAOyJ^*eZ=3xeBiuV(94d`v5~;I zKkw}+-u>sif#km$&UT_adG4-PukSZ3w0@8Z&2!h(6Wn|U)vxM^;|WZDZ7=o!owe&b za^u~Rf3ruzfDAByy+$T|Z$?$~aO^BeXuy|h->m%ot^E9G#?V$JJ+E23rxTe&wVHQ@ z+=RjZcxdnwyJ?VfvJcb(>7Iq-u9#Ou%P+IW@zh?lsw6}>mYOxwUXOho`n{_c?7;#7 zIYY;#efX)Ny?V%&TAU}jDx*pZ#*6*nZ@UCjymJ^NL{qg{(m|C5loJA`%JIS+&}#&B z{kX{I$^Czb!lVcMbyXbHtsi^(UKaUzLk3>zc>#I3rtfy5tT3oHd|nl%l)2Z*P79Hj zl4x#k#z-jqJyO)BfU@CT|1MMx`aWb^>kq9qYIUR^?<|AbZge8$O&$k2Y?~AZ7F7Ud zTD4xx$XHh7%qm(&@o;kCVoo~(Q=)skyT!^rU4>~Oc$-P7KG(%7zN3>)$D(cHK?3>~ z&}z+uLE_^EEIe~q76S=@^Nx{E+SDpq@Sy14VO}d#OZ6~fF?kxs>_INEhhnKgwG7@2 zODG@=Nx9Mm-e?vhxZ3Vk?n0d`^%w$Vf2Pdp7($NTlW2vPr>&RP_ZtJICRd)jCjwUy z_kO$Kq1wmAy`SEF-(U+LuD#S=S!ev7%$x2r03OlTNDPBa8B#TOnRO7I{N*A#3H;6| zGMT-~Wt`(7_!+5a@@IhirJ49yGouYK1zUz@=sR z8bO~KBfC|hCfFJpusdQc8b9Mm)hp9!)T*Usl1~P(KYCMEM*CzncLC#oqb$7G%D#`9 zU?ZUjM|>#|SveMShBma5LkzpKSc-FrElvTQfxiP)V2>>og=pde&XgaV)a#=l87tLe z()z1(gIp_2Lum*yfY$mPm_G}WfS~U(chUuc>oAJiF>&RR=I>`RqevM}@B9q9p1jYxIp;h#qdM$YT%Nz&=C$DJ5UQsxq zEzy!xFLm(aaXDLQx&SF{^@1e~GZp;e@$=k*Je!hG(=wbYu&CQNd5o3kkHYV!q;G#O z#>~s7n??u2E!3J?gD)Ip6~FrcZW|cVHk~a8ypEV$W+wx99l8YwmNZo#r(3_gQT?*j=QI>%SPCpBKkP<^u^9f_b?$F z1tYQvC@5m;V?Fjs3doX{giU8zZ~Ol9okyX4s74nUS*v)Cl{j-A)bt43Jx9@cWKa7v{b|JDIJ}npvwK!?&MhUW;uU)=A17r@a2}ELO?8g z^GutGom4yXDqnui-^;Q(0|!s)5K}*&RPy!~D~RTGO-d~PN60<1o;=@{{?FG)X?7FI zi35@D1b#rN@3!Th5K-Zaux7PLtqjKRZhYdv zIpW`mE53_qo?*Mymj57~4`j=S_2rB|?W|u;eV&G~6l<(7@CF<%QX}9GUtnnv4_t)E z=&q7B(KYOA6jruL*nXo0X5P&42wBHLB(j(;Q>SXZ8=Y$ySyF-A@`z5Hbo`dO_im6q();A@$Jd1N>{)G3R-47bOJ{Yx*)){$cKzq6~TW=MGi?&NA zzF=~9gc@`!#Kzg&e_&2)9TO6-=t8)R!hoiN;Cign8XGRges3oe6DID%$7TRr9(sD2 zqP2?Oz=QS=R;ZONq-WISlq)^dp~;19wwmc5Kl81p)#gEPFm=0M9>FVuVErpcojmyP z%nNE0t8^6W<)Xug4cduZKiAeD$<8B^^f97;SVc9@KjINzZ?9U`PigtE*2P1uJ&N!2 zxR$x5mRp|Hxw1Zt=Pb#GTALZCV%Pn7A!* zS7FYZKgGT%C_sEzS5wgRG4jV-GEr1{M8VAFzEt_D>r-m!10>eKy;jj$rb(hgNCrk% z(y~!*?aLB3#(5kb`w`Cu(oKNBm#yH@C=~B8C2e>&Vv?yrQ3eU)k+_(h4^c}&OR?wF znWEqSVRLTfYHnw5PC68z^D5`9Jgt3frKRJ)tJ{L%+d=+;?Ty{!*} zH#SQf-R})_BD;U3iaJ>!n^g)(6Rpn=(OpUaas-z-ce{72bgkwq41JOaPrZe73;Qau zTIGPDt;Got?KQ@|GPWy0{uvoQXr)3_(57EZnmP?PE~tr~E%$CTrYAdjAoIqjTM1{^ zF{de3H-Q}BuI-Y(A}yadQh7~|!Ex5W%T1fRN}D5(jDO7CTYs~C+FN+%RbhZ)Yk?5t zsLRc%zgHwEyj%+~cdp&cINRk;mrCn5m^G?@bH*)p?Azz@$_P(E*w^}xs>Xo>;0GB& zOH>&BBhawtc!v&`$95RpM>G${X88-TeZ1L`R87owpmibD6}?a*Yr4I zgRcXKEx&Nm=X+spM`zH<&x2u~$u1$dEi7L_V~>ANT`I@2yOPPE=gKLin!S5#>6i`QV!uoxG9MZ8J7u zJXH;_^G!2cMwDW);v?4Z=JeNv7ckqmYcBLs-=Gh^B9M}wPe);mz^8~~MYmb+1m4qu ze^~E|Q7_w2C9dDjOZ3{*d$C)!!+BVYjYNUiBeWmw3O`@tx&sMsAaR} zcm>7`vm~&U?fXB6ywzV~Eoa}W`)#$vYprdu7O|n*-5R-fuD37xJ`2b*%nGBW-=5|5 zJ@3T&^acnai9I*vx@-%X-g}%xwfE^3-g>upQQ0I9{LZNLyMt(Nv_C#5_APpesa~`Y zaQ3Z&6E!^rZr^8y0F@Y>+PyNSSBY>_fOxY`kt}7R>#?^iWv-8rBW~4W$E7P^$lFLF z0$Yy_tz|qIlYl5o6LI~iht&nar(~veWQD4DONd(r}U<*+(F5HoQ0!Tqg}2U+NM zm@LCd4U6KOZ<`h!^pg*=i@-C$hKu5Qtef4Rv^R`v`t;FR%0eoBQ(){_uwzD*KiqAR zYOs9bo<4F)@I=I$Vd$BkZxpSKm`}m(3|_JltYtLaK%+|^hoP+l7)sw#M?|pdJ=CDW z`Ba8%#q3PJE4cvEOFaoC=6KM*$7I$|M>3fX!;3?%yg|ihvGge+_UDpL5T{3DujGZ! z)XJTrj6m=Yz{sog_oWFWX;@Vj*pc$U&=TgxR1#j^pGy!S*axQV7I70UMW2MJtVQ>N z^H&dl-pW1vsjcxu_Kas5E*a(eSDrPUH73{$Fmif<3WmSdCwlH}v)!SXvdOW`y{sR7 zwMM^c{GkPkO+~eD(JLwekw4sieb24=Y9-3HUvu^z6cN><=ivw)P>6*RH&4vmgg!OI z$%ciYXY-LCP=mK*;;Gx)8;w$FZk6z)W>KI9erN`)nRtQKzGoxjzUjwBtn0NPBK~+F zaq4f|F>aCTr8juBnmE>C3Yd~ZGwhb-#~?Hhx~WVP+3Seaj0a*s+I58;7z(i^Mk#ht zv|w(;V?p@J-IqrqLiphE%~M3ddl7Hk>=xeXa!>|D2%X=%0;Ya+PwOd`@HxxtE-qMR z@9Ss*EF5$D-}56W-`^P-X_;Y|&g5;z=bX^SJWm`w0N;@V0-BaH7tnX-S?WF$;@|z* zqii6XT8O~JDYGIw9$w9rWmAH?9rX7Thpxi-iUZ;5AORWGwN9&iU?j0BnAism-XrPwGNBlz4E=$MTjv1gUdevn@q)Qc*A%D zP?JNP`|>vQ*x?H}RYInbTtz~A|BL7)2?;`H4=xr$v`RWbFppiUVW<6IrFoYAIuw|1 zR0EzUtM40=|u8pll-GGjHQ+b*S)RV-q~83_p;FMJ+po&%_;)3K{#5A!|kX~POQK992rvx18$5PoQ=#?hA>e&1M#lYwK zapXzXT#k4A8rF1PF^9hJou!=zYH*$O04xpysp87Je_$bjgqDJ zp!3uuR)2k#!fPsuSI9n?H^XP5->y!VaEXe!WFKs%X_(__8$3n-2$hIywbNNFa)$K3 zVxoWE**AAyRE3Wzw-MbQAYOuyU&dJ)Ccq}}0(+j^UElwvj=2e6fIWI|^wusomORC= zB@W$=!p-)I!9I)wtEsV%pUaZ?N&nLQ_vTlpTTLxS$Np@;2s>!_MYe0>7v4Tr;8Eiu5)U7l%6GAsF!yJ{71XO-K@EN zHGh3AzXHJ|?qekrEs+zpnNmsO#`P*897p|*r2%u%6vyyRUKf!%uJUhkdo|y_|Mo5? zL}Sw>6@7{lQ{pxWBSHUG5TZ5BVj{?X3Cw#KkOt7roLTdB)Oy*E+QHY~sRF@;!Q_ci zzp)ASHze1L7;Nm7b<8QstP;%4Sn&d73L~!GX%^$9rOR5)N8zJfZ|f%}^t&GG-^6H{ zY^p(e_az;EH>ec6OB|n=Ud^xy>IrLUC%gEvg_-LA3P1Rq|GGB_n7}@@5LnH zF$>FEMRi@aIWMR_|I70nUNf0Hj1WJRnr0?VL7K(Gb9}>=@=0K193De_X&<^1mhQZ6 z8qw*EzVn6bn_)5!vOYQ%7C#P_fY>XyvMQn(R-+s6P{Nn5F=IW)LGt583}$Iwkm*5Y z6l-15@kv;*G38CbSA?A%M`932m-Nb7t13ER%2ym#&_y{bOiDHNUt==e`t#SWW6@A` z-zr{{GcmXpG83Fxi22q5S3578h&gYPs^_gPgM9>qG2k;A?;sL?jIUwY6TK{%$* zzNC7r?Rl^BsPj*s_fUVyuHN)ar$rtf=8Keo``&F*Pv8KA z67?*sHPg&rS6x|PbgMP5NXb^lBlM~x#&j;lGW1RH{WzDxaM5rR7%!c3b5l&~%ol_F z-J6&B<2wyuo^$|ZuCw#k&A80_x~AlIvibbF;BsE5d7K?D9b^(N+{%9~ocyzvwU_T} zq*{n4xLdt_?E3n&oUjeAoV*7|v)ezoK3$pccYWx_X7Z8yz3^F-U?6~PM~E1g+75aG z5NzBO?u2!pulPV3X~?=N*Q!~rmpR;k?c1%#wy24(PC{t71rOvEq}t&V=gjR_L}Xwr zZt~AsxjhuMDWAgP8FIxk^BlaEL+0DFDN!>!_~^!HMeASfz~G|5STh`xb zQm1X|4FBN`{*QlO`Fs`bcm=+@6$v<<2H02s5& z+6+3?cmfEFop;z+r&P)u;1b}s4gr%?s5*Mn%msV_zFsBX)_@@}DpQp;($pu1e@iFn zIoxTAs+nG0TJtiNqng|n##+0CGns-x-^)Hl*`BB9hkn5>X^IfcR~mg6=OS|ohp#6K z(AWs4V?_m}4Vzzr2_HgX3ZHz;wY{@XiJvP@2M99hK z6eHZ8_v$$BjM7G*PghmVJMFh{e}Ur$|I4#(4N(m~A-?L-kM`HSl1H^{gx?~wwZws= zX#L+&;Kjk|K0xlk^#c;rwRfsc)BCDAa|5=f>okhqzbzj(0r?&85V@NFs^v37ht+}w*j{@gJ>wCjlK>LPxl-H;HDN2s^aqz*b|6ZY7-%_ zsD(Z(%4F`TCgSfc>_I0`^H*Js#~^!`Sv|M=G4J2jMLB_i zULE_rTuo9b5fz5^$`v=xA>O2$9Usrr1!W2uuGv&cNNyHT6zjwcP53Dzs(f?2zNM=_ zfUl*jB~6Y}Hjwt=21STuf9vV+E9IZUu6ocjym}>5r0a9B9W^bdsWmNQ+cp8H z1|7w|3X})sQy<}Rv>c||DZfn$b%9bCfK$@tqOk@Xj&^#AWj6q^JVXlZSlV#Q%@?sd zkTNv3G_V!atTB^aruLR45!z~`L8~>A4$dz6xI1x$$nQ>IvM=&^jdktVFYFL!;d1Q1 zaoCeRd>yD3gh{|v+`^UyiKEhqsaFUL@cvhh6Ah4*F0e`r#uob)ZP!D^48JC>+VgO- zRwCBJTE55d1~7rCGr?pvpd2OO4DE?gh{D!hV4X`UzyDuSO!vNY+aSfS1WhvaXlAIs zLG3{IN>N}h+Ysi)FEPd4%K}r621PEZU7`d$uPi+!!bM0#*lEGE zyPkVZRkC5&ooCL2Cs`pgqpSxeI#g=y;f?q(Y~RNDx-#eUQDUX@ zpSVy~#2bAZ{x=zM*uBiS9`52)>S2~_A}-=4kb9pcuxrEMmh~de0>d}pZiY|1JQ1M| zWfh&TMm0H!ZuM9k+p+%{B8xNa7BYc!znR2|jKdI6)wMV&$f&sk5uyH_s;}(y4g7mJ z--K>_$GsUP&wE6^%Xw!?0(_IM+*M1efA@)6I`A`f?0_{{nCDc?+rWd>iy?wi71w(7 z7%We{sL)3od4&@XUmSUu#9OKTEc}&%kMk0?^+Kia#71cFP~QIUm?v0cwpeYWiIcNZ8H`o%O_Mi}Z~P&X~T+InqLX-rQU!3-}Dmr+N=QJb1cY3jWP zuNBeRCr3AM)C}2*9Iy7(>7FAF87IuzPux**A)^RN9Knd`u2sK2PNkY1O}(a5Zz2uB zHY@-xMXXg%fH$}a$AxUh4p=VA-NatD@M>KW6}t9AVQb=Lte5Xqq%?upWge9tT{@d2 zjJE>SJpK`@FNiPWi(P8DOxTx#%~rBmgC?0LOu<`8eEG+3llu#O`HC7aaWOklEe?AM z%e-SNLJA|->rw3?3TGFM)4Sw&!d^GqwVicS!Z-q3LYVTTRZYf@9`rr{y#A+)Xoi-_ zfOL3zohGRhSxBlte7NWCsHgx@o&{!f8z0;i7nkushBzQb{*@|1N-`SEGK*I8i#gWK z0ShmR2Ph_P=RH&t2C9L$h<&DQh_up3Sj~qPzVu=By|1i6P-LO9(tD0yP(Rqp4_BnM4fTIvsJANeiO{>o);O#ZB#nCtBBss90#1JE&wnjhaNCJeaPI?hS6Fn>16%;lMcP^Eo>XX1RJ zn-y4<&lpUp`0C1Mj;UTr>OHf)N8y35ETALOJ>rSAsFVLH1^t@nG%9*!+js$iKJR49`In%NUH5ZNdQbnT3X5lT*<_d2iaksC z@?lMYK$jmb?r<%a#S>h7cAdbdbZZd)raxvRSlzA8!7&P5Abj zeqZ^gbjrTM$e8%<#t3)+UQQKQ&RiA)}Qy8HkWr(U)XMepT{KRFp7kEh0s#FD4{vr7ycrIUSS#)%)XU z$9l|$^3xs5mFZ)COk(e)SU2QlACgC zXL**4gR;hxrT!H4pK-@uXHF7KIr*)%V0s_f>XHzKEAl3hm`-6@KU5<&f}c(E=9BVx z*5E{b>_v0spLw?%rIMAhLe>_^bh+XT&?*F<;}XqapEd*bv6G^9RqcdxEc=-Gm$v0 zQFpQ>PF5he(S-Esg+Z#MhDN@-@-bQ3xLL96Q(3P{)9IS&$MU?Br+SWMhIFx@DFnZe zgNBGfcjC0R)l`ly}}z{U+vn)1t=oHTCgf% z_QU`ZU!iTBE~>;q(f36MJ53)ToF7rFlb+6kqL*rUc=K;#f_{f^bvL=bR`I)v?fT=< zj7wFQ6i!SOQ*C`@@%O*hz#rt}zUB*q9R=6J^pcf7iKH5jsC!Ud zJ|5)svo&cV^tEabxI^){VEp9zJ^Mp34F3SMCPA?5+LuJZF3R;-WygYGL&&#Vq}^9n z_=jhN9iR9y!wUGE&rpnC5mxj88ZL9i^S!?p4>0CG zF?+QJ^MRwnH>y@cvWGexO+D*0-5%Qe6j5lC9pE#OP?7Zg>*f8k=-YuzoWAM zCMsN*w2D#IU-EHYNbJcvYAxwqWYJ8k@wL)FUqzh64;OrxgY7`Qzuz&}EytPz;-S^W@L`f?AYz z9aO{amIDfYjG$AC>}gt*PxGK$&!#&>Pz8s~Sy?J{9z-DFiAv729G3OM1x#l?+3b&Y z(WmJx1TfCeJm3;=lFasnf#R^8cs;<5)rvs86sIKF*rl~=D5oA>sVC3t*^MO)CWJ|H z+Fq|#PHB0HTd&(LsDci+z)^rs&}rREQROx9S8 zoeG?oW#m=ZLsNXFBQ%7^K1qQ4iEa(pvz9VBfCvQBE3SE0CPjVtWtrZ<&uR6OAImbl zQWkI?&7{#7fOQ8oMdf&1Uym7(Uag(JNQeLmrZ#*}<7#_9jEp_RPr-_Ho&mkW4=MAONS8YiKm+W1P2ek*n1x##w=~s&} z#V#B_CNP|VaeT#U#6BwzjVaYc+jE33-8_s28~ z|1Rn1eD6bf)hfJ|4f0pTvg;Ofm`ulaAjfJA>|eP^tYbAzj)x!g6}&}I{Aop~yO`__ zd)hE@zeU{HFtc6)sN>A6U=qA#SO2p;F6NubwOTdA?g2OzN zHHC{`!MEj;9rk+<4`K&O`6iT)&u}D7)rQc+N{1{$_gg5xLs*hzyFGuJ`Rp7 zwLnL+ttLb&JVZGRw9k2o5qh{Wjj1OWdCBsG%+f@*yrX;P*j(J&i_{~%Fo_llY(D2H znT^lAU?dqBZ*0=l{G7u;jl3EnPyT7LLc@dd724rwxs~PrrxyNaiMEQCj{U@N4?#6JFb=ur5yD^)Cba&jlb>Hz6=8$;3nbfBF z+`iczZ4j!@w+4aAJwT3;X&dh8IBKL}_Z|ceu)B%WWjNv~)%L~c`c9U3VgNRZy6E)} zd=O+;Nz?YhWW4}vV4i#U5-y|XcwBnb2%I(^i3JIMr#i;iGxV^3t%(~#>=jIQ34f%r zhIN#{5wL-djS?A7AtNB*$Ynl}i4aeZtxQaFFaQzWrQ5bkU~H|{4RW!VApzxSd~Il; z=)GCgAx9?b=et{?UHj9##cE~WezU8Y@ONKk1w}S|bkz>+6?&K0rIxq;_sg`t{VzZ2^7Y~2(1OUf>F&qR%3COy{7qWG9 z=j-FFadS)#t0sD2OAkw(m@bzTd9B#08|!iM3KiNKK;oc0aEo>59Qa_8duaXpKyFCD z=M^-7EyoZhXK(3XFlM*;a-o93Pn0~YeZS;j$ri53L6F-K2C|3Z6{hNoF#det2!&CN zA9}g-)$)9#a!ma|A4fZ zcdqfe2?sH`Ry-VkWA@OxuU=Kcc=SpEUtbYQcudb*_NDEK0NDpJ8e!uEA9+Jt1KF2e zxF8A09bO0v)$um#B*$1g-H(9!5o5anLwIa7KIP1qnb@$H0|DAh>D8)Fj$L6()u&m( z7|CEPH2nh+WW=F| z#%n52k<}NQ^gJNgs5=i{nqo(rm)X+l70rtrJdD}2u|)*b4T~q9>_q1=J>$$_iNidX zZ=WmxV{7u!2T~)*oN}uM+%rm1o1!~LRxpMakC8F%W#j~^qG1dEc;Id$=DOiy_~TmC zoBMIL(^<;M(SxZl2Lsc9V3KjgeQP2~Wezau&x^f8psIVd(DS14RL*Wy>>ln}EU5Ei z6Q4|7QcwEgv)H4%iT6(k?4|RIMcF*BX_-&2`pnf=^UZ8C`kK~ec^V8!HgNqg0NwYfxsC z5lr(*zn_MIyAczRqRiH#9AgR-z)Rj9z$d-DOqlQJk6Pl#80|lLFTwGJ)&HI$Tfwss-iK>K zw4?~Eo>UB54|^N7Quhx#trEjE=i}}E#b%d+$mn048@>X0ypew_623j3`64tqQ`rE!T7Jhei}3`w zeRCHX3#&K-`ptS^Vq~h1AlwCFO!pJJ10p_z(NSTl9yX?9F-$KEN)hC3vxD*n-5Brz zjQO8{ScIrjD-Q0BdE9hbJY2~PYORrtCB66x9{sQ4X^Zepr1P5H)YQQ`PW?)+5Z2xr zDP{dK$fR^Ig{txWl<7h7M{E?zE@@ksXWmQAkUx7IeK%m>=$p*G=;2{SVKU&-O!QDT zK<06g`gG~~-Q`#Du|?b0Xq-YA0swGtv_!gd?efp)DE>!@#KBdyWA_w#`^r>Kc;Yk8 z267oo#w%`Iac2N8@!@VKQax)|N*R!1@<=4U=)BV`8=ew)e|!;N)Jw!Pz9>2-TJF&R z8E}x5etldM(LgfT5RTxT#Ki$rS1n3u;-Ba;iUBRJ#nof)lLs&j*ks?Tv5iv!OubZt z>u@G-^fPLc2*Qy5bX*4qqHWaZVXp^to-b}WT?QZfT?(I$J3c?dPAG8uiC5xLju}y9 zUuCZLo{fwA1Gh*k&{^3K4Bfp{2gvh6w;RuTny|%oB<540zu68`7hAo9Z!)GMI>DMsm_3Oh@X2Udf8&uk(tMGZ z@VU=G8*yhsKIE_%q(-~RxJ%=PKSV9Qy)|Yar{O7WT6Os*11s;_FK`$dtc&{C%gzS$ z1+7LnU&}QWjB~S&2QP_QOw5UMp~sCR{pYf;!F{|C1+vp8Gr9V|&o!a;}VhFw#F% zvrTi|vpj)jK!5dCb!Yak_+hZEVe959P?i4R{uNx;^(KKTbCZ503TU5*S)EQ;x2Q!i znTP(UsjF(Aa3xLqJMT?w6^>&z7h(becT4M_M)M#o!NniYRzACz za)i0ocReV|S5F&M=siiiCAi12O9g)rP%FwdLzdL4@0E`JHxclQCo_%a%W0ye;t-aBZBG2!DPH`O679G}SbiusZ$l z4b8vl^ewt6GVE0^pwJc+Kg@ZQpp+2z0cg+1S5qA=s_QPU>o4qf0UDL@N{H@b2GW4tDR4mp*t*V1x&Cx+u;xLEM- zQYxI+=4Dz75DWa;JL^C$ZNQF;@R5%`FgJh2;r)VP*Fk^@eeHnVRXvK!xPI__>Linz z1Bi+kiIK4fze6)U0MC9l_`rSQ8bNGPFqBPC5kwXL$0uUu#%}`Ea;CkFC^5*QilF+2D%;U&!MSo@NxFO1;tKW`bvN(GA^*iO)YT!BV1E#llM4uz+`d1z7K} z%YgnALkm|KPf?GhZU%J9bp4!GK@9v?Q9T|x0X}%1FoH9xYEo8>PigO>AJE+_jqwGDKD{4qH|U6p^4fHHb%FwxA2-#F_XOSPJb z#OZ(0Gm^gdDALhkX6*CmaWV@ezV0+}IwiwO^dM2~j(6)(4uAri3sH zZBYv5dk-R1vdj9v%Aq^W@U-{bN#;uFm z9W3wS#`BWxU}aBT9R?ze;jO=96P6b5s_Ik}jK*$rj&oijAZ;6OpCOzUR@`h_`*t;T z%wf*o?6D2k&`q{~4y>eXK8Bmbs8)&l8gLQGqZv0bNc%Cem}@o~^#0MGvW%N++!v!r zt;C_>y&k?_($OBsbZY!}SDZ;8vdSLXH!=P8(`h(Y3oi)weq)eypZ@D-zTU;!%S6)u z9#Q!Fvw+Swv85KA9{IrW-LZaQY5)kW?1^cQk>Xml*;_{$!_$p!7%yRm%mT{_vg}GV z+hO#Lz&Rl(Gq=r+iql_mY|>!@GxIJ;jkcP$X~|HfsUvPP$_fgae+yfCou zIX+94X4VbHGJYDbE@`$o2L`{DXVyyc`oT>YZr_KRt@!OhWsmd%zHNTfPDaS8i#C07 z2?;ikB{(}^Yk&8~Mq)VQy~Hg`y&Rav?+B_vf%AHW8K#_#)siGcT?P_stfuawQ0P`G zJI@x&++&UG_!~`Z%}tjsc_=-DYMAUhg=h}}Jzc86mNuV`S)A54>c5r|s1MpHQ~5jf z$FW>YMt;sq25MJ&^H4X3*d}I7S9ed-ryFf@H)ofBV!lrXN0H*G$#h)C7+Eur7h(qG z#S}XC07;fBEA^mXu$S7T+$!3rp7E_ra`jsoe3P9(8H{u=_)t>^no{yp3{2t6DFbMo z?k@GsQ6FK4y)}=-5jK{q8<#01!;uw~Wepo{iqpyx53GPKym67*m3xsQ4)gVO7Gu1m zRV?o4rl$f#wtvK(6nlC${xPevf-MHWty;$NjW%4y^@6wfaY1b4Bv5n7NB^3a!v_KX z&zN4`j6d(c`axJMfdP!%e~b7)@Sq3Z%v|W9&hWa*oAKa@QfNb|9HRYD+Ivl>8)J}R z34noP`Nw7llx+yHg7IP`v(2AldNtE$Zy_H8*KBicDHUHT`Eo5OSHsGh2FPvnW=_NS zi-l?VfhP!H2ViKKqSU&do46KVlM+vO@Dn$?JRq8PePL=Q=`%^*?(Flrx}w7YQLsZn@w@E&kYCD43Zm~ntQJ50gv4;q-|%Ko_nt4k)5W{pQat-ICk_hgrMbtp9Pvf z9JhMM#cq$Pou|B3@d1z?K$q<*HhN`~e>iL|>XP0$l1AdcF26U10DT+kJ!nIEl+a~X zw||{LnI-WKG3~-eNI+%<)Xo=g(%Y@AG#vErbFqHu%Wr!>G7r)yj4mPb+$TQ-2*0)3 zxnAnDHyVrug|C53=#6^V9|s?50{}Z&{k0ZbAqmd3e%br)=RuZ|rPgMjC`4e-YcuPf z0D#!}3IkzbEL0QNSQH8z8wXBU@!t_$&N$JCz&QlT`VW!#AbxE58 z6R}4clvC0%!#ccVLacs8!R^?|p#hx-*KB4CyvWSpe_R9e-6nRe7V*{3b-;|w(E~vC z7pm^wF>CH$$cT6lwp0L6K^IXosp8=U1V#ls^S#tt^z->7okDbq?8Keh4Op*@S5$+b zj2oDy0yk3mr!st$qVG|seP~W=n#e8sK^jqi4%8a(Rbt{ylUvlA7IH|ejgmCony4@> zNcbYG=5XLvrfwhL_G-+S_Emy>^WwNJWB&q$e)fvx%3BsL{v{L(UtQ9BRK!{3m`jv` zjc0-adx&VSg5RLmP_v|Z_Cs-jy{V^5VJ9$@1}Rwju&eN%P+$P@5p11&VJ)bht?gyB zS66sd72Cw_`NTc_=^O#9PhF+$^D)@EjgrZZ`7GmI=fHAm4sk!zB z%!oNo!T`&Dh|^_|pDyiBW5T9oci+qZBN65NoSo@BK$)+FTMo5$-kG~QXE_jkM?I{= zW%+*JHy>6)*b+|GJ$nJCd^wq0;SPWtZf!*0kEg1LJMY;L(c`E8oK``ohh?Y|wFhgb z-y&G8gOLX0xQzc~gR#wh_W%h@xz zb96Z;YhvhscN~CtdmtPa>=Up%^ewe8&@Atg=`$%cXumO!WeF~<_sq2N2?I;^tlR z&mzuB44)#bvrope#N!is{;+<9u* zspRd~)+OJqe6O^QLf@%1jE#Ev7!5|OV^1zOchUnH_O#pdRi_*Tj9x7pUQ@=gp54lE zLIunP8!DhhYg-LKLu6Ib0owiBz70p-nQE7%cHAe^`=^C< z;Jg#yr8Pr|@PL4K#ifI97`G40b!Z_={i73<&p>1X@I~eJ71IOqNA>T-K<-%CH-SId zGpdKD%Xb>;fTCaUNXB(P6~gAJ`0^c7j75bTd+E*yDJe^)=67X<`x${y!=8jlz(f`Q z6<>D5D^AZZogg4n^wpZ<*%KuVq9jpA=T~O|x;kU)OuFaC*LO;cqEx^~rb#RI31g4B ziO6iwg+ZChxMrD@34IFD$IF<-O*`C2GfZKa$*HH3cEaf-}@}??Y-y$v{x{ zRBm;cUvY3p7avp#24gMPmJakU8X`o}(?_K(($Bs}Eabgnd}@b>ce|xi@ld6)7vXR~ z$|mt)``k$SWtxnNO>EJfB{V1Wxfg%7TAru8zyOC`?gifqttAOV9k25neX40GB{E)* z;X8M6N&Lmv<=^Ausl0#F(KIOxsaB*rrg#lBDp4^9wD{KkkekuGNQ{RY$Gj`nEz`A6jx-dBSrnQ9DrfXy}5}Xu@aZ5>B5p63{ zbHMKNphK^9$9X{%3LpL~89o^f&l{>qnBL!r-n;UILQtZO1~0-CyD*e-o^Z7U=&k?b z=*r`n{{MJVRHSTIKV1&s5(2f%p0pG$W#O_20?y8QoZ>P=xK9 ze7DdGwWb^n?);sb$h|Gw$aYPK(NF$DPx@}WuDF)K*smI=t})B|tRDX9i>G8emZ5W& zCIzoB-6p*!_}_?5)f*~TIBr(NDJrXbFndR>e1&D<i3jK+p+&lMy_6mM8-lwv9U$@y(6PsL7@KKy`hUH-azq0roH78(AtOXz>pzi?^;YIr8s*|^k_wGjOs-gzm&FJ2{jff1j> z-#vMOel>0v7a9OGFt2TiA*$3f-O#i-pTa{Tt7y7^yU0Gp zuf&5XgaKT>?}a-}nT+4ozrMha@AgS}I`>}iU_L-2VrPjpdMVe-(DjTY6MuzD_`OqO zAKFI^^g?9G@RQ^dvEU-hQ!X?%@mWrOFB(r`Fi4|stD(%|_n1=~=+pO_2&3ep zJiArQ!k^tLr&#`O2GrLJnto9ScBcCgVsBFbU^!KC-DYQi^^-3m-hYOy7@1*CF4CU^Z)y{W*_dOPZobK7 zFE^T4LlYv+6Kc5Smso5E2g|UC(zm#fsb%7Fi!CeQTlWI--AkmAt8ryUuh)jEIZMEm zUo#h{X8sx|^lA9DLqa4Q3U_s0!{Q-|blU(d#GA_Btxw4l$W6dNTk^R9;o0C)9)P^e z9(msNPw}c)PEuzJPuIiMb-r&W6jE2NjU751kkQwpR3{=o`l{gupOIh^9j9%kT4Xb< zIjtiPwJ7iU%el*9PcG|yJPq)g>EH%KCf%Y8ox*5Bq+PH0?1fB|hX8Dz(+zWjDsKFw ze~DqN>JTz*$p#x+mambwhP1LHdp^j}kf-yIX&(bf=%Jw2py2%r`uQ}!AhZj%W>9^I zLK`ywPKC6}8`i*wao4FE698WluKSM-KqBf!Ajsp`atK3cxPJjIJ+tu4k#Ac`%_fVh zMPY@4~2^eS0NE0ybqTxRdYYWo>Z6>7!5N8>SUmU9z|4OUc?`l*B zt^sP$lBe_!A(=c93;JbLRnf7_XGO(l*@?z9srG}KOr`e!tesv1PF(-z?Sx~9aI>_< zG&uWNGWV;D=Xe!8!{641z5JqXI9~>y59IrrHyL?i=epv5^QB?1 z=RIZ4vUT~)bxQn%8whu1;nrp6g1pAaVfs1 zf{he@A9?hQ1?mkzi5M@^b^DrUi4VccFV6;n-mmpF89D)SHUW=EYzP`lz1Qj}iTMVk zC?*noLWZ}qqhIgMhhbx_NjDc;Excy!QrS7TQekpCxu5qrfq^4;Jetn$25(gEBP1#P zNC;i5I|@%dF52B9nKdx5asfgYe9zZY3ZW#cPC;?IIqW!10bh+EZ2{-9J6#dca}gD> zo|&0CuNpqt5^NP*XX~UmiVgOakm9g|+oR_d5DzfJzo&K1#2vbC0Yot^9uA)oemaAl~@A$*S27`ErKP?Kjvi1W%%*u8-29hiLn$Q5D*q>3^CS<{jEU3e3p3EPJWoQ7xBsQ@j3{1bnKC!OvqS1Jp?FyxD6$No9#<2 zl9ZE7svXn1U(z|dU$Dpg^~k^@yhcN^d*2r8J>Q7ld%lvFfZc7B#^J|V#i#SeO4 zlqaKRq`598$ImF@PE_Xs;F_+xmvr@z6HscwSo9TQ$2GL}0hfch-n`vQX-W75K=}V0 z83AehcQFM2c=_UA{aclDg>!~~M$#nG7V%i5ff$S7eW`;W{lV`_l2oD#me66jMQxW+YRADEOFW)h#;g6W!_=R#a zBXr|29H0!FP64vAennqAzR`o2O`h1Y#o-?pibGCZl6Y^r{xUaLB_i|hFM*{)QwMLP zUq`4;4~uWUHp{Bkc)#WXR8x6qo|%>z`vZBs>}|fSB`ky73RG7cib8FE=cu5g-R6xu zK*KwVv`uxH`3M{yNKGZ43c0G`1!W9NfpH-f3@)%4rW($9a#=z`g7o#WVL)OBmH5(+ zp7)(4JK8mF{(TE(ZFK9OJnbkOxDgAJSx#E0NT=4w>OUPoxv^=jD!jC*TAVi@r>U@9 z{1HF1pf@BKz$fI#s&*EVlU4?ISDYCZ$}yd4oR$0yNEMPoC2JG%#;<$@6bcPE0{>yR z%r|%Adl>Mgr)Mh`s?pnjyN2#8{`#^Cm@0-iA!X>Y8OR3(b6^am&UZ;+5VwKO)(-WY zQDVncHBHd2!Xr4l&HUZJ4Tk4gckvoyyq$ju!FH&-iF0=38Fu6O-GGQB{My$xi7Y3O ztH^L9RE0v5H@-a2r_qGSFh<^t}J|HCi|9*N!83A%;XE%^iE zd!{LYVFYoZ&v$w%RF(k1W9re6Vcv<(P%G~T8+T_tfW)8P(A?P&oQkJ>#ia8A+JW!T z^xHwkN0Fx&0WE=ug%^1!0KNZF;m-|Y>+|W@NAzLI9kb-Ac>~<_BSz1Pp2ozpy$aVs zIwBVcODJ{uw(jhbjEUKOIqE=TRzEN=t`BGtyy9EdzH6!_?1*@j-7#{jF1`mS$$|Ss zJxdZ4`FDf1+REGUZH9lMu4pWLcU^xQ(OlkiA8-a)B$V6J2wo*A& zA|LU_kF8~f6CDcpUMA*?No(<>{lH=ys{&9Q%kxyZ{c%~Y-TD|78(n~i1e>j2w@uxw zhHF&id8KMNz^Uhc7`71ud20WRoA#FvlW@=RK%U;4ds-niqE5zR^kNHF1h}Nq{8$p zj0Czoe%{ckI9ZAtsvmvpU@kZn?|(EfdiVLyPM*vs z?f$nE{OuI{=juLB+!86geg}6*0>>p6xzU2U5FUWo`W#ztd(4*~TqSKeRboX20`MX& zISk};M)z|yGXxXRK>7qiVRr)NqJMSe3ABcpkT>LDv~LO%vmZqwlyTC%SxOq1i0({2 zv)cZq3|Qr*;UmRD=Fp1%NAHM@OIK^2Q!R}0q{E&b2R@D42f)8e|K~$F^l zme;PswhaM*qK|n)OvrrR9Lf;x*a(pQGfWhUD&7drz}jhHG?G%2R~eZ0k* z5T;2_ZmkI1YUz5iaD^{IIhd>Vo>6iZ?aG>oSqyOH4;+xkt-O-;oLW_ET366LRG!?o z%$i1D$rASj5`|t>@ai>>&;m$bHTN?bI8u}V&058Mv8`^$LHt^PoMZDQ@#y_T&1yL8 z`j33;^qRb5v&8Lu`s!d#fDBfE++#SYRc1J;)OLK)K1_XRP3DxQ(Y0Y6lj#$Fdlfm8a(5B zvTIsUc)E@94|HsJxEIN(c|Sr*zl!!LbuI;`e?-5Ol?;D<(&HZ=2=!rEh{u=g)#&yy zpsXe@xdy%wzc5@kls5oNZ zpLnEUTnmG@GZI%MEfND*#2=(`8+&zla(C>-hl>pt$=Nq>ohbLu+aGpwTQn6z`)UxK&n7H`BTB5Yog zQw%4s%@XZ^;%HP0dXWV-Ql#Lf-!i5r%==(MxrRKbbTK^#maOldM^c6Qbys7jkI|-v zWf@dbJ(0fuI(=5m#iS6tPUbFk@hzJhc}GE3V0-oGpjEx+gg9 zJ{3+GFanUr4+_q;Betn;UMvGKO2HDmXYziT-(Uwo=m|0-dO6L6PMM5`#LrsW+K#@G zx<=HHcrU1DD<(Niz!yRf1+Wn{?E%=@R85EAlp?bGZ}+j!kNVZQsl>MAujgy>Ha-oF zl7RmqXT183h#N1FCPXhNb9HCPv$Cv0W1T?XyBBJv=iN)_5?i_9`DQ~NuIO{Q#*T5p z#I6sQ8z7d~^rbUhKiIyxwOkdquDgA@WAWBn;HKUlppuq#9yXE8{VDAiZcYE0fbV_iCcR7980$`ud1r^x8Ot{U(>>ZQhmkz<;Yx2! zw2CsQffU*q?r|at5bV>`18x*e9Oi5nD5_sIK9^hdW#wsyr@^S_q+Z@wPt!Wz_J19V zxV?j`|Mo{o3uaM@in)g_?Sfu%8#MIeX+YQvHv?YOGh}Ig6h^Cx_8`vQ5k5F3a8s7%Z!fYZiX0=~D# zzIs8~tECpMRAlut1HhqERB%d)*p=C7G}o$_+NzLhj9*sYaR2iE)}VoGGu%-TfSCRp zkpJdBQ_VMI!$;JmmQf;Qqx;Ly>1QJRwS%404_rP%>iC;55}4wq=>^RiSF#eVvIQ#k zH?kCjp2%BNmcN!bWk<%uI^JOuedYWY-meW$JqdK$R*9IpsV1;=(IkDqJj`&^2~@qj zEslE6b#tz%r+CuGnZ04bFZ!Q&EpQ}%cEKXz-r3WyIvKlGXgrVqbmPCcih-Eu1^!e4 zvmM!y<5Nd=bf;HO9B^3?f3zMj79L%)X?n@(^1Lu0dy#PT&;{IKz%+GU{4=18GGbpr z_)pNupI;l#5~+t0nhBI?J*QYLpKs;K{J*c^4iWKXx|P4`A4G${-b7O9(vg@YFi38N5claq`mS z4i5;`aMn4f;P@pI5Chx6gPN;1n}sOY^NNE$(+Fu?{4@Z{w@Q7+ug=exk1?jWU2f=q zRA1xTv|i~P>e2Z{I{bvd4&U29M_W9jSGiNa?<|hahpp3!4D2uSHS7c) z2Ilun^7y@!xe=NwWk35YO=YQ_F#jD2V0uHG(ivh@T20=KD(MH^Y@`CNEC&;`;U2dr+O+kAQoAz z%Etpl|tb8v;!k;zeyx{=AE;|0rot<2Wcsix1dML@n;_NgK9DM`xSI-V!N zq>AbkP0G3l3jS=e z3hR$G5~l&0xn3^LdXJWrDJ)h&6HZggkVFFkOmE5M8aDHT^ zE+@t-_H5)=#x2qVBHo(^)sD9*c@Zckh9HGMPnMydGH2nuDl@3ZHet`zDk&zbrNr!F z1o<1^F;$k=WZZR|Rx$VZccnFf`OncW`;45>Pp=z|f89{>iZCMwmHqL16kAzuZr-bH zA(|5P?%Ushxce$QE$(S^U~zj-)V-H6Hm@Z-CwXdJx4L_F8`c7uN__eegI?x4b{|@E{RfoA#G`BbyYEZBz5(@( zqPSHmNc$cFPK8j!?&Y1)FXB_xm$%dIAm;t}L9C?H`A$>0)WGz#P)^v_HfX`gq8;pM z1h$4v6ggH#ViWCydwAFD(`(Kuh|8j% z^)%Y)Zi6@-ihS6qH+H+@(kktxxgsQ1Wp?@P^-l_Y%}RCvnlBTg*SOEAiScSRD-oM< z)0UN{%(upy1|+JU36?*BDtr`oP0DF|Z$5MB>L+pqvMxyc7#0ZYlw;>YYzI&z~k&Q1JJU>~mF1Ue+dP~YE zt8xM<&}-&|InARaB!yOJdqLo5IdR$93FOCjw0oJwY<_q;GW$4i#;@y-TYkJ#)WBN9 z;zcNdfMOv^%|HAbhItcRM!m^?2`x2UkJCmk0NNQHqnaPOQrHQ{(@Eg0x$~bs4s5Cj&;Rwiuw26y$YEG@RIQ*@4j}s- zT*B=uZ!T?HL}UeAbK2FGjgm7HC7B^a{(3%LE9cY&9FB0k!#gg0rg{B`4ySGvyP?1N zV9Y&W-heiKx9FFM8c46LNmVfv4lDc?;>n4k2Gq%(^?*?yvq*>Te2 z=%0D^^Xpx)cFMv(=@m7!BZPEd5~;_%#pZA5aUinX@Imrryu# z&>O6mQ|lP*a^e8j^FLA|{~|)kL9cdIJX46>$*piKbU&|8rf}9pEbEgO9P-1<5>7l{qlch^lH0_gqt{qnqaQ>K#px9N* zjZ=c5G=|~i#+N-6abvVJpn0t1dsdBl`9RGqqGc(^8ybO%W5WRyS6fg2c9- z>I5{kNYZBz_?uzyXHU^H^x|kg>kHi23lz8enf)tVJphBMf{R{YJ#73okF!@uUtD&5 zN*_>ghDC)t*s@=K@PiI(GQS{`iOcM`bYS*SF=JIW(_x$GE*q-p1j;boa@}OwAWh-& zw<(T^vDm#(UT_Hb8#MjMy=&i~+m;(8;#R|fa(AlW)`%X-cz!|UH#b>w!;$IUiJDZ% zykxu#{cj*HK;OjedCW4niXkXYvMZr?^*&6O(DcdnY$hua7YLQwy8W~@kCVfp4)5nLZH4W>25${x zeZz97e#xKm@_W4dhqU}eG?-1s%_wvGy5 zgw@d3v>3s!LHK3idW|QUwFV-mn4hY2Gg=%LkBR0Q1ETjg8IE;1M!-Kp)V$9L@p9@3 z#gk_QG`9~WKiv()xj76b-ZJe(dY0W-cP`l~dwEa3QtJjdq*W&UN%p!P9_`TxSJhd1 zJaf`J@pPR2_m3u`c&bfOi*YXX*9^$#hE^O=jVy9AL75zj125l28Y(5#ixAR&+=0JtY#$|LC*Ku-i4$`3kXK-Q1es45qtl9g6pVJY>51U)YO=JcHO$7$ z0?78jHslIWnH14R$FyA?KHfR7*YlQIqF3uI^JRH`kW{>?iOFz8z5+%1xXY)r zk$TThoWtT6!1h52xg9mj&7*JE%C0caJfasJB#$3Nc*iy$CKrV0D2i#`0Z5H&!!0IN zc?!#&{ZP$A`<<;--Qr2zAhiPFdI&GRM$o*! zCcxF$ffZt9cO689oX^$C?kuqF7?Ah%=ij=W3xqg#mh|S>u+>!PJPhcke0u+5JMu~> zE%XX|0!g#Tf8m!J1S$)@F^@E4CuvfkLYgO&2diDGrgff1`@^xHqTf4#&TjVKYbeH* z;|1cEXYZYe&^8fGfndi=2y}Y>Zo=~qn?*$qM@O+a#Zq2SdZdQiR(M`(d<$dTx z((c)h#;gsk9++RYRyol!k{bEFi_LmVo}3SBPxOZF{qcgPa2e|i$9m1I>ZE?JdQMMw z7@^&%!v7_l!`6DYK|9#QHh?E}!Pz0+vRC%X7zX0Z{NE;>O~pARs?rmvCeC1(RZlY(J}pK9z*_%Ai&^4J1K8L@z*hE&tCN|e zGE-kh11y0p#giI4zYB#m3o)$X$+4eWCi5r9fASKVOaYmWNIAp}wSl8vGI>Cm-b-P! z6=oMI4|zpMCH}h;vvBO;$j-yb^hW`{eDu$^@c>rs5<{N#083#~E02Yf{w~TZ^MyTRyL?9XyUKIId|@bR^CJ5>RsPt(#zD zoYimt3WXIlZF%|$JvLl~6z@GzMM9zC@N0h_-ocU98qkRBqLZlex&F4|y1yK! zo&ud$!@CjEuD)!1Matid60=6ETQgzyJH92r26+)qN>I zkzQSnlNQiK--liwRC8f{6G6~|K>VT}{lsB`mF3Yhn!hdvmRbWrgL=o=cpR`X?w~IH zPaAYyt!mn1^9c+tnf3*~?q6i6q)YkDY3Z!?e)>80l-Lj4eH-A{MRG#r;B;(|4mhSnWLfczIPQA5ucvwN?)StU z_C~)dmhX8YP?Mt`_HC_WtzMr@h}t|R31rk{ni-D$OK@sEFX#kn>$dYBD*Smd5{E!Vpubpx=~ZmF7>R`* z|Hs2TAYkYc|~7v6*+57IO5S?#YoS7fhFAW=rf`mL^{0EeE4}Z z)+q=eC8~m2;VM-$W7Hchjf&V{amFj8`i$56qG_4*BDc3@EFm`(fVqZuc;xhVzb$gR zILA8T1;veaM9%YyPD$=iyc5$vjv<3xIws+x*iFf$Bci7@CjJ}~;q2Z6)BU(zaHvM$ zRe|R)9>ul5C;VkE+u^CVlkC}Wo20)0UgV7IAD^vWR=I!9=bN9$R|41>X| z*kw=R=Fx@w#64XLWjw@IT=o&NC!rE$uZfJ0v~6yT-Ovot8~R|{5BY79TrRER^8x1w zUn`!}dsI9*r*dt$Pnr@7CZDB9+%u&CM}Olqu@m^a7i$GIHB>~?RIqEs^3Lv_U~m;T zh*``)_KyFPiv(iuOZ2EUrb(Rxr!sSwemHWu#yaD)Z2aZ^oCjx+Fr56oebnuoE?BhL z;IyKTTnp)NVe#Yz^JAhsR0xh&RC9b-3V8XJ&#{_s-)yJ*pA)T5^IVdX@d-&Q4K~`p zGeS1jyhvJg8sSl~R1Yl0xY`^AjSnR)Bh6@YC}_=@Djy+LtTun?OYvGwmgKQ6l{ktMCf5`(kkQ~KY2{gn zw9k=n!&ZaS*ug}(pED3;pFv=}?!E+9PRcNDR|kuQ*)=pJ3SLE2giSn7 zQ_>643%RH(gCiRP?T{h+EnZ1AR3t5P#BhE{Y5LT0*pcpvBDci7U8MooojAWh=so#c ztU+=c@QNwd}U3Q_g zxD=3;>6~~E5WmU$g6YI_W&w%sPD}!~JPWT;iCZ3a7%ZNkcg@$=ysBD8h>`xe({k|| zFCQiE!{1|Oj! z%%SFqdc4voHWBDB1@3RnBWd!HvXhcaH9i}CyzG7=Fa)m?f(L<+D^QmDX;vxn+W^i0 zNwcOx_Wi?S=KbX-nSh{HU6Uz2eRi^CNU7oMPJcCVv*ya60K3y7cB?E|cAe*1wO#eH zM_cx{>sJPW-b>17@aHL}^HWid{j&#HPKMH}BD~z_oKD7U&1Lu%ETW+Ww#S{K`6+sw zFRye}Fguji(1SknWFdfXxSSY_JJD^#458qiQv09Tkjxr<29>zq@QOmxk%qu5{P?VL z)WapSrvUm_pj!#mY_}tQerQmw<7BMe@z*zm8jNNBSp@B4VATR|zw0uMf9BCgK=^c6cdrJz7jh({XGBzqCoK)P*4V~BuJtIu-!H)@i&cNcS_U8d&Lp{ z9U=;QmiqSwdkk)l6Cv=?JIV-eF2#nzj$Epb}8Sz!8gU~giQ#>`i2l2fZl zzR~b`tPiuwXK=I}a!NDBj22gn-R6IGhG+n|{4ru|V~t%gtt8}}`k_9d^qzxMU!u=?swB4f9 z-acb?%ME?GHv;ta%SHz`v80x$ibm?P%3Ho>u zrgpK`=SYf0I-$ehwUv_!xTbImGTz#@xbcwg&FY7|x%Y2&wXNul`%{e(QCKxVW}8Zk!i+#Ds2%{YZ^B+o z{*X1y3JthT+ztKB3!$q&MRW8kX_51})HDr^lgxr-=_0TKeM8^W{**uNZt3fnWWAu) z78OdKhBru69_$4*uIca)c8U$erQL>W0w)DPk1)xHN1=9Qw?C>@!$VTnj@ZkL{#+%j z0E$qwjvcv0X~|ZXP^K6QgumP@4&0P_`BbOiUyW-W2(9nts^QG-FP`fy1<>upRAr;0 zqBO#4ZNGsj?Y?^m&hy8&zx~}0oLV~;)eXe6XFb7R6R6Lu>1x28Wss!6bjGmyEq@R9 zpxCD+_flHcQKh{4`vV}xsQGZNv@V?>wiFi)beMoEZ@*M}omSk@wIe-XKot`iR-z?F zzPU%)9?3}O#;X%ECyCei+m9qG5Ul7Dowc6?VRq*`Z#|l%_%xp%X z>OryQOhP^aj0ahVRb=mba2(6mUIUy1qy@FFdTGsj+Bdm=WE(NFdIAv_1=(%47SMAx zMt>Y7u~<&Ak)gpZbXennR6U-6vv+rI{h-N*&v0tJ@eXrNied<+FULu|`pVy-VR8{b z#=iajpp2c6ghE8$yu7ohKCx1aROc42?@UhpvZeG-U4o=%n)VK@D2z1BKDz|ZI6R8z zFxW(%)@*lzUr7QI?#CsU)Fxyc$JC&tS@Y9ZsMW{EUf7#r7m#V8mTV5rs@l?y8DVdS z0)kZ{uRa5UaY-_@dJ)MnUr?D*7EJM*3e4$}+Sq$h2cwStesz7}jAQ)q<%Ku{jfSIs zTWr7s-)+8mBGL_TkBE}y!4&R`N&%tvMkc(@(OLC9vD7$mx7@ zxdCk5!~Voyf>$H3BpgTIs5i0ya$au7wDfyx+kNgAm(bW)O_O7Y%jf+|Ph!R~-R7qO zoUg-o>DyldA_?+&hyRpB&!dVx@sC{m`6T0tGPNJI@_^a~$IRWo3U*oaixk6HHy{|l zK5*0Vl9hD9gK-g zNoFO&)qI4;M2C@vxf*c4!Biw|@SK^G^;0KfzZdSmZmbwOepT9D{wotg03<7~S^Es; zLEuX-z~z{&F69I+02_}!nMsq!ZQfS2GSBoH#TODoJDbBhrY=h4j9a;rB(6z^m43o( z2%3MzV!WWDGg4tL-7t=JWiO06J@Ij?Lms;j%Gn^$U1uEOd`9^G$s?k$bV5bH)mouc zeN!9nMnK}OhGXd6(naI8MW9mEXBR@Hus%3v`&11pV0dmgH-AVD90Yvz%NYzmOA!@M z9X%lCtWw#SMpsimJ30L|w$cbNu$_4KjDIt&r0m|&H~q3%?QU#9bC+Rl_x*FMZ#CFI z*IF0Yl_K$2Y5Ps}hp(;7y@PH~`c{??ll`}EnTkb3N1fRv#t7)OJ^0?0u#oFyEQIS` z&F@bVZ_hWOxY@HRg{NwilHus5$lYor8Q5LszDPav396>P$wq@y#U0f0(I(~ zb66tmea!UQR=@Vn)BEZ&_N|xofi+mD=pa#R1?+ZTTDb4gnuM19HcR7R0QoOd5;COdxR z_-96?$M+P`jD9-ec3zwfW`~>3Uqk>ukN8`acF2F`*xC!jr(qs5$Dm1ZE`m`Zj+fXF zGokJ++O4bD9vHnIQmy;!sfH80uuh6!wEsW8kYzdUu>w)W^(-5fnm}E8frC6i_SocO zz8Sy(Jh=3dP0BYKf#&@W;$!6zf!WDU|eD zXV1Za?ykzb&APc$%A8T7a^Fthh zd9|YNvA71mpDAm3qCjw=E%fv9{%c{kBg{$ovNxZ(!>F)c@!!;*TsiBNf!DrQ|3w zKG0Tr4!gjHh>-@!$91(&*0()tdv}A)f%1;;blmG4Nv_*EzcqID8N7OUbfuogYfN-SXHt>|VILgXb)c<)mqXy4y>z`2hxXF~q?= zmg=!(qny{PqwLqR8sFou=r$(0c_(Y@NQeJoM3n1Cv6dsizEs}sJhYK<27B=epj$1u zb||+7wXctys25F}ZL&$A=3v_Gonm=KPdkZR_k#X@hkVm7aWBsQH^X^4NU3h zx@qh$qTGn02bsIQ*6+t3l)T2x-5)QT+*X+`^S9b4Kc35kgfuN6q>PG4w-ip*=>W-F z8D*mY65#L;7Lb^h!ow{Np}RRFX+ts1gyquWoZGA`Mz>p=%qg_QJm=OX!~PmT&bM)0 z){J;VzK*Jby@x!VcZeT^GGtqZ)0P7LH~g!#ZUEf@Ko}T4#q~zvq5xr+9OEQeFSgkR zm{7sU(>=1vyO)qJuC+mz=WI>O&OK{=XbgZS8prh=$jvngHPZnbExO=PYdJjajd-GOpR&;;~`P90Ds zdX-*R?fee255!3g4?%qynU^{qi}u&JO|oYAIhQVerV37tcBR1(eo4@*)E?3HsC7 zEC_v6p&bZ}Exa|X5o)y!->iB8=gXj0XT}7@!rMx__zG7pzvN0UlfAk4r!M`r5SJ7V z17yxWbOa)Ig%-X{d(;Bk`WDw(qwHfPUJN~4J&@H&;MKcvOJ`vb5gO;>^p9QHKWT)% zF`KoYhpsoUTpVGL3bpHn0n?lf>!EJt#?f1sA!CQ@iQdS>`WHaQWlyFS(a0EWB7Ryl zRSDw%L{QMl82S~uURsxvO#c;xI}I%MmW&^T&S$1&zMmmhO|!qrIoq&_nmjfSjrSumDjb0&O|R~+c<@)L09hM477s?KDdzqk0W-&{u9tUa}jt9a_rVjen?nwJAuSOMTd!aH@ezy?Mj>t>xdXgs~ke~ zswtX2+XXvV4~ZB*_iS2}Nry#7B|JhV1Yi-CEi0w4LU%c+$U*O{r4 z=L1IwpG_k2$&1V{IN&>9*$sT%ABPtz_;&}os&AbzvHh{b^M!V%^xFFUTZ3x3XKa|K z=&*xvVpF_k;=K}ZR zB866uT2QFZI93n2y0&mn9iUxm7+75&IS?vgt0NG18iYgbvwk3Jm^FJNJdx0B`fT2{{B${E(<|17Jv#GZUJ}6D3{KLP<(ST10&)&YLv|Q~y4$FthH&+=2T++O-%CQ^u(<`7EYD|Fyzw{{j4Kr#!rPrYw5X4h#zHsg42DH zWds^mM@V%CT#8p4zUI>>7#yC4d}>Dy2lqbBQN*E$lu!Ec#yXc;pa7jPqa`PV0YBH+Qvc|>7nEnHknkJDo0=_)>4}3ljJW)K zdU8a+3N^7y;3<$weqXfvi9LPugyHv5sMnrb{nBvT|aA~ zb$a4wX_52{2GDkX9yK3+G9Wmj5v_F*7rEjw!^%lK-A(+gR+ASr#Ib4e0(m#CYC7&( z3N9UxGFN9lGRO8VuqT2+N0>PEj7!(Bt!NMI;19>L^h0ub+IHl-2oRJ%S7U>&UW2y@ z`+Sa!w+k^q_%r^lS^7xwVx403WN(MaI)E$ZzCiR#FCEHky{M1>Du~W0kM=_gcQ3D~ z7NZq=108P1i32L&TM@Ao#OZGDc4rN-I^x}xESy+G;udT%IQenn9L`(mF19fvwE^N{ z!2I}+CwW!tM!Qz7yJ1$+E>=$3JUI5d$?{cU=BDE0%OoD-u*RaU;1_HGnGo4gK_?F> z#FibIJ0kAyt%Z;;a*^mdg<8O?r}}dVh}n6oS|_ziw&^j{yAlmHTC(U|FY8HMHz|8P z4g2fT)L`8hnp>3p9;bK|d>Vw!+2T3fEpgYy*xYE@aTe2Su;$oK6i=*&D3Z9kOQveN z0y&8Tf-3baz*o{vyk0aN!hs#=mL&OZ68jwxHQZyrBAi2F(){|^Z=a)w*#bWZP0y*< zsPmW!*=Hp{z}z`fPfGt)CmWcH-6qz82}>_)zi_PFl;w^~E6qm>1Bq7>gZcDvwbs1k zQBK``FBFFyGis0$^*KxYzH4z7o(qNOS1Z&iT8E_~l6B z4Ter`)qoYKyJqCFrPE!(RO}3<@k_COE{KwW9u68j1d;+rLOWP$S7C$Z3Pk)Ke8_w; zdQEZ-gL^0q7G{=303U%dH~clD=T0jxbKvHWf$SIlLZ$G>>1AVa~BzJmiLTHh3{R?1#xrTURS7oGPA+xtV^7-{9g--OP=LDe)Omj^J)b=T*=|LL?udSQ5Kp4 zO}nCnDlNhvLk)t~=Lnp+O9PKRy%bBdE~?zH7y9^9>F zsbK@I+OXi(p@OgM!5e_@D;V@%Lp--UhAumboF}Mi)C9z(*=%AL%s$tNs#HMSkj&R9 zkWG5Y9Q~5?TS$iZQEZrs#c{X7xk`&#QyLL3+=AiDl z08cRP^(mgj2X@ZCyb5v%xJs5N=6maK2;GMwTJLj9yvX>2&n>y4_7|673ZCWm4ckdP z(HXC)chC=N+=+$j;iUQW6_?$!NN#XdoVRvNtgVHM2n@y-l(B`$0E013=LE8%t?C>6 z?LMY&xYZZ_c}L|bM3q?w%PqyUNkV`%{4I{L_>i8?=$!(PU`t}p9m%XPgEhRwi z_bG(2o2&L71=i=X#j_E#+Qnwfz(ilVk65#7xUh1agS4Oh~6i4K4b@2;oV;E za|l}J@T|@7>~nOVKM$DCbLQ)Ao#!te`&#OEh`c@J$5_ zS?{+W+-`ZoGgXt?BYheI1C&i@=W&rL@VxVyL0+n#+=SLN%?&FHIdNJ;uE;k7_9 z7jf1uZ4c{nnD>dKuTg|Ms!?@s0gm9)I|I1`D~p_V56iQ>dNgNiB4Yd2%h#Y zZ@&YAH|Oi6Jo`;H+>H-u!drEFo}jHz@c@q_3o8sg8TjdraqnK0M)6oM;PrO)D@xaRs}XW z9S7CIA`W9eb38-`(>Z^PSDYYDsmW6x!+IFk#31jbXU;ay# zcl>H=fwa1uj@N{FMpshw|fkLPD9saIMMrNv;qdIlB-YwE_AaO+Yl z8{Fal%rYEm3%fb{c3m7u$?sv?=RO${s!MNIo@+9; zNpE5|$X1heb$n-xeEU`8IX(F`TcanMU}qh2x)&_4bIBIfoDO1D!>iy^Zsp-e7$)U} z+dCA|(ks`d5tI5FW(?H%A(rJ|&cKcP`QDoiX-T7qjd}+vCmI&*IkKl^M>C=Wf}8-mPctio{`GDD>6#EyK_%aLXwG@IVI75LtPVTvYHckmV|Ye0ef#mwyj>4x6P zWDHGqCdfFI;_}`YDPO{eopsfgD{(v-x^m;5!f=p%*CXzGwZW&)HXctEymC{VW3I{1 z?Uw9mNLo*N?EBCEIP;N5l6~07$Vx!`8Lhc*Q*%7qwb0{vW10%b@_inhAZsFLwoqvk zC+%_)R5=ly7Gg*WcEQXA`oY$klGDP(I(ayJx2vJS2wQghhMz-_PM(0Z+6QwBgby7r ztF+$yS4jaY11Fjhs^bNz2W*wn{Aab#P{^gXv|%z)%ueuh+M!vk({*nK0mkp}IecS3 z!s#=YW9l|=PsDo|Rdt^Gd=BeJAR;GSA@8GB*WF|gvxcbUT7~%XXPBFE@pa;Na2bp{ zy#5ZmP@SR7*-t)_ft`Wtx7IVZlyVR=m*y3cr93$2K1D&FAD+3w*6Eb|zaZ06Ow5kG zTxod5Sc2P(PJ1)(7_bj(*Nd7Y}LK(?EJ`^GWQivvE-l(;`zAiki^S@!!z>lbL|8-hS=l4na_mwB$+WkGiC}?P)X<;o~rxk1ss`PHnC>H2% z88JL-RjKl)4&E~9bZiWt!*To+aU$r-$S5xFX*A`7dj^16D%s56Nb8VtDmis?F(&`p zIj+BWV|%!$t%59dp6Tc49@1k}aTt$T<@K+>N4lhL`ddurec86-ce}>c%%79^^nftk z!P2N=b>p2NS4`}vt=LYLG|Y;@=qL?2ER)4m*2XsR@PLPQR~9E)6&ukSv6x@w^2~#F zTL9wv7;wh?alP?cDN4)!uJP5%NNyc&=eFn%P01E&QfI~>Z3A|+VzKifeUt2?@pzqI zHtbH-UW2%%=adN)t3^m+sdV4jh93of9w71gIBVwNL4ltu+EYwU%DW7{fI{c$rGk$+ zQ|1yr=aWd2l0VH)SPNw*Uo)68bJc|2Rwfw^B`ioHWm8mttwt5CO88 zFmTdDf_Nh@6>3j51G%x&TEfm_U(16V6HdudYr_6;YpI?4Sf!W25PIvLfx0PWDI5Yn zj(=CGtWQs+PO#A{Ph{9L#fD(k@7^$JYHL->TBwsjm_Hl}QOdU`KBF)?C|bQ%w!1ab z3_dWzF#vj?&^ILWHt><1_&7ypGYtsvUtnzpXLes>M{Pgt@|lH!IR&o%@qpQzY>w$Y zz8<^|9j91X$$Ae@lk5MQ-(+`--H=ZAUt25g45V4bydMR=C9a2-XlT{bcd*L1&k!fD zf7Bm?$Ai6p!lz)vDx?=HJA(IDLIl^#?`YoN_BW&(HIf9F9Qgx!_sksI9dz+vQ8;3 zhiNyz@N`luxbum9Kt%s57fx57n*&2GXwV_iz%VP3gV6U|`(l6`VDY~CEJ>1>; z9XF+c7l7o$2@OId_)Qy_2f6;rE=T5iON{j`K`_Aw5Zv_AlZ5hZXFeeJ~Zlf(&~ zyx$b`Bu&v1yv+)1PDMI0XGpvD374Shy`=8aSxSYWYlG@EYEk~$rHhvck%r%Y4xGw3 zjvEdrxM7eWOldJ@vb|7QIgjIWHb%sr5cBqj^sF>1)i}3R*(VIVBKmc1ujy14axLFK z?(>`v=X%dB1Ohm^snIvupAxR4B+uu?j~c}<-@#L|E`NXE9N=@J5@_P5Aoftk%}Wf= zvQnm{<8xai`Zt)!W4?AvrcsRRZd-@=C6!VX+RETl*oc3n6jk5~Lcu41b;RJSq zeJ+rF^XA$2q8jce*AG&OH3i8(YsM#bXwMeFJ4g}>33@P^TMjt)*S+!R!$GgA-SKgw zl-&igj?cy{ba@unYk?h|EFU`lEj0Aackd~MyJ2mb2-+ym>_d^_ZD8LToCT{#b;luZWH5hwBuZx-d2R>Wd;7`_pSOvVT&_Bea1j$$DP%l#wI2f66XUpN<-K!t? z-~*S}xHmlEgP*}@VJIp;GI~%pDi%kBR&xD=0}^7J6bWvxt}CZp*Yg4%gz?HO^TvJ* zLM>!&%N{!i{EQ#SO;?${AHG&S8m%KE$b!cVxo1rHWL=)OkuHOG&sUWa;wkO3K$TW-y*M}u&vK{_op=d8EXuqWWUMIL zDOC}Ugk}gFOYzyJTu5w_+NbNk=>0OUa^^$fpA^7H@7P?yNspGfV=sI1En>~FFMwbH#gWGFyjw4BVO{^niw>rdx>PMe=o_YGX{j>U z4ap~ej2CoAdLLh;l}g!A|0R8$E=-)bMkiiqLOoK`<{>RaQF`vw8&BiSHC`c9+)Ay`mL<|~%!tzZZVJ@)9_c;Q_6+Zw>h=({l7-g1gTz%N_5$l{<;ef5MyBEcz zq>}_T#qiz*1b&JuaSE?rE^P$Ya;YZ^X~sVy5^3h_Xv|)NOn{srbg4iF+S1`c;zb^lO=Hv^OXJ*bDG1t3X_`#9(yPG zPy)QrY0%L4>&)Nm&H?rOlzuG3Db=3nX7ah?D+MC=2ZAeQ=D#bYIMt>$-LX#p7oU|8 zEi}f{WIN2gp&kncSMIOrwgs6SoY^OT?dm1|thsmi2L(E%RbLCG}~x zqFrC+GVaiXaC!``Q|&YVz?LWTGy7s=l9O5NM3H{S8i=t?c|ae^uTtF8c)=>hYEX)# zj_Z^nX@~q=37^GIr0K)fMj)o_hU?_Z1LP-aQhCSg_(W5<*c4Q{2AO;Fh61}A5@nfq$e=xfqYk;?@ zRyhkAIIaA&{&Ly3;KwGczMe9E5slq**}U0zIFo2g2E5tbr_f~v%xBgraH;{*tl&6F z8AmE%7yJEz@GltDsOB?}Xia5Y7K93^WD&3%2WHZgHj9PCmKHhns2|SMYkA#H$E6BT zAx>4G&7{>O#L^$g?tc`B6uizddhod>AXaE&F=*pSWIACz!{A>v6C-AmhzPDe7kwJ{~94~^ipH;Zz<9^j{uCBKK7&X zB*-K0Y6h!GZEBjnFAUy}>S&0wLEKa^5T-!BGwfc05XJt%V{3dsPVo_D4}O2$`W=Ju z1{~HQyp;Ts(lpgVqBxisqFE~e>7+pPox36#Mbu~5_kjk#PSG_x50fdX<5yZNhcuzi z?JqqK&_N*L*}@HR0M9Lj!;laX!lM2`obe?**ZPdIrNb`8<9F3C+4Ga zPgvBoc=<#Un9OTcyj{<`*DoWs!3!EL;E@UTq`fHpJCEqo+y$}KrmXhVc_odY; zrk2}VBIfmger*5x!SJrL@j0?BKs~PsTKv`J{2p~JpyfT;-s;eiDe9#8UC-$5626Om z#YpautGR|Y4(NPun{L47JOnZowyKAMhp2CQ;>$-=fvE}Ri0-#R7_#5o0gW`z7dfo~ zlRaW5kv7%J{iXnyh)>9;ri!mJ1i~7gN?ySmn(;gPtL@Q+F@#tOh!DoUm0-SR`p|Lx z&IO9j7UpZ0U^+S@6bgM`?48V>vHq z1`++ZxjP$^m2vqq>F9Z^>m^);ptm8!RVzCbBI-Q@V8t#BnX(TvE<^AQoWa|J9Sx7c zovbb-(e0gwAeX5hC?GmJ%CNMke;@`X&6jRlXIE+Atntq&G{iEWto?jEb;4@r)O9*T z`OvWaWzs~_A6XCLL}QTJ2p6LAO6Y1;Rt&|kxF=j7)abM+QeAlTmfg;5@F9R`LivRN z>J&8{&ihyaSM8U*aRy+L^6uO+=~bJ!O$iD5&pf9+bzbDz;WEP$#LvtWI3 z)aa0lwCVY5Ui6vx(cy!$FL=UN90R__-|x3 zt?WD{(?y|ps~Gv;A3V;H*XwTpUokN&N`GyyZhp@UGByvw&>25$zEL1vS?=Yf(j2O? z_%gU}JV@gpb#^BJ^DKy6>UhN>M*54;*VISyd}px$K3xwAIV}Stex2X(^}ZMo zuI^htzV~1{;87m;^K+tqx9=cf1Bn3*#oYTQzha%;MlWDI8%{Xyg?Zt~NjF5)-l=N> z@t&dHs^fuGw7l}owh>5_<~@$XuH=u@B3^P^bVD*P*-dHldq@y#2ZzXeqWI|&trMS0 zK_hfX$_|F}<{B7htkYjgnK=xV5JouWIuF4US)&D=!}d2ZXFF}xyptnk9NgO})qfUb zRg0M?Qz*Y;DgCSGUFy%CL?k?I8wa*1#@m9m6j$x0;g|AlQ~n_j8$Q%pCoO`((a@%D z)!DW?px=-4ug0tB;z0h%HB}XE$cW5{h!dx-OxV)-9has7OHp#doKU6PcE`FcZh-t> zrFdZ53d_v#jDG3mFAFB;hla=%Gn(Tw3LcEc_@K7?f@$)S)Z8?c**~R}Z$N$N?bf15 zD&*NK0=QWv;F~+Ji`{Swrq3Q`EOGXLA9kzpCY|P^p4$T-hQR2z?Sz+O0*IvJ+He=) zBb80h3+aw-y%#Kpq_25dIk^1302fW{B}L_$TR1F!{O7HnjT=ADWUrHJponi{*Z7|5 z_qkThg7K@L&(YP}pnx?(rV;|v>u5*@7OZM`V1|zgwS~V_RwAsHZ=%^FV~Zy}7Xn*@ z?6#yx4pj2-TW==D7*#7il-@LIQQMba#^9nRhatVWR98u`dTHZFDW$>3`W-)I`Ls>? zDR^Y+33%j`STQDZF4QSwd7t&LXX5iuthsOWE><-NgJ%MtO^`ep$?3AzqM8>$MQVR^ z&}b;kV3h})+{l3!JdZcC3whFgMoZ`1@=dO9KEW4cJHzQaU^GFg>XeUoA8T{7y^eI? zpYspV0{6`<$r|=gAf}wNX+6!C<@zkV+n!{ZE(-g=6*)Xk{uPpu{U@L^ zK0Sk=K>f~KncF~wJg+z3Wtl}tfY}wn=3d?LYmMPa4^lR_*yhdcAYmfcp@$EjcC4q@ z#9Yni^*M{29uz=m=uRl`&*Re-Y{jxC&z*^fA`c^XS$5k(9yP)b!CdTqf@iO=Hz0FE z?6+mKCnRb18+o1Escdv?mT`-Z^lIRk0-$?!Ia(HIAA-33OHZDCG*OIL5q!EcmfB)%|q%|b}Ox{_4MaXip$!~cDlM}J@H`#h?K_2|+i)bTW_T_3%E>Q~PASQUqQ zbK6`%)eAQ*o1d%5kGCZ+D(CatTmYGV@umFY>!?M=elLAO*+n@)_U%^1C{O!kh4{jU z7lvjvwJWDYd^q-$76R|EYsJJJ7pN|*9hl(WzcUN9*x^^kOHr@nftF|Y(BMSD4UU_l zxC$q0uPEgbR1Y{mN)Ra3TGc4{<=M(K_nHT z0&uH%5i3=iOf70PGKUS(tiCP zm-$z@m*L9^y`;NjLTay80q%f(?Jb|tlcVQPZge*G&OH?%NBaEQz=>Ryd^dd1v|fNN zaGI?#lmqsV%`Eod#eUi)SU~1fVqbzMktNw3j`C7XqJ0{eFn}OIcN4KeviEDHi!e8) zc?e|XZ^_lQ*X@4~?cizDD*{W&QuU?3*^p^13nKj?)^uVdsK5-V9s)|YsxNXvZ0@j2 zz-!VCyBX)@@a0P+r>03j?9urNv$^oD_b45 z8zW2y@p!paJrTocd|9#rd?Pv!VaVCw5j*0kn<<=z$;NJzBD;QS=WHB)Pm0|ddXFJK zKspX?0bv~QI&5ase_XKx_IldKNWp+%#(MGY1B@#gIuWJdYj^X ze`*&|=@xQ^JS!Ybf`Pt-q-CLgOY#e?nEG_!_J#VN3+jfZ?4;O;3jxbxVnnw)Nc1On zf#y=w_Fw1#mF!yvUxQiG1?o$&R+<7NQkC*zOx+WM(^7Jfl<5Kzmf9la^yEdxFl6f(S?y?)ki!G{MnpH1B=rhu1m|vz{}YeT0;>%i-6BZX@y>Up(&5L- z;1wXY;7DdQ;}VOp{j=x0#3=!mE6f^`H1JD4>M0W-Z}gaEF$jh^3p>s8MWBYzL^zEw zjKs*;&*#IjC)!9k&@Q{7tKJ%~IhVVgy@lb;=WtB7cDidl-!kCeV2PW#P)2B#bPCfRy@tKAI-NrhzTL$4lE1$R{EHuR+>ED%dovJhDK)P{f)hM0CSeNk>v+M(q4acwsx=O_DwdHZScj^ zm^_S?*jZ4|MHo!RA$5^2#rd_ zQXuNSt^QWNeDqb)}bx$vWMtZ4Bt0m2a&s}n2Hc#GcD@e(W1EBxrx`t_HpskzlNDEF>m zV&4T;+*oMoXlVLygS%u!%b1Oq(kG{rUE1GPKU*j$&jpyVRb<*Q=QrcpTk~G?H_dYE zh$VZLUJOLD@5i}9U@jF)w0&vrCF{{Eu$)Z2+|QemHCnGNgW9%w+%s%IFTXZ0Yr8?8 z(}53Ed?kMVUSRl!8NL0iWA)@>%)%^Ct@Q)@5er($Eg^s;ry_UaMBPAvax@-^KYkMv zioNXOV9q7@>KjQ#8@{ROGUQ2Tm~mBp98>bwzIUW~s^Et+dP9{WcVuM$7R)F=)%-EP zWN8_hd+=88)|uAX^2`Z?WBj)uduIsAe*bOXaWP1_&s*;gVi4xxS(wCa)aSdO(%)SS zzZgfWf^>pm%Yy9Zt$Np(^h>m3B(!x1at-N&Zny(_l4`(2>>s#dBVypdW9830wNFNr>bjp)0M1`s25R=iij+Zx8T2r? zF=uBzBwGd#ePsRabG|!hbNvdH#keL1rc@d_>`=}72AW|sZb^t%0Z3d}UqYa0skRf( zGIXa_N~@U8)!T>l3bSfY!D}g?OU5=927yf6&NG_Q&8R z2^V9YtTU_d2@WA4uTp!nDS1DT4n}9*2$adcd8;RSPi4$>q@Rl(S69nBxW|?yH_Cc8 zb^Wl?iNTd1t|}BK|tSD_FPM@z-1ve`7GoFC|84na+y0EiA{Umwj=*hnZnqJ-Bu=dAG^3_pkZH>gnS zV0524>PJdVQQ3+)7eo`((G^lDQZ6C+doO)wG9zk2)U-|M7B#5W%#9KZh#D;iGgYzB z;Xllkev<(D49Mp^sxuPxrpM=w^4ZJTI5oZf-z5T)BSJ@m68k2-tqk3OS5nhlQc3_! zhX+6W{gA)TY-8Z~w*Wsx^!Oe}KPUD7>y&q4hAONar#}B`;X`NsN%@(-*f!g}A>PUp zE^=Xq(PBe(#Kx+o7kw-)TqN?vZVY@`o{Y5-w7ZCNBYWl$WtM1ek+BEH4@UQG5CH(O za0X=zR)Es`4sOcUDtkjH1*CXsZGzT+c=QbRa$BL7n)WL&w47**+y$#VR`jkjYOvnH zEmg`T%9_x>lLciCUQNO|P)!%%)2sa_O}Tc5v!J8y%~}^rH1I8%O&6p}BKeCyP%}2B zl|9x6!ZbMEa8`#%9L{c)>=j!b0H_Bkzt{VlzH{m-$+z-ZYX0*#DB{r+A1#-4_l52< zDXU~LxYc~^vo)LC9gt5jJ?|jFIJmEObs&m6oYncC=I)4%6I^86jd!_1m$}Wzp4meE zFceroV^8?PYs4J8y2vN1^QmOAK48BDQEfH)|wj5)?U4kgq?x&@ZJAOO5wEBMNS9y!^Br$OC_m{3vvMu zgoX9R2~=xwRtX~GD5W*nV$1{piU7){T;iRSF2+A{kU_5xy@ov$b)8(|?7xex3-?2U zn-#zuTxxc8F4${F`>2M-3ER8tI3A|;x-;QJHtzSmS0-z)1K#cVk1l>}(NATa>zmC< zS>3G7XD0%N!2|~6W04kMN`8LlM2x4O218$b=Rn^`nfbz@vatLjz#+DC?3ywgvbs=) zXJ0Rtwhylq?Y#*DrojVU-Spbfu_jkp-(oFVsAu++_)}%LW&5Bt!ZbuhU3%<1bt(71#4e_)U%vFHo4!Cc>+F`?AkE?I`~l? zp6I{Bo!`f*q|u3q3*CK}GXCI#$9k8k1K)c$qT-T{&pldhO|S|kGJUN@C?6oo6iE4G zUSlS8#5P@x1Lcy}ACpG{aEXNLE=(^Aa@AeC4eCT|)n#1g23(9YA%8L4X!FMgfbqh;n8G#OWsF{5L(a_VUjVP8O-G_7p8bL=`j z^tO;f@abzPc}t&=YLw3IAB8PWu11=|L%CrEj=nRY2;p0=1 zNL|}5*0^qrq%Im^kS}@z#)oU4`Gh}3z7LCx%7~3AlX*%5e)pyK#d^*L{x(vU6*_1= zNuQF#r*!*vju1(8TF`66DVN$Zcu7v_En}pl{ofLd3OIvzi4%eJ)Am}50f&wE_^7Kx zcWXn`8n$d%kBZDTE-W42Z8vm)(aV}|^~pMoWj^RNq=RIpYej;Co3OhO*M;8mC2~5raiSoK7Nxw>z_* z)Y-{VOQ}2^hU|7T)&85i7 zLZ}>q5)R1;tt)nRLlz+}e`=T#I6{Sk|0SqXHuNJQlqT=RQLsSpGt4cghUj)``hx{|W#o_Uh%J&4U(i5ytuYO(t`uLHSfbpLNAklK;% z=M$*=V?Rke>l>M$tzxt3$t0uFIyT}<#30n>I%8;xpV5dB#!2}am?V`c#ev~GEw+?>_<~Xspg`r(Lj5?R|1Zco*-X5kJ}Xv6 zf(MO6oY=eIok-b9?RVY&17NDFn8&2Y^|7Pkw`+^S>CbYZ@d*wxp|KRO-SQ-sQ~ski zEeA?}(C{py*Lb@e+CHr;dO3ns(AmTsKydK!l?&Wl{7NfH_gh?=cgteQD#?rMK&mf0 zx#|B0a5coN_h>*vX$7c@wYae_is# z(3&62Qax)4AHf=rsVg5l46vL_HGVGjV4X$j$Prh}5l&M~1(Uk>bt3P3Ac~#1{vI(ftR`KifXW7u|1c&KhMfj#jrowf)aXP4VXkIR9&pQZjV=%7> z$Qoa@SaY2$090b)(!n+Sc(fWtG1uGF z(OCCk%)?`aEZp7>h5KtVS74;*^7yy{LncR7sG2l!O7~;O1ykf3RLDY)%|rq9MTKJL z;bM>L)nHoH84Bnej~Gy}e;zJC?6@@qNu+!|;);Q)`|T=+R$s)!aYlb2P<(G59!6){ zAk18b%(&M4Lr&H?-~?;O8DbhxzCF5F<*SHOq~Louwcp}>-+vgU@N4Xg=l2<3If`|d z$*-r|>HEJGue5lrMs)}%%%;*L8crWr!dx=5(2ac*HG46Rpf)E@^vJSpx<6c^bOkK< z*hbNMZco^YHO6QZSO?e5A+Blge>4+q$MSrv%@14uPOG2r z(lym?_^$ZjW#43+lhEo$?6COGV_W-%%55=^RbD^yt?riX^C^SJa)GakO0gB9(M;fEQPJ71N-(B9L88tx^bB*2FG+TcOi zSW`z0Z}DDG4&DFwvoNdiE-Bc-{2|;*$hT*j*&Swc7~75n*KqFW!iW~d#Ie}`Y1Z>g zc)R^Tmq$P!PzSqrlXidg(`^BTlOA%f-PT&(9CmE)Sv`1s?VS_)65)N^fk>HHquxE3 z)gkRJjM$JyBu$y4~E9X<^_*@;!Y|0tM;doh?eo=>|%}F=7=BMkJ=WIP)u<1yNH@8Ujg(& zYAw!(*sq?2s(L(LeF6P&K8eN%C9}lR^gI|&BGp=q2S@F8Ul|sc5VJiKcYwy8GcGA^<$_;II(A$3=XERq}! zJI9RZ;{}HOQXHTxb|=)JOdF+s|M9X#5ejVXTI76#LV^{NqSaX7yXQXiv?)68p&PNxuc!g4u0dHzUi@xpbI?p1CtIuqTKons?0UT#V#?o z;~IGT+xmnq+f;`DF187RH89PvJJJb)Q8hMQfwPf%r#e~NL1h8@ADh{Ag57>UudpT~ zK4nH7#>4{ul7C^k>@?Y(l6g+gRW^Du4kfO)rDuf#oPQwbEuG*)lNh{Fz1#BvsUtx; zkxF)xT;hai%6W&;i`Vhqc0EScOhkptds=KlB+8F$)#1R_lS8kDm!|lyiB&E*e?M#;_k}5J(5!5*%Gn zoWGc>=2hF9cDhx#O@8bDb_;W~St%Bz)}49>ZC4lc44Y_V^S%QnU?yy(MEah@mZ{n) zRtJLxbyl&RC;l4#z51tOzdr{Xzp{>l75UtaU(eTXbqMC~O|H3wowiAfmzMzw9SxcM zSxKkdU2*Y#57?BNg>fQ8;zjnGcZ!)-rzJwvWy;Z$hW4p_d~!7#DVB<~#p`3@M)g8OmjxMmT<)RpV@ z)o1FoIzWOEBsWC2Y_(+}SMlp&6-89bTiKcjH?X0I`Qj3uPms%1XYVJ&oNK8<;AO9Z zKirq{s><^4;%P7TDIUC_fgI?ptU6_8Pj5$3XZ5krFpcoy?s==M+*wkq<);+`{~e6i zE4%!@N#Kads!RK4Os#c#KkWR&%c4>Deb~B;jb|eZ4c7Gk<{!^zH8x=Nh~_0@Ke^R> z{SUWW+*okMy>PaO8dR?a7_ zC(Pu`K=5kdl6?x%lIh%gLi?HtYxZFag87O$Lw|H(m&*xrF7;K*-`Wy_dceh0a3G;l0mV(Vx?&UW)1w#jkADlG;1MA!#)6- z1C_7qH5}wv-V7o=X@5Dy!P*8)Io%u}ibP;)wAjJN?X6da04R%Ujw9N#@l)0aL4S}j zC(j?H#sYUrYKt*1dN1MEuK50Rp~{NZA$23B!tSlc$rVM*D7a(g!;ymDuM*|Hp<9s1 zImFydmcuJ3XH)J$QuqAT|80HRx7d`daZ%RnoHcb}7Kq(q;NJe#&% zxvLXa@ij{}`RDfdS#{CrFsL$H-gUwiTqgx?L&MOeV3l?MCedc6C$Bc&a6TV$?);A2 z39>>Xm6{R$(LzOld^6C|sCS7UeX8LUxohERrb})X`bI2eX!TQ#GyiD7J85l0q^b@< z5IN!ViOR8D0|XgEE4~`SoB5?GmSYfB*^HPm%TbP$*Pb^lK>2%Y3ahK~neuNF>N(|G zzO6noBJ-mocoOmiOjAn6@SMLL;3;xa)MZfVB~|})J1`hc#5mNei43%L{Z@4s@_jR- z>|*p^@Bs3&Z|ah_XdUz#CM+RxicaEt3?_`Oc=YsSgwZSh8plzV)3FgRB)!jZeTeu$3P#LQ)&bJf40%%U3u=bG zUx~hDe)rK^>H)r`AAfp%2@GvD*YmmK`L2Vg()y643uFvxeuu5xX$Un6n;odE7n&aL zyP?mvG!n7}al_|YrLTfihGQbsb1=><3G z1_-r8g{AD(K_|KX*_JSR``~9~PDb3YqrbA@Ic1IT7v1w?+s2QOuYv{S8&Y!*J_}#| z*g9V*RF-nP2YME5bZ>dLy$xR-ocBdzLT_RF&FtFziymO6Z}~h9)9py(ZbWf@I;SXu zdYpWiaJ@|9gzsY7Ia#p78D~iMlfCny_>9-dC1M z?U&+|Pl7l_M`yZ;>Ah|K6+4S%Fql=vAlE@s)m-HzVoc~IV_=QoY}$wqLi8uyz2=l0 zpmVQa9X}^~8Sc@$$n1$)-AR0X_F=QS;{TQ;B|V>DKRp$e7`E5H`PPlp+GXFFPxG1Y z7k{@G*`qLYB3EWEve~?gRpI*n$j7Mu%=-^N_n65P@Q~BK#zH^bZ3@t^yHM{2tJLM+ zAMR)jsM*_-ZC3oHP>pS3CmjVz2VfA=f@*W41>cUwPxz>peRVtA;5_JY1^e38i~f`9 z=Y~$rFjqyiN$$HB;En7wb#>TXv>zcu245;rDMoTkeExIA*LZ@O&VMfTTTB7}og|K{ z*G8()^E+k5jS=72W1l=#SSrTUWSkj`g$jOmbT6l~?Ms%3NR}*FJ_S>1AalDsnS&2V z*qypqaud8bAOCNKKX;FvRu!#?_~xbw7Ho0F@1I!$OJQ7oZtY3z&M8&#*4x89r~H{& z_O1nd=O1GVJR@n*$6z_FPP*^5q6G8TI{$w7<^knS3YEEp8}sGfhpkpTsd!6s@nGb+ zK~mN#Qkw=ZuLj#W0K*VX>M^Xj?Zmb#eU@2%EE>N?^V~}H&&Q+Hw<(upsbNmCN8J_X zgkTKefCs1SqRpNW43h-wU*37$U>-KB7Gu7zR{0B?a^VPM%I%q!a%A0bwd)vm-PSyG z|L=23&7LAu>nSbBG32zxraD^qd2iC~7f9P_X1;~xA@Jge$Lg-UV!D_Lrg)5EA03Wq zw{TfeOmo@B_{eYTIN_4Jj{|ITHvwIrm4LHz(h;nK97RZ6_Q16@k@nW;f#90a|PQ8xBo2RT)Y z?WwB!%UM%5d9;x!g0b>VD&No^>mm>j_u2iQr;x7by=Q+Q>t!o2_M3wc1=b+ac7MSz zhs&eom|mY?mgN}mFTb7|@4ymjL6Ws)^^*b}A)$#VlZPIpO6t6EluHNlg0In2X1E0M zmGu(mko3Bm4CL@<=KKRQi4q9d?d4jGneq7*CRP&4EZw?>(Rr_L6wd#A$N${r=lbD~ z!S@UUk|!uNj@I2PZq-|T#y_d(~=g8kNJHcTB8OfOKN0?PF`1Q0;|`;LVJZ&Fg4Exr zz3^wm0*Kvq1h+p#D(N&xHTK412#(H$x}hDvYrr?p!iT8> z#Alw<1f8dzBlKvR`I_~rv(5b>WnRyxHay3E58US9Q?Mbm2K-k1;BB)eQJ-^SlI@+W zGsdrfO@B$xrF8G8t0l81{Eh+F2i}mkX+5V;%_!a@H`EGt+qcPAaO1{K#`*}eHGWR- zsoL3BRg+N$hR4{+H^aD(5=qwRc=;w5Ija2P8FF*Sh!)}xM9^q4SqOyN$ovg7$q?() zbw3$%8o~9f>sElt=^&EGcgCxk9I!~MVv6S#^pw?(>kXu3?U`cK+nU?vT>1z>tgd)O zrYa2~QAd5Ny5*;)kIZy%7QaIcY5K4(JzLMf0WoFddX!YpoYwtBhSM66~ z{utm9| zX>s3~=6~BqRC8ta=d#1h5w!m2=RPkRRQ{y#W@PjPEr(L8FNb6!=V)q>qW;*7*z4ju zfL_%;hf0y?sq;hcXp;}EL5v&E??RYdunD7clhyvk(f{2V=s3P|*Vs5AR#)!oGE-KM zbW774ef!qVXphep-+@o?bBbyVE0z&RoG{F&5URd!txs10i}!*}eKp}X|4MSm$i1fW z%-i$2B5i9?#!Krf>UiUqQw36B^9VNp4p&x@llQXMSSkl+N>1vnYE5sR?2VN42HVN9 zRQm}4;kZ?A=Z75C@4h3xVMyYzQs3)-fBz5&wwK{^T1CO~1u`pdmVw%wX1aviw8g}Y z?Ej+?{_I}haDBGk(Rb6|xIV_Fo5A)&qGs%iLTX3emu+;xJ{Eqs9g^Se1UO4PI&q0< zp>1Pw5{k#q=4;f@C=kBlyT_VSozz%KHIfVX_KK2VUBG7kEQPp zr}F>**SjLbAz9%VW$)~9WM&+WkiA0T*n5RLp<{%GY?%jTZ<*OE>l_N%`;c)sX5n}H ze1HGAE-wGvuj@6Q&&PU>Nu=-m7o{NKz3T&_RX7k(VClW@s1;kPqJw<9C^6WySmEoq z^G4XzR6i{kBx{WihOGPN<;_ZKB4pul!XZE_=$Wbr&;SzSXE9m`h(W6l6IR7hC~gMU z+<0O$Fo1Jz%dqC=vHW+-o>!3GTpC0#-J@;fOGE^J%g?#!I?HI8_byX}d}M!H54HS? z4sHH#{D6)U(vSOY`Kqh|Tc4fVO05*aLP?{9u{PCn@mqc) zm-@k?vE|(A;zw%M7E|;riUi?@$B1gb-c(2b3=n})1nsmTcKKwxS)kG1VN(X`7c@y? zj(Uwb?>r^EV@@zJIs5jcTKo)CWtyf3$ZlRy6J5z*R-GWYAw&X?-*p81x|D{^juX`8J(0=f~XpJZhC|nO$QULt@GpWLv z89$D8K2c6kByAA_uaA@{drvSCqli6{3(!_gH?^VqA7w*){~mP+w(Q61WM>2OoiT~> zvKv(A2R~X21kfXj24<5i^!!>Mm*1ClynMom&WiU*s!}lvMEXB3{xQ4vLvLCd3bLB5 z;$UYJ2_~k1mVX=EUlBkcE>Wlu9IJDRktjgT?*<3mGA24v6MT$}(q@uzQD*Ld-v{;BKv0A~$Kes)D zJ6%w5$N@2P*FKz_o*qrHdxs4N<2Zn)2{Jxm2L*(_*|P0Uz{T*BS)G5GF{%`@4{*oi zYRgz<{nOir=1!2|Pk(uFr)=L(kIFP0TMG3TK8BBZhe@W_3bj4spAw;yEFSW;*D5U zDMyg$l-v4IYh1(|>E4DVF@Zb&NL6~R0!2cv=x}@7M!O0jI`t*@->YySkXF$;pb?Z6 z0KlXvC7g*#P)0KoB?VMcz_M=f8d_&UA7JcE*GtFn37k`t1&nIJ|12#YI>DMjv%z26 zAO`s$9?)orQ@QRB3Bx4cLAR|DN2%hN{MrvyFqj}sc}E@4(m~1AS}P7~ZW0_#a2RIW z%p+1jqqMEdcxDq4hX;Qz3HIY&>H$|9qt|9h$0;R1kdmgHjDkka=CJ(zqyxXLw{OUs zge{|aVaB-bWqs4;;l-Jr;62JU_nA(Cc*&rg-)e+2{z8LmyjmN0W#wv98?v#;lxwQ7 zri%;gXD2^eK8}JuJPrxDD39u0D{pltuAf2SI))wcj}=%s1nf4VimTBlL@}|2@SJ_ukGfw&Jb7U^Y~n{kyvjbfaab z5uVf^2W~vSX#8(I30MmkRjB6!9c*s2W1A-IJ0WfNn$9vGi%aDiU(Z#4v6J~qIqeT< z@{t#?tbUF=8vSWgVVd@v#SYB7(nf~L&gej@R|j7vbwnp!EFPrYUt4p&j<##{kp<87 zPfqBP(6*2d+*v{g5{;qXxauO?sL*W-SIXbk-~XANa!#@2?R-aeq-VwT{&ZJP`U_vo+QppI zH)i?a_m2V4$WVN3?9tE+Q#S~UgLasppdxsZtslv}>{}KLrfKn+zqSxB*lo~v5JsVx z+}XW?Z2^gRl4JBdLmT|BP+R-5$_D%;Rt20lvQ7CC?~%OF-5G@K^g4bQjH@d^fx${% zJ8=3eDj00srg`b0fERQJ9osQLv?0^3?VNyWdEdBR(1duAh@k_O>8uZ9Pjw>n7mpH! zO+vDh1E}%7ba76ZBnCgTHb69PwwpV@Dqx*Gwdue0u28b?roZCI6zUTrp`8!JpZ?a_ zl(-B*wd|&jFD67cb+1+`hdcU~RGc)pEn39uE4RTdKb^DjZ?N6JX91RbO|kA&5kM}v zD*b%P(%;D9NaitnceJ7pes<>fc4gpp~dRW0lr^5Ps$!s=RBz_R_*Sed5p|c8L_ODlZsh z9CkWW^DdSlGCLrO?#krA_oV73 zOF{&d>jOf(k+KR;qoTMgusk;)5nM}E*LIA%G1hCpcFv=T>vEHxchDpV;Ovnsd!x0O zO;z$qmX;Ua?Rc2c-B>V~R?tvTkNq_HpySpzcF9@Hr0IJ2wUT9 zl1$C-j`ZX=`tNz4uB4hl9FMYdo9{VT5RF6XCA67uft3wM@L47kNx%|kO7Jy>j{V&x ziuI(m@Rdi8@=q+jAvCu5`qn>x;ny*z2Os;)h|l$s<%k%7ng50=$#H84sViBc$Z(EB zq`ztMGUb-n%zzQO`?Dy?oDJCELnE(+xwoNSi#$=_5TW~vBz6fe?>$KxGbKI(M zXD3|#<`)dOx(!N&Vc4gFGEL#7DEA)TOai+8XFTc%P2v-j(p+@-JN!CUrLowsPWwK( zJdY0|2Pi&}3F&p%m%DlO;V}i5YHHZl45KYURook2`GMIaQd7EM2zMs~`Y!cxP4s2+#h` zBV_se4+ZSd5q-qg(`Jb)A#X2_UF)hE1)0t)j9tTWr5^UP(w{7{FUUGR1(H~8`d1l} zfz6DAKaMGnsBCE8$L#k=@?SNG3IBg9sNeg`!R3gvWT;fezUAce7H&_^Zzot zhYAK`X3jVzV9$p@@j+ZtT|6osTDE}gtUb{)y9H8oQeXU&fg~Yl!IfaQu?5F&F&;BZ zC4A8r^Qhs3u;*Vl(COSmlh|WUWHsi)Ug*Eir%izteM?eUn~^c6HRmb{nj+4RsL-*( zYD&oag*k!!+jSLdoc>iwkudv7O^yUz-TXe1e&prbLF`rYc=^8q5OVUr9i#4QWL;OMZ8F$bsMLZh=;93Cot8^-q z$>!h=Z7T83e_+Ds?O;f8QQV;t^iWk!J5eq04hkPyCrV3Ut`|chV%%4Pi!%_0mdf7_5W7Ad@8h)LEZQlLwq6CKA#uw#tAzLMOiPaj6NGt&NTS|i+W10Mmkgm9n9DpMsVhWgo9FzdCerbs z;h3guw6h<%hIlDhu>1I`!&Eb)tsjCfd(=nTM;Q#RpzAW2>)Y@7J=O|mxs z#*wy|zB=mY3Ef4J_qR9I|3yHp1HKg&mvBLDc+B!unujF+{5Y^wOR{dhbS1Sqd9Zu{ zFk}@Yilu?;fIz&)yXC_TWfdiH=X(BRqpr#hs$AApc;thesgk{6hFpKh2w8ZPkR|1t z4J;|REG;KXor93U8M&EyxzIaRaz)Rhc~}T&ngWm_dhRbD?x+45BbJdwY&|UwZ(^7m zRVxDV{+wW3^o!dglPnpS!$Oq5zi*J^E)*L2I24E|s8P6~n5e+Hq5~*H(RP^Gn8OLlZ4V;VamoN<#7aMy6ID?h6;?rF%|x%J{rt(JMQ*}L$Kd(({>|cv zCcfvCxlO#?DL>mdUJ9t zjn)<9wPZ|{Ea=s64!Whai=sDo%J|Yk-5F4?&j3lHLK+6YTt{pvCvb!7k_HWU7CVD8 z) zw%}e48z>45BST&m8-KfEL18# z!M{ytm$ z7(D`J%8H{Sg)=t!x=SYbVpnCvZ z5>TP+&xmG!t8OOSc*V#)3pz=Zw2^O~T-tHc`=P?D7%`iasfWORJ#k3Ppi4aRH*W^k z(Eg4xaYOK$#VYnjY%uK@i-&0ik$K9GwG$BwU&fAEWPRMNxIn*@lRK0&{n?>Cx*Pb& zWE61(I{eNPL_75YDN(sGeHPWT8FRF`|vw7J^ln>a{ zy_X7xY9fS^!3?j$-`fG|;#|1^C_)g=oz)Zo**?J`vV^^5=5G2K6@n7DM{1SN{u*h7 zgM5mD&==4L;osR0$}G%`1#haOmXeGzyFqCwnEZ5Al*+Ebw{Yxo*Pcay>X&rr;}F~m z7#JR60>5$(r+`fTp-xNS9?3sE+DS8F;x73@b@2_-~6-TXg@GnPOiH+C+|Vboi*Qr{Dg(nM0S5bZ6LS=b z&rampEs1I^UsI*;S#A zMjW1IqSLARu*muux$wvdxo`r72&ghRp9tSOxv}^7@Gq{+i&(l|oYg1pyl~KdiX#h9OFK5~`Nef+l%)5`eOQlK_-T&CM zC@T;G#bR=uqK(YTAf+`k#b=jl4!CMhu<{H-{7eCr`>n#W7S45G;mOSdlaztoO%$pD z1v4NdJ7zSf7HTCc3d`q9c*c-mF#QIv1qM&GKtN*A@oY=rZSO2Hgji1+8hU`qo5}p? zl{SO>&Swh*+7HH43l_z?XYts6Xen?T=@xu2?E)=pY@YTYKIE6y4yHy$kAN^5QDvG( zNcz&zP)=c_KX<}KT}ICmo}xYM)d9Bj2T42NXUQBtqT)b88Jrw!g(OtB72io5&2!dp zw90(iBQsv9JmuDV)Ou-4zEd_wL*w6Y?n*g$Cl`R&!}*;K|0as$9{2zFErmetz(Ij% zDHPKvsf-&K#xQ^y%g^n`W-A1b_jxr9@FtrfTuwGY<@D!+!ryaFU|PWS)|%3No>d=_ zheI78;SUV*p1a;&eviXbz>&9>k^X7%|Gfh(_($o<(6t@$NZ1`O+2)w2%S1f{;m`_JCU1I2i z%cxJ-u-VQub3xmn4LRuRt8oG^ishRx^mBcR7|RpE7>K{>9RW`^sLg00Ph@?F@qp=j zTpqQI&J>P5+y>GVvmxZlXjE*ITQ8&FFm_K;)zYnLRK$~mlBU<7iI~Y^#GapH+L%qK;nP|+f@^|0&9~do zIx(2GTkUrORT_RpkjU(gF<8`rn>!?%wI}vZ-9OWeyY%$e2yU@$d>4Btn9OV@*B7gDURqH>kM!lbX`iusv8|u7p`oBbkkzBURI5j&hO^UEHVS>GB9iL@>1;mr=)(+ z=lB`g*i=(+2>{zur;R=!;~&JsoY19K3MTCgAmm3eV7Dj`ZSaXid>N^w^5Z)AnCmdf z#3lNPLZCg%US?TJ0zBuOm*0&<-l~5=CSoC>T}|YBs_^2dXHVS!yot^(QbHV9VZYs9 z_&oUE)V|G|Xza6;J`>nARCLdAUyIFBcBSmm&XFzv@j208+TsqKeOamhl5IhtgGspl zA!`kF)8YZWVoYZ-lN#yvKMFb4h#tKq?Am z^TnoA1G57>BHq>;r0}++l|{aZYaVl6$Z%bM^1<2Xjgdz9;ARKs}X@$o~YMhH(F0 zW5CR|6|{bO%M%Ercb7`d>}+<^-eBTtZSWrUVv68ppza6R@?ZJ{UrNJJ9q{m2_JKJs z;KX>FVtL9=K8R^U7Yl@`M=n}onKn_O<%HpFB5gt2eQakkHo3A%ux3tQKWP2C+n^;+ zVc>h*byhpIf=a_KMZf7Xj@L@tCbIF z&jr}Kg(fhWHq_sO@H5c=@3hII3;6X^66WC{y0!3Opf1>o=z`dHiuO*By{VMbgPL^6 z>r3t6P#WTGzF(x_LgJbr-8hNSS~9UA8v7fhb3tE3iDAptB?duC$AD8XKnytgvEMS9 zcp*8>LLzphq5r6C2yY*=Ia{(B>h2UrbAL)4o*;OfR^@=n*42rUW+43tgFWcIKO1el zn@iV^%alL|cGqMRcK5@{v<^g|da?}<+*ZX+u-szczUh>E6(B;V!@5u!Gf0PpJwUrZ z1y_X+u|s$iAve3kw*>GDDNvNS4On3hK|8|q)8NDsA!EzY?1IMyRZ@@;$UUyAz$M3K z7dfg%vu0p{hA1JY_G0)dq#ww$K2R7jb?A2)T=$sW=t&w$ z{}jsy&Eo$>s-*0m`C-)mX0p*qCCI;4KJDWaA0`7>RK&MS{{cUOGlvF``)2;$n`XHT z_v;O71r6R;;4EnBhRM@)I=jQ<5uoqkNKOmF%R7ro^xIk#)P|Th7a0y9b-+-x<-}ID zM-|yM3~af}o{6kIdG_*?it>1MzO}IbMaLk$3cqwG&MW$WS;x&IHV66^2o*nB4|=xN z80mX=fkV1JCkqXqmI9_KD}(EstKe_GrrsC9bNlV6Xqa2dE&n?&2W>be$L)CXr9_}n z0hiASbX_|u=lAztYZpjS)e-YLyz+)0C{1%%nC%57O^n2kjD8{z8%xQK9cM{o@q@8! zNG0X@qtm`hWo3fYzn78!7?Rp*Z0#dORn3!uvOpT8X&I{W`Y|Dl|ey`j|$ z-UaM}xjuVKIq{$czO|IeEXYX)=CVYf;st{_&OnO3w*ZB~XCvf+Ad}v8J5o@TrgJ>H`#!?*-sht}=mw0|4+09WPB?<12CGtTN*R7Oho2CDrOE7U^ zI>;$#xCuFBZYdwN?fz^vS_^)DHx+)M!S|>r^pWKovCO@?V*{e$FQ*H(qO4tI7gJBg z8$ZV>s<8M>O(s}s&H!8rzf8G-yQUja5v?lQAx+>IEw$wq<*x`Yma%cAw8uX9We@iH zc&Xg2!qa521HZw2FzkY*T22v8Zhe*#CCqXgzGV+;c8IR3!0uzTuZgS%(yI1u26XtK z5XJuwXHyN93Y%Tn#0zo#v+6WVr3w*fy?sal;%p&)p_8Vq!a6p9ymQdMh7-GUM!8pg z1*k$hhVl}T2?we$(7MrjuQR}nRMh18z^eF*!g|3@C~a}nu6TdZx{_WSiz!8C*N{z$ z<9*f|8LMFPmReP;n{4rkmE3%1&%r;NC4B}ijLz@R4^Q+&^4X$cr;C--zb0~X8aY8| z`}q-@Jo~59mo;{PbOL3^)ST|32V#VTUUfbE!^jh3mSnNlbcPwkc5aEB)@r zQIkxcj|~x#(M`nxI^wP+f7~q{WsPoaYeqhRC?Ao0TErE>thrsk6x4sS9wR z0&mut%!`^2SYIP>kikMpsB@sh%tx%qV;^)Nk<+ps=nl)Mr7N~sD&bV=5}`Jo75h@} zV4DRn@**l6Xfmx?q!i6CU{Bd3vP9Z4dlZX%o-Nwa8~m`I#35mXdD!Fi=+UEP50Q$j zhk%Wv!bVKCO7Q1fS3|8<+~w7S5#=<*mK!X2chZhpXE_D5WH2?`fC9TU(hJq8{&}xQoTQnzFgchJe zW>cZW!cN!Fn(+Df#MW=)m@kJaAHb5UO-Q(o*^^idc0%+X)Ubq}9N0|~>CL#>n4SH1 z*+^&cwZ&q_m0ArPwW?NtK3 zuccuN{44SYCYD6Q&lJ)_ABeJMj9k4+pI1*u(nfR`7c~yP4a3q zKF(%M7lNXgA-v-&NL^kG2In9ww-=)B_T<4l5y%-=#^{$z>R(bw9C6F%BAqGB*p0SUwrPHL@ZlX+Uhdq~mp*$K#9z~@&oWm))5tI5m{pV zG1Ymb!2DFJWeCu8Ujw-*aBfvpU4sD~gyNZw(cODx6jLmsS_gL^PD#XCZFf?jYhrNg zM(P7JlUp&TG)&uKTuT>n2?{;3;`Gc=_<(dUp4QKNLt9XP+NIV*E5WNtkUMIYuJIOC zF5#4+hhGOW)~uQd&FxF9!fuyx{0E}<7b18yy{;Pou|!1Cwmrvfn$q1ddKNC(@E`>y zF6CvCjHN1xpatXfb9yn88#1%*CkJ0I&CxSvY`%J%i=0m4NAx}t1b^XBJaY|m1m zEW4kd4&Rs!nPh~cPCO(}*H3~)R@}8Cyp5$f2>Q&q{9jHci85%j47MWJNiFSj!ngC< zH}gXP5$aOvq2C{i!pE)6WJ2$%6V@LdC?q6aROy1n*DgI7Ja$+=+o!|{=W_YZXsCkV zs(~B$%IS$0@haj}fH7+YBBfw11qG;5i}C#e)B^lcP#ae@aNo~3mWQHA@L!6wUfS$` zCwS5yggxW#PBrY$WCchkc;%=a==;7$+5)s=BZx;QdUY|kve({26twRa3q1ozm^xF^ zjAi#QOMG6s_qaqd+iF^Dwkn9v0`W&;k}=^xHOMZ!x_eaU_Cnet%%mM*#Xq&d;HLk~>MPS6%^6w`h4$8eZDPl-6EA||DhSl<)9b%ZT1};EE&r68=!8)52nKUW#CEE3TNQ(DhBKghvuL}L$if%@CfZ={>C){(Mkr@?&hb9>;K9!|W2r zHk;_~bcna$mk!9LNBGb~IpJsBUB5Sa7+V;yy|E=K#35{dnMQ z=SegiyEc8ECWi5IF+c|0kkIfADgjLysyX)G> ztKlq*22@P2!RMop<Y7BR@^Dv^uCHbe`Tk>=>A`R=(D0+N|lr=%)tsI}~KW)~CKtMXi55 z&ECth3tqF-9BG#7UibS+DoU=S6z}7UQTzKB&Od)BT>9Wj2Ni8U)ZQG70{cAVHk?Eq z1p-n-7*VY(EFCBnsVM;A+e3m!5Lm7C;c{l3a4c3__;G@VZL23Jt9W@U`>JWLzo#{L zp&trXL6GG!x4~=c>m;AoopE9yY3yfSG`f6)zfjG|Y@TMlNpQURsX3z1h}!>lKhm!U zO$15>-Y-lD^4V6!1qyp4OqVr|icqgbi)d#&Kt=OA{8wyU?;=?tTcP1r0wD{XJnupZ z<*$>aZRot7TH>p%zZJsfQ^G9h93*^pB(Z1)Fx}s7Szk(kzre4&c_v2W0Jl5MXsdkv zk7B91!Cmc`Br~8a1JZN8UT=3pwr)e`LJYT_fPO%jAD6XZAwBO+iBM>;Fbku^R0onE zsm8jKYfkDq2CqT`zktdZW-|EhAP-A(0FNw)@dMO_H7QUlt5vwM{#hyr=y**K0FM{+ z1t{IsUAxQxw;)HzHE9`F;ksK|Six78UEOq|u;*SuZR7{%f@rv)PA0sqYc|Q?=~#`z ztG?Z6Z<(RpiI_D`YlMN{*}YKu@78L~L)K~_$wxQdlTB;{bg3zHv=q>dkGxlpo04x^ zy^e}z8WX9UXX0u+09C=pIXi5CmL(;P!+}k%D<<6@6}=RF=V@}eTZ2pQEib4aZr6GBF5XuSG6+o(WnX z3yaXYj`dEwe*d#X0mbM?Kcjzjl_vc=Jj(rf){e8ew)q+pnX%>%`6hfG)l}TA1EEhP z)%>*bOK;-g$?tTs5Y#+bU?*^YMXbsASR zBt+FUzM6w8uc$u{pqrAP>wB(Pii&O#(H57iwUZDJovbqOk0D1zQ(>yx6F51GZSrp= zAYDF}@38-x-WHS`$evCqpkK+;vn%br8}LWQkoi>Zty>b;0sqDB`ULSo#_1b29tS!! z4P=PowtJ$-8?XFY3on(~`l@qZrb$xw^V5ajaD~fW-Kog?fM3SQb{UNolLdDPdydU+ zdXiB`bQ4i-{ooG}-NWgcYhBh41qA0vUX}L^m=6tbrhIWr`SJRiMhRHPcn5(B3|$P2 zVpVwGr#BR<;-#k?eFbzM?X8U^blh#Vbp4z!#T(@3)7Qa z=M{7ydYW!ET+hRE{u&L+a$hj)TCc`Um$L39cX?Ju@(c~adEfSuL~){py+jj$>n7_M z_Tc(eZNK_RgP^BuZ@K-=AKM=2Yak9d4BTn)TN2>aqhB25@>XL4d&w`^`%O;p&Uoo< z8tze%_jP@Tyh0C)es#QqR!x_E?0iu+1%HESw0XdQWkezn-{wyMUJcSZ~zcuX4AZ;Mnw*IKi&2-@+Th4Q$g1b!lFYo))1#cw< zlBN&hS-&m0n`36bbC8Dgx3Xwl;fvHQI`(tDV9w1AG7wjLg(0;zdn(9sXH$SSk*g_u z9z%wJ^zXbH#;8WCXW|xtuZ5_gJ;JE(lHjJL-8G9s*D?ui>vV%4FW{ml`n1Og;VvsV z|CUE59(8NEnjM1%`o~s$g`Z)fFP5d6G49Nt_ABN6{rvw-1Z*n-;nHt zyWASK`U7JfuK2jLaJyf2;b1>?t8{M{B8k7qrX7)33m>_j@9A!DqAGk+W0{e$UhYd%9mVLlqMKsrWAFtZ^bz{oMEPZ;W@ z1=#?%)3sNzX0}(HI;EIYSGx1?pt^^a?vRuKPn=f}O)kMP-$&%_u}15JN~^G70jjcwvL2XJG@E+jE4c4queb;~1Cs85A^w&cZJ~ zLIc?@@+=wl>|Z*LGh~SE>)D;*d7q!Xk7K^w7hN%vzi~svfa$f$AcfN9&;cE>>l&lo z2;J~pFx9{*(`pER&TLHlNR8-{Xm*dE8LR^Yc+ zqP5LtM}QXM^7SB2qD?idHE8RqzhFv3ZmHJF%zzts%zKIgYKVgMzqbR>QXby?+{#+U)$$>AsIoWrr_j zXXXRR(ijqZ_vWb}!?C2p@jYvT0>I^zo=kc7LUY-xY6|y?we|1k?NX8F>l?xE)c;6l z#U_x&PRf9;BM|?emGeVpdH_J?UQ?-t>geoCAJ`)BazJozLn z$P=Q40qF}$Bf(ir45$O{N`_j`M%ODpX|x%RvU`5-Cq#-(D}nz$Ruu`fgl+`m)J5K+ zn4*3km^I7oU-rZbV$wj2VE~hSQDAvz-Rq2~`4&|kVXTI4XSZ(D5dTrdOLhSP6n^?s zvx_J+riO=43)_0_h*!u;YTsok+~tW?7&s7ei47KrAXrTCW-N8sED?)qTjV5J_mvY5 z1}z3lJy&(a&eZh0U-_U8id`!!k0-N8a61^(5CTOv6Ro;=wwV(?V753w zq{01lVknlMS1Vm)u5BOk$ZP3M`W7_dPA)jwITJtmHo|y2>Su6vvhu6 zj!;hZk!i_@+XJ|EGd1ySt}T`0H2szP54D5!Cq%)5M}D`%1V*gu85j9J*L9>irg5J5 z(aaZmvrxP#5Lc~sK=-N3Z?ueAV%W?K!E~A)7AuD3{r&irrRkv}0}A8W_grr3d0WQ4 zOI~T=y5|9~L?u!P=vr9O?1nnhFSpN+2&L;~;? zP1sIj@X8M1M3)NBZt=hpbRdQBs|X)!z4%`2MgWND+o3a#cyxvW0Dkvt!R^Ore|76K zXKlnwu;mfmJnuP^)Bq@Tgq{v#mj|OlRPo&#}(f%j%xOw4!Z}G zB(OC1p&XugA1`-0r8K-S?Omau>CY<&v<-|YCQWu75~&;wxT!gJE6mB+!0zK`yV`Z* zYD;j<($(eG?h}frO<)d{8BO@bWdY3ZBCkTRiOitE6cNOYm88AEtkA|!!{+lx)^~?P zI5Ut64Wi55dlzhSIr@MC!-AN)I35V>{V>8o9^$=H6Z0pstPNqpnWLT)aUrU)@!xQ_ zaaF)+QfeUUv&4&{OsJQjjvon_5++y*14#ms6HcfZymto^gJXYm?THMm86A$ZSye0j z7RqgPNZ6y0C`3{9y!>w!?6Br58F$@&y`|3wvkAXt%)vo)inbs)sL!|?_#bWuT>+;! zNZdS7E&sy6wQo=toO04$72kiGX1gv{Z+u0M+{iubMWJnq<9hT*vO1#TFNcZ5v7fD5 zTX+= zs8H**xg;&Pd#pK1?j(^5OpFyTH=8yFFB~CgOa<6f?9&j@pV{Dq!2I~F9zsRsnuR22 zA)bC*FfT1SuVIj89QY20kNB+^A@cbEz1u4?*HXqfk|!>?3As>n6s)!o9P~;AKo~ zUEi#TrybL6G5qYC1I4-T=T4I5ggLLV*{9I$4}L-^lP)KHrGMNM>WuG%l5eDBXAqTj z>evSyvC{N00~He5e*z!MjNBgne8~(~2>%v#;r$DgIlI3K6*~EMbLC*6gocm)td~0n zG~!0@?H@k}RqO^Pjb7-RUz57D;NX-n3;FR@@ky5TNFy^_FfQRCti)3<_7u#aUJL?R z#6FNE`MN)PT{RcXawGxi!gV4Bv@e6Zzn;z4K|J6Xw6R;)V2C$)k9_cFtkkfJz(`*m zck8FRZA#xP#OBHM;xBL0B8%V&W*JLCDE}C^WT=b15udgkjnx{N0AGiTUh`fNb+hv& zCs%@HC}-HJxpR(#u-rpA>6f$jI6op2nCfq`WO&-VvmHt2$dF2K^BeqYbayW5bVT%A z+v6v2pft3ed64eco^3fHyNIsTZ#vtGASJcrIJ3M;Dq!udAozWC&@?zJ&goWx!6Lq* zyMm+(38tlqaA#{-Prc%0oK2P#j2R4NjuUn*K#6$^gX8Mr453!Qm&Th5!8j7px4j6^ zU-x^QupT0F{vt#-16?pkhCK+8(HVjRASQ=`ZI*IuR`h;zqQ&PL8B?<>oZmd4XuL^( z=X$4V>)r=uE(M`C(c-#im z3KAO~X<7p)%4mpni=UR#T<|fjP?>IEB86H*BK2Pv-q;Xb`p4Ced5;q&rtgFiYNZ01 zyGYsyTLWLRjvM-2`ev-l++%@FFPjQN25eOuv|J%(>Z?2u+d!d+!mmt-*X3z!-#Vpk z@%XTE*7xdB3uSt1#emb_4-e*sdCo)SU^lc57_3H<3o2?_0~j)(UQOW!veK~IZ_we` z&f<^QPDGvA=2hKA|NCw4e=5k|Z`W69^2Ln;n^Sw``@qP=PRORn-1$DJ$6fZ6DdpEj z2J!4fTW{FMIN9q!FFMH6Dhu>Ns<7>8gAdYhYJm+INn2?vIs(=2SE@WPow+K_z z6@UGi$$gEfA%-mX)uaWro}Q}ST$2JJM;y&|>y|FH@~seh|hjH+mG&^Py? z#iFt&Uy(&o-NQYlqEZUtctFLL4|B+B`pN7aFViUVYx?h>6|?%1dyk5$HZxj0OLuR# zx&mH+`5zMZ;rUa#A;6f@A7u6#;C*3qfqj!18b-V}h?x zsw6~w`HSz_L8D{Z98ICUd@W+P_ZQOWd0I5bLtvMX^L6Szjhf3=Ch==o>#nEQeO*qo zPw`vRvC+_C_xsF!nM_6h!6GLn|AqzEj??McL|n_%W8DrK#1wV~@X7He*lx7Wj+j2z z4DAy{;j=uZ3?{gB$rh+AKTS1TlD)R|e(cej^}2dNig4bZaB}&J%{*wq^WuN`OTBhZSucCDh-{scy!*^}AF>#Rru1@g5O&iD; zx<3>GT%TGGc9^`CKu);tbE*XU z5bip9_jaSn#h@c~Y;r9S%fdntzeZubE-|1fhGR!0n3QUqQ54VT^5bubMIp^0o_DK` zoPs;332Ca@gtk=KGi&#aa;i= zi|K`H-qL(tz)zKr(n=>}{c$*95z=N#6xzc?21px1ym>qh|3k>{*S`&$slykk1S2 z^La9xxQBlsU96`0M-az?F%7y~JRE@AcqB)`?I+x#@00XmYshhV2$StCg`(r-9g5r( zjU%VqZ464?DTcueyw1#{j9O*N;3qKEGvdP-Z3OC#(R|Hijd6 zvO>4BeZugLPa(Wo zCVE}&?|7DOh{Xh)MCC;_=<$mJcofHGZUDqw`|b@18Rl1o4Q>}aGToeJU;3@$7U}Oj zt*KQ@q{ofsSvo2D)qGNar4!*Sp}T&`e%VG@FEFr|lv|6g(JH5KyjTwgWY#kO*qer; zf35PgT+@R{34KLHHq|J@#!+TZVE>5KaY@ZSZR4HhvwPc6G&zb0YRHaXZw@la@eyQe zX;oD7xUkT&RrIyiNjx%Y)`4rk)-|q=u=$Wk$^;fKHw24a?@Bx-1XjMt*&brJv zN{lvcjHx&`2Fy8CC=T9W9USibT=0T zsnLV$W>C(zy<*7Zqa<7d{NpotDfFz#>@d{~Fy2Zq zpIlxTHkaMxIX3{_U~r!s%&wM2{AC8?U@{__G?`h829vkSnEZyvmViLTnMFk_21Ttj zkZhW13V4kxYbVxUmt_BtJEg@!`c6*sL~U=Pu1-V!@K3wEc5De_w9cnqO1SjV3wi&r zlB%4uZo|`ZXOu33J!&Qa)9RQvR5PDE*kw#w2dA6-Jcn~ z_!TvB9!H~Jp7~~@U4mJgVjPO55k4V8=Y2aDm@agqnUm)CzH*AJb8PM}kJjQ=W)y+Y&Sv+U|Gf2Be=LcWGRz--HZ3jTOR=^0*e5H5x(&GXriO zR+uLeTb-G}0${59X#XE_u)k)O1| z@dlpCZOT%L1k8j5%$5-hK=3R``VZ#v33v>wVEN5H&W9B$ z!ckH%A;w&g+jCovZMVMi~+mwCQ`OKo^l4}U&x-eLd!5XEEE#JQ%eS&5g zpCr<1g)D|&kaq@*?rX;?L(}^HrGqLZZ(JNHzYs}t$L&mLa;j(ggIZ`NfSeXG|NeuIVot%9a}`YzTIlcHvp!k*w@ zMr-emW1?8H-pGCagQIiiV3aZU;Dq<-!M&D8D+L-5f#X|kuU_>$Hkd28SkOmRY}28M z-dz+m%2cV2oGhO3H9u<+9m1l0Z^z#(?6pzE2E?3CYFvnK_vsJCy|4ivOvGFc>#j-U znbIHfT?klF*^LsDXvImi3C3n$PP63zL=Z%UyorP|W7ItLsbV;fRoUV_Iu*a8?%K*} zA{@21AvkR0?ai9y*zUqP+MMf-AfTnij6#xs7Gug%ppLxdeN(kB7??)Ov<;Lln=hcT zQI^36>IU#Co$PN%l2nBYL({qArq(HEG@*yWC3kmSd(8RG7XR|aPRd`z59h0>ipfBsJT1qJ2yY#g9XdTZu*#{f zDgAEp18|*@Y1#`*Wt!&WK-AsOvB~?F9MzHb=dZuAsXoFohgA3}O{b>^XNkIZI_;VF z_o|m|n_`y{;iJ4^JilH+7rH@=orQio;9_|w2J(|@3W>j0V3@k<3Q7%HKf7>aqBOI- z?qo}h;4=FqzlB4g2baL}s%io5aHx~sjG0GazFJ`3;B;Vs-J@qzBPF*jSD7ftl9EHt zR@WONmS7e)^D-NFG5FrTD?jEg<<@#_vGvftlT`i3TVRsac`vj8-O{G?kjF|8+vtB3k)N>K_zL_o`^sh!^MlYbpBA%<3po-qCQ*Yp=6*HfX z|I-XcJ{za9Z3E$kn+4;>ousxLTJnP3q=9ER0;WAQz8^x9mNXpP^`1ili#MmgB5`eN znNF)Vhb_L8MQ_?w8NdhjEQVbd;WgmPQsCj{FGhg+hs?i{CyU^WHz=!w5C|a$j17bf z6H^=+=$}}Ox^X;z^GC$4(G;;(lsb@^NutydB0kAn2?W=enfxupj<*b%%v#1-duS>U zSA|^gJDCVRrnmDE82*~&78>D3+t*h(8;K7YhMxK7{4v9Ss6p@~99M1YjIx|cJ#Dls zqO*O(Zv@@Ts`^6xV3&D_uGaVVfs9`5&ld|@Xhm=TE)U;EygD&G#_|GgFvjv*WlUlM zwe1AsJL%hC7Gpd2qW|-``2y`#5yQ^N7Ssfw@pqP!;vJsgOrSWXCAY~0RA3@7G_Eo`G1hegV6`_ z+P~s0m%?J-<1~-lUYTS)o=m)qj^KBFP%d9X@l%>4d%87UCJiF@O%Ms_u)z+bww_s?qyKcd7& z+loHC>x>?!h_|~w9L)Eul`M0RF$q;^X`}_Km$PsBlC=))%VaIB2o)|$OFb~ z6?h8rB2FUCRe4+d<5y*+a3ANgqOdCoAu$DoNeQ7Gpjrqg0&c(`w&htIs9jXqj?%EHNq8hKMyCLx~SOE{vUnDNQR9mCDX=!DrxivOk?|d7!NShZ(Goq9lC-8jqqc^YWAPXmngY`=H zW=#!~Nm$ZN^0TsIpvRot-L%i=c(98e_c!;GK&9E%>G9&I7uOV-aTKhoQ1~@2}%m|X_6B2Lzx9g&h^T$~I!(=|m z+$e#o_ST_(>BNfH>6W;r_ZcVFDm(kLzAoDT^Gkr{^GDv9TwJ5kV#_}M@-`dpv@zxp zvi^XvD8QHIFULoYqfNhD^j>gC9>Z}WXF(_35A*Mw1(g{z8@|B3;lw~Y8WwSO8OCkj zaMS?TRvF`Q^Uzq=k~0Kps^XdD4$2F*R8dYT4*1QWUhKjdLj2{b95-I_S?h^-#|77R z#NP{!9s1N#ww}FoGwJ7p(+dg=L^NreY~!ByKC6}h^szU`$>?oQ{hIy&;mZC1IaHIG zE=XmUuOgY%90V%AR~MJ*47^2KjdyOOGBeRxRNwQBZ3IX;SoyKjCv$x-(C@8=X6OsE zABYpwYClV6l=2fJ%+4Ugah}azWuDaq1tZBt-uIFafBg}T&Jeo09(9BBvvA)p?cT31 zx@qx9lYnwRXxa#^rAFfOQt|Ko-rUMECfpIv7g|tJ_J23HhnOgSRv>=PAYwC0q1R;F zZ%NE^=}8D5?gh&!#})?geSM`xd}wpo>Zh@*a-BhZ98#QD#~pP6@l9^En!Nw&wVkD2 zHtB^~Pr1A}ARLl@mmPgovBcnq>ZwPGwmJW6Rxfc4cnncCwPZ1R%tgFh4Z5o5;@8 zB}%o$^0?b_B2ILY##bB%JKQrOqN@ovvYGBde}oX97qi{EbP+T~oE|yY323j;Mxcft z^>*nu8EBnSc-X$uE|q&8Jopa_9c~nR3n8F?#BY;-x-x@;>DS699{_-psu<&NZa1xs zK|qBNw+suDTSQ_G86KL?z|^9Tkl%!_bcHn8A0_gDUxM2_1?f z(aSqVW_ahe#c&TP`VbF}G!P$$<25u_bQlmZ-e6YC*GFy}J3$&d$yr2a6pa^yM&dJG5}_t6!Vl zY80yG64!^cMmh!3%(j*XQ%DwDlUnBt>%)s%4mEEB1h$sn+PsNT6L}N!DM1&JZ5E>Z z$=I?oM*q_oD>VE1bkl}8bUvh79l4ur%U?qvUWM3|B|-?9tcw;oq==sE42u+E@{D4~ z58RZZ&7Kj3@qxM{Bhzpt8belpTBf>VOVGMoD{?;vqT7M?lg?z0ce{*Ln6$jV^ovfkI9(*l zKVMtH?dnz9S^wYfS!BG^4mIqY&38v#%}ox~X(K2|Gm?JM+tI?pfd7@k1w8n8)8T@= zsF0V%WK#+miL<#!a^8Y+i^b$h5Uv6xe@b5tj=Mi7Py?3D2mN~{Dxp0dg;IV>YRyjt zH!A4yOL)nyB5c0}iIY4B)jv01(4+5o@_6%bG=OufO=ogAEVPOcc7}~-n8wKlcxg;>;PMG zwY5z5twQnKLGe5tH!k!(z1l)5>Z=gng2bV*6gZ^8^Q34hPfgrTsh} z!4)a+J!79n_BX@T78pMTU**&L0LvzQS3LWr`}KkEElC{oOk=zq5Bnf04wRR)6_X3S z{e-iFfHq_Hm2)l=F*EgEs1VqK41pu^t|Q@mLXIGUoMSCA4Fswz>#h_p&CH~EsS;ZP zD36eATg@je zBJCBBr#?rEGrtZ!Q`1%PT*C!!j=zp3eS8_5la8!6I!GrPQB8#9z3?0~`PrurEE}7F z9q3{l57OT9A2KI_Npn}-eHIkx<8>y zM+{|Hk0C;By93yLjr%IaO~qg-4ox3!_=wk=$N@v&@$|3{a<2rv|uv-=+cWRl!*C}y~Q#bJ|1^R)-4CG!G z&ZAA*EQiX9jiZsyIrNVp;vZ%`HNc11%_n7MAn0StQJG4-e^aIsVnPr%`}B96&N()2 z0D9Kx-)nA&Ny|{R3lzVoCui&Vwjywou~1s&DTZ@pkwP!V2Bo2n{H#B^ZC^xfRaRiX zExk?Vg?7CE+#E(3Z{R%a0ew#(#a>NFPKor0|@LnTxiFk}) zWG4HSEde2HKKnte+fLpTQdEdmtEqSE@1uA}8o^6Vp#c^ph`}Vy5Noj3mt(dQDNm!H zCb9IjcU)!7Xk5~J6pDF+5l2hsH{s8=vbCst?`PNqL@hGazwv z@{(x>FS>5@zW+P_+d+y!_mt9D+oetEMI_Ghhl5HoeOVZEY`P48N$VW(0!O)2QE->J`}M_g~a zQ^h)eTx@@67+X(w6pLAEpki#S)4&WI6cKAtO{d;A&T8r=b3@yX|EAv|Yx+)qkM8AZ zAb}pm^J=IdzN65Qav&l6k8jN$y4|&jnUXH|!2FDda7RhlXCX@3+xe#zpFFi+G0GKv zKd$c6=4y3XT%o-52fip#=jS@KD0+*cWi{o>x04E)N;G<02{CfP7l2Xz8Z@z8S_>&Z zVWLh1=+}24X$xJNM3Q@6X+j@KR3HhO$U;~@F8V1k2{ly8cr2Kw?}`?&DJxitQ0~>I zzZHok8ar?{h}mi-Y)dOd9aCx{*U-3!_j8%E8a(xTclc(IAnkStk9PYP?+N@OMe^lr4bay=qS5DjU-h2C-(-UV$y1^@58G6in=yBFW*p{SlpNi zf7@}hBgX6H*HW935B$=qFfz81bHItgAb*`$$fILatgG?TBl3>N1^Ihu;ib7ugS$(f z#He3?t8Q^8YV7XN+B}mwHQy8)c_20Wb{3)sNE)8%5-%QE7o(14jr1}QZHcJzvvE7$ zu6O$Y13}h!e9RD7n2yCahww^-oBef+uM5d+xlkkM+OE0DsEu6C-e4)s^tx!9T}4ox zy`=s_29Cb$%fiTlW|~Li9yANWd+w%)3^qS%)Fp{OO@NFzBH&9ZTZx zM>kV!R%Ag^E($sn901^(An|#pEPx*{dl#@7GM%;g!Zu)V!(9Cb>jx8_uc*M~kC)`@ znmlnC=*xDgaRv`*Qf_=5pGp6-KdjH7IiXz|2BfmaK^|9QF|#(-2jD}UMD8XACO!pK z6;@c@{7de>Ku(}cn5-?+ggv%qA^S=Q3{;mLsaoal+CNDXZp-lWR8%C$!T&Vw-zt7ogTFH*q3*YD;r=Uv7y76JLuR-p(g% z6<(_y3dS2W(H#10-a+lS7X^$+subD0rp8LktY&R3-|Eo^BnZw{e(6X{>9Y$1%@*zG z009+cy$?IAJ%Ol;xf<~CE=?pOi(L-*D@40=y8=SE2GmW!U@`eeU;nNEJ`uGHD{MGn zn~eAL%hk4_RQmC(O{g4HdEn^ywX%A!`9)?ckD9O5RnaHaVn1Jo@dm6VC6b%4@M!%K zyhXNUUs=nB;+>qW5@@Zk&W=1V|JVG+LLbXbB(*i zFvqmwuzNEWMIdZ#P)#C+@FWOeiK-&O6ohHzCRD@vbGzwiP z{uK(ZQnieY#Y{3$nXS55=@}OnWxuea)#zEk_vF2z7iiV!zgQd3ACy<3qa915YZvm0 zTcN>$ljnw^gf|!9E3WV{(9M_>N_C>NY=RRD>N4ZKbz>?8MfW{mE3uFoe^guP$k@xy~rw z)LQz~ghrGV-&5Q4g_YkW(V$Mq5*gEtPr>uFv1~6g!hZX`IpGsx za=uK(AW?)tqUlD2Hmf>Ac(`)wpA<)rf^uD+=k;xx#NBTAQZzWSCU^Q*`AM5)Q77et z;ii#JggGkK(#j?JMnPm$>suM3s%!}!5DrP|SOr`Q$ z5r4RFV3TpJIszwdRfUvPZv-SvMUM|MN+fRaIa}4CLx`|mquSz}3`fh;v#`7c461Ap z0k1bQ-6gw3AMK?lFAe{B?^srR69Bs`Oo6o`xeX6=86OT($Hh*R^c}OS(q0<%XJ_x53MqoCWNflEUh}pvwJ>E;f1sF#bP1AYRI) zr$y&)imYC9v#GJ0n4+$DzS{lhS#ROdM5`uK7?_O|l8hOReO_Zr8U4LLi5gf4F`;ib z`e&m+1FZSqFuU*V1FQguL$4zb)Sh2 zS38LcTg&!FD%=jjw#BGcH@d@@W(GVt8c2uUoRQ>Mwp)a35<{N8+yNzIxEVuB&|Oy) z18O3zJ`)?&k3v}#XheJJyFKVfHxI=kNbH(n9-TWRVcV3l8KNKa*ghcGl3E3qN3E|i zzUD6LDD?@Zt5b}NU6s@}2o@ewepQ~x(^;Y`*u(!i6JufcNy0SX7_@L?~dCWW9m~{bBcI$WT7X6*IF)p z9R4!ZrWT956;Lfn{t;;uGaBQQG5@#hp$H38fx~$p$SjbjK9EWpmt#SEGp5&dQzBip zZQEsQ(!m1hMrSzTH*rV}!yIUJ1=4bzPch^1nl@p@1fQKRy()nGoBPfu8=5H<14c)%IQD0X7OLVm!S#m#DROP0y*>*f^dwY2KKAo5 zY4~gYk(hE%V47l2U@%18#2686_YE1pi3gMy7%tl|f-9yY6~+b-M`I}PKf2h&nZx$nFWZ|HNQ@1Od&vC!ERlXBy{>T`&u z3zrHiH+lF@L^tgjaJ5awmfc<2UdW&=hrx~Ul*$+<%kmiA6H)qkNyAFz&zB%StUsO8 zo)ZbW(?l+*40r9#af+$=bYXeDP_+dU)a82BIx05?kHVyFY4BG^KDdpudjsKU-!*vw zi}C3de2kuGTJPGCVd2X-xO*ejD2Y%GKmb};iqC|`y<0#IegY3;C5v4mcfUw!b8C>9 zRqhBtiEm!1n)2!JFKOsWd)}WPvxRb$7t&wROn57%dt)zDwMW7K=sj(uKXX^htrh86#|0)f+2qh;6%us=f^_{FpHP~REd6NcODT+nv-=!X z@PuXAKTkMFjW=%J^&pVb*s_{1pmalSs~Rh}ONX7l-@5^nw^Wy&)XMf6gNDDhEUPtT zDP_j>sF3~~&$F_yOm8i}%E(iTk~emNP+on&;R z5=TRM$okgS)U!aRa73Wb1;k{3m{pN-3v$07x2CoAm*bh%OZ_8-n1>OO_SbXij;e(!A`lbQWenka z_ag?arZu$887HZi6{wwG#C*se%!|sx8Kc&=9G0=^W7cnih{-5h&MCmI0{<>6S7Vf0 z1K_CY^lF)haL)vo$79JeZ_xgCr>bsde!R^^yVOdaAN}>ZX#Ps% zYW1tOUrS+EDK>kZKlAOu4P}nq-m1}s>CjrPN-6)6A#QRH33B7mZQK)Gz@l}D<2(Uf zT(1Hx3(2k^oLZ$ZDs*r|17XQ5e#3FTT+EuW%(Y!=RZ;AlviPn13K_(=TiH|F0ji=4 zu|Za!(274A#RfO}AOxynpS*~fTaxQ;&H46-?j}?`WFajUu$J@2gn_}tfN%Z%%_*d> zFf1HZF)EX*elweUE8P^9e)9)X}J2x3&yz~+sX>LY#R9wN+9W*82 z1d_XCFEJ&0mu^fBG+(9j&s1@m0b%O_X$U&_r5KH@-$`R%{_ghlPimQ)&@a<|e5nq&+TMWJ_1dbUA>zaojH8lCgm&0i zmj&I2Ru2aY=>hZ zj6K^Q>hto~v`Ytp1p#6q?|t9ufE)lpcs94c$YHjb`ZWvSl^r&USBga#bSsuVoh%cs zQdQ4eQA}f)*!Nt4Ge%szci2+pap`S?5Khdf8Q()Vw!N{$se9-AM)---dU?49EkxOX z8?KIi-)dnHK9D|JKKDV;`WkgA)vz(Fj1b&M)$%ETx*{O5Y2KJPfetl~u%uf7mPMd~ zo6aw&-)Gb1R&M+O;UpeFRs0U?d=UC?VgfR33u*z^5&)vXNM&QXZTweUkByjrhAN~O zY}7CmoaseeHmKgf{SQx53P@dgv}sb9v!+-=0uLCOvsTbq)ouNF*D~rqOxhFM_$0_B zrE8RjwftuP8oqja0%U{Rem4b}er?MbxF- z!J}$?NbwNbd(G_8S76HJmQ8gZ3A$dYN#tQjdpw|jq_2YKNY;GaSIRL+o;pnkF7iR% zizi*MJ*m42L|zhI+hx;-+s?{Pb43J5atpZW{F->d>L;h`G(9Y!=^&ECs zAj%@Txs}9wvxuc%|#+8(LrWDH7E27k%98l=KZ&iM@>G1r#gSpt=-&k&=;g!OF1wY+@+^5iPIuCm{5kN^ zX^Hn1PwO0&Mt{j8AJv3&$$!9y?+^cSP>>Wy)l6US4XWK??)z1z*=1xh95T{*A9}_E zLgOTmn#j})@t~DMEch3$9e*=THFH)Osu%yx(q)jGP%72*7K^;WA`!!|YaV3v*OfWz zIuJtuTq6@C?=zWU%Rj`j zdDtjrI=6g5l}Du+UMYoUZcOz@QTvnV@M+e>d=*7%y$XZ@R=4Vg6NCn0a48v&ug0QVG?4DS zT(!oQ_d~weoG>SiZ(0lk49WJ{3SIm;Ns{n&R*eTZJkw@`QuDEk~p%GX05}!JSF|^zhPUz%F0S`zDkQ)rP>(Lm&1Dr~TU5^da z;Dwr&X^6AZRbGF3zO?l7sTld=vhNf!%xJ0V<_@0jn^hr&YCKCDs^6hhiCPQMMt!(f zgGJFKPz&kM!nG{FBPSU?07GUW#@T29GC{*%NUjpG#D8mE z;D9`FISCn^o(hj_TNdGA{g0vWUHm~JVJYv|PQVTAs`&klKwG&W_F{~;XB?zv_5t%4 zMWA7Lcln@jw;~|in}#zrtq(^9D#~nBSYVl%#`IKFdTk3cM1tbtcP7~*G^&i2*?P>S zyhyYB1lFEH^!zu%v}2?;r3gqda@h7FKUVP1&C9Fmjst~ScQyu27C-v2P*QCgD9W*) zCo}xn?j2fVxr-GP*)U}&sANGYSr=6bbGv5y-zHSs0Io+-IO1k8xZ%D&fQd+$Nv&`i z-syy(68B!h`LOI2S86zoA28Z9&dw&070=kM&}A{PGf{N}3V}HJY;BMd(cO!u7y~ZX zxJ#MTcE6i^@CduH(4NL!mKbvKM!%})`Y&a?$*6!u_~T#9Y+`5fd(N?wPmB>elO(&a#kC}biJ$cv@iYxH0dRNMo&=#(naZ7u4l&@Q7 zS+Jrg<#Ktj$c5L7Y$Z%gbCap+q*LG={XQPvjt#?N=rdgA`Ttm=dHThnd zguEyPDJ*$NwIb%SgxG}EPm;QA+rRTPD;d4rH@66H^;dME?kGr$0oxRk2{$GqHbtz= zSrG%YJ{?AEaR#tB`IaQe)Q)s;S@=H_48-q=qBdwoG4cFeWo;*P?kqoRGh-acdYb6p zQ92E(YQ~DE<;jkC+c2ZC;;|>j=h6-s3{-!DhnsO#m$@1eNLS05E<%pCbi6tH` z2uW|g|6ar;pu{!Ps_)l>so3O8wQ1E({r z2{+tF=bz5Sg4*(oP0rj(w|Cj5xltPDnMHtr4o!?l9p|I-C$!4UWd=T5gRjm7`89N>v+87{F@k_(efCJ^=Endv-|O4 z?|=uFivw>_V%3pD&BkirXoicp(e>eA{3FX+0{Rlpa2jA|S+FY`iiW#eyFH=z79T@)nKj&rw;}W)k1ljYLt132g;tE0!O~Oblrl-V@Ar#6BKn zDr+q*GqrXa72$j{;8LU2?IK(Tw| zXt^*s*16}_uX^4jJT)l0MH3+`K@$f%a`XGL_0jZ!{Y$0oUfOU#vZMWHo8}+)ttV;d z_mV6Ahj+TdrWG<%^OR(g$2%%w`t=ug=O{*0N|eE5?38}3(=e_O{G!;><86{U@u=rz zYnBSUSL=R=C(_3AcLO5>@-=mIH+@|;37ur(s_dWFYXeB74W`L1tiZf0wgORiy5GK& zCxqzc1Cq;LBjAfW^;f5f0ENfFmH=_z#e=lTea%zxl!qsl1{2%T7i5;p|NUs2*nhSY z@Z)nAUcWe#=DZW69r2d6_U7i$fA}J)A|~WsRqEt2gdAOnwjRxAcc2q7c#K}Rb?}$x z6aUQf8q)ap^I`(Nw`D)~z?Y*yiYM!C(MVgrH~VvJzbBAN_Os0X!y`(!@;a>uC#5Ah zhJs~cHP|UQzfxgLA#;Em_Xh`F81@3wlfcPtI_Cj=|Kj<%*KM{d`aFX{Y@}|Eig?7)&s)GjM9g8B2$|mY(+tA-!Ub+OP-8L2SI6c@dGJ zWg*Nki+xRIUtEMXsPi>2GX2VS#fs+uu3>IN4?doesVfg&sQR+h>>L5bbE-KXYo`&l zBNe$KIu%l^pN&1tjP04jvOh=>Ep=F*GX457G>4xi>lT9rntmo#7}B+~sl?RJ;LKVb zaP5i)%vFeLnCq=YT%C$3(DmHrar+RwRE zil0QpGI@FKHHV%=M6p#vw$+Jii)Wx*t4`v$R;xaNq6y0TxIYAmXq~_Sk|jEs)%9#r z(o#^tb>%Ugec$|Qjy3Mr+1gxZ0nS5TbUaz1>g)LxFPb-BvHi9?pp?X1;U{({c7Tv=4 zRz>9E5fxbm%5JwMbukU%^U5}DZ=ZN`IzC@@;`ROU-TiHHXzOs)xv~|iM~FinygC-2 zLLYXi{2oi!lv-%9%$<_ljm@wjD9-NFZC`b)2_gQRS|FB1&2%L|#CxF-snFnE^6f;( z`@8=$xYsBL7#C*-2N@(Sc78=}d|n;!Z8qxCIXk$obuFW>MKhA~JW$t`5sQgstc0C9 z+HQ;+qOc_>KlZ2Fw*~0<>n-;t9ntcF5VuPRu;Ht20fQ4&Av@AAp07;9F)M;@4OUKb zrz|JBF!SZzEO!@^fFh_^)y=Q@{>KStfuLNRD$PylC8;XzNrQmvmyJ*0qxvlfdaM2M z#=LjK6olITZD4KtLPwiu<-R@inrnNIi!q8n!d$-)O?HdlD!RQo z7HC}fRPl`0u8hYG(Y>tjcVX&aS#+hrn%Vb@ zE-2<51_CkWH!GIgUHCry&a|Gu?x#`sK7|DSx7oHlY+uZ}LtR5q6LN&WJ=}a#^Osa8 z&Fl(4NwgUx$Ho3GT+u+AYSt)U8~7x>#@gef2fr@lBIJWrPZrVp4Lnp7~5>#wh=x?OoU1Ul>!u?~Q1ZHB1!_xCavFhC8jx%I6AX z;9ay{n$oXne4pFG7|!0IHOaJ5-?#q>tCKtaMSlnWRilLO&a%Kg;);_Q&g@pqijrtu z9y|L7__;WEo$q-&y3gj`S!oYN#B;b{l9JJ=La?^S=s+wp^T)$e=L!_E&bm%N!b7AfdA)slF|xN z|9g`Ew@qIDKW$QKQvW@mjLiSs8sJy|d(|=uQva8AFiDt#tW3tM#fv($z*W%-3Tofe Hq5XdV6AlsB diff --git a/lib/matplotlib/tests/baseline_images/test_axes/polycollection_joinstyle.pdf b/lib/matplotlib/tests/baseline_images/test_axes/polycollection_joinstyle.pdf new file mode 100644 index 0000000000000000000000000000000000000000..604364f3f8ac90eeb7b17b78e75d60c9c736b1f9 GIT binary patch literal 1231 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 pS$o^}dhvnB(EOXC|E~hgTs$+)Dy%_*mxI + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 39a6bcb58496..c23a5dae94ed 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -407,6 +407,23 @@ def test_imshow_clip(): ax.imshow(r, clip_path=clip_path) fig.savefig('imshow_clip') +@image_comparison(baseline_images=['polycollection_joinstyle']) +def test_polycollection_joinstyle(): + # Bug #2890979 reported by Matthew West + + from matplotlib import collections as mcoll + + fig = plt.figure() + ax = fig.add_subplot(111) + verts = np.array([[1,1], [1,2], [2,2], [2,1]]) + c = mcoll.PolyCollection([verts], linewidths = 40) + ax.add_collection(c) + ax.set_xbound(0, 3) + ax.set_ybound(0, 3) + ax.set_xticks([]) + ax.set_yticks([]) + + fig.savefig('polycollection_joinstyle') if __name__=='__main__': import nose diff --git a/src/_backend_agg.cpp b/src/_backend_agg.cpp index 48ade9e85e76..421c65976dba 100644 --- a/src/_backend_agg.cpp +++ b/src/_backend_agg.cpp @@ -147,8 +147,7 @@ Py::Object BufferRegion::to_string_argb(const Py::Tuple &args) { } GCAgg::GCAgg(const Py::Object &gc, double dpi) : - dpi(dpi), isaa(true), linewidth(1.0), alpha(1.0), - dashOffset(0.0) + dpi(dpi), isaa(true), dashOffset(0.0) { _VERBOSE("GCAgg::GCAgg"); linewidth = points_to_pixels ( gc.getAttr("_linewidth") ) ; @@ -164,13 +163,6 @@ GCAgg::GCAgg(const Py::Object &gc, double dpi) : _set_hatch_path(gc); } -GCAgg::GCAgg(double dpi) : - dpi(dpi), isaa(true), linewidth(1.0), alpha(1.0), - dashOffset(0.0) -{ - -} - void GCAgg::_set_antialiased(const Py::Object& gc) { _VERBOSE("GCAgg::antialiased"); @@ -219,11 +211,11 @@ GCAgg::_set_joinstyle(const Py::Object& gc) { std::string joinstyle = Py::String( gc.getAttr("_joinstyle") ); - if (joinstyle=="miter") - join = agg::miter_join_revert; - else if (joinstyle=="round") + if (joinstyle == "miter") + join = agg::miter_join_revert; + else if (joinstyle == "round") join = agg::round_join; - else if(joinstyle=="bevel") + else if (joinstyle == "bevel") join = agg::bevel_join; else throw Py::ValueError(Printf("GC _joinstyle attribute must be one of butt, round, projecting; found %s", joinstyle.c_str()).str()); @@ -532,7 +524,7 @@ RendererAgg::draw_markers(const Py::Tuple& args) { if (args.size() == 6) face_obj = args[5]; - GCAgg gc = GCAgg(gc_obj, dpi); + GCAgg gc(gc_obj, dpi); // Deal with the difference in y-axis direction marker_trans *= agg::trans_affine_scaling(1.0, -1.0); @@ -775,7 +767,7 @@ RendererAgg::draw_text_image(const Py::Tuple& args) { double angle = Py::Float( args[3] ); - GCAgg gc = GCAgg(args[4], dpi); + GCAgg gc(args[4], dpi); theRasterizer.reset_clipping(); rendererBase.reset_clipping(true); @@ -1081,7 +1073,8 @@ RendererAgg::draw_path(const Py::Tuple& args) { template Py::Object RendererAgg::_draw_path_collection_generic - (agg::trans_affine master_transform, + (GCAgg& gc, + agg::trans_affine master_transform, const Py::Object& cliprect, const Py::Object& clippath, const agg::trans_affine& clippath_trans, @@ -1101,8 +1094,6 @@ RendererAgg::_draw_path_collection_generic typedef agg::conv_curve quantized_curve_t; typedef agg::conv_curve curve_t; - GCAgg gc(dpi); - PyArrayObject* offsets = NULL; PyArrayObject* facecolors = NULL; PyArrayObject* edgecolors = NULL; @@ -1312,7 +1303,8 @@ RendererAgg::draw_path_collection(const Py::Tuple& args) { try { _draw_path_collection_generic - (master_transform, + (gc, + master_transform, gc.cliprect, gc.clippath, gc.clippath_trans, @@ -1449,7 +1441,8 @@ RendererAgg::draw_quad_mesh(const Py::Tuple& args) { try { try { _draw_path_collection_generic - (master_transform, + (gc, + master_transform, gc.cliprect, gc.clippath, gc.clippath_trans, diff --git a/src/_backend_agg.h b/src/_backend_agg.h index 294e6b9645f6..37082700a0c0 100644 --- a/src/_backend_agg.h +++ b/src/_backend_agg.h @@ -104,7 +104,6 @@ class BufferRegion : public Py::PythonExtension { class GCAgg { public: GCAgg(const Py::Object& gc, double dpi); - GCAgg(double dpi); double dpi; bool isaa; @@ -224,15 +223,16 @@ class RendererAgg: public Py::PythonExtension { bool render_clippath(const Py::Object& clippath, const agg::trans_affine& clippath_trans); template void _draw_path(PathIteratorType& path, bool has_clippath, - const facepair_t& face, const GCAgg& gc); + const facepair_t& face, const GCAgg& gc); template Py::Object _draw_path_collection_generic - (agg::trans_affine master_transform, - const Py::Object& cliprect, - const Py::Object& clippath, + (GCAgg& gc, + agg::trans_affine master_transform, + const Py::Object& cliprect, + const Py::Object& clippath, const agg::trans_affine& clippath_trans, - const PathGenerator& path_generator, + const PathGenerator& path_generator, const Py::SeqBase& transforms_obj, const Py::Object& offsets_obj, const agg::trans_affine& offset_trans, @@ -262,7 +262,7 @@ class _backend_agg_module : public Py::ExtensionModule<_backend_agg_module> BufferRegion::init_type(); add_keyword_method("RendererAgg", &_backend_agg_module::new_renderer, - "RendererAgg(width, height, dpi)"); + "RendererAgg(width, height, dpi)"); initialize( "The agg rendering backend" ); } From f645f42ffb9baaa06246dd359260d1e319234cea Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 3 Nov 2009 16:21:36 +0000 Subject: [PATCH 0356/1000] Merged revisions 7919 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7919 | mdboom | 2009-11-03 10:46:14 -0500 (Tue, 03 Nov 2009) | 2 lines [2890979] Close paths correctly in PolyCollection ........ svn path=/trunk/matplotlib/; revision=7922 --- lib/matplotlib/collections.py | 14 ++++++++++++++ src/_backend_agg.cpp | 11 +++++++++++ 2 files changed, 25 insertions(+) diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index d101b09fd2e2..6589d0ecaa5b 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -574,6 +574,7 @@ def set_verts(self, verts, closed=True): if closed: self._paths = [] for xy in verts: +<<<<<<< .working if len(xy): if np.ma.isMaskedArray(xy): xy = np.ma.concatenate([xy, np.zeros((1,2))]) @@ -585,6 +586,19 @@ def set_verts(self, verts, closed=True): codes[0] = mpath.Path.MOVETO codes[-1] = mpath.Path.CLOSEPOLY self._paths.append(mpath.Path(xy, codes)) +======= + if len(xy): + if np.ma.isMaskedArray(xy): + xy = np.ma.concatenate([xy, np.zeros((1,2))]) + else: + xy = np.asarray(xy) + xy = np.concatenate([xy, np.zeros((1,2))]) + codes = np.empty(xy.shape[0], dtype='uint8') + codes[:] = mpath.Path.LINETO + codes[0] = mpath.Path.MOVETO + codes[-1] = mpath.Path.CLOSEPOLY + self._paths.append(mpath.Path(xy, codes)) +>>>>>>> .merge-right.r7919 else: self._paths.append(mpath.Path(xy)) else: diff --git a/src/_backend_agg.cpp b/src/_backend_agg.cpp index 421c65976dba..a93cda8b274b 100644 --- a/src/_backend_agg.cpp +++ b/src/_backend_agg.cpp @@ -163,6 +163,17 @@ GCAgg::GCAgg(const Py::Object &gc, double dpi) : _set_hatch_path(gc); } +<<<<<<< .working +======= +GCAgg::GCAgg(double dpi) : + dpi(dpi), isaa(true), + cap(agg::butt_cap), join(agg::round_join), linewidth(1.0), alpha(1.0), + dashOffset(0.0) +{ + +} + +>>>>>>> .merge-right.r7919 void GCAgg::_set_antialiased(const Py::Object& gc) { _VERBOSE("GCAgg::antialiased"); From 74b6d50dd8579766119c94f0cc9c7eb62d231554 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 3 Nov 2009 16:23:41 +0000 Subject: [PATCH 0357/1000] Remove conflict markers from last commit. svn path=/trunk/matplotlib/; revision=7923 --- lib/matplotlib/collections.py | 14 -------------- src/_backend_agg.cpp | 11 ----------- 2 files changed, 25 deletions(-) diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index 6589d0ecaa5b..d101b09fd2e2 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -574,7 +574,6 @@ def set_verts(self, verts, closed=True): if closed: self._paths = [] for xy in verts: -<<<<<<< .working if len(xy): if np.ma.isMaskedArray(xy): xy = np.ma.concatenate([xy, np.zeros((1,2))]) @@ -586,19 +585,6 @@ def set_verts(self, verts, closed=True): codes[0] = mpath.Path.MOVETO codes[-1] = mpath.Path.CLOSEPOLY self._paths.append(mpath.Path(xy, codes)) -======= - if len(xy): - if np.ma.isMaskedArray(xy): - xy = np.ma.concatenate([xy, np.zeros((1,2))]) - else: - xy = np.asarray(xy) - xy = np.concatenate([xy, np.zeros((1,2))]) - codes = np.empty(xy.shape[0], dtype='uint8') - codes[:] = mpath.Path.LINETO - codes[0] = mpath.Path.MOVETO - codes[-1] = mpath.Path.CLOSEPOLY - self._paths.append(mpath.Path(xy, codes)) ->>>>>>> .merge-right.r7919 else: self._paths.append(mpath.Path(xy)) else: diff --git a/src/_backend_agg.cpp b/src/_backend_agg.cpp index a93cda8b274b..421c65976dba 100644 --- a/src/_backend_agg.cpp +++ b/src/_backend_agg.cpp @@ -163,17 +163,6 @@ GCAgg::GCAgg(const Py::Object &gc, double dpi) : _set_hatch_path(gc); } -<<<<<<< .working -======= -GCAgg::GCAgg(double dpi) : - dpi(dpi), isaa(true), - cap(agg::butt_cap), join(agg::round_join), linewidth(1.0), alpha(1.0), - dashOffset(0.0) -{ - -} - ->>>>>>> .merge-right.r7919 void GCAgg::_set_antialiased(const Py::Object& gc) { _VERBOSE("GCAgg::antialiased"); From ae377a26a1f4b7dd294819c3b68bc17f995d1f3b Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 3 Nov 2009 17:57:52 +0000 Subject: [PATCH 0358/1000] Merged revisions 7924 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7924 | mdboom | 2009-11-03 11:27:13 -0500 (Tue, 03 Nov 2009) | 2 lines [2880836] Save from toolbar changes directory with WX backend ........ svn path=/trunk/matplotlib/; revision=7925 --- lib/matplotlib/backends/backend_wx.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/backends/backend_wx.py b/lib/matplotlib/backends/backend_wx.py index e3161ee68482..d34316089c57 100644 --- a/lib/matplotlib/backends/backend_wx.py +++ b/lib/matplotlib/backends/backend_wx.py @@ -1795,7 +1795,7 @@ def save(self, evt): default_file = "image." + self.canvas.get_default_filetype() dlg = wx.FileDialog(self._parent, "Save to file", "", default_file, filetypes, - wx.SAVE|wx.OVERWRITE_PROMPT|wx.CHANGE_DIR) + wx.SAVE|wx.OVERWRITE_PROMPT) dlg.SetFilterIndex(filter_index) if dlg.ShowModal() == wx.ID_OK: dirname = dlg.GetDirectory() From dc13d250cd8370a6503b71ca5f6806c32f31ef27 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Tue, 3 Nov 2009 20:27:23 +0000 Subject: [PATCH 0359/1000] added PCA helper class to mlab and deprecated prepca svn path=/trunk/matplotlib/; revision=7926 --- lib/matplotlib/mlab.py | 81 ++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 81 insertions(+) diff --git a/lib/matplotlib/mlab.py b/lib/matplotlib/mlab.py index c16401491697..bed921206c4a 100644 --- a/lib/matplotlib/mlab.py +++ b/lib/matplotlib/mlab.py @@ -759,6 +759,9 @@ def longest_ones(x): def prepca(P, frac=0): """ + + WARNING: this function is deprecated -- please see class PCA instead + Compute the principal components of *P*. *P* is a (*numVars*, *numObs*) array. *frac* is the minimum fraction of variance that a component must contain to be included. @@ -778,6 +781,7 @@ def prepca(P, frac=0): R13 Neural Network Toolbox but is not found in later versions; its successor seems to be called "processpcs". """ + warnings.warn('This function is deprecated -- see class PCA instead') U,s,v = np.linalg.svd(P) varEach = s**2/P.shape[1] totVar = varEach.sum() @@ -789,6 +793,83 @@ def prepca(P, frac=0): Pcomponents = np.dot(Trans,P) return Pcomponents, Trans, fracVar[ind] + +class PCA: + def __init__(self, a): + """ + compute the SVD of a and store data for PCA. Use project to + project the data onto a reduced set of dimensions + + Inputs: + + *a*: a numobservations x numdims array + + Attrs: + + *a* a centered unit sigma version of input a + + *numrows*, *numcols*: the dimensions of a + + *mu* : a numdims array of means of a + + *sigma* : a numdims array of atandard deviation of a + + *fracs* : the proportion of variance of each of the principal components + + *Wt* : the weight vector for projecting a numdims point or array into PCA space + + *Y* : a projected into PCA space + + """ + n, m = a.shape + if nnumcols') + + self.numrows, self.numcols = n, m + self.mu = a.mean(axis=0) + self.sigma = a.std(axis=0) + + a = self.center(a) + + self.a = a + + U, s, Vh = np.linalg.svd(a, full_matrices=False) + + + Y = np.dot(Vh, a.T).T + + vars = s**2/float(len(s)) + self.fracs = vars/vars.sum() + + + self.Wt = Vh + self.Y = Y + + + def project(self, x, minfrac=0.): + 'project x onto the principle axes, dropping any axes where fraction of variance=minfrac + if ndims==2: + Yreduced = Y[:,mask] + else: + Yreduced = Y[mask] + return Yreduced + + + + def center(self, x): + 'center the data using the mean and sigma from training set a' + return (x - self.mu)/self.sigma + def prctile(x, p = (0.0, 25.0, 50.0, 75.0, 100.0)): """ Return the percentiles of *x*. *p* can either be a sequence of From a38b6ba8c742c57367c08210f4741e60109b86fa Mon Sep 17 00:00:00 2001 From: John Hunter Date: Tue, 3 Nov 2009 20:51:55 +0000 Subject: [PATCH 0360/1000] added pca test svn path=/trunk/matplotlib/; revision=7927 --- lib/matplotlib/__init__.py | 1 + lib/matplotlib/mlab.py | 23 ++++++++++++++++++++++- lib/matplotlib/tests/test_mlab.py | 11 +++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 lib/matplotlib/tests/test_mlab.py diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index 1b2a5d443b22..8a0089dc6da2 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -905,6 +905,7 @@ def tk_window_focus(): 'matplotlib.tests.test_backend_svg', 'matplotlib.tests.test_basic', 'matplotlib.tests.test_cbook', + 'matplotlib.tests.test_mlab', 'matplotlib.tests.test_transforms', 'matplotlib.tests.test_axes', 'matplotlib.tests.test_dates', diff --git a/lib/matplotlib/mlab.py b/lib/matplotlib/mlab.py index bed921206c4a..00b5963be142 100644 --- a/lib/matplotlib/mlab.py +++ b/lib/matplotlib/mlab.py @@ -761,7 +761,7 @@ def prepca(P, frac=0): """ WARNING: this function is deprecated -- please see class PCA instead - + Compute the principal components of *P*. *P* is a (*numVars*, *numObs*) array. *frac* is the minimum fraction of variance that a component must contain to be included. @@ -870,6 +870,27 @@ def center(self, x): 'center the data using the mean and sigma from training set a' return (x - self.mu)/self.sigma + + + @staticmethod + def _get_colinear(): + c0 = np.array([ + 0.19294738, 0.6202667 , 0.45962655, 0.07608613, 0.135818 , + 0.83580842, 0.07218851, 0.48318321, 0.84472463, 0.18348462, + 0.81585306, 0.96923926, 0.12835919, 0.35075355, 0.15807861, + 0.837437 , 0.10824303, 0.1723387 , 0.43926494, 0.83705486]) + + c1 = np.array([ + -1.17705601, -0.513883 , -0.26614584, 0.88067144, 1.00474954, + -1.1616545 , 0.0266109 , 0.38227157, 1.80489433, 0.21472396, + -1.41920399, -2.08158544, -0.10559009, 1.68999268, 0.34847107, + -0.4685737 , 1.23980423, -0.14638744, -0.35907697, 0.22442616]) + + c2 = c0 + 2*c1 + c3 = -3*c0 + 4*c1 + a = np.array([c3, c0, c1, c2]).T + return a + def prctile(x, p = (0.0, 25.0, 50.0, 75.0, 100.0)): """ Return the percentiles of *x*. *p* can either be a sequence of diff --git a/lib/matplotlib/tests/test_mlab.py b/lib/matplotlib/tests/test_mlab.py new file mode 100644 index 000000000000..0af409323700 --- /dev/null +++ b/lib/matplotlib/tests/test_mlab.py @@ -0,0 +1,11 @@ +import numpy as np +import matplotlib.mlab as mlab + +@staticmethod +def test_colinear_pca(): + a = mlab.PCA._get_colinear() + pca = mlab.PCA(a) + + assert(np.allclose(pca.fracs[2:], 0.)) + assert(np.allclose(pca.Y[:,2:], 0.)) + From cdeca395c5f72e14e213f0ba0358e11a8f3dfb96 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 3 Nov 2009 20:56:03 +0000 Subject: [PATCH 0361/1000] [2889193] Rasterized output offset in pdf and ps svn path=/trunk/matplotlib/; revision=7929 --- lib/matplotlib/backends/backend_mixed.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/backends/backend_mixed.py b/lib/matplotlib/backends/backend_mixed.py index 37e58410eab2..36241bb5af04 100644 --- a/lib/matplotlib/backends/backend_mixed.py +++ b/lib/matplotlib/backends/backend_mixed.py @@ -122,8 +122,8 @@ def stop_rasterizing(self): gc = self._renderer.new_gc() self._renderer.draw_image( gc, - int(float(l)/self.dpi*72.), - int((float(height) - b - h)/self.dpi*72.), + float(l)/self.dpi*72., + (float(height) - b - h)/self.dpi*72., image) self._raster_renderer = None self._rasterizing = False From ee18992683f7cbea0b1aab5599bb6d6042b2b5c1 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 3 Nov 2009 20:57:23 +0000 Subject: [PATCH 0362/1000] Merged revisions 7928 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7928 | mdboom | 2009-11-03 15:55:47 -0500 (Tue, 03 Nov 2009) | 1 line [2889193] Rasterized output offset in pdf and ps ........ svn path=/trunk/matplotlib/; revision=7930 From 178c3dd44e5fbafd879d4f05d95717bcd1ddcf60 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Tue, 3 Nov 2009 21:17:48 +0000 Subject: [PATCH 0363/1000] remove static decorator svn path=/trunk/matplotlib/; revision=7931 --- lib/matplotlib/mlab.py | 4 ++++ lib/matplotlib/tests/test_mlab.py | 1 - 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/mlab.py b/lib/matplotlib/mlab.py index 00b5963be142..b645449e2f06 100644 --- a/lib/matplotlib/mlab.py +++ b/lib/matplotlib/mlab.py @@ -820,6 +820,10 @@ def __init__(self, a): *Y* : a projected into PCA space + + The factor loadings are in the Wt factor, ie the factor + loadings for the 1st principal component are given by Wt[0] + """ n, m = a.shape if n Date: Wed, 4 Nov 2009 17:30:12 +0000 Subject: [PATCH 0364/1000] added levels kwarg to contour svn path=/trunk/matplotlib/; revision=7936 --- lib/matplotlib/contour.py | 5 +++++ lib/matplotlib/mlab.py | 4 ++++ lib/matplotlib/widgets.py | 6 ++++++ 3 files changed, 15 insertions(+) diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index 802654c0262a..7909655ace1e 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -1066,6 +1066,11 @@ def set_alpha(self, alpha): scaling data values to colors. If *norm* is *None* and *colors* is *None*, the default linear scaling is used. + *levels* [level0, level1, ..., leveln] + A list of floating point numbers indicating the level + curves to draw; eg to draw just the zero contour pass + ``levels=[0]`` + *origin*: [ None | 'upper' | 'lower' | 'image' ] If *None*, the first value of *Z* will correspond to the lower left corner, location (0,0). If 'image', the rc diff --git a/lib/matplotlib/mlab.py b/lib/matplotlib/mlab.py index b645449e2f06..1ddb70330708 100644 --- a/lib/matplotlib/mlab.py +++ b/lib/matplotlib/mlab.py @@ -2576,6 +2576,10 @@ def rec2csv(r, fname, delimiter=',', formatd=None, missing='', *withheader*: if withheader is False, do not write the attribute names in the first row + for formatd type FormatFloat, we override the precision to store + full precision floats in the CSV file + + .. seealso:: :func:`csv2rec` diff --git a/lib/matplotlib/widgets.py b/lib/matplotlib/widgets.py index e23cb19f10dd..59d0ee12b457 100644 --- a/lib/matplotlib/widgets.py +++ b/lib/matplotlib/widgets.py @@ -669,6 +669,8 @@ def __init__(self, ax, useblit=False, **lineprops): self.vertOn = True self.useblit = useblit + if useblit: + lineprops['animated'] = True self.lineh = ax.axhline(ax.get_ybound()[0], visible=False, **lineprops) self.linev = ax.axvline(ax.get_xbound()[0], visible=False, **lineprops) @@ -741,10 +743,14 @@ class MultiCursor: """ def __init__(self, canvas, axes, useblit=True, **lineprops): + self.canvas = canvas self.axes = axes xmin, xmax = axes[-1].get_xlim() xmid = 0.5*(xmin+xmax) + if useblit: + lineprops['animated'] = True + self.lines = [ax.axvline(xmid, visible=False, **lineprops) for ax in axes] self.visible = True From 3964724e90f595daaa93167ed6e6f144b665ed43 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Wed, 4 Nov 2009 17:53:25 +0000 Subject: [PATCH 0365/1000] add bbox_extra_artists keyword for savefig svn path=/trunk/matplotlib/; revision=7937 --- lib/matplotlib/backend_bases.py | 29 ++++++++++++++++++++++++++++- lib/matplotlib/figure.py | 4 ++++ 2 files changed, 32 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 67ed73c9fbce..7e192d8c0ed8 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -1536,11 +1536,26 @@ def print_figure(self, filename, dpi=None, facecolor='w', edgecolor='w', *edgecolor* the edgecolor of the figure - *orientation* ' + *orientation* landscape' | 'portrait' (not supported on all backends) *format* when set, forcibly set the file format to save to + + + *bbox_inches* + Bbox in inches. Only the given portion of the figure is + saved. If 'tight', try to figure out the tight bbox of + the figure. + + *pad_inches* + Amount of padding around the figure when bbox_inches is + 'tight'. + + *bbox_extra_artists* + A list of extra artists that will be considered when the + tight bbox is calculated. + """ if format is None: if cbook.is_string_like(filename): @@ -1597,6 +1612,18 @@ def print_figure(self, filename, dpi=None, facecolor='w', edgecolor='w', **kwargs) renderer = self.figure._cachedRenderer bbox_inches = self.figure.get_tightbbox(renderer) + + bb = [a.get_window_extent(renderer) for a in kwargs.pop("bbox_extra_artists", []) \ + if a.get_visible()] + if bb: + _bbox = Bbox.union([b for b in bb if b.width!=0 or b.height!=0]) + + bbox_inches1 = TransformedBbox(_bbox, + Affine2D().scale(1./self.figure.dpi)) + + bbox_inches = Bbox.union([bbox_inches, bbox_inches1]) + + pad = kwargs.pop("pad_inches", 0.1) bbox_inches = bbox_inches.padded(pad) diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index 0efe4267980f..eb84e04fadda 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -1031,6 +1031,10 @@ def savefig(self, *args, **kwargs): Amount of padding around the figure when bbox_inches is 'tight'. + *bbox_extra_artists*: + A list of extra artists that will be considered when the + tight bbox is calculated. + """ for key in ('dpi', 'facecolor', 'edgecolor'): From 3fd4fcc5cdeba5613a4fb5a375c87b1b161782a1 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Fri, 6 Nov 2009 15:00:57 +0000 Subject: [PATCH 0366/1000] fix to int in afm to not crash on floats svn path=/trunk/matplotlib/; revision=7940 --- lib/matplotlib/afm.py | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/afm.py b/lib/matplotlib/afm.py index 05d2f78d54c9..6722a1a52398 100644 --- a/lib/matplotlib/afm.py +++ b/lib/matplotlib/afm.py @@ -38,7 +38,13 @@ from _mathtext_data import uni2type1 #Convert string the a python type -_to_int = int + +# some afm files have floats where we are expecting ints -- there is +# probably a better way to handle this (support floats, round rather +# than truncate). But I don't know what the best approach is now and +# this change to _to_int should at least prevent mpl from crashing on +# these JDH (2009-11-06) +_to_int = lambda x: return int(float(x)) _to_float = float _to_str = str From 915feade7bf6e5dbb87b76d46a36e2d62bec7604 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Fri, 6 Nov 2009 15:02:19 +0000 Subject: [PATCH 0367/1000] fix to int in afm to not crash on floats svn path=/trunk/matplotlib/; revision=7941 --- lib/matplotlib/afm.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/afm.py b/lib/matplotlib/afm.py index 6722a1a52398..bb5163453170 100644 --- a/lib/matplotlib/afm.py +++ b/lib/matplotlib/afm.py @@ -44,7 +44,10 @@ # than truncate). But I don't know what the best approach is now and # this change to _to_int should at least prevent mpl from crashing on # these JDH (2009-11-06) -_to_int = lambda x: return int(float(x)) + +def _to_int(x): + return int(float(x)) + _to_float = float _to_str = str From ac1306f61c4b3ee2742c1ee8182d84f6465c998f Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Fri, 6 Nov 2009 19:26:35 +0000 Subject: [PATCH 0368/1000] Merged revisions 7944 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7944 | mdboom | 2009-11-06 14:24:55 -0500 (Fri, 06 Nov 2009) | 2 lines Add support for \widebar{} in mathtext (Thanks Sean Arms) ........ svn path=/trunk/matplotlib/; revision=7945 --- lib/matplotlib/_mathtext_data.py | 2 ++ lib/matplotlib/mathtext.py | 2 +- 2 files changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/_mathtext_data.py b/lib/matplotlib/_mathtext_data.py index 56f437c0bcdf..3473a3112e18 100644 --- a/lib/matplotlib/_mathtext_data.py +++ b/lib/matplotlib/_mathtext_data.py @@ -41,6 +41,7 @@ r'\rangle' : ('cmex10', 64), r'\widehat' : ('cmex10', 15), r'\widetilde' : ('cmex10', 52), + r'\widebar' : ('cmr10', 131), r'\omega' : ('cmmi10', 29), r'\varepsilon' : ('cmmi10', 20), @@ -1762,6 +1763,7 @@ tex2uni = { 'widehat': 0x0302, 'widetilde': 0x0303, +'widebar': 0x0305, 'langle': 0x27e8, 'rangle': 0x27e9, 'perp': 0x27c2, diff --git a/lib/matplotlib/mathtext.py b/lib/matplotlib/mathtext.py index 6d83dc161502..e2cb33478952 100644 --- a/lib/matplotlib/mathtext.py +++ b/lib/matplotlib/mathtext.py @@ -2481,7 +2481,7 @@ def char_over_chars(self, s, loc, toks): r'overleftarrow' : r'\leftarrow' } - _wide_accents = set(r"widehat widetilde".split()) + _wide_accents = set(r"widehat widetilde widebar".split()) def accent(self, s, loc, toks): assert(len(toks)==1) From 43d86e6f38952a6b8b0a3dd8eda6a4fa722fc9cf Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Fri, 6 Nov 2009 21:54:57 +0000 Subject: [PATCH 0369/1000] do not check the visibility of bbox_extra_artists of savefig svn path=/trunk/matplotlib/; revision=7946 --- lib/matplotlib/backend_bases.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 7e192d8c0ed8..7a223e14fdd5 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -1613,8 +1613,8 @@ def print_figure(self, filename, dpi=None, facecolor='w', edgecolor='w', renderer = self.figure._cachedRenderer bbox_inches = self.figure.get_tightbbox(renderer) - bb = [a.get_window_extent(renderer) for a in kwargs.pop("bbox_extra_artists", []) \ - if a.get_visible()] + bb = [a.get_window_extent(renderer) for a \ + in kwargs.pop("bbox_extra_artists", [])] if bb: _bbox = Bbox.union([b for b in bb if b.width!=0 or b.height!=0]) From 42c640e8fb457fecd57fd137f23df437d954d5d6 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Fri, 6 Nov 2009 22:33:34 +0000 Subject: [PATCH 0370/1000] axes_grid: add HostAxes.get_tightbbox svn path=/trunk/matplotlib/; revision=7947 --- lib/mpl_toolkits/axes_grid/parasite_axes.py | 12 ++++++++++++ 1 file changed, 12 insertions(+) diff --git a/lib/mpl_toolkits/axes_grid/parasite_axes.py b/lib/mpl_toolkits/axes_grid/parasite_axes.py index ac11a678b948..6b165dce3d68 100644 --- a/lib/mpl_toolkits/axes_grid/parasite_axes.py +++ b/lib/mpl_toolkits/axes_grid/parasite_axes.py @@ -10,6 +10,8 @@ from matplotlib.axes import subplot_class_factory from axislines import Axes +from matplotlib.transforms import Bbox + import numpy as np import matplotlib.cbook as cbook @@ -238,6 +240,16 @@ def legend(self, *args, **kwargs): return self.legend_ + def get_tightbbox(self, renderer): + + bbs = [ax.get_tightbbox(renderer) for ax in self.parasites] + bbs.append(super(HostAxes, self).get_tightbbox(renderer)) + + _bbox = Bbox.union([b for b in bbs if b.width!=0 or b.height!=0]) + + return _bbox + + def draw(self, renderer): orig_artists = list(self.artists) From 114921505cf9edc823ff22d8e64a3df09f48fdaa Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Sat, 7 Nov 2009 06:53:49 +0000 Subject: [PATCH 0371/1000] textpath.get_glyph_tex tries set the font charmap svn path=/trunk/matplotlib/; revision=7948 --- lib/matplotlib/textpath.py | 65 ++++++++++++++++++-------------------- src/ft2font.cpp | 21 ++++++++++++ src/ft2font.h | 2 ++ 3 files changed, 53 insertions(+), 35 deletions(-) diff --git a/lib/matplotlib/textpath.py b/lib/matplotlib/textpath.py index 5ea41e3321a2..5093c2027a96 100644 --- a/lib/matplotlib/textpath.py +++ b/lib/matplotlib/textpath.py @@ -19,7 +19,7 @@ class TextToPath(object): FONT_SCALE = 50. DPI = 72 - + def __init__(self): """ Initialization @@ -44,7 +44,7 @@ def _get_font(self, prop): def _get_hinting_flag(self): return LOAD_NO_HINTING - + def _get_char_id(self, font, ccode): """ Return a unique id for the given font and character-code set. @@ -64,7 +64,7 @@ def _get_char_id_ps(self, font, ccode): def glyph_to_path(self, glyph, currx=0.): """ - convert the ft2font glyph to vertices and codes. + convert the ft2font glyph to vertices and codes. """ #Mostly copied from backend_svg.py. @@ -102,14 +102,14 @@ def get_text_path(self, prop, s, ismath=False, usetex=False): *s* text to be converted - + *usetex* If True, use matplotlib usetex mode. *ismath* If True, use mathtext parser. Effective only if usetex == False. - + """ if usetex==False: if ismath == False: @@ -121,26 +121,26 @@ def get_text_path(self, prop, s, ismath=False, usetex=False): glyph_info, glyph_map, rects = self.get_glyphs_tex(prop, s) verts, codes = [], [] - + for glyph_id, xposition, yposition, scale in glyph_info: verts1, codes1 = glyph_map[glyph_id] if verts1: - verts1 = np.array(verts1)*scale + [xposition, yposition] + verts1 = np.array(verts1)*scale + [xposition, yposition] verts.extend(verts1) codes.extend(codes1) for verts1, codes1 in rects: verts.extend(verts1) codes.extend(codes1) - + return verts, codes - + def get_glyphs_with_font(self, font, s, glyph_map=None, return_new_glyphs_only=False): """ convert the string *s* to vertices and codes using the - provided ttf font. + provided ttf font. """ # Mostly copied from backend_svg.py. @@ -151,7 +151,7 @@ def get_glyphs_with_font(self, font, s, glyph_map=None, currx = 0 xpositions = [] glyph_ids = [] - + if glyph_map is None: glyph_map = dict() @@ -190,14 +190,14 @@ def get_glyphs_with_font(self, font, s, glyph_map=None, glyph_ids.append(char_id) currx += horiz_advance - + lastgind = gind ypositions = [0] * len(xpositions) sizes = [1.] * len(xpositions) rects = [] - + return zip(glyph_ids, xpositions, ypositions, sizes), glyph_map_new, rects @@ -275,14 +275,14 @@ def get_glyphs_tex(self, prop, s, glyph_map=None, """ # codes are modstly borrowed from pdf backend. - + texmanager = self.get_texmanager() if self.tex_font_map is None: self.tex_font_map = dviread.PsfontsMap(dviread.find_tex_file('pdftex.map')) fontsize = prop.get_size_in_points() - if hasattr(texmanager, "get_dvi"): # + if hasattr(texmanager, "get_dvi"): # dvifilelike = texmanager.get_dvi(s, self.FONT_SCALE) dvi = dviread.DviFromFileLike(dvifilelike, self.DPI) else: @@ -312,6 +312,10 @@ def get_glyphs_tex(self, prop, s, glyph_map=None, if font_and_encoding is None: font_bunch = self.tex_font_map[dvifont.texname] font = FT2Font(font_bunch.filename) + try: + font.select_charmap(1094992451) # select ADOBE_CUSTOM + except ValueError: + font.set_charmap(0) if font_bunch.encoding: enc = dviread.Encoding(font_bunch.encoding) else: @@ -322,25 +326,15 @@ def get_glyphs_tex(self, prop, s, glyph_map=None, font, enc = font_and_encoding ft2font_flag = LOAD_TARGET_LIGHT - if enc: - ng = font.get_name_index(enc.encoding[glyph]) - else: - ng = glyph - char_id = self._get_char_id_ps(font, ng) + char_id = self._get_char_id_ps(font, glyph) if not char_id in glyph_map: font.clear() font.set_size(self.FONT_SCALE, self.DPI) - if ng == 0: - # While 0 is a valid index (e.g., "-", "\Gamma"), - # font.load_glyph(0) does not seem to work. This - # may not be a general solution. - glyph0 = font.load_glyph(128, flags=ft2font_flag) - else: - glyph0 = font.load_glyph(ng, flags=ft2font_flag) - + glyph0 = font.load_char(glyph, flags=ft2font_flag) + glyph_map_new[char_id] = self.glyph_to_path(glyph0) glyph_ids.append(char_id) @@ -349,7 +343,7 @@ def get_glyphs_tex(self, prop, s, glyph_map=None, sizes.append(dvifont.size/self.FONT_SCALE) myrects = [] - + for ox, oy, h, w in page.boxes: vert1=[(ox, oy), (ox+w, oy), (ox+w, oy+h), (ox, oy+h), (ox, oy), (0,0)] code1 = [Path.MOVETO, @@ -358,12 +352,13 @@ def get_glyphs_tex(self, prop, s, glyph_map=None, myrects.append((vert1, code1)) - return zip(glyph_ids, xpositions, ypositions, sizes), glyph_map, myrects + return zip(glyph_ids, xpositions, ypositions, sizes), \ + glyph_map_new, myrects + - from matplotlib.font_manager import FontProperties from matplotlib import rcParams @@ -384,7 +379,7 @@ def __init__(self, xy, s, size=None, prop=None, it simply is a path, not an artist. You need to use the PathPatch (or other artists) to draw this path onto the canvas. - + xy : position of the text. s : text size : font size @@ -437,7 +432,7 @@ def _get_codes(self): Return the codes """ return self._codes - + vertices = property(_get_vertices) codes = property(_get_codes) @@ -463,7 +458,7 @@ def is_math_text(self, s): Returns True if the given string *s* contains any mathtext. """ # copied from Text.is_math_text -JJL - + # Did we find an even number of non-escaped dollar signs? # If so, treat is as math text. dollar_count = s.count(r'$') - s.count(r'\$') @@ -489,7 +484,7 @@ def text_get_vertices_codes(self, prop, s, usetex): else: clean_line, ismath = self.is_math_text(s) verts, codes = text_to_path.get_text_path(prop, clean_line, ismath=ismath) - + return verts, codes diff --git a/src/ft2font.cpp b/src/ft2font.cpp index cf101557b2d7..2d599f7c99e1 100644 --- a/src/ft2font.cpp +++ b/src/ft2font.cpp @@ -885,6 +885,24 @@ FT2Font::set_charmap(const Py::Tuple & args) { return Py::Object(); } +char FT2Font::select_charmap__doc__[] = +"select_charmap(i)\n" +"\n" +"select charmap i where i is one of the FT_Encoding number\n" +; + +Py::Object +FT2Font::select_charmap(const Py::Tuple & args) { + _VERBOSE("FT2Font::set_charmap"); + args.verify_length(1); + + unsigned long i = Py::Long(args[0]); + //if (FT_Select_Charmap( face, FT_ENCODING_ADOBE_CUSTOM )) + if (FT_Select_Charmap( face, (FT_Encoding) i )) + throw Py::ValueError("Could not set the charmap"); + return Py::Object(); +} + FT_BBox FT2Font::compute_string_bbox( ) { _VERBOSE("FT2Font::compute_string_bbox"); @@ -1368,6 +1386,7 @@ FT2Font::get_charmap(const Py::Tuple & args) { FT_UInt index; Py::Dict charmap; + //std::cout << "asd" << face->charmaps[1]->encoding << std::endl; FT_ULong code = FT_Get_First_Char(face, &index); while (index != 0) { charmap[Py::Long((long) code)] = Py::Int((int) index); @@ -1841,6 +1860,8 @@ FT2Font::init_type() { FT2Font::set_size__doc__); add_varargs_method("set_charmap", &FT2Font::set_charmap, FT2Font::set_charmap__doc__); + add_varargs_method("select_charmap", &FT2Font::select_charmap, + FT2Font::select_charmap__doc__); add_varargs_method("get_width_height", &FT2Font::get_width_height, FT2Font::get_width_height__doc__); diff --git a/src/ft2font.h b/src/ft2font.h index e8f6b8e2423d..cc6bb151affe 100644 --- a/src/ft2font.h +++ b/src/ft2font.h @@ -95,6 +95,7 @@ class FT2Font : public Py::PythonExtension { Py::Object clear(const Py::Tuple & args); Py::Object set_size(const Py::Tuple & args); Py::Object set_charmap(const Py::Tuple & args); + Py::Object select_charmap(const Py::Tuple & args); Py::Object set_text(const Py::Tuple & args, const Py::Dict & kwargs); Py::Object get_kerning(const Py::Tuple & args); Py::Object get_num_glyphs(const Py::Tuple & args); @@ -137,6 +138,7 @@ class FT2Font : public Py::PythonExtension { static char clear__doc__ []; static char set_size__doc__ []; static char set_charmap__doc__ []; + static char select_charmap__doc__ []; static char set_text__doc__ []; static char get_glyph__doc__ []; static char get_num_glyphs__doc__ []; From 16b855b210126bd88f6a3bae2b4c17ccf0b9a9ef Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Tue, 10 Nov 2009 21:03:51 +0000 Subject: [PATCH 0372/1000] use image zorder when drawing svn path=/trunk/matplotlib/; revision=7950 --- CHANGELOG | 9 +++++++++ lib/matplotlib/axes.py | 3 ++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 5d8011be59c9..b803d1ca97b6 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,12 @@ +2009-11-10 Single images, and all images in renderers with + option_image_nocomposite (i.e. agg, macosx and the svg + backend when rcParams['svg.image_noscale'] is True), are + now drawn respecting the zorder relative to other + artists. (Note that there may now be inconsistencies across + backends when more than one image is drawn at varying + zorders, but this change introduces correct behavior for + the backends in which it's easy to do so.) + 2009-10-21 Make AutoDateLocator more configurable by adding options to control the maximum and minimum number of ticks. Also add control of the intervals to be used for ticking. This diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index f62813459628..d23d1ce6874f 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -1721,7 +1721,8 @@ def draw(self, renderer=None, inframe=False): if len(self.images)<=1 or renderer.option_image_nocomposite(): for im in self.images: - im.draw(renderer) + dsu.append( (im.zorder, len(dsu), im) ) + dsu.sort() # re-sort with images now else: # make a composite image blending alpha # list of (mimage.Image, ox, oy) From 87097cf4c7d71f11ed3ace3cc77e190b95eeb018 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Wed, 11 Nov 2009 23:59:23 +0000 Subject: [PATCH 0373/1000] drawing images respect zorder among images even for noncomposite backend svn path=/trunk/matplotlib/; revision=7951 --- lib/matplotlib/axes.py | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index d23d1ce6874f..da56038f1dc7 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -1727,9 +1727,12 @@ def draw(self, renderer=None, inframe=False): # make a composite image blending alpha # list of (mimage.Image, ox, oy) + zorder_images = [(im.zorder, im) for im in self.images \ + if im.get_visible()] + zorder_images.sort() + mag = renderer.get_image_magnification() - ims = [(im.make_image(mag),0,0) - for im in self.images if im.get_visible()] + ims = [(im.make_image(mag),0,0) for z,im in zorder_images] l, b, r, t = self.bbox.extents From 6cfc6854b7e19963a512e01b1fe45b10dad83329 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Thu, 12 Nov 2009 17:28:22 +0000 Subject: [PATCH 0374/1000] Fix EINTR problem in font_manager.py svn path=/trunk/matplotlib/; revision=7953 --- CHANGELOG | 5 +++++ lib/matplotlib/font_manager.py | 18 +++++++----------- 2 files changed, 12 insertions(+), 11 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index b803d1ca97b6..3b05d9149ddb 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,8 @@ +2009-11-12 font_manager.py should no longer cause EINTR on Python 2.6 + (but will on the 2.5 version of subprocess). Also the + fc-list command in that file was fixed so now it should + actually find the list of fontconfig fonts. - JKS + 2009-11-10 Single images, and all images in renderers with option_image_nocomposite (i.e. agg, macosx and the svg backend when rcParams['svg.image_noscale'] is True), are diff --git a/lib/matplotlib/font_manager.py b/lib/matplotlib/font_manager.py index a8ddc9d9cbc4..f57e95c4a88f 100644 --- a/lib/matplotlib/font_manager.py +++ b/lib/matplotlib/font_manager.py @@ -42,7 +42,7 @@ see license/LICENSE_TTFQUERY. """ -import os, sys, glob +import os, sys, glob, subprocess try: set except NameError: @@ -292,16 +292,12 @@ def get_fontconfig_fonts(fontext='ttf'): grab all of the fonts the user wants to be made available to applications, without needing knowing where all of them reside. """ - try: - import commands - except ImportError: - return {} - fontext = get_fontext_synonyms(fontext) fontfiles = {} - status, output = commands.getstatusoutput("fc-list file") - if status == 0: + pipe = subprocess.Popen(['fc-list', '', 'file'], stdout=subprocess.PIPE) + output = pipe.communicate()[0] + if pipe.returncode == 0: for line in output.split('\n'): fname = line.split(':')[0] if (os.path.splitext(fname)[1][1:] in fontext and @@ -1244,11 +1240,11 @@ def is_opentype_cff_font(filename): import re def fc_match(pattern, fontext): - import commands fontexts = get_fontext_synonyms(fontext) ext = "." + fontext - status, output = commands.getstatusoutput('fc-match -sv "%s"' % pattern) - if status == 0: + pipe = subprocess.Popen(['fc-match', '-sv', pattern], stdout=subprocess.PIPE) + output = pipe.communicate()[0] + if pipe.returncode == 0: for match in _fc_match_regex.finditer(output): file = match.group(1) if os.path.splitext(file)[1][1:] in fontexts: From f437de60eb12caffe7f09a49a7021f646ba63234 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Thu, 12 Nov 2009 17:31:19 +0000 Subject: [PATCH 0375/1000] Merged revisions 7952 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7952 | mdboom | 2009-11-12 12:27:34 -0500 (Thu, 12 Nov 2009) | 2 lines [2853659] Patch to fix EMF backend ........ svn path=/trunk/matplotlib/; revision=7954 --- lib/matplotlib/backends/backend_emf.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/backends/backend_emf.py b/lib/matplotlib/backends/backend_emf.py index c4dc1f8cc133..90b98f392142 100644 --- a/lib/matplotlib/backends/backend_emf.py +++ b/lib/matplotlib/backends/backend_emf.py @@ -46,16 +46,19 @@ def __init__(self,other,angle): other.get_weight(), other.get_stretch(), other.get_size()) - self.__angle=angle + self._angle=angle def __hash__(self): - return hash( (FontProperties.__hash__(self), self.__angle)) + return hash( (FontProperties.__hash__(self), self._angle)) def __str__(self): - return str( (FontProperties.__str__(self), self.__angle)) + return str( (FontProperties.__str__(self), self._angle)) def set_angle(self,angle): - self.__angle=angle + self._angle=angle + + def get_angle(self): + return self._angle # Hashable pen (line style) properties. class EMFPen: From 8c200dab4680efd52012c3a3330fab21d7906ecf Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Thu, 12 Nov 2009 17:57:13 +0000 Subject: [PATCH 0376/1000] Fix previous EINTR fix in case fc-list cannot be run svn path=/trunk/matplotlib/; revision=7955 --- lib/matplotlib/font_manager.py | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/font_manager.py b/lib/matplotlib/font_manager.py index f57e95c4a88f..0baa2537cdc6 100644 --- a/lib/matplotlib/font_manager.py +++ b/lib/matplotlib/font_manager.py @@ -295,8 +295,13 @@ def get_fontconfig_fonts(fontext='ttf'): fontext = get_fontext_synonyms(fontext) fontfiles = {} - pipe = subprocess.Popen(['fc-list', '', 'file'], stdout=subprocess.PIPE) - output = pipe.communicate()[0] + try: + pipe = subprocess.Popen(['fc-list', '', 'file'], stdout=subprocess.PIPE) + output = pipe.communicate()[0] + except OSError: + # Calling fc-list did not work, so we'll just return nothing + return fontfiles + if pipe.returncode == 0: for line in output.split('\n'): fname = line.split(':')[0] @@ -1242,8 +1247,11 @@ def is_opentype_cff_font(filename): def fc_match(pattern, fontext): fontexts = get_fontext_synonyms(fontext) ext = "." + fontext - pipe = subprocess.Popen(['fc-match', '-sv', pattern], stdout=subprocess.PIPE) - output = pipe.communicate()[0] + try: + pipe = subprocess.Popen(['fc-match', '-sv', pattern], stdout=subprocess.PIPE) + output = pipe.communicate()[0] + except OSError: + return None if pipe.returncode == 0: for match in _fc_match_regex.finditer(output): file = match.group(1) From af9954d46e5db3499542859519d0507daeeb157a Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Thu, 12 Nov 2009 20:53:36 +0000 Subject: [PATCH 0377/1000] Fix a number of font manager issues: 1) AFM fonts now store stretch information in the FontManager database 2) pdf.use14corefonts and ps.useafm will now only use the afm files for their respective formats 3) The fontList.cache file is now versioned -- if the version doesn't match the current version of matplotlib it is thrown away and regenerated svn path=/trunk/matplotlib/; revision=7956 --- lib/matplotlib/backends/backend_pdf.py | 15 ++++- lib/matplotlib/backends/backend_ps.py | 10 +++- lib/matplotlib/font_manager.py | 76 +++++++++++++++----------- lib/matplotlib/mathtext.py | 6 +- 4 files changed, 70 insertions(+), 37 deletions(-) diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index 4eefa0869ebf..af67f1c9ba7a 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -363,6 +363,8 @@ def __init__(self, filename): else: raise ValueError("filename must be a path or a file-like object") + self._core14fontdir = os.path.join( + rcParams['datapath'], 'fonts', 'pdfcorefonts') self.fh = fh self.currentstream = None # stream object to write to, if any fh.write("%PDF-1.4\n") # 1.4 is the first version to have alpha @@ -507,7 +509,11 @@ def fontName(self, fontprop): if is_string_like(fontprop): filename = fontprop elif rcParams['pdf.use14corefonts']: - filename = findfont(fontprop, fontext='afm') + filename = findfont( + fontprop, fontext='afm', directory=self._core14fontdir) + if filename is None: + filename = findfont( + "Helvetica", fontext='afm', directory=self._core14fontdir) else: filename = findfont(fontprop) @@ -1743,7 +1749,12 @@ def _get_font_afm(self, prop): key = hash(prop) font = self.afm_font_cache.get(key) if font is None: - filename = findfont(prop, fontext='afm') + filename = findfont( + prop, fontext='afm', directory=self.file._core14fontdir) + if filename is None: + filename = findfont( + "Helvetica", fontext='afm', + directory=self.file._core14fontdir) font = self.afm_font_cache.get(filename) if font is None: fh = file(filename) diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py index 1a3c53017724..db2a2ce7ba60 100644 --- a/lib/matplotlib/backends/backend_ps.py +++ b/lib/matplotlib/backends/backend_ps.py @@ -170,6 +170,9 @@ def __init__(self, width, height, pswriter, imagedpi=72): self.used_characters = {} self.mathtext_parser = MathTextParser("PS") + self._afm_font_dir = os.path.join( + rcParams['datapath'], 'fonts', 'afm') + def track_characters(self, font, s): """Keeps track of which characters are required from each font.""" @@ -312,10 +315,13 @@ def _get_font_afm(self, prop): key = hash(prop) font = self.afmfontd.get(key) if font is None: - fname = findfont(prop, fontext='afm') + fname = findfont(prop, fontext='afm', directory=self._afm_font_dir) + if fname is None: + fname = findfont( + "Helvetica", fontext='afm', directory=self._afm_font_dir) font = self.afmfontd.get(fname) if font is None: - font = AFM(file(findfont(prop, fontext='afm'))) + font = AFM(file(fname)) self.afmfontd[fname] = font self.afmfontd[key] = font return font diff --git a/lib/matplotlib/font_manager.py b/lib/matplotlib/font_manager.py index 0baa2537cdc6..5af570179676 100644 --- a/lib/matplotlib/font_manager.py +++ b/lib/matplotlib/font_manager.py @@ -301,7 +301,7 @@ def get_fontconfig_fonts(fontext='ttf'): except OSError: # Calling fc-list did not work, so we'll just return nothing return fontfiles - + if pipe.returncode == 0: for line in output.split('\n'): fname = line.split(':')[0] @@ -463,8 +463,7 @@ def ttfFontProperty(font): # Relative stretches are: wider, narrower # Child value is: inherit - # !!!! Incomplete - if sfnt4.find('narrow') >= 0 or sfnt4.find('condensed') >= 0 or \ + if sfnt4.find('narrow') >= 0 or sfnt4.find('condensed') >= 0 or \ sfnt4.find('cond') >= 0: stretch = 'condensed' elif sfnt4.find('demi cond') >= 0: @@ -502,6 +501,7 @@ def afmFontProperty(fontpath, font): """ name = font.get_familyname() + fontname = font.get_fontname().lower() # Styles are: italic, oblique, and normal (default) @@ -532,9 +532,15 @@ def afmFontProperty(fontpath, font): # and ultra-expanded. # Relative stretches are: wider, narrower # Child value is: inherit - - # !!!! Incomplete - stretch = 'normal' + if fontname.find('narrow') >= 0 or fontname.find('condensed') >= 0 or \ + fontname.find('cond') >= 0: + stretch = 'condensed' + elif fontname.find('demi cond') >= 0: + stretch = 'semi-condensed' + elif fontname.find('wide') >= 0 or fontname.find('expanded') >= 0: + stretch = 'expanded' + else: + stretch = 'normal' # Sizes can be absolute and relative. # Absolute sizes are: xx-small, x-small, small, medium, large, x-large, @@ -960,12 +966,20 @@ class FontManager: matches the specification. If no good enough match is found, a default font is returned. """ + # Increment this version number whenever the font cache data + # format or behavior has changed and requires a existing font + # cache files to be rebuilt. + __version__ = 5 + def __init__(self, size=None, weight='normal'): + self._version = self.__version__ + self.__default_weight = weight self.default_size = size paths = [os.path.join(rcParams['datapath'], 'fonts', 'ttf'), - os.path.join(rcParams['datapath'], 'fonts', 'afm')] + os.path.join(rcParams['datapath'], 'fonts', 'afm'), + os.path.join(rcParams['datapath'], 'fonts', 'pdfcorefonts')] # Create list of font paths for pathname in ['TTFPATH', 'AFMPATH']: @@ -982,32 +996,23 @@ def __init__(self, size=None, weight='normal'): # Load TrueType fonts and create font dictionary. self.ttffiles = findSystemFonts(paths) + findSystemFonts() + self.defaultFont = {} for fname in self.ttffiles: verbose.report('trying fontname %s' % fname, 'debug') if fname.lower().find('vera.ttf')>=0: - self.defaultFont = fname + self.defaultFont['ttf'] = fname break else: # use anything - self.defaultFont = self.ttffiles[0] + self.defaultFont['ttf'] = self.ttffiles[0] self.ttflist = createFontList(self.ttffiles) - if rcParams['pdf.use14corefonts']: - # Load only the 14 PDF core fonts. These fonts do not need to be - # embedded; every PDF viewing application is required to have them: - # Helvetica, Helvetica-Bold, Helvetica-Oblique, Helvetica-BoldOblique, - # Courier, Courier-Bold, Courier-Oblique, Courier-BoldOblique, - # Times-Roman, Times-Bold, Times-Italic, Times-BoldItalic, Symbol, - # ZapfDingbats. - afmpath = os.path.join(rcParams['datapath'],'fonts','pdfcorefonts') - afmfiles = findSystemFonts(afmpath, fontext='afm') - self.afmlist = createFontList(afmfiles, fontext='afm') - else: - self.afmfiles = findSystemFonts(paths, fontext='afm') + \ - findSystemFonts(fontext='afm') - self.afmlist = createFontList(self.afmfiles, fontext='afm') + self.afmfiles = findSystemFonts(paths, fontext='afm') + \ + findSystemFonts(fontext='afm') + self.afmlist = createFontList(self.afmfiles, fontext='afm') + self.defaultFont['afm'] = None self.ttf_lookup_cache = {} self.afm_lookup_cache = {} @@ -1151,7 +1156,7 @@ def score_size(self, size1, size2): return 1.0 return abs(sizeval1 - sizeval2) / 72.0 - def findfont(self, prop, fontext='ttf'): + def findfont(self, prop, fontext='ttf', directory=None): """ Search the font list for the font that most closely matches the :class:`FontProperties` *prop*. @@ -1162,6 +1167,9 @@ def findfont(self, prop, fontext='ttf'): returned. If no matches below a certain threshold are found, the default font (usually Vera Sans) is returned. + `directory`, is specified, will only return fonts from the + given directory (or subdirectory of that directory). + The result is cached, so subsequent lookups don't have to perform the O(n) nearest neighbor search. @@ -1194,6 +1202,10 @@ def findfont(self, prop, fontext='ttf'): best_font = None for font in fontlist: + if (directory is not None and + os.path.commonprefix([font.fname, directory]) != directory): + print directory, font.fname, os.path.commonprefix([font.fname, directory]) + continue # Matching family should have highest priority, so it is multiplied # by 10.0 score = \ @@ -1211,8 +1223,8 @@ def findfont(self, prop, fontext='ttf'): if best_font is None or best_score >= 10.0: verbose.report('findfont: Could not match %s. Returning %s' % - (prop, self.defaultFont)) - result = self.defaultFont + (prop, self.defaultFont[fontext])) + result = self.defaultFont[fontext] else: verbose.report('findfont: Matching %s to %s (%s) with score of %f' % (prop, best_font.name, best_font.fname, best_score)) @@ -1289,16 +1301,16 @@ def _rebuild(): try: fontManager = pickle_load(_fmcache) - fontManager.default_size = None - verbose.report("Using fontManager instance from %s" % _fmcache) + if (not hasattr(fontManager, '_version') or + fontManager._version != FontManager.__version__): + _rebuild() + else: + fontManager.default_size = None + verbose.report("Using fontManager instance from %s" % _fmcache) except: _rebuild() def findfont(prop, **kw): global fontManager font = fontManager.findfont(prop, **kw) - if not os.path.exists(font): - verbose.report("%s returned by pickled fontManager does not exist" % font) - _rebuild() - font = fontManager.findfont(prop, **kw) return font diff --git a/lib/matplotlib/mathtext.py b/lib/matplotlib/mathtext.py index e2cb33478952..0e8d450d3289 100644 --- a/lib/matplotlib/mathtext.py +++ b/lib/matplotlib/mathtext.py @@ -1032,7 +1032,11 @@ def __init__(self, default_font_prop): self.glyphd = {} self.fonts = {} - filename = findfont(default_font_prop, fontext='afm') + filename = findfont(default_font_prop, fontext='afm', + directory=self.basepath) + if filename is None: + filename = findfont('Helvetica', fontext='afm', + directory=self.basepath) default_font = AFM(file(filename, 'r')) default_font.fname = filename From 8a556328b9ff90095b22f358c3deeb6d31bc6b99 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Thu, 12 Nov 2009 22:17:24 +0000 Subject: [PATCH 0378/1000] docs: update git guide svn path=/trunk/matplotlib/; revision=7957 --- doc/devel/coding_guide.rst | 78 ++++++++++++++++++++++++++++++++------ 1 file changed, 67 insertions(+), 11 deletions(-) diff --git a/doc/devel/coding_guide.rst b/doc/devel/coding_guide.rst index 1911078a52df..3b669c30db3a 100644 --- a/doc/devel/coding_guide.rst +++ b/doc/devel/coding_guide.rst @@ -166,15 +166,14 @@ Cloning the git mirror ~~~~~~~~~~~~~~~~~~~~~~ There is an experimental `matplotlib github mirror`_ of the subversion -repository. To make a local clone of it in the directory ``mpl.git``, +repository. To make a local clone of it in the directory ``matplotlib``, enter the following commands:: - - # Download the entire git repository into "mpl.git", name the source repository "svn". - git clone --origin svn git@github.com:astraw/matplotlib.git mpl.git + # Download the entire git repository into "matplotlib", name the source repository "svn". + git clone --origin svn git@github.com:astraw/matplotlib.git # Change into the newly created git repository. - cd mpl.git + cd matplotlib # Setup the subversion mirroring. git svn init --trunk=trunk/matplotlib --prefix=svn/ https://matplotlib.svn.sourceforge.net/svnroot/matplotlib @@ -187,11 +186,15 @@ enter the following commands:: To install from this cloned repository, use the commands in the :ref:`svn installation ` section:: - > cd mpl.git + > cd matplotlib > python setup.py install -Using git -~~~~~~~~~ +Note that it is not possible to interact with the matplotlib +maintenance branches through git due to different representations of +source code repositories in svnmerge and git. + +An example git workflow +~~~~~~~~~~~~~~~~~~~~~~~ The following is a suggested workflow for git/git-svn. @@ -227,10 +230,63 @@ rebase it to the new trunk:: git checkout whizbang-branch git rebase trunk -Working on a maintenance branch from git -~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +How was this git mirror set up? +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + +These are notes for those interested in mirroring a subversion +repository on github. I pieced this together by lots of +trial-and-error. + +Step 1: Create a local mirror of the svn repository + +:: + + rsync -avzP rsync://matplotlib.svn.sourceforge.net/svn/matplotlib/ matplotlib-svn-rsync/ + +Step 2: Import the svn history into a new git repository + +:: + + #!/bin/bash + set -e + + TARGET=mpl.git.fixed + GIT=/home/astraw/git/bin/git + TRUNKBRANCH=trunk + SVNBRANCHPREFIX="svn/" + + rm -rf $TARGET + mkdir $TARGET + cd $TARGET + + $GIT init + $GIT svn init --rewrite-root=https://matplotlib.svn.sourceforge.net/svnroot/matplotlib \ + --trunk=trunk/matplotlib --prefix=$SVNBRANCHPREFIX file:///mnt/workdisk/tmp/matplotlib-svn-rsync + $GIT svn fetch + + # now, make master branch track ${SVNBRANCHPREFIX}trunk + $GIT checkout master -b tmp + $GIT branch -d master + $GIT checkout ${SVNBRANCHPREFIX}trunk -b $TRUNKBRANCH + $GIT branch -D tmp + $GIT svn rebase -l + +Step 3: Upload the git repository to github + +:: + + #!/bin/bash + set -e + + TARGET=mpl.git.fixed + GIT=/home/astraw/git/bin/git + TRUNKBRANCH=trunk + SVNBRANCHPREFIX="svn/" + + cd $TARGET -The matplotlib maintenance branches are not available through git. + $GIT remote add github git@github.com:astraw/matplotlib.git + git push github $TRUNKBRANCH:master .. _style-guide: From 43d4b59454b394f83451f05e6761d729049868e6 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Thu, 12 Nov 2009 22:47:43 +0000 Subject: [PATCH 0379/1000] axes.py: remove redundant variable svn path=/trunk/matplotlib/; revision=7958 --- lib/matplotlib/axes.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index da56038f1dc7..f3670ab2162d 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -1698,7 +1698,7 @@ def draw(self, renderer=None, inframe=False): artists.extend(self.spines.itervalues()) - dsu = [ (a.zorder, i, a) for i, a in enumerate(artists) + dsu = [ (a.zorder, a) for a in artists if not a.get_animated() ] dsu.sort() @@ -1721,7 +1721,7 @@ def draw(self, renderer=None, inframe=False): if len(self.images)<=1 or renderer.option_image_nocomposite(): for im in self.images: - dsu.append( (im.zorder, len(dsu), im) ) + dsu.append( (im.zorder, im) ) dsu.sort() # re-sort with images now else: # make a composite image blending alpha @@ -1757,11 +1757,11 @@ def draw(self, renderer=None, inframe=False): gc.restore() if dsu_rasterized: - for zorder, i, a in dsu_rasterized: + for zorder, a in dsu_rasterized: a.draw(renderer) renderer.stop_rasterizing() - for zorder, i, a in dsu: + for zorder, a in dsu: a.draw(renderer) renderer.close_group('axes') From 750692a121f5914907c7b61a4c96b78948fd4bd2 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Thu, 12 Nov 2009 22:49:37 +0000 Subject: [PATCH 0380/1000] fix typo svn path=/trunk/matplotlib/; revision=7959 --- lib/matplotlib/backend_bases.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 7a223e14fdd5..0e953aecf4c2 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -335,7 +335,7 @@ def draw_image(self, gc, x, y, im): def option_image_nocomposite(self): """ - overwrite this method for renderers that do not necessarily + override this method for renderers that do not necessarily want to rescale and composite raster images. (like SVG) """ return False From 75f665d1036c98d3096b6532b41d3b36f350e2e1 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Thu, 12 Nov 2009 23:05:45 +0000 Subject: [PATCH 0381/1000] image.py: change default image zorder 1 -> 0 svn path=/trunk/matplotlib/; revision=7960 --- lib/matplotlib/image.py | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index 63a9e3bdaad1..0341e10db288 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -27,7 +27,7 @@ from matplotlib.transforms import BboxBase class _AxesImageBase(martist.Artist, cm.ScalarMappable): - zorder = 1 + zorder = 0 # map interpolation strings to module constants _interpd = { 'nearest' : _image.NEAREST, @@ -687,7 +687,7 @@ def set_alpha(self, alpha): self.update_dict['array'] = True class FigureImage(martist.Artist, cm.ScalarMappable): - zorder = 1 + zorder = 0 def __init__(self, fig, cmap = None, norm = None, @@ -805,7 +805,6 @@ class BboxImage(_AxesImageBase): """ The Image class whose size is determined by the given bbox. """ - zorder = 1 def __init__(self, bbox, cmap = None, norm = None, From c926c2632a9c4bd70a68533f896d796cf114d4ec Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Thu, 12 Nov 2009 23:07:36 +0000 Subject: [PATCH 0382/1000] examples/pylab_examples/dolphin.py: fix zorder issue svn path=/trunk/matplotlib/; revision=7961 --- examples/pylab_examples/dolphin.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/pylab_examples/dolphin.py b/examples/pylab_examples/dolphin.py index f59b9ccd4ae4..f457ccc0c796 100644 --- a/examples/pylab_examples/dolphin.py +++ b/examples/pylab_examples/dolphin.py @@ -20,7 +20,7 @@ im = plt.imshow(np.random.random((100, 100)), origin='lower', cmap=cm.winter, interpolation='spline36', - extent=([-1, 1, -1, 1]), zorder=1000) + extent=([-1, 1, -1, 1])) im.set_clip_path(circle) plt.plot(x, y, 'o', color=(0.9, 0.9, 1.0), alpha=0.8) From a5729a54322bdab07d935808a129f2ed5232dcb9 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Fri, 13 Nov 2009 00:44:03 +0000 Subject: [PATCH 0383/1000] testing bugfix: don't save test results to site-packages svn path=/trunk/matplotlib/; revision=7962 --- lib/matplotlib/testing/decorators.py | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index d9284ff8e0f8..1e91375e7a84 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -1,6 +1,6 @@ from matplotlib.testing.noseclasses import KnownFailureTest, \ KnownFailureDidNotFailTest, ImageComparisonFailure -import os, sys +import os, sys, shutil import nose import matplotlib import matplotlib.tests @@ -85,7 +85,11 @@ def compare_images_decorator(func): def compare_images_generator(): for extension in extensions: - expected_fnames = [os.path.join(baseline_dir,fname) + '.' + extension for fname in baseline_images] + orig_expected_fnames = [os.path.join(baseline_dir,fname) + '.' + extension for fname in baseline_images] + expected_fnames = [os.path.join(result_dir,'expected-'+fname) + '.' + extension for fname in baseline_images] + for src,dst in zip( orig_expected_fnames, expected_fnames ): + if not os.path.exists(dst): + shutil.copyfile(src,dst) actual_fnames = [os.path.join(result_dir, fname) + '.' + extension for fname in baseline_images] have_baseline_images = [os.path.exists(expected) for expected in expected_fnames] have_baseline_image = np.all(have_baseline_images) @@ -148,15 +152,10 @@ def _image_directories(func): basedir = os.path.dirname(matplotlib.tests.__file__) baseline_dir = os.path.join(basedir,'baseline_images',subdir) - result_dir = os.path.join(basedir,'current_images',subdir) + result_dir = os.path.abspath(os.path.join('result_images',subdir)) if not os.path.exists(result_dir): - try: - # make the current_images directory first - os.mkdir(os.path.join(basedir,'current_images')) - except OSError: - pass # probably exists already - os.mkdir(result_dir) + os.makedirs(result_dir) return baseline_dir, result_dir From b386a562dd61e8e6cc999d9812c460e45b6e6434 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Fri, 13 Nov 2009 00:44:11 +0000 Subject: [PATCH 0384/1000] testing bugfix: buildbot postmortem uses new file locations from r7830 svn path=/trunk/matplotlib/; revision=7963 --- test/_buildbot_test_postmortem.py | 10 +++++++--- 1 file changed, 7 insertions(+), 3 deletions(-) diff --git a/test/_buildbot_test_postmortem.py b/test/_buildbot_test_postmortem.py index 672347d48908..ba7f272567f2 100644 --- a/test/_buildbot_test_postmortem.py +++ b/test/_buildbot_test_postmortem.py @@ -81,9 +81,13 @@ def path_split_all(fname): # new matplotlib.testing infrastructure os.chdir('test') - for fname in glob.glob('*.png'): - absdiff_fname = diff_basename + fname - expected_fname = expected_basename + fname + for fname in get_recursive_filelist(['result_images']): + # only images + if not fname.endswith('.png'): continue + + result_dir, result_fname = os.path.split(fname) + absdiff_fname = os.path.join( result_dir, diff_basename + result_fname) + expected_fname = os.path.join( result_dir, expected_basename + result_fname) if not os.path.exists(absdiff_fname): continue if not os.path.exists(expected_fname): From 974b3600895465906276f8ae92a8d6f7d5f1f191 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Fri, 13 Nov 2009 19:22:52 +0000 Subject: [PATCH 0385/1000] Expose the pdf information dictionary svn path=/trunk/matplotlib/; revision=7964 --- CHANGELOG | 3 ++ doc/api/api_changes.rst | 3 +- examples/pylab_examples/multipage_pdf.py | 10 ++++ lib/matplotlib/backends/backend_pdf.py | 59 ++++++++++++++++++++---- 4 files changed, 66 insertions(+), 9 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 3b05d9149ddb..3f9bd98c4464 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2009-11-13 The pdf backend now allows changing the contents of + a pdf file's information dictionary via PdfPages.infodict. - JKS + 2009-11-12 font_manager.py should no longer cause EINTR on Python 2.6 (but will on the 2.5 version of subprocess). Also the fc-list command in that file was fixed so now it should diff --git a/doc/api/api_changes.rst b/doc/api/api_changes.rst index c15dfb52a287..8a6f20057d3c 100644 --- a/doc/api/api_changes.rst +++ b/doc/api/api_changes.rst @@ -10,7 +10,8 @@ list may help describe what changes may be necessary in your code. Changes beyond 0.99.x ===================== -* You can now print several figures to one pdf file. See the docstrings +* You can now print several figures to one pdf file and modify the + document information dictionary of a pdf file. See the docstrings of the class :class:`matplotlib.backends.backend_pdf.PdfPages` for more information. diff --git a/examples/pylab_examples/multipage_pdf.py b/examples/pylab_examples/multipage_pdf.py index 7e727acaec8b..9f385da877c4 100644 --- a/examples/pylab_examples/multipage_pdf.py +++ b/examples/pylab_examples/multipage_pdf.py @@ -1,5 +1,6 @@ # This is a demo of creating a pdf file with several pages. +import datetime import numpy as np import matplotlib from matplotlib.backends.backend_pdf import PdfPages @@ -29,5 +30,14 @@ pdf.savefig(fig) # or you can pass a Figure object to pdf.savefig close() +# We can also set the file's metadata via the PdfPages object: +d = pdf.infodict() +d['Title'] = 'Multipage PDF Example' +d['Author'] = u'Jouni K. Sepp\xe4nen' +d['Subject'] = 'How to create a multipage pdf file and set its metadata' +d['Keywords'] = 'PdfPages multipage keywords author title subject' +d['CreationDate'] = datetime.datetime(2009,11,13) +d['ModDate'] = datetime.datetime.today() + # Remember to close the object - otherwise the file will not be usable pdf.close() diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index af67f1c9ba7a..efeaf603e501 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -5,6 +5,7 @@ """ from __future__ import division +import codecs import os import re import sys @@ -149,6 +150,16 @@ def pdfRepr(obj): elif isinstance(obj, (int, long)): return "%d" % obj + # Unicode strings are encoded in UTF-16BE with byte-order mark. + elif isinstance(obj, unicode): + try: + # But maybe it's really ASCII? + s = obj.encode('ASCII') + return pdfRepr(s) + except UnicodeEncodeError: + s = codecs.BOM_UTF16_BE + obj.encode('UTF-16BE') + return pdfRepr(s) + # Strings are written in parentheses, with backslashes and parens # escaped. Actually balanced parens are allowed, but it is # simpler to escape them all. TODO: cut long strings into lines; @@ -374,7 +385,6 @@ def __init__(self, filename): fh.write("%\254\334 \253\272\n") self.rootObject = self.reserveObject('root') - self.infoObject = self.reserveObject('info') self.pagesObject = self.reserveObject('pages') self.pageList = [] self.fontObject = self.reserveObject('fonts') @@ -388,13 +398,12 @@ def __init__(self, filename): 'Pages': self.pagesObject } self.writeObject(self.rootObject, root) - info = { 'Creator': 'matplotlib ' + __version__ \ - + ', http://matplotlib.sf.net', - 'Producer': 'matplotlib pdf backend', - 'CreationDate': datetime.today() } - - # Possible TODO: Title, Author, Subject, Keywords - self.writeObject(self.infoObject, info) + revision = '$Rev$'.strip('$').split(':')[1].strip() + self.infoDict = { + 'Creator': 'matplotlib %s, http://matplotlib.sf.net' % __version__, + 'Producer': 'matplotlib pdf backend r%s' % revision, + 'CreationDate': datetime.today() + } self.fontNames = {} # maps filenames to internal font names self.nextFont = 1 # next free internal font name @@ -471,6 +480,7 @@ def close(self): { 'Type': Name('Pages'), 'Kids': self.pageList, 'Count': len(self.pageList) }) + self.writeInfoDict() # Finalize the file self.writeXref() @@ -1280,6 +1290,31 @@ def writeXref(self): if borken: raise AssertionError, 'Indirect object does not exist' + def writeInfoDict(self): + """Write out the info dictionary, checking it for good form""" + + is_date = lambda x: isinstance(x, datetime) + check_trapped = lambda x: isinstance(x, Name) and x.name in \ + ('True', 'False', 'Unknown') + keywords = {'Title': is_string_like, + 'Author': is_string_like, + 'Subject': is_string_like, + 'Keywords': is_string_like, + 'Creator': is_string_like, + 'Producer': is_string_like, + 'CreationDate': is_date, + 'ModDate': is_date, + 'Trapped': check_trapped} + for k in self.infoDict.keys(): + if k not in keywords: + warnings.warn('Unknown infodict keyword: %s' % k) + else: + if not keywords[k](self.infoDict[k]): + warnings.warn('Bad value for infodict keyword %s' % k) + + self.infoObject = self.reserveObject('info') + self.writeObject(self.infoObject, self.infoDict) + def writeTrailer(self): """Write out the PDF trailer.""" @@ -2052,6 +2087,14 @@ def close(self): self._file.close() self._file = None + def infodict(self): + """ + Return a modifiable information dictionary object + (see PDF reference section 10.2.1 'Document Information + Dictionary'). + """ + return self._file.infoDict + def savefig(self, figure=None, **kwargs): """ Save the Figure instance *figure* to this file as a new page. From d6477746fc4b782688bbc0f6dd3c9a1a78ad55a3 Mon Sep 17 00:00:00 2001 From: Jeff Whitaker Date: Sat, 14 Nov 2009 15:57:46 +0000 Subject: [PATCH 0386/1000] fix bug in griddata that occurs when mask is a scalar boolean (found by James Conners) svn path=/trunk/matplotlib/; revision=7965 --- lib/matplotlib/mlab.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/mlab.py b/lib/matplotlib/mlab.py index 1ddb70330708..91c0cbeef5b0 100644 --- a/lib/matplotlib/mlab.py +++ b/lib/matplotlib/mlab.py @@ -2687,9 +2687,11 @@ def griddata(x,y,z,xi,yi,interp='nn'): raise TypeError("inputs x,y,z must all be 1D arrays of the same length") # remove masked points. if hasattr(z,'mask'): - x = x.compress(z.mask == False) - y = y.compress(z.mask == False) - z = z.compressed() + # make sure mask is not a scalar boolean array. + if a.mask.ndim: + x = x.compress(z.mask == False) + y = y.compress(z.mask == False) + z = z.compressed() if _use_natgrid: # use natgrid toolkit if available. if interp != 'nn': raise ValueError("only natural neighor interpolation" From ca73ea342ffe5135c9cf47319c19e9891aa5c8ef Mon Sep 17 00:00:00 2001 From: Jeff Whitaker Date: Sat, 14 Nov 2009 15:58:16 +0000 Subject: [PATCH 0387/1000] make sure data points are plotted on top of filled contours. svn path=/trunk/matplotlib/; revision=7966 --- examples/pylab_examples/griddata_demo.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/examples/pylab_examples/griddata_demo.py b/examples/pylab_examples/griddata_demo.py index 1050115635c1..a72ad3f00ac7 100644 --- a/examples/pylab_examples/griddata_demo.py +++ b/examples/pylab_examples/griddata_demo.py @@ -11,15 +11,15 @@ z = x*np.exp(-x**2-y**2) # define grid. xi = np.linspace(-2.1,2.1,100) -yi = np.linspace(-2.1,2.1,100) +yi = np.linspace(-2.1,2.1,200) # grid the data. -zi = griddata(x,y,z,xi,yi) +zi = griddata(x,y,z,xi,yi,interp='linear') # contour the gridded data, plotting dots at the nonuniform data points. CS = plt.contour(xi,yi,zi,15,linewidths=0.5,colors='k') CS = plt.contourf(xi,yi,zi,15,cmap=plt.cm.jet) plt.colorbar() # draw colorbar # plot data points. -plt.scatter(x,y,marker='o',c='b',s=5) +plt.scatter(x,y,marker='o',c='b',s=5,zorder=10) plt.xlim(-2,2) plt.ylim(-2,2) plt.title('griddata test (%d points)' % npts) From 50509ca09a94ece2ab3848d3e147054e01002445 Mon Sep 17 00:00:00 2001 From: Michiel de Hoon Date: Sun, 15 Nov 2009 14:07:11 +0000 Subject: [PATCH 0388/1000] Fixing the order of transformations; see bug #2896668 on sourceforge. The master transformation was moved to backend_macosx.py. svn path=/trunk/matplotlib/; revision=7968 --- lib/matplotlib/backends/backend_macosx.py | 9 +- src/_macosx.m | 163 +++++++++------------- 2 files changed, 69 insertions(+), 103 deletions(-) diff --git a/lib/matplotlib/backends/backend_macosx.py b/lib/matplotlib/backends/backend_macosx.py index 11423304e618..4895746741c0 100644 --- a/lib/matplotlib/backends/backend_macosx.py +++ b/lib/matplotlib/backends/backend_macosx.py @@ -63,12 +63,15 @@ def draw_path_collection(self, gc, master_transform, paths, all_transforms, linewidths, linestyles, antialiaseds, urls): cliprect = gc.get_clip_rectangle() clippath, clippath_transform = gc.get_clip_path() - gc.draw_path_collection(master_transform, - cliprect, + if all_transforms: + transforms = [numpy.dot(master_transform, t) for t in all_transforms] + else: + transforms = [master_transform] + gc.draw_path_collection(cliprect, clippath, clippath_transform, paths, - all_transforms, + transforms, offsets, offsetTrans, facecolors, diff --git a/src/_macosx.m b/src/_macosx.m index 7d1c1265c658..8107882091dc 100644 --- a/src/_macosx.m +++ b/src/_macosx.m @@ -1165,7 +1165,6 @@ static BOOL _clip(CGContextRef cr, PyObject* object) static PyObject* GraphicsContext_draw_path_collection (GraphicsContext* self, PyObject* args) { - PyObject* master_transform; PyObject* cliprect; PyObject* clippath; PyObject* clippath_transform; @@ -1187,19 +1186,18 @@ static BOOL _clip(CGContextRef cr, PyObject* object) return NULL; } - if(!PyArg_ParseTuple(args, "OOOOOOOOOOOOO", &master_transform, - &cliprect, - &clippath, - &clippath_transform, - &paths, - &transforms, - &offsets, - &offset_transform, - &facecolors, - &edgecolors, - &linewidths, - &linestyles, - &antialiaseds)) + if(!PyArg_ParseTuple(args, "OOOOOOOOOOOO", &cliprect, + &clippath, + &clippath_transform, + &paths, + &transforms, + &offsets, + &offset_transform, + &facecolors, + &edgecolors, + &linewidths, + &linestyles, + &antialiaseds)) return NULL; int ok = 1; @@ -1235,43 +1233,22 @@ static BOOL _clip(CGContextRef cr, PyObject* object) PyErr_SetString(PyExc_ValueError, "transforms must be a sequence object"); return NULL; } - Py_ssize_t Ntransforms = PySequence_Size(transforms); - - CGContextSaveGState(cr); - /* ------------------- Set master transform --------------------------- */ - - if (Ntransforms) + const Py_ssize_t Ntransforms = PySequence_Size(transforms); + if (Ntransforms==0) { - CGAffineTransform master; - double a, b, c, d, tx, ty; - PyObject* values = PyObject_CallMethod(master_transform, "to_values", ""); - if (!values) - { - ok = 0; - goto exit; - } - if (!PyTuple_Check(values)) - { - Py_DECREF(values); - ok = 0; - goto exit; - } - /* CGAffineTransform contains CGFloat; cannot use master directly */ - ok = PyArg_ParseTuple(values, "dddddd", &a, &b, &c, &d, &tx, &ty); - Py_DECREF(values); - master.a = a; - master.b = b; - master.c = c; - master.d = d; - master.tx = tx; - master.ty = ty; - if (!ok) goto exit; - CGContextConcatCTM(cr, master); + PyErr_SetString(PyExc_ValueError, "transforms should contain at least one item"); + return NULL; } - /* ------------------- Check offsets array ---------------------------- */ + /* ------------------- Read drawing arrays ---------------------------- */ + CGContextSaveGState(cr); offsets = PyArray_FromObject(offsets, NPY_DOUBLE, 0, 2); + facecolors = PyArray_FromObject(facecolors, NPY_DOUBLE, 1, 2); + edgecolors = PyArray_FromObject(edgecolors, NPY_DOUBLE, 1, 2); + + /* ------------------- Check offsets array ---------------------------- */ + if (!offsets || (PyArray_NDIM(offsets)==2 && PyArray_DIM(offsets, 1)!=2) || (PyArray_NDIM(offsets)==1 && PyArray_DIM(offsets, 0)!=0)) @@ -1282,11 +1259,36 @@ static BOOL _clip(CGContextRef cr, PyObject* object) } const Py_ssize_t Noffsets = PyArray_DIM(offsets, 0); + /* ------------------- Check facecolors array ------------------------- */ + + if (!facecolors || + (PyArray_NDIM(facecolors)==1 && PyArray_DIM(facecolors, 0)!=0) || + (PyArray_NDIM(facecolors)==2 && PyArray_DIM(facecolors, 1)!=4)) + { + PyErr_SetString(PyExc_ValueError, "Facecolors must by a Nx4 numpy array or empty"); + ok = 0; + goto exit; + } + + /* ------------------- Check edgecolors array ------------------------- */ + + if (!edgecolors || + (PyArray_NDIM(edgecolors)==1 && PyArray_DIM(edgecolors, 0)!=0) || + (PyArray_NDIM(edgecolors)==2 && PyArray_DIM(edgecolors, 1)!=4)) + { + PyErr_SetString(PyExc_ValueError, "Edgecolors must by a Nx4 numpy array or empty"); + ok = 0; + goto exit; + } + + /* -------------------------------------------------------------------- */ + + if (Npaths==0) goto exit; /* Nothing to do */ + /* -------------------------------------------------------------------- */ Np = Npaths > Ntransforms ? Npaths : Ntransforms; N = Np > Noffsets ? Np : Noffsets; - if (N < Ntransforms) Ntransforms = N; p = malloc(Np*sizeof(CGMutablePathRef)); if (!p) @@ -1305,35 +1307,22 @@ static BOOL _clip(CGContextRef cr, PyObject* object) ok = 0; goto exit; } - if (Ntransforms) + transform = PySequence_ITEM(transforms, i % Ntransforms); + if (!transform) { - transform = PySequence_ITEM(transforms, i % Ntransforms); - if (!transform) - { - PyErr_SetString(PyExc_RuntimeError, - "failed to obtain transform"); - ok = 0; - goto exit; - } - iterator = get_path_iterator(path, - transform, - 1, - 0, - rect, - mode, - 0); - Py_DECREF(transform); - } - else - { - iterator = get_path_iterator(path, - master_transform, - 1, - 0, - rect, - mode, - 0); + PyErr_SetString(PyExc_RuntimeError, "failed to obtain transform"); + Py_DECREF(path); + ok = 0; + goto exit; } + iterator = get_path_iterator(path, + transform, + 1, + 0, + rect, + mode, + 0); + Py_DECREF(transform); Py_DECREF(path); if (!iterator) { @@ -1381,30 +1370,6 @@ static BOOL _clip(CGContextRef cr, PyObject* object) if (n > 0) CGContextClip(cr); } - /* ------------------- Check facecolors array ------------------------- */ - - facecolors = PyArray_FromObject(facecolors, NPY_DOUBLE, 1, 2); - if (!facecolors || - (PyArray_NDIM(facecolors)==1 && PyArray_DIM(facecolors, 0)!=0) || - (PyArray_NDIM(facecolors)==2 && PyArray_DIM(facecolors, 1)!=4)) - { - PyErr_SetString(PyExc_ValueError, "Facecolors must by a Nx4 numpy array or empty"); - ok = 0; - goto exit; - } - - /* ------------------- Check edgecolors array ------------------------- */ - - edgecolors = PyArray_FromObject(edgecolors, NPY_DOUBLE, 1, 2); - if (!edgecolors || - (PyArray_NDIM(edgecolors)==1 && PyArray_DIM(edgecolors, 0)!=0) || - (PyArray_NDIM(edgecolors)==2 && PyArray_DIM(edgecolors, 1)!=4)) - { - PyErr_SetString(PyExc_ValueError, "Edgecolors must by a Nx4 numpy array or empty"); - ok = 0; - goto exit; - } - /* ------------------- Check the other arguments ---------------------- */ if (!PySequence_Check(linewidths)) @@ -1610,7 +1575,6 @@ static BOOL _clip(CGContextRef cr, PyObject* object) free(p); } if (!ok) return NULL; - Py_INCREF(Py_None); return Py_None; } @@ -2390,7 +2354,6 @@ static BOOL _clip(CGContextRef cr, PyObject* object) PyErr_SetString(PyExc_RuntimeError, "ATSUDrawText failed"); return NULL; } - Py_INCREF(Py_None); return Py_None; } From 687fe27e909522c853ee386046d3a74ef4ebce27 Mon Sep 17 00:00:00 2001 From: Michiel de Hoon Date: Sun, 15 Nov 2009 14:17:14 +0000 Subject: [PATCH 0389/1000] Bracket each call to new_gc() by a corresponding call to gc.restore() to avoid bugs in the Cairo and Mac OS X backends. svn path=/trunk/matplotlib/; revision=7969 --- lib/matplotlib/patheffects.py | 3 +++ lib/matplotlib/text.py | 1 + 2 files changed, 4 insertions(+) diff --git a/lib/matplotlib/patheffects.py b/lib/matplotlib/patheffects.py index 067fb50dedf4..329f5f8d8cab 100644 --- a/lib/matplotlib/patheffects.py +++ b/lib/matplotlib/patheffects.py @@ -119,6 +119,7 @@ def draw_path(self, renderer, gc, tpath, affine, rgbFace): gc0 = self._update_gc(gc0, self._gc) renderer.draw_path(gc0, tpath, affine, None) + gc0.restore() class withStroke(Stroke): @@ -183,6 +184,7 @@ def draw_path(self, renderer, gc, tpath, affine, rgbFace): gc0 = self._update_gc(gc0, self._gc) renderer.draw_path(gc0, tpath, affine0, shadow_rgbFace) + gc0.restore() class withSimplePatchShadow(SimplePatchShadow): @@ -198,6 +200,7 @@ def draw_path(self, renderer, gc, tpath, affine, rgbFace): gc1.copy_properties(gc) gc1.set_alpha(gc1.get_alpha()*self._patch_alpha) renderer.draw_path(gc1, tpath, affine, rgbFace) + gc1.restore() if __name__ == '__main__': diff --git a/lib/matplotlib/text.py b/lib/matplotlib/text.py index 4486ee137a6a..66472adfda28 100644 --- a/lib/matplotlib/text.py +++ b/lib/matplotlib/text.py @@ -590,6 +590,7 @@ def draw(self, renderer): else: renderer.draw_tex(gc, x, y, clean_line, self._fontproperties, angle) + gc.restore() renderer.close_group('text') return From a8aa115e8fad1d3bbb51c7d87af47e510ca1a315 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Mon, 16 Nov 2009 23:53:13 +0000 Subject: [PATCH 0390/1000] Merged revisions 7970 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7970 | efiring | 2009-11-16 13:49:11 -1000 (Mon, 16 Nov 2009) | 4 lines Fix Normalize bug: ensure scalar output for scalar input. This bug was causing a bug in clabel with a single contour level, as reported by Brendan Arnold. ........ svn path=/trunk/matplotlib/; revision=7971 --- lib/matplotlib/colors.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/colors.py b/lib/matplotlib/colors.py index 00e30882bbab..52110028d773 100644 --- a/lib/matplotlib/colors.py +++ b/lib/matplotlib/colors.py @@ -794,7 +794,7 @@ def __call__(self, value, clip=None): if vmin > vmax: raise ValueError("minvalue must be less than or equal to maxvalue") elif vmin==vmax: - return 0.0 * val + result = 0.0 * val else: if clip: mask = ma.getmask(val) @@ -855,7 +855,7 @@ def __call__(self, value, clip=None): elif vmin<=0: raise ValueError("values must all be positive") elif vmin==vmax: - return 0.0 * val + result = 0.0 * val else: if clip: mask = ma.getmask(val) From c45ab91214c3df28f93234a1a8a162a8e5714d55 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 18 Nov 2009 16:30:16 +0000 Subject: [PATCH 0391/1000] Fix plot directive so it handles source files in various encodings. svn path=/trunk/matplotlib/; revision=7973 --- lib/matplotlib/sphinxext/plot_directive.py | 28 ++++++++++++++-------- 1 file changed, 18 insertions(+), 10 deletions(-) diff --git a/lib/matplotlib/sphinxext/plot_directive.py b/lib/matplotlib/sphinxext/plot_directive.py index 4296bd4cf2b1..d28e21c62eb9 100644 --- a/lib/matplotlib/sphinxext/plot_directive.py +++ b/lib/matplotlib/sphinxext/plot_directive.py @@ -38,7 +38,9 @@ Additionally, if the `:include-source:` option is provided, the literal source will be displayed inline in the text, (as well as a -link to the source in HTML). +link to the source in HTML). If this source file is in a non-UTF8 or +non-ASCII encoding, the encoding must be specified using the +`:encoding:` option. The set of file formats to generate can be specified with the `plot_formats` configuration variable. @@ -331,14 +333,21 @@ def _plot_directive(plot_path, basedir, function_name, plot_code, caption, # Now start generating the lines of output lines = [] + if plot_code is None: + shutil.copyfile(plot_path, os.path.join(destdir, fname)) + if options.has_key('include-source'): if plot_code is None: - fd = open(plot_path, 'r') - plot_code = fd.read() - fd.close() - lines.extend(['::', '']) - lines.extend([' %s' % row.rstrip() - for row in plot_code.split('\n')]) + lines.extend( + ['.. include:: %s' % os.path.join(setup.app.builder.srcdir, plot_path), + ' :literal:']) + if options.has_key('encoding'): + lines.append(' :encoding: %s' % options['encoding']) + del options['encoding'] + else: + lines.extend(['::', '']) + lines.extend([' %s' % row.rstrip() + for row in plot_code.split('\n')]) lines.append('') del options['include-source'] else: @@ -348,8 +357,6 @@ def _plot_directive(plot_path, basedir, function_name, plot_code, caption, options = ['%s:%s: %s' % (template_content_indent, key, val) for key, val in options.items()] options = "\n".join(options) - if plot_code is None: - shutil.copyfile(plot_path, os.path.join(destdir, fname)) for i in range(num_figs): if num_figs == 1: @@ -425,7 +432,8 @@ def setup(app): 'scale': directives.nonnegative_int, 'align': align, 'class': directives.class_option, - 'include-source': directives.flag } + 'include-source': directives.flag, + 'encoding': directives.encoding } app.add_directive('plot', plot_directive, True, (0, 2, 0), **options) app.add_config_value( From 6934781e9dd995073f21d7561a650bddcadbb4f9 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 18 Nov 2009 16:33:54 +0000 Subject: [PATCH 0392/1000] Merged revisions 7972 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7972 | mdboom | 2009-11-18 11:19:21 -0500 (Wed, 18 Nov 2009) | 2 lines Fix plot directive so it handles source files in various encodings. ........ svn path=/trunk/matplotlib/; revision=7974 From 57fd362f17212027e1fdc550377eb4d5e5c22af7 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Fri, 20 Nov 2009 19:08:18 +0000 Subject: [PATCH 0393/1000] hide numpys datetime in pylab svn path=/trunk/matplotlib/; revision=7975 --- lib/matplotlib/pylab.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/matplotlib/pylab.py b/lib/matplotlib/pylab.py index f9c261b92796..df296c3eb299 100644 --- a/lib/matplotlib/pylab.py +++ b/lib/matplotlib/pylab.py @@ -273,3 +273,6 @@ def save(*args, **kwargs): files, we recommend numpy.savetxt. For saving numpy arrays, we recommend numpy.save, and its analog numpy.load, which are available in pylab as np.save and np.load.""" + +# don't let numpy's datetime hide stdlib +import datetime From a42ae7f76559c2d89a3e3abbc2e506a5fcec4ea8 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 23 Nov 2009 03:38:11 +0000 Subject: [PATCH 0394/1000] bugfix: don't crash PDF backend when not using SVN checkout svn path=/trunk/matplotlib/; revision=7979 --- lib/matplotlib/backends/backend_pdf.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index efeaf603e501..729f5b612820 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -398,10 +398,14 @@ def __init__(self, filename): 'Pages': self.pagesObject } self.writeObject(self.rootObject, root) - revision = '$Rev$'.strip('$').split(':')[1].strip() + svn_special_string = '$Rev$' # on checkout, gets replaced by svn client + if ':' in svn_special_string: + revision = ' r'+svn_special_string.strip('$').split(':')[1].strip() + else: + revision = '' self.infoDict = { 'Creator': 'matplotlib %s, http://matplotlib.sf.net' % __version__, - 'Producer': 'matplotlib pdf backend r%s' % revision, + 'Producer': 'matplotlib pdf backend%s' % revision, 'CreationDate': datetime.today() } From 78ef1dffa1a75d54bc782af5e43a34d4258eaacb Mon Sep 17 00:00:00 2001 From: John Hunter Date: Mon, 23 Nov 2009 20:26:44 +0000 Subject: [PATCH 0395/1000] make index formatter derive from base svn path=/trunk/matplotlib/; revision=7980 --- lib/matplotlib/dates.py | 1 + lib/matplotlib/ticker.py | 7 ++++--- 2 files changed, 5 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/dates.py b/lib/matplotlib/dates.py index b1c1deab5d85..5e513d29aea0 100644 --- a/lib/matplotlib/dates.py +++ b/lib/matplotlib/dates.py @@ -454,6 +454,7 @@ def __call__(self, x, pos=0): return self._formatter(x, pos) + class rrulewrapper: def __init__(self, freq, **kwargs): diff --git a/lib/matplotlib/ticker.py b/lib/matplotlib/ticker.py index fe1ab298d9f6..b98cda2a706f 100644 --- a/lib/matplotlib/ticker.py +++ b/lib/matplotlib/ticker.py @@ -206,13 +206,14 @@ def fix_minus(self, s): """ return s -class IndexFormatter: +class IndexFormatter(Formatter): """ format the position x to the nearest i-th label where i=int(x+0.5) """ def __init__(self, labels): self.labels = labels self.n = len(labels) + def __call__(self, x, pos=None): 'Return the format for tick val x at position pos; pos=None indicated unspecified' i = int(x+0.5) @@ -657,7 +658,7 @@ class Locator(TickHelper): because the locator stores references to the Axis data and view limits """ - + # some automatic tick locators can generate so many ticks they # kill the machine when you try and render them, see eg sf bug # report @@ -673,7 +674,7 @@ def raise_if_exceeds(self, locs): 'raise a RuntimeError if Locator attempts to create more than MAXTICKS locs' if len(locs)>=self.MAXTICKS: raise RuntimeError('Locator attempting to generate %d ticks from %s to %s: exceeds Locator.MAXTICKS'%(len(locs), locs[0], locs[-1])) - + return locs def view_limits(self, vmin, vmax): From 4dcb9a81eebab8f02e3baf2a3c349678d0371912 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Mon, 23 Nov 2009 21:18:06 +0000 Subject: [PATCH 0396/1000] Merged revisions 7981 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7981 | jdh2358 | 2009-11-23 13:16:15 -0800 (Mon, 23 Nov 2009) | 1 line make IndexFormatter derive from Formatter ........ svn path=/trunk/matplotlib/; revision=7982 --- doc/_templates/indexsidebar.html | 4 +--- doc/users/image_tutorial.rst | 4 ++-- 2 files changed, 3 insertions(+), 5 deletions(-) diff --git a/doc/_templates/indexsidebar.html b/doc/_templates/indexsidebar.html index 38547af89b76..878e5d7fef76 100644 --- a/doc/_templates/indexsidebar.html +++ b/doc/_templates/indexsidebar.html @@ -4,10 +4,8 @@

    News

    Please donate to support matplotlib development.

    -

    We have a release candidate of matplotlib 0.99.1 available for testing. Please report any problems on the tracker and mailing list. -

    -

    matplotlib 0.99.0 is available for download. See what's new and tips on download. See what's new and tips on installing

    diff --git a/doc/users/image_tutorial.rst b/doc/users/image_tutorial.rst index 07a3a6a02597..bef7e68a64f3 100644 --- a/doc/users/image_tutorial.rst +++ b/doc/users/image_tutorial.rst @@ -274,7 +274,7 @@ image data, we use the :func:`~matplotlib.pyplot.hist` function. .. sourcecode:: ipython - In[10]: plt.hist(lum_img) + In[10]: plt.hist(lum_img.flatten(), 256, range=(0.0,1.0), fc='k', ec='k') .. plot:: @@ -283,7 +283,7 @@ image data, we use the :func:`~matplotlib.pyplot.hist` function. import numpy as np img = mpimg.imread('_static/stinkbug.png') lum_img = img[:,:,0] - plt.hist(lum_img, range=(0.0,1.0)) + plt.hist(lum_img.flatten(), 256, range=(0.0,1.0), fc='black', ec='black') Most often, the "interesting" part of the image is around the peak, and you can get extra contrast by clipping the regions above and/or From e3946176e6fbbf44baa264ac06fdb644bf571672 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 24 Nov 2009 18:15:49 +0000 Subject: [PATCH 0397/1000] Merged revisions 7983 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7983 | mdboom | 2009-11-24 13:08:51 -0500 (Tue, 24 Nov 2009) | 2 lines [2902715] artist.set_clip_path does not handle tuple ........ svn path=/trunk/matplotlib/; revision=7984 --- lib/matplotlib/artist.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/lib/matplotlib/artist.py b/lib/matplotlib/artist.py index a7c9a72521b7..380429a0ba9f 100644 --- a/lib/matplotlib/artist.py +++ b/lib/matplotlib/artist.py @@ -487,6 +487,8 @@ def set_clip_path(self, path, transform=None): path.get_path(), path.get_transform()) success = True + elif isinstance(path, tuple): + path, transform = path if path is None: self._clippath = None From 802cb7f21c52f7cf8acec560b5203a0d69ba1c7a Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 24 Nov 2009 18:45:18 +0000 Subject: [PATCH 0398/1000] Reduce compiler warnings with Sun Studio svn path=/trunk/matplotlib/; revision=7985 --- setupext.py | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/setupext.py b/setupext.py index d0b316561dfe..2740f9d98843 100644 --- a/setupext.py +++ b/setupext.py @@ -121,6 +121,10 @@ 'build_windowing': True, 'backend': None} +defines = [ + ('PY_ARRAYAUNIQUE_SYMBOL', 'MPL_ARRAY_API'), + ('PYCXX_ISO_CPP_LIB', '1')] + # Based on the contents of setup.cfg, determine the build options if os.path.exists("setup.cfg"): config = ConfigParser.SafeConfigParser() @@ -1105,7 +1109,7 @@ def build_ft2font(ext_modules, packages): deps.extend(glob.glob('CXX/*.c')) module = Extension('matplotlib.ft2font', deps, - define_macros=[('PY_ARRAYAUNIQUE_SYMBOL', 'MPL_ARRAY_API')]) + define_macros=defines) add_ft2font_flags(module) ext_modules.append(module) BUILT_FT2FONT = True @@ -1118,7 +1122,8 @@ def build_ttconv(ext_modules, packages): 'ttconv/pprdrv_tt2.cpp', 'ttconv/ttutil.cpp'] - module = Extension('matplotlib.ttconv', deps) + module = Extension('matplotlib.ttconv', deps, + define_macros=defines) add_base_flags(module) ext_modules.append(module) BUILT_TTCONV = True @@ -1132,7 +1137,7 @@ def build_gtkagg(ext_modules, packages): module = Extension('matplotlib.backends._gtkagg', deps, - define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')] + define_macros=defines ) # add agg flags before pygtk because agg only supports freetype1 @@ -1155,7 +1160,7 @@ def build_tkagg(ext_modules, packages): module = Extension('matplotlib.backends._tkagg', deps, - define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')] + define_macros=defines ) add_tk_flags(module) # do this first @@ -1198,7 +1203,7 @@ def build_macosx(ext_modules, packages): module = Extension('matplotlib.backends._macosx', deps, extra_link_args = ['-framework','Cocoa'], - define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')] + define_macros=defines ) add_numpy_flags(module) add_agg_flags(module) @@ -1217,7 +1222,7 @@ def build_png(ext_modules, packages): 'matplotlib._png', deps, include_dirs=numpy_inc_dirs, - define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')] + define_macros=defines ) add_png_flags(module) @@ -1249,7 +1254,7 @@ def build_agg(ext_modules, packages): 'matplotlib.backends._backend_agg', deps, include_dirs=numpy_inc_dirs, - define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')] + define_macros=defines ) add_numpy_flags(module) @@ -1282,7 +1287,7 @@ def build_path(ext_modules, packages): 'matplotlib._path', deps, include_dirs=numpy_inc_dirs, - define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')] + define_macros=defines ) add_numpy_flags(module) @@ -1311,7 +1316,7 @@ def build_image(ext_modules, packages): 'matplotlib._image', deps, include_dirs=numpy_inc_dirs, - define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')] + define_macros=defines ) add_numpy_flags(module) @@ -1332,7 +1337,7 @@ def build_delaunay(ext_modules, packages): sourcefiles = [os.path.join('lib/matplotlib/delaunay',s) for s in sourcefiles] delaunay = Extension('matplotlib._delaunay',sourcefiles, include_dirs=numpy_inc_dirs, - define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')] + define_macros=defines ) add_numpy_flags(delaunay) add_base_flags(delaunay) @@ -1349,7 +1354,7 @@ def build_contour(ext_modules, packages): 'matplotlib._cntr', [ 'src/cntr.c'], include_dirs=numpy_inc_dirs, - define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')] + define_macros=defines ) add_numpy_flags(module) add_base_flags(module) @@ -1365,7 +1370,7 @@ def build_nxutils(ext_modules, packages): 'matplotlib.nxutils', [ 'src/nxutils.c'], include_dirs=numpy_inc_dirs, - define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')] + define_macros=defines ) add_numpy_flags(module) add_base_flags(module) @@ -1384,7 +1389,7 @@ def build_gdk(ext_modules, packages): ['src/backend_gdk.c'], libraries = [], include_dirs=numpy_inc_dirs, - define_macros=[('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API')] + define_macros=defines ) add_numpy_flags(module) From 8865017e525e498b11372521e865a64b17ab4e15 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 30 Nov 2009 09:06:48 +0000 Subject: [PATCH 0399/1000] buildbot test running: run tests in MPL root dir (bypasses weird bug with scons build) svn path=/trunk/matplotlib/; revision=7987 --- test/_buildbot_test.py | 9 +++------ test/_buildbot_test_postmortem.py | 3 +-- 2 files changed, 4 insertions(+), 8 deletions(-) diff --git a/test/_buildbot_test.py b/test/_buildbot_test.py index 565b20f8fc5b..e1229110ea3d 100644 --- a/test/_buildbot_test.py +++ b/test/_buildbot_test.py @@ -1,7 +1,6 @@ """This script will install matplotlib to a virtual environment to faciltate testing.""" -import shutil, os, sys, glob -from subprocess import Popen, PIPE, STDOUT +import os, glob from _buildbot_util import check_call @@ -13,10 +12,8 @@ TARGET_py = os.path.join(TARGET,'bin','python') check_call('%s -c "import shutil,matplotlib; x=matplotlib.get_configdir(); shutil.rmtree(x)"'%TARGET_py) - -previous_test_images = glob.glob(os.path.join('test','failed-diff-*.png')) +previous_test_images = glob.glob('failed-diff-*.png') for fname in previous_test_images: os.unlink(fname) -check_call('%s -c "import sys, matplotlib; success = matplotlib.test(verbosity=2); sys.exit(not success)"'%TARGET_py, - cwd='test') +check_call('%s -c "import sys, matplotlib; success = matplotlib.test(verbosity=2); sys.exit(not success)"'%TARGET_py) diff --git a/test/_buildbot_test_postmortem.py b/test/_buildbot_test_postmortem.py index ba7f272567f2..39d6c9b4cf7e 100644 --- a/test/_buildbot_test_postmortem.py +++ b/test/_buildbot_test_postmortem.py @@ -4,7 +4,7 @@ This is meant to be run from the mplroot directory.""" -import os, sys, glob, shutil +import os, shutil roots = ['test_matplotlib','test_plots'] savedresults_dir = 'saved-results' @@ -80,7 +80,6 @@ def path_split_all(fname): # new matplotlib.testing infrastructure - os.chdir('test') for fname in get_recursive_filelist(['result_images']): # only images if not fname.endswith('.png'): continue From 25d62dd8277f7ab5a7f9fe045f129eb47fa60767 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 30 Nov 2009 17:18:27 +0000 Subject: [PATCH 0400/1000] fix typo in r7985. closes SF-2903596. Thanks C. Gohlke. svn path=/trunk/matplotlib/; revision=7988 --- setupext.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/setupext.py b/setupext.py index 2740f9d98843..24f07f56bfed 100644 --- a/setupext.py +++ b/setupext.py @@ -122,7 +122,7 @@ 'backend': None} defines = [ - ('PY_ARRAYAUNIQUE_SYMBOL', 'MPL_ARRAY_API'), + ('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API'), ('PYCXX_ISO_CPP_LIB', '1')] # Based on the contents of setup.cfg, determine the build options From 8e7461fd30066a60e476668580ea15396ddf0819 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 30 Nov 2009 17:39:37 +0000 Subject: [PATCH 0401/1000] replace failing test image with passing image svn path=/trunk/matplotlib/; revision=7990 --- .../baseline_images/test_axes/fill_units.png | Bin 60171 -> 60272 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/lib/matplotlib/tests/baseline_images/test_axes/fill_units.png b/lib/matplotlib/tests/baseline_images/test_axes/fill_units.png index 567c6a60a14adb67ee595cb5a3e016ae1894167d..9418ebcd025dbc2bc0b5f9621d4b88d8df6a3eca 100644 GIT binary patch literal 60272 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 literal 60171 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®d1*w=A($^V6iu#P#96cGf#D`fTXKH} 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 OkG|ew-RnAQ_Wlno(aEs@ From b386ea55c5ca4fc877c06d90208f0c2082bcec8d Mon Sep 17 00:00:00 2001 From: John Hunter Date: Mon, 30 Nov 2009 21:13:34 +0000 Subject: [PATCH 0402/1000] add Matthew's OSX makefile patch svn path=/trunk/matplotlib/; revision=7992 --- make.osx | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/make.osx b/make.osx index 501c7820e46a..14210120d36a 100644 --- a/make.osx +++ b/make.osx @@ -4,21 +4,24 @@ PYVERSION=2.6 PYTHON=python${PYVERSION} ZLIBVERSION=1.2.3 -PNGVERSION=1.2.33 -FREETYPEVERSION=2.3.5 +PNGVERSION=1.2.40 +FREETYPEVERSION=2.3.11 MACOSX_DEPLOYMENT_TARGET=10.4 +OSX_SDK_VER=10.4u +ARCH_FLAGS="-arch i386 -arch ppc -arch x86_64" ## You shouldn't need to configure past this point PKG_CONFIG_PATH="${PREFIX}/lib/pkgconfig" -CFLAGS="-arch i386 -arch ppc -I${PREFIX}/include -I${PREFIX}/include/freetype2 -isysroot /Developer/SDKs/MacOSX10.4u.sdk" -LDFLAGS="-arch i386 -arch ppc -L${PREFIX}/lib -syslibroot,/Developer/SDKs/MacOSX10.4u.sdk" +CFLAGS="${ARCH_FLAGS} -I${PREFIX}/include -I${PREFIX}/include/freetype2 -isysroot /Developer/SDKs/MacOSX${OSX_SDK_VER}.sdk" +LDFLAGS="${ARCH_FLAGS} -L${PREFIX}/lib -syslibroot,/Developer/SDKs/MacOSX${OSX_SDK_VER}.sdk" clean: rm -rf zlib-${ZLIBVERSION}.tar.gz libpng-${PNGVERSION}.tar.bz2 \ freetype-${FREETYPEVERSION}.tar.bz2 bdist_mpkg-${BDISTMPKGVERSION}.tar.gz \ bdist_mpkg-${BDISTMPKGVERSION} \ - zlib-${ZLIBVERSION} libpng-${PNGVERSION} freetype-${FREETYPEVERSION} + zlib-${ZLIBVERSION} libpng-${PNGVERSION} freetype-${FREETYPEVERSION} \ + build fetch: ${PYTHON} -c 'import urllib; urllib.urlretrieve("http://www.zlib.net/zlib-${ZLIBVERSION}.tar.gz", "zlib-${ZLIBVERSION}.tar.gz")' &&\ From f21eb653264e7d582926db8f96c84b20868145e3 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Mon, 30 Nov 2009 21:38:58 +0000 Subject: [PATCH 0403/1000] Make the kwarg combination "units='xy', angles='xy', scale=1" work as expected svn path=/trunk/matplotlib/; revision=7993 --- lib/matplotlib/quiver.py | 33 ++++++++++++++++++++++++++------- 1 file changed, 26 insertions(+), 7 deletions(-) diff --git a/lib/matplotlib/quiver.py b/lib/matplotlib/quiver.py index 3c9cd0d09212..948a79f3c2df 100644 --- a/lib/matplotlib/quiver.py +++ b/lib/matplotlib/quiver.py @@ -64,7 +64,7 @@ Keyword arguments: - *units*: ['width' | 'height' | 'dots' | 'inches' | 'x' | 'y' ] + *units*: ['width' | 'height' | 'dots' | 'inches' | 'x' | 'y' | 'xy'] arrow units; the arrow dimensions *except for length* are in multiples of this unit. @@ -518,17 +518,33 @@ def _set_transform(self): self.set_transform(trans) return trans - def _angles(self, U, V, eps=0.001): + def _angles_lengths(self, U, V, eps=1): xy = self.ax.transData.transform(self.XY) uv = np.hstack((U[:,np.newaxis], V[:,np.newaxis])) xyp = self.ax.transData.transform(self.XY + eps * uv) dxy = xyp - xy - ang = np.arctan2(dxy[:,1], dxy[:,0]) - return ang + angles = np.arctan2(dxy[:,1], dxy[:,0]) + lengths = np.absolute(dxy[:,0] + dxy[:,1]*1j) / eps + return angles, lengths + + def _make_verts(self, U, V): uv = (U+V*1j) - a = np.absolute(uv) + if self.angles == 'xy' and self.scale_units == 'xy': + # Here eps is 1 so that if we get U, V by diffing + # the X, Y arrays, the vectors will connect the + # points, regardless of the axis scaling (including log). + angles, lengths = self._angles_lengths(U, V, eps=1) + elif self.angles == 'xy' or self.scale_units == 'xy': + # We could refine this by calculating eps based on + # the magnitude of U, V relative to that of X, Y, + # to ensure we are always making small shifts in X, Y. + angles, lengths = self._angles_lengths(U, V, eps=0.001) + if self.scale_units == 'xy': + a = lengths + else: + a = np.absolute(uv) if self.scale is None: sn = max(10, math.sqrt(self.N)) if self.Umask is not ma.nomask: @@ -543,14 +559,17 @@ def _make_verts(self, U, V): self.scale = scale widthu_per_lenu = 1.0 else: - dx = self._dots_per_unit(self.scale_units) + if self.scale_units == 'xy': + dx = 1 + else: + dx = self._dots_per_unit(self.scale_units) widthu_per_lenu = dx/self._trans_scale if self.scale is None: self.scale = scale * widthu_per_lenu length = a * (widthu_per_lenu / (self.scale * self.width)) X, Y = self._h_arrows(length) if self.angles == 'xy': - theta = self._angles(U, V) + theta = angles elif self.angles == 'uv': theta = np.angle(uv) else: From a2a7fa149bee423b68d098519c8b934c0a9d1428 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Tue, 1 Dec 2009 03:50:21 +0000 Subject: [PATCH 0404/1000] add zorder to figure drawing svn path=/trunk/matplotlib/; revision=7994 --- doc/pyplots/pyplot_simple.py | 2 +- examples/pylab_examples/figimage_demo.py | 3 ++ lib/matplotlib/figure.py | 59 +++++++++++++++++------- lib/matplotlib/pyplot.py | 2 +- 4 files changed, 47 insertions(+), 19 deletions(-) diff --git a/doc/pyplots/pyplot_simple.py b/doc/pyplots/pyplot_simple.py index 4edfab91203f..46b9f225a97e 100644 --- a/doc/pyplots/pyplot_simple.py +++ b/doc/pyplots/pyplot_simple.py @@ -1,4 +1,4 @@ import matplotlib.pyplot as plt -plt.plot([1,2,3]) +plt.plot([1,2,3,4]) plt.ylabel('some numbers') plt.show() diff --git a/examples/pylab_examples/figimage_demo.py b/examples/pylab_examples/figimage_demo.py index a1e430b271c3..49e7f087cc2d 100644 --- a/examples/pylab_examples/figimage_demo.py +++ b/examples/pylab_examples/figimage_demo.py @@ -12,6 +12,9 @@ Z.shape = 100,100 Z[:,50:] = 1. +ax = fig.add_subplot(111) +ax.grid(True) + im1 = plt.figimage(Z, xo=50, yo=0, cmap=cm.jet, origin='lower') im2 = plt.figimage(Z, xo=100, yo=100, alpha=.8, cmap=cm.jet, origin='lower') diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index eb84e04fadda..c7de0979ec33 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -343,7 +343,8 @@ def figimage(self, X, cmap=None, vmin=None, vmax=None, - origin=None): + origin=None, + **kwargs): """ call signatures:: @@ -393,11 +394,14 @@ def figimage(self, X, .. plot:: mpl_examples/pylab_examples/figimage_demo.py + + Additional kwargs are Artist kwargs passed on to + :class:`~matplotlib.image.FigureImage` """ if not self._hold: self.clf() - im = FigureImage(self, cmap, norm, xo, yo, origin) + im = FigureImage(self, cmap, norm, xo, yo, origin, **kwargs) im.set_array(X) im.set_alpha(alpha) if norm is None: @@ -735,10 +739,19 @@ def draw(self, renderer): if self.frameon: self.patch.draw(renderer) + # a list of (zorder, func_to_call, list_of_args) + dsu = [] + + # todo: respect zorder - for p in self.patches: p.draw(renderer) - for l in self.lines: l.draw(renderer) - for a in self.artists: a.draw(renderer) + for a in self.patches: + dsu.append( (a.get_zorder(), a.draw, [renderer])) + + for a in self.lines: + dsu.append( (a.get_zorder(), a.draw, [renderer])) + + for a in self.artists: + dsu.append( (a.get_zorder(), a.draw, [renderer])) # override the renderer default if self.suppressComposite # is not None @@ -747,8 +760,8 @@ def draw(self, renderer): composite = self.suppressComposite if len(self.images)<=1 or composite or not allequal([im.origin for im in self.images]): - for im in self.images: - im.draw(renderer) + for a in self.images: + dsu.append( (a.get_zorder(), a.draw, [renderer])) else: # make a composite image blending alpha # list of (_image.Image, ox, oy) @@ -762,20 +775,32 @@ def draw(self, renderer): im.is_grayscale = False l, b, w, h = self.bbox.bounds - gc = renderer.new_gc() - gc.set_clip_rectangle(self.bbox) - gc.set_clip_path(self.get_clip_path()) - renderer.draw_image(gc, l, b, im) - gc.restore() + + def draw_composite(): + gc = renderer.new_gc() + gc.set_clip_rectangle(self.bbox) + gc.set_clip_path(self.get_clip_path()) + renderer.draw_image(gc, l, b, im) + gc.restore() + + if len(ims): + dsu.append((ims[0].get_zorder(), draw_composite, [])) # render the axes - for a in self.axes: a.draw(renderer) + for a in self.axes: + dsu.append( (a.get_zorder(), a.draw, [renderer])) # render the figure text - for t in self.texts: t.draw(renderer) + for a in self.texts: + dsu.append( (a.get_zorder(), a.draw, [renderer])) + + for a in self.legends: + dsu.append( (a.get_zorder(), a.draw, [renderer])) - for legend in self.legends: - legend.draw(renderer) + + dsu.sort() + for zorder, func, args in dsu: + func(*args) renderer.close_group('figure') @@ -1045,7 +1070,7 @@ def savefig(self, *args, **kwargs): if args and is_string_like(args[0]) and '.' not in args[0] and extension != 'auto': fname = args[0] + '.' + extension args = (fname,) + args[1:] - + transparent = kwargs.pop('transparent', False) if transparent: original_figure_alpha = self.patch.get_alpha() diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index 9ae2818434e7..8cadb036e68a 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -401,7 +401,7 @@ def figimage(*args, **kwargs): # allow callers to override the hold state by passing hold=True|False ret = gcf().figimage(*args, **kwargs) draw_if_interactive() - sci(ret) + #sci(ret) # JDH figimage should not set current image -- it is not mappable, etc return ret def figlegend(handles, labels, loc, **kwargs): From 50fc548465b1525255bc2d9f66a6c7c95fd38a75 Mon Sep 17 00:00:00 2001 From: Darren Dale Date: Tue, 1 Dec 2009 14:29:11 +0000 Subject: [PATCH 0405/1000] improve blitting with the qt4 backend svn path=/trunk/matplotlib/; revision=7995 --- CHANGELOG | 3 +++ lib/matplotlib/backends/backend_qt4agg.py | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 3f9bd98c4464..da98433082b9 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2009-12-01 Applied Laurent Dufrechou's patch to improve blitting with + the qt4 backend - DSD + 2009-11-13 The pdf backend now allows changing the contents of a pdf file's information dictionary via PdfPages.infodict. - JKS diff --git a/lib/matplotlib/backends/backend_qt4agg.py b/lib/matplotlib/backends/backend_qt4agg.py index 45a1b73b7432..89d9f4e63a4d 100644 --- a/lib/matplotlib/backends/backend_qt4agg.py +++ b/lib/matplotlib/backends/backend_qt4agg.py @@ -138,7 +138,7 @@ def blit(self, bbox=None): self.replot = bbox l, b, w, h = bbox.bounds t = b + h - self.update(l, self.renderer.height-t, w, h) + self.repaint(l, self.renderer.height-t, w, h) def print_figure(self, *args, **kwargs): FigureCanvasAgg.print_figure(self, *args, **kwargs) From 0c725cd5bd3eeca2507d8bd71ca7d32a18b9d11d Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 1 Dec 2009 15:17:21 +0000 Subject: [PATCH 0406/1000] Merged revisions 7989,7991 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7989 | mdboom | 2009-11-30 12:24:49 -0500 (Mon, 30 Nov 2009) | 1 line Fix SF-2903596 on the 0.99.x branch ........ r7991 | mdboom | 2009-11-30 13:30:09 -0500 (Mon, 30 Nov 2009) | 2 lines Fix bug in usage of "contains" ........ svn path=/trunk/matplotlib/; revision=7996 --- examples/event_handling/looking_glass.py | 2 +- setupext.py | 6 +++--- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/event_handling/looking_glass.py b/examples/event_handling/looking_glass.py index 2d308767580f..3ceeb68f8231 100644 --- a/examples/event_handling/looking_glass.py +++ b/examples/event_handling/looking_glass.py @@ -24,7 +24,7 @@ def onpress(self, event): if event.inaxes!=ax: return - if not circ.contains(event): + if not circ.contains(event)[0]: return self.pressevent = event diff --git a/setupext.py b/setupext.py index 24f07f56bfed..7d9cf7211a32 100644 --- a/setupext.py +++ b/setupext.py @@ -122,8 +122,8 @@ 'backend': None} defines = [ - ('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API'), - ('PYCXX_ISO_CPP_LIB', '1')] + ('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API'), + ('PYCXX_ISO_CPP_LIB', '1')] # Based on the contents of setup.cfg, determine the build options if os.path.exists("setup.cfg"): @@ -1123,7 +1123,7 @@ def build_ttconv(ext_modules, packages): 'ttconv/ttutil.cpp'] module = Extension('matplotlib.ttconv', deps, - define_macros=defines) + define_macros=defines) add_base_flags(module) ext_modules.append(module) BUILT_TTCONV = True From 39933e4c37549980d486283208f55a3594fd91f3 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 1 Dec 2009 18:58:49 +0000 Subject: [PATCH 0407/1000] [2906157] Let sphinx reference matplotlib-created plots svn path=/trunk/matplotlib/; revision=7997 --- lib/matplotlib/sphinxext/plot_directive.py | 33 +++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/sphinxext/plot_directive.py b/lib/matplotlib/sphinxext/plot_directive.py index d28e21c62eb9..cb06e024dae9 100644 --- a/lib/matplotlib/sphinxext/plot_directive.py +++ b/lib/matplotlib/sphinxext/plot_directive.py @@ -308,8 +308,8 @@ def _plot_directive(plot_path, basedir, function_name, plot_code, caption, # treated as relative to the root of the documentation tree. We # need to support both methods here. tmpdir = os.path.join('build', outdir) + tmpdir = os.path.abspath(tmpdir) if sphinx_version < (0, 6): - tmpdir = os.path.abspath(tmpdir) prefix = '' else: prefix = '/' @@ -421,6 +421,36 @@ def plot_directive(name, arguments, options, content, lineno, return _plot_directive(plot_path, 'inline', None, plot_code, '', options, state_machine) +def mark_plot_labels(app, document): + """ + To make plots referenceable, we need to move the reference from + the "htmlonly" (or "latexonly") node to the actual figure node + itself. + """ + for name, explicit in document.nametypes.iteritems(): + if not explicit: + continue + labelid = document.nameids[name] + if labelid is None: + continue + node = document.ids[labelid] + if node.tagname in ('html_only', 'latex_only'): + for n in node: + if n.tagname == 'figure': + sectname = name + for c in n: + if c.tagname == 'caption': + sectname = c.astext() + break + + node['ids'].remove(labelid) + node['names'].remove(name) + n['ids'].append(labelid) + n['names'].append(name) + document.settings.env.labels[name] = \ + document.settings.env.docname, labelid, sectname + break + def setup(app): setup.app = app setup.config = app.config @@ -441,3 +471,4 @@ def setup(app): [('png', 80), ('hires.png', 200), ('pdf', 50)], True) + app.connect('doctree-read', mark_plot_labels) From 2e04cabf6b0c636666bafc8ef53334638172d50e Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 1 Dec 2009 19:09:10 +0000 Subject: [PATCH 0408/1000] Merged revisions 7998 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7998 | mdboom | 2009-12-01 14:01:45 -0500 (Tue, 01 Dec 2009) | 2 lines [2906157] Let sphinx reference matplotlib-created plots (backport) ........ svn path=/trunk/matplotlib/; revision=7999 From fd715983042b706a471fff04c18e778ed0589f21 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Wed, 2 Dec 2009 01:13:25 +0000 Subject: [PATCH 0409/1000] Draw artists with identical zorder in the order in which they were added. svn path=/trunk/matplotlib/; revision=8000 --- lib/matplotlib/axes.py | 12 ++++++------ lib/matplotlib/figure.py | 2 +- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index f3670ab2162d..6db0df933c33 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -1700,10 +1700,10 @@ def draw(self, renderer=None, inframe=False): dsu = [ (a.zorder, a) for a in artists if not a.get_animated() ] - dsu.sort() + dsu.sort(key=lambda x: x[0]) - # rasterze artists with negative zorder + # rasterize artists with negative zorder # if the minimum zorder is negative, start rasterization rasterization_zorder = self._rasterization_zorder if len(dsu) > 0 and dsu[0][0] < rasterization_zorder: @@ -1722,15 +1722,15 @@ def draw(self, renderer=None, inframe=False): if len(self.images)<=1 or renderer.option_image_nocomposite(): for im in self.images: dsu.append( (im.zorder, im) ) - dsu.sort() # re-sort with images now + dsu.sort(key=lambda x: x[0]) # re-sort with images now else: # make a composite image blending alpha # list of (mimage.Image, ox, oy) zorder_images = [(im.zorder, im) for im in self.images \ if im.get_visible()] - zorder_images.sort() - + zorder_images.sort(key=lambda x: x[0]) + mag = renderer.get_image_magnification() ims = [(im.make_image(mag),0,0) for z,im in zorder_images] @@ -1793,7 +1793,7 @@ def __draw_animate(self): if self._lastRenderer is None: raise RuntimeError('You must first call ax.draw()') dsu = [(a.zorder, a) for a in self.animated.keys()] - dsu.sort() + dsu.sort(key=lambda x: x[0]) renderer = self._lastRenderer renderer.blit() for tmp, a in dsu: diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index c7de0979ec33..ae3e17293d82 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -798,7 +798,7 @@ def draw_composite(): dsu.append( (a.get_zorder(), a.draw, [renderer])) - dsu.sort() + dsu.sort(key=lambda x: x[0]) for zorder, func, args in dsu: func(*args) From cd881448702e59c937204d37ec2a04a4b452e0d3 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Thu, 3 Dec 2009 19:02:07 +0000 Subject: [PATCH 0410/1000] Merged revisions 8001 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r8001 | mdboom | 2009-12-03 13:54:54 -0500 (Thu, 03 Dec 2009) | 2 lines [2903460] _path.pyd crashes in 0.99.1.win32-py2.6 on PIII CPU ........ svn path=/trunk/matplotlib/; revision=8002 --- src/_path.cpp | 72 +++++++++++++++++++++++++-------------------------- 1 file changed, 36 insertions(+), 36 deletions(-) diff --git a/src/_path.cpp b/src/_path.cpp index 1ef9d6f94a41..9802e3841a0d 100644 --- a/src/_path.cpp +++ b/src/_path.cpp @@ -147,7 +147,7 @@ bool point_in_path_impl(const double tx, const double ty, T& path) // The following cases denote the beginning on a new subpath if (code == agg::path_cmd_stop || - (code & agg::path_cmd_end_poly) == agg::path_cmd_end_poly) + (code & agg::path_cmd_end_poly) == agg::path_cmd_end_poly) { x = sx; y = sy; @@ -190,13 +190,13 @@ bool point_in_path_impl(const double tx, const double ty, T& path) vty1 = y; } while (code != agg::path_cmd_stop && - (code & agg::path_cmd_end_poly) != agg::path_cmd_end_poly); + (code & agg::path_cmd_end_poly) != agg::path_cmd_end_poly); yflag1 = (vty1 >= ty); if (yflag0 != yflag1) { if ( ((vty1-ty) * (vtx0-vtx1) >= - (vtx1-tx) * (vty0-vty1)) == yflag1 ) + (vtx1-tx) * (vty0-vty1)) == yflag1 ) { inside_flag ^= 1; } @@ -462,7 +462,7 @@ Py::Object _path_module::get_path_collection_extents(const Py::Tuple& args) //segments, trans, clipbox, colors, linewidths, antialiaseds agg::trans_affine master_transform = py_to_agg_transformation_matrix(args[0].ptr()); - Py::SeqBase paths = args[1]; + Py::SeqBase paths = args[1]; Py::SeqBase transforms_obj = args[2]; Py::Object offsets_obj = args[3]; agg::trans_affine offset_trans = py_to_agg_transformation_matrix(args[4].ptr(), false); @@ -474,15 +474,15 @@ Py::Object _path_module::get_path_collection_extents(const Py::Tuple& args) { offsets = (PyArrayObject*)PyArray_FromObject(offsets_obj.ptr(), PyArray_DOUBLE, 0, 2); if (!offsets || - (PyArray_NDIM(offsets) == 2 && PyArray_DIM(offsets, 1) != 2) || - (PyArray_NDIM(offsets) == 1 && PyArray_DIM(offsets, 0) != 0)) + (PyArray_NDIM(offsets) == 2 && PyArray_DIM(offsets, 1) != 2) || + (PyArray_NDIM(offsets) == 1 && PyArray_DIM(offsets, 0) != 0)) { throw Py::ValueError("Offsets array must be Nx2"); } size_t Npaths = paths.length(); size_t Noffsets = offsets->dimensions[0]; - size_t N = std::max(Npaths, Noffsets); + size_t N = std::max(Npaths, Noffsets); size_t Ntransforms = std::min(transforms_obj.length(), N); size_t i; @@ -555,7 +555,7 @@ Py::Object _path_module::point_in_path_collection(const Py::Tuple& args) double y = Py::Float(args[1]); double radius = Py::Float(args[2]); agg::trans_affine master_transform = py_to_agg_transformation_matrix(args[3].ptr()); - Py::SeqBase paths = args[4]; + Py::SeqBase paths = args[4]; Py::SeqBase transforms_obj = args[5]; Py::SeqBase offsets_obj = args[6]; agg::trans_affine offset_trans = py_to_agg_transformation_matrix(args[7].ptr()); @@ -563,8 +563,8 @@ Py::Object _path_module::point_in_path_collection(const Py::Tuple& args) PyArrayObject* offsets = (PyArrayObject*)PyArray_FromObject(offsets_obj.ptr(), PyArray_DOUBLE, 0, 2); if (!offsets || - (PyArray_NDIM(offsets) == 2 && PyArray_DIM(offsets, 1) != 2) || - (PyArray_NDIM(offsets) == 1 && PyArray_DIM(offsets, 0) != 0)) + (PyArray_NDIM(offsets) == 2 && PyArray_DIM(offsets, 1) != 2) || + (PyArray_NDIM(offsets) == 1 && PyArray_DIM(offsets, 0) != 0)) { Py_XDECREF(offsets); throw Py::ValueError("Offsets array must be Nx2"); @@ -888,7 +888,7 @@ Py::Object _path_module::clip_path_to_rect(const Py::Tuple &args) } for (size_t i = 0; i < size; ++i) { - ((double *)pyarray->data)[2*i] = (*p)[i].x; + ((double *)pyarray->data)[2*i] = (*p)[i].x; ((double *)pyarray->data)[2*i+1] = (*p)[i].y; } if (PyList_SetItem(py_results, p - results.begin(), (PyObject *)pyarray) != -1) @@ -922,14 +922,14 @@ Py::Object _path_module::affine_transform(const Py::Tuple& args) vertices = (PyArrayObject*)PyArray_FromObject (vertices_obj.ptr(), PyArray_DOUBLE, 1, 2); if (!vertices || - (PyArray_NDIM(vertices) == 2 && PyArray_DIM(vertices, 1) != 2) || - (PyArray_NDIM(vertices) == 1 && PyArray_DIM(vertices, 0) != 2)) + (PyArray_NDIM(vertices) == 2 && PyArray_DIM(vertices, 1) != 2) || + (PyArray_NDIM(vertices) == 1 && PyArray_DIM(vertices, 0) != 2)) throw Py::ValueError("Invalid vertices array."); transform = (PyArrayObject*) PyArray_FromObject (transform_obj.ptr(), PyArray_DOUBLE, 2, 2); if (!transform || - PyArray_DIM(transform, 0) != 3 || + PyArray_DIM(transform, 0) != 3 || PyArray_DIM(transform, 1) != 3) throw Py::ValueError("Invalid transform."); @@ -1010,7 +1010,7 @@ Py::Object _path_module::count_bboxes_overlapping_bbox(const Py::Tuple& args) { args.verify_length(2); - Py::Object bbox = args[0]; + Py::Object bbox = args[0]; Py::SeqBase bboxes = args[1]; double ax0, ay0, ax1, ay1; @@ -1131,13 +1131,13 @@ Py::Object _path_module::path_intersects_path(const Py::Tuple& args) void _add_polygon(Py::List& polygons, const std::vector& polygon) { if (polygon.size() == 0) - return; + return; npy_intp polygon_dims[] = { polygon.size() / 2, 2, 0 }; PyArrayObject* polygon_array = NULL; polygon_array = (PyArrayObject*)PyArray_SimpleNew - (2, polygon_dims, PyArray_DOUBLE); + (2, polygon_dims, PyArray_DOUBLE); if (!polygon_array) - throw Py::MemoryError("Error creating polygon array"); + throw Py::MemoryError("Error creating polygon array"); double* polygon_data = (double*)PyArray_DATA(polygon_array); memcpy(polygon_data, &polygon[0], polygon.size() * sizeof(double)); polygons.append(Py::Object((PyObject*)polygon_array, true)); @@ -1179,26 +1179,26 @@ Py::Object _path_module::convert_path_to_polygons(const Py::Tuple& args) while ((code = curve.vertex(&x, &y)) != agg::path_cmd_stop) { - if ((code & agg::path_cmd_end_poly) == agg::path_cmd_end_poly) + if ((code & agg::path_cmd_end_poly) == agg::path_cmd_end_poly) { - if (polygon.size() >= 2) - { - polygon.push_back(polygon[0]); - polygon.push_back(polygon[1]); - _add_polygon(polygons, polygon); - } - polygon.clear(); - } + if (polygon.size() >= 2) + { + polygon.push_back(polygon[0]); + polygon.push_back(polygon[1]); + _add_polygon(polygons, polygon); + } + polygon.clear(); + } else { - if (code == agg::path_cmd_move_to) + if (code == agg::path_cmd_move_to) { - _add_polygon(polygons, polygon); - polygon.clear(); - } - polygon.push_back(x); - polygon.push_back(y); - } + _add_polygon(polygons, polygon); + polygon.clear(); + } + polygon.push_back(x); + polygon.push_back(y); + } } _add_polygon(polygons, polygon); @@ -1356,8 +1356,8 @@ extern "C" DL_EXPORT(void) init_path(void) { - import_array(); - static _path_module* _path = NULL; _path = new _path_module; + + import_array(); } From 8eb73d95479e421dc688d03432a722d94acea46c Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Thu, 3 Dec 2009 19:24:30 +0000 Subject: [PATCH 0411/1000] Merged revisions 8003 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r8003 | mdboom | 2009-12-03 14:21:28 -0500 (Thu, 03 Dec 2009) | 1 line [2896454] subscripts and \mathrm don't get along, aka the long-standing wiggle baseline problem ........ svn path=/trunk/matplotlib/; revision=8004 --- src/ft2font.cpp | 732 ++++++++++++++++++++++++------------------------ 1 file changed, 366 insertions(+), 366 deletions(-) diff --git a/src/ft2font.cpp b/src/ft2font.cpp index 2d599f7c99e1..5ab2553482bd 100644 --- a/src/ft2font.cpp +++ b/src/ft2font.cpp @@ -94,8 +94,8 @@ void FT2Image::resize(long width, long height) { void FT2Image::draw_bitmap( FT_Bitmap* bitmap, - FT_Int x, - FT_Int y) { + FT_Int x, + FT_Int y) { _VERBOSE("FT2Image::draw_bitmap"); FT_Int image_width = (FT_Int)_width; FT_Int image_height = (FT_Int)_height; @@ -126,9 +126,9 @@ void FT2Image::write_bitmap(const char* filename) const { for ( size_t i = 0; i< _height; i++) { for ( size_t j = 0; j < _width; ++j) { if (_buffer[j + i*_width]) - fputc('#', fh); + fputc('#', fh); else - fputc(' ', fh); + fputc(' ', fh); } fputc('\n', fh); } @@ -156,7 +156,7 @@ FT2Image::py_write_bitmap(const Py::Tuple & args) { void FT2Image::draw_rect(unsigned long x0, unsigned long y0, - unsigned long x1, unsigned long y1) { + unsigned long x1, unsigned long y1) { if ( x0>_width || x1>_width || y0>_height || y1>_height ) throw Py::ValueError("Rect coords outside image bounds"); @@ -199,7 +199,7 @@ FT2Image::py_draw_rect(const Py::Tuple & args) { } void FT2Image::draw_rect_filled(unsigned long x0, unsigned long y0, - unsigned long x1, unsigned long y1) { + unsigned long x1, unsigned long y1) { x0 = std::min(x0, _width); y0 = std::min(y0, _height); x1 = std::min(x1, _width); @@ -249,7 +249,7 @@ FT2Image::py_as_str(const Py::Tuple & args) { return Py::asObject (PyString_FromStringAndSize((const char *)_buffer, - _width*_height) + _width*_height) ); } @@ -276,9 +276,9 @@ FT2Image::py_as_array(const Py::Tuple & args) { PyArrayObject *A = (PyArrayObject *) PyArray_SimpleNew(2, dimensions, PyArray_UBYTE); - unsigned char *src = _buffer; - unsigned char *src_end = src + (dimensions[0] * dimensions[1]); - unsigned char *dst = (unsigned char *)A->data; + unsigned char *src = _buffer; + unsigned char *src_end = src + (dimensions[0] * dimensions[1]); + unsigned char *dst = (unsigned char *)A->data; while (src != src_end) { *dst++ = *src++; @@ -297,9 +297,9 @@ void FT2Image::makeRgbCopy() { } else { _rgbCopy->resize(_width * 3, _height); } - unsigned char *src = _buffer; - unsigned char *src_end = src + (_width * _height); - unsigned char *dst = _rgbCopy->_buffer; + unsigned char *src = _buffer; + unsigned char *src_end = src + (_width * _height); + unsigned char *dst = _rgbCopy->_buffer; unsigned char tmp; while (src != src_end) { @@ -335,9 +335,9 @@ void FT2Image::makeRgbaCopy() { } else { _rgbaCopy->resize(_width * 4, _height); } - unsigned char *src = _buffer; - unsigned char *src_end = src + (_width * _height); - unsigned char *dst = _rgbaCopy->_buffer; + unsigned char *src = _buffer; + unsigned char *src_end = src + (_width * _height); + unsigned char *dst = _rgbaCopy->_buffer; while (src != src_end) { // We know the array has already been zero'ed out in @@ -480,27 +480,27 @@ Glyph::get_path( const FT_Face& face) { // check first point to determine origin if( tag == FT_CURVE_TAG_CONIC) - { - // first point is conic control. Yes, this happens. - if(FT_CURVE_TAG(outline.tags[last]) == FT_CURVE_TAG_ON) - { - // start at last point if it is on the curve - v_start = v_last; - limit--; - } - else - { - // if both first and last points are conic, - // start at their middle and record its position - // for closure - v_start.x = (v_start.x + v_last.x) / 2; - v_start.y = (v_start.y + v_last.y) / 2; - - v_last = v_start; - } - point--; - tags--; - } + { + // first point is conic control. Yes, this happens. + if(FT_CURVE_TAG(outline.tags[last]) == FT_CURVE_TAG_ON) + { + // start at last point if it is on the curve + v_start = v_last; + limit--; + } + else + { + // if both first and last points are conic, + // start at their middle and record its position + // for closure + v_start.x = (v_start.x + v_last.x) / 2; + v_start.y = (v_start.y + v_last.y) / 2; + + v_last = v_start; + } + point--; + tags--; + } double x = conv(v_start.x); double y = flip_y ? -conv(v_start.y) : conv(v_start.y); @@ -515,157 +515,157 @@ Glyph::get_path( const FT_Face& face) { closepoly[1] = Py::Int(0); while(point < limit) - { - point++; - tags++; - - tag = FT_CURVE_TAG(tags[0]); - switch(tag) - { - case FT_CURVE_TAG_ON: // emit a single line_to - { - double x = conv(point->x); - double y = flip_y ? -conv(point->y) : conv(point->y); - Py::Tuple tup(3); - tup[0] = Py::Int(LINETO); - tup[1] = Py::Float(x); - tup[2] = Py::Float(y); - path.append(tup); - - continue; - } - - case FT_CURVE_TAG_CONIC: // consume conic arcs - { - v_control.x = point->x; - v_control.y = point->y; - - Do_Conic: - if(point < limit) - { - FT_Vector vec; - FT_Vector v_middle; - - point++; - tags++; - tag = FT_CURVE_TAG(tags[0]); - - vec.x = point->x; - vec.y = point->y; - - if(tag == FT_CURVE_TAG_ON) - { - double xctl = conv(v_control.x); - double yctl = flip_y ? -conv(v_control.y) : conv(v_control.y); - double xto = conv(vec.x); - double yto = flip_y ? -conv(vec.y) : conv(vec.y); - Py::Tuple tup(5); - tup[0] = Py::Int(CURVE3); - tup[1] = Py::Float(xctl); - tup[2] = Py::Float(yctl); - tup[3] = Py::Float(xto); - tup[4] = Py::Float(yto); - path.append(tup); - continue; - } - - if(tag != FT_CURVE_TAG_CONIC) return Py::Object(); - - v_middle.x = (v_control.x + vec.x) / 2; - v_middle.y = (v_control.y + vec.y) / 2; - - double xctl = conv(v_control.x); - double yctl = flip_y ? -conv(v_control.y) : conv(v_control.y); - double xto = conv(v_middle.x); - double yto = flip_y ? -conv(v_middle.y) : conv(v_middle.y); - Py::Tuple tup(5); - tup[0] = Py::Int(CURVE3); - tup[1] = Py::Float(xctl); - tup[2] = Py::Float(yctl); - tup[3] = Py::Float(xto); - tup[4] = Py::Float(yto); - path.append(tup); - - v_control = vec; - goto Do_Conic; - } - double xctl = conv(v_control.x); - double yctl = flip_y ? -conv(v_control.y) : conv(v_control.y); - double xto = conv(v_start.x); - double yto = flip_y ? -conv(v_start.y) : conv(v_start.y); - Py::Tuple tup(5); - tup[0] = Py::Int(CURVE3); - tup[1] = Py::Float(xctl); - tup[2] = Py::Float(yctl); - tup[3] = Py::Float(xto); - tup[4] = Py::Float(yto); - path.append(tup); - goto Close; - } - - default: // FT_CURVE_TAG_CUBIC - { - FT_Vector vec1, vec2; - - if(point + 1 > limit || FT_CURVE_TAG(tags[1]) != FT_CURVE_TAG_CUBIC) - { - return Py::Object(); - } - - vec1.x = point[0].x; - vec1.y = point[0].y; - vec2.x = point[1].x; - vec2.y = point[1].y; - - point += 2; - tags += 2; - - if(point <= limit) - { - FT_Vector vec; - - vec.x = point->x; - vec.y = point->y; - - double xctl1 = conv(vec1.x); - double yctl1 = flip_y ? -conv(vec1.y) : conv(vec1.y); - double xctl2 = conv(vec2.x); - double yctl2 = flip_y ? -conv(vec2.y) : conv(vec2.y); - double xto = conv(vec.x); - double yto = flip_y ? -conv(vec.y) : conv(vec.y); - Py::Tuple tup(7); - tup[0] = Py::Int(CURVE4); - tup[1] = Py::Float(xctl1); - tup[2] = Py::Float(yctl1); - tup[3] = Py::Float(xctl2); - tup[4] = Py::Float(yctl2); - tup[5] = Py::Float(xto); - tup[6] = Py::Float(yto); - path.append(tup); - - continue; - } - - double xctl1 = conv(vec1.x); - double yctl1 = flip_y ? -conv(vec1.y) : conv(vec1.y); - double xctl2 = conv(vec2.x); - double yctl2 = flip_y ? -conv(vec2.y) : conv(vec2.y); - double xto = conv(v_start.x); - double yto = flip_y ? -conv(v_start.y) : conv(v_start.y); - Py::Tuple tup(7); - tup[0] = Py::Int(CURVE4); - tup[1] = Py::Float(xctl1); - tup[2] = Py::Float(yctl1); - tup[3] = Py::Float(xctl2); - tup[4] = Py::Float(yctl2); - tup[5] = Py::Float(xto); - tup[6] = Py::Float(yto); - path.append(tup); - - goto Close; - } - } - } + { + point++; + tags++; + + tag = FT_CURVE_TAG(tags[0]); + switch(tag) + { + case FT_CURVE_TAG_ON: // emit a single line_to + { + double x = conv(point->x); + double y = flip_y ? -conv(point->y) : conv(point->y); + Py::Tuple tup(3); + tup[0] = Py::Int(LINETO); + tup[1] = Py::Float(x); + tup[2] = Py::Float(y); + path.append(tup); + + continue; + } + + case FT_CURVE_TAG_CONIC: // consume conic arcs + { + v_control.x = point->x; + v_control.y = point->y; + + Do_Conic: + if(point < limit) + { + FT_Vector vec; + FT_Vector v_middle; + + point++; + tags++; + tag = FT_CURVE_TAG(tags[0]); + + vec.x = point->x; + vec.y = point->y; + + if(tag == FT_CURVE_TAG_ON) + { + double xctl = conv(v_control.x); + double yctl = flip_y ? -conv(v_control.y) : conv(v_control.y); + double xto = conv(vec.x); + double yto = flip_y ? -conv(vec.y) : conv(vec.y); + Py::Tuple tup(5); + tup[0] = Py::Int(CURVE3); + tup[1] = Py::Float(xctl); + tup[2] = Py::Float(yctl); + tup[3] = Py::Float(xto); + tup[4] = Py::Float(yto); + path.append(tup); + continue; + } + + if(tag != FT_CURVE_TAG_CONIC) return Py::Object(); + + v_middle.x = (v_control.x + vec.x) / 2; + v_middle.y = (v_control.y + vec.y) / 2; + + double xctl = conv(v_control.x); + double yctl = flip_y ? -conv(v_control.y) : conv(v_control.y); + double xto = conv(v_middle.x); + double yto = flip_y ? -conv(v_middle.y) : conv(v_middle.y); + Py::Tuple tup(5); + tup[0] = Py::Int(CURVE3); + tup[1] = Py::Float(xctl); + tup[2] = Py::Float(yctl); + tup[3] = Py::Float(xto); + tup[4] = Py::Float(yto); + path.append(tup); + + v_control = vec; + goto Do_Conic; + } + double xctl = conv(v_control.x); + double yctl = flip_y ? -conv(v_control.y) : conv(v_control.y); + double xto = conv(v_start.x); + double yto = flip_y ? -conv(v_start.y) : conv(v_start.y); + Py::Tuple tup(5); + tup[0] = Py::Int(CURVE3); + tup[1] = Py::Float(xctl); + tup[2] = Py::Float(yctl); + tup[3] = Py::Float(xto); + tup[4] = Py::Float(yto); + path.append(tup); + goto Close; + } + + default: // FT_CURVE_TAG_CUBIC + { + FT_Vector vec1, vec2; + + if(point + 1 > limit || FT_CURVE_TAG(tags[1]) != FT_CURVE_TAG_CUBIC) + { + return Py::Object(); + } + + vec1.x = point[0].x; + vec1.y = point[0].y; + vec2.x = point[1].x; + vec2.y = point[1].y; + + point += 2; + tags += 2; + + if(point <= limit) + { + FT_Vector vec; + + vec.x = point->x; + vec.y = point->y; + + double xctl1 = conv(vec1.x); + double yctl1 = flip_y ? -conv(vec1.y) : conv(vec1.y); + double xctl2 = conv(vec2.x); + double yctl2 = flip_y ? -conv(vec2.y) : conv(vec2.y); + double xto = conv(vec.x); + double yto = flip_y ? -conv(vec.y) : conv(vec.y); + Py::Tuple tup(7); + tup[0] = Py::Int(CURVE4); + tup[1] = Py::Float(xctl1); + tup[2] = Py::Float(yctl1); + tup[3] = Py::Float(xctl2); + tup[4] = Py::Float(yctl2); + tup[5] = Py::Float(xto); + tup[6] = Py::Float(yto); + path.append(tup); + + continue; + } + + double xctl1 = conv(vec1.x); + double yctl1 = flip_y ? -conv(vec1.y) : conv(vec1.y); + double xctl2 = conv(vec2.x); + double yctl2 = flip_y ? -conv(vec2.y) : conv(vec2.y); + double xto = conv(v_start.x); + double yto = flip_y ? -conv(v_start.y) : conv(v_start.y); + Py::Tuple tup(7); + tup[0] = Py::Int(CURVE4); + tup[1] = Py::Float(xctl1); + tup[2] = Py::Float(yctl1); + tup[3] = Py::Float(xctl2); + tup[4] = Py::Float(yctl2); + tup[5] = Py::Float(xto); + tup[6] = Py::Float(yto); + path.append(tup); + + goto Close; + } + } + } path.append(closepoly); @@ -850,14 +850,14 @@ FT2Font::set_size(const Py::Tuple & args) { #ifdef VERTICAL_HINTING int error = FT_Set_Char_Size( face, (long)(ptsize * 64), 0, - (unsigned int)dpi * HORIZ_HINTING, - (unsigned int)dpi ); + (unsigned int)dpi * HORIZ_HINTING, + (unsigned int)dpi ); static FT_Matrix transform = { 65536 / HORIZ_HINTING, 0, 0, 65536 }; FT_Set_Transform( face, &transform, 0 ); #else int error = FT_Set_Char_Size( face, (long)(ptsize * 64), 0, - (unsigned int)dpi, - (unsigned int)dpi ); + (unsigned int)dpi, + (unsigned int)dpi ); #endif if (error) throw Py::RuntimeError("Could not set the fontsize"); @@ -1033,7 +1033,7 @@ FT2Font::set_text(const Py::Tuple & args, const Py::Dict & kwargs) { if ( use_kerning && previous && glyph_index ) { FT_Vector delta; FT_Get_Kerning( face, previous, glyph_index, - FT_KERNING_DEFAULT, &delta ); + FT_KERNING_DEFAULT, &delta ); pen.x += delta.x / HORIZ_HINTING; } error = FT_Load_Glyph( face, glyph_index, flags ); @@ -1236,12 +1236,12 @@ FT2Font::draw_glyphs_to_bitmap(const Py::Tuple & args) { FT_Glyph_Get_CBox(glyphs[n], ft_glyph_bbox_pixels, &bbox); error = FT_Glyph_To_Bitmap(&glyphs[n], - ft_render_mode_normal, - 0, - 1 - ); + ft_render_mode_normal, + 0, + 1 + ); if (error) - throw Py::RuntimeError("Could not convert glyph to bitmap"); + throw Py::RuntimeError("Could not convert glyph to bitmap"); FT_BitmapGlyph bitmap = (FT_BitmapGlyph)glyphs[n]; // now, draw to our target surface (convert position) @@ -1278,12 +1278,12 @@ FT2Font::get_xys(const Py::Tuple & args) { FT_Glyph_Get_CBox(glyphs[n], ft_glyph_bbox_pixels, &bbox); error = FT_Glyph_To_Bitmap(&glyphs[n], - ft_render_mode_normal, - 0, - 1 - ); + ft_render_mode_normal, + 0, + 1 + ); if (error) - throw Py::RuntimeError("Could not convert glyph to bitmap"); + throw Py::RuntimeError("Could not convert glyph to bitmap"); FT_BitmapGlyph bitmap = (FT_BitmapGlyph)glyphs[n]; @@ -1329,8 +1329,8 @@ FT2Font::draw_glyph_to_bitmap(const Py::Tuple & args) { long x = (long)xd; long y = (long)yd; FT_Vector sub_offset; - sub_offset.x = int((xd - (double)x) * 64.0); - sub_offset.y = int((yd - (double)y) * 64.0); + sub_offset.x = int(-(xd - (double)x) * 64.0); + sub_offset.y = int(-(yd - (double)y) * 64.0); if (!Glyph::check(args[3].ptr())) throw Py::TypeError("Usage: draw_glyph_to_bitmap(bitmap, x,y,glyph)"); @@ -1340,10 +1340,10 @@ FT2Font::draw_glyph_to_bitmap(const Py::Tuple & args) { throw Py::ValueError("glyph num is out of range"); error = FT_Glyph_To_Bitmap(&glyphs[glyph->glyphInd], - ft_render_mode_normal, - &sub_offset, //no additional translation - 1 //destroy image; - ); + ft_render_mode_normal, + &sub_offset, //no additional translation + 1 //destroy image; + ); if (error) throw Py::RuntimeError("Could not convert glyph to bitmap"); @@ -1477,7 +1477,7 @@ FT2Font::get_sfnt(const Py::Tuple & args) { key[2] = Py::Int(sfnt.language_id); key[3] = Py::Int(sfnt.name_id); names[key] = Py::String((char *) sfnt.string, - (int) sfnt.string_len); + (int) sfnt.string_len); } return names; } @@ -1495,7 +1495,7 @@ FT2Font::get_name_index(const Py::Tuple & args) { std::string glyphname = Py::String(args[0]); return Py::Long((long) - FT_Get_Name_Index(face, (FT_String *) glyphname.c_str())); + FT_Get_Name_Index(face, (FT_String *) glyphname.c_str())); } char FT2Font::get_ps_font_info__doc__[] = @@ -1543,7 +1543,7 @@ FT2Font::get_sfnt_table(const Py::Tuple & args) { int tag; const char *tags[] = {"head", "maxp", "OS/2", "hhea", - "vhea", "post", "pclt", NULL}; + "vhea", "post", "pclt", NULL}; for (tag=0; tags[tag] != NULL; tag++) if (strcmp(tagname.c_str(), tags[tag]) == 0) @@ -1558,140 +1558,140 @@ FT2Font::get_sfnt_table(const Py::Tuple & args) { case 0: { char head_dict[] = "{s:(h,h), s:(h,h), s:l, s:l, s:i, s:i," - "s:(l,l), s:(l,l), s:h, s:h, s:h, s:h, s:i, s:i, s:h, s:h, s:h}"; + "s:(l,l), s:(l,l), s:h, s:h, s:h, s:h, s:i, s:i, s:h, s:h, s:h}"; TT_Header *t = (TT_Header *)table; return Py::asObject(Py_BuildValue(head_dict, - "version", - FIXED_MAJOR(t->Table_Version), - FIXED_MINOR(t->Table_Version), - "fontRevision", - FIXED_MAJOR(t->Font_Revision), - FIXED_MINOR(t->Font_Revision), - "checkSumAdjustment", t->CheckSum_Adjust, - "magicNumber" , t->Magic_Number, - "flags", (unsigned)t->Flags, - "unitsPerEm", (unsigned)t->Units_Per_EM, - "created", t->Created[0], t->Created[1], - "modified", t->Modified[0],t->Modified[1], - "xMin", t->xMin, - "yMin", t->yMin, - "xMax", t->xMax, - "yMax", t->yMax, - "macStyle", (unsigned)t->Mac_Style, - "lowestRecPPEM", (unsigned)t->Lowest_Rec_PPEM, - "fontDirectionHint", t->Font_Direction, - "indexToLocFormat", t->Index_To_Loc_Format, - "glyphDataFormat", t->Glyph_Data_Format)); + "version", + FIXED_MAJOR(t->Table_Version), + FIXED_MINOR(t->Table_Version), + "fontRevision", + FIXED_MAJOR(t->Font_Revision), + FIXED_MINOR(t->Font_Revision), + "checkSumAdjustment", t->CheckSum_Adjust, + "magicNumber" , t->Magic_Number, + "flags", (unsigned)t->Flags, + "unitsPerEm", (unsigned)t->Units_Per_EM, + "created", t->Created[0], t->Created[1], + "modified", t->Modified[0],t->Modified[1], + "xMin", t->xMin, + "yMin", t->yMin, + "xMax", t->xMax, + "yMax", t->yMax, + "macStyle", (unsigned)t->Mac_Style, + "lowestRecPPEM", (unsigned)t->Lowest_Rec_PPEM, + "fontDirectionHint", t->Font_Direction, + "indexToLocFormat", t->Index_To_Loc_Format, + "glyphDataFormat", t->Glyph_Data_Format)); } case 1: { char maxp_dict[] = "{s:(h,h), s:i, s:i, s:i, s:i, s:i, s:i," - "s:i, s:i, s:i, s:i, s:i, s:i, s:i, s:i}"; + "s:i, s:i, s:i, s:i, s:i, s:i, s:i, s:i}"; TT_MaxProfile *t = (TT_MaxProfile *)table; return Py::asObject(Py_BuildValue(maxp_dict, - "version", - FIXED_MAJOR(t->version), - FIXED_MINOR(t->version), - "numGlyphs", (unsigned)t->numGlyphs, - "maxPoints", (unsigned)t->maxPoints, - "maxContours", (unsigned)t->maxContours, - "maxComponentPoints", - (unsigned)t->maxCompositePoints, - "maxComponentContours", - (unsigned)t->maxCompositeContours, - "maxZones", (unsigned)t->maxZones, - "maxTwilightPoints",(unsigned)t->maxTwilightPoints, - "maxStorage", (unsigned)t->maxStorage, - "maxFunctionDefs",(unsigned)t->maxFunctionDefs, - "maxInstructionDefs", - (unsigned)t->maxInstructionDefs, - "maxStackElements",(unsigned)t->maxStackElements, - "maxSizeOfInstructions", - (unsigned)t->maxSizeOfInstructions, - "maxComponentElements", - (unsigned)t->maxComponentElements, - "maxComponentDepth", - (unsigned)t->maxComponentDepth)); + "version", + FIXED_MAJOR(t->version), + FIXED_MINOR(t->version), + "numGlyphs", (unsigned)t->numGlyphs, + "maxPoints", (unsigned)t->maxPoints, + "maxContours", (unsigned)t->maxContours, + "maxComponentPoints", + (unsigned)t->maxCompositePoints, + "maxComponentContours", + (unsigned)t->maxCompositeContours, + "maxZones", (unsigned)t->maxZones, + "maxTwilightPoints",(unsigned)t->maxTwilightPoints, + "maxStorage", (unsigned)t->maxStorage, + "maxFunctionDefs",(unsigned)t->maxFunctionDefs, + "maxInstructionDefs", + (unsigned)t->maxInstructionDefs, + "maxStackElements",(unsigned)t->maxStackElements, + "maxSizeOfInstructions", + (unsigned)t->maxSizeOfInstructions, + "maxComponentElements", + (unsigned)t->maxComponentElements, + "maxComponentDepth", + (unsigned)t->maxComponentDepth)); } case 2: { char os_2_dict[] = "{s:h, s:h, s:h, s:h, s:h, s:h, s:h, s:h," - "s:h, s:h, s:h, s:h, s:h, s:h, s:h, s:h, s:s#, s:(llll)," - "s:s#, s:h, s:h, s:h}"; + "s:h, s:h, s:h, s:h, s:h, s:h, s:h, s:h, s:s#, s:(llll)," + "s:s#, s:h, s:h, s:h}"; TT_OS2 *t = (TT_OS2 *)table; return Py::asObject(Py_BuildValue(os_2_dict, - "version", (unsigned)t->version, - "xAvgCharWidth", t->xAvgCharWidth, - "usWeightClass", (unsigned)t->usWeightClass, - "usWidthClass", (unsigned)t->usWidthClass, - "fsType", t->fsType, - "ySubscriptXSize", t->ySubscriptXSize, - "ySubscriptYSize", t->ySubscriptYSize, - "ySubscriptXOffset", t->ySubscriptXOffset, - "ySubscriptYOffset", t->ySubscriptYOffset, - "ySuperscriptXSize", t->ySuperscriptXSize, - "ySuperscriptYSize", t->ySuperscriptYSize, - "ySuperscriptXOffset", t->ySuperscriptXOffset, - "ySuperscriptYOffset", t->ySuperscriptYOffset, - "yStrikeoutSize", t->yStrikeoutSize, - "yStrikeoutPosition", t->yStrikeoutPosition, - "sFamilyClass", t->sFamilyClass, - "panose", t->panose, 10, - "ulCharRange", - (unsigned long) t->ulUnicodeRange1, - (unsigned long) t->ulUnicodeRange2, - (unsigned long) t->ulUnicodeRange3, - (unsigned long) t->ulUnicodeRange4, - "achVendID", t->achVendID, 4, - "fsSelection", (unsigned)t->fsSelection, - "fsFirstCharIndex",(unsigned)t->usFirstCharIndex, - "fsLastCharIndex",(unsigned)t->usLastCharIndex)); + "version", (unsigned)t->version, + "xAvgCharWidth", t->xAvgCharWidth, + "usWeightClass", (unsigned)t->usWeightClass, + "usWidthClass", (unsigned)t->usWidthClass, + "fsType", t->fsType, + "ySubscriptXSize", t->ySubscriptXSize, + "ySubscriptYSize", t->ySubscriptYSize, + "ySubscriptXOffset", t->ySubscriptXOffset, + "ySubscriptYOffset", t->ySubscriptYOffset, + "ySuperscriptXSize", t->ySuperscriptXSize, + "ySuperscriptYSize", t->ySuperscriptYSize, + "ySuperscriptXOffset", t->ySuperscriptXOffset, + "ySuperscriptYOffset", t->ySuperscriptYOffset, + "yStrikeoutSize", t->yStrikeoutSize, + "yStrikeoutPosition", t->yStrikeoutPosition, + "sFamilyClass", t->sFamilyClass, + "panose", t->panose, 10, + "ulCharRange", + (unsigned long) t->ulUnicodeRange1, + (unsigned long) t->ulUnicodeRange2, + (unsigned long) t->ulUnicodeRange3, + (unsigned long) t->ulUnicodeRange4, + "achVendID", t->achVendID, 4, + "fsSelection", (unsigned)t->fsSelection, + "fsFirstCharIndex",(unsigned)t->usFirstCharIndex, + "fsLastCharIndex",(unsigned)t->usLastCharIndex)); } case 3: { char hhea_dict[] = "{s:(h,h), s:h, s:h, s:h, s:i, s:h, s:h, s:h," - "s:h, s:h, s:h, s:h, s:i}"; + "s:h, s:h, s:h, s:h, s:i}"; TT_HoriHeader *t = (TT_HoriHeader *)table; return Py::asObject(Py_BuildValue(hhea_dict, - "version", - FIXED_MAJOR(t->Version), - FIXED_MINOR(t->Version), - "ascent", t->Ascender, - "descent", t->Descender, - "lineGap", t->Line_Gap, - "advanceWidthMax",(unsigned)t->advance_Width_Max, - "minLeftBearing", t->min_Left_Side_Bearing, - "minRightBearing", t->min_Right_Side_Bearing, - "xMaxExtent", t->xMax_Extent, - "caretSlopeRise", t->caret_Slope_Rise, - "caretSlopeRun", t->caret_Slope_Run, - "caretOffset", t->caret_Offset, - "metricDataFormat", t->metric_Data_Format, - "numOfLongHorMetrics", - (unsigned)t->number_Of_HMetrics)); + "version", + FIXED_MAJOR(t->Version), + FIXED_MINOR(t->Version), + "ascent", t->Ascender, + "descent", t->Descender, + "lineGap", t->Line_Gap, + "advanceWidthMax",(unsigned)t->advance_Width_Max, + "minLeftBearing", t->min_Left_Side_Bearing, + "minRightBearing", t->min_Right_Side_Bearing, + "xMaxExtent", t->xMax_Extent, + "caretSlopeRise", t->caret_Slope_Rise, + "caretSlopeRun", t->caret_Slope_Run, + "caretOffset", t->caret_Offset, + "metricDataFormat", t->metric_Data_Format, + "numOfLongHorMetrics", + (unsigned)t->number_Of_HMetrics)); } case 4: { char vhea_dict[] = "{s:(h,h), s:h, s:h, s:h, s:i, s:h, s:h, s:h," - "s:h, s:h, s:h, s:h, s:i}"; + "s:h, s:h, s:h, s:h, s:i}"; TT_VertHeader *t = (TT_VertHeader *)table; return Py::asObject(Py_BuildValue(vhea_dict, - "version", - FIXED_MAJOR(t->Version), - FIXED_MINOR(t->Version), - "vertTypoAscender", t->Ascender, - "vertTypoDescender", t->Descender, - "vertTypoLineGap", t->Line_Gap, - "advanceHeightMax",(unsigned)t->advance_Height_Max, - "minTopSideBearing", t->min_Top_Side_Bearing, - "minBottomSizeBearing", t->min_Bottom_Side_Bearing, - "yMaxExtent", t->yMax_Extent, - "caretSlopeRise", t->caret_Slope_Rise, - "caretSlopeRun", t->caret_Slope_Run, - "caretOffset", t->caret_Offset, - "metricDataFormat", t->metric_Data_Format, - "numOfLongVerMetrics", - (unsigned)t->number_Of_VMetrics)); + "version", + FIXED_MAJOR(t->Version), + FIXED_MINOR(t->Version), + "vertTypoAscender", t->Ascender, + "vertTypoDescender", t->Descender, + "vertTypoLineGap", t->Line_Gap, + "advanceHeightMax",(unsigned)t->advance_Height_Max, + "minTopSideBearing", t->min_Top_Side_Bearing, + "minBottomSizeBearing", t->min_Bottom_Side_Bearing, + "yMaxExtent", t->yMax_Extent, + "caretSlopeRise", t->caret_Slope_Rise, + "caretSlopeRun", t->caret_Slope_Run, + "caretOffset", t->caret_Offset, + "metricDataFormat", t->metric_Data_Format, + "numOfLongVerMetrics", + (unsigned)t->number_Of_VMetrics)); } case 5: { @@ -1730,7 +1730,7 @@ FT2Font::get_sfnt_table(const Py::Tuple & args) { pclt["symbolSet"] = Py::Int((short) t->SymbolSet); pclt["typeFace"] = Py::String((char *) t->TypeFace, 16); pclt["characterComplement"] = Py::String((char *) - t->CharacterComplement, 8); + t->CharacterComplement, 8); pclt["filename"] = Py::String((char *) t->FileName, 6); pclt["strokeWeight"] = Py::Int((int) t->StrokeWeight); pclt["widthType"] = Py::Int((int) t->WidthType); @@ -1805,23 +1805,23 @@ FT2Image::init_type() { behaviors().doc("FT2Image"); add_varargs_method("write_bitmap", &FT2Image::py_write_bitmap, - FT2Image::write_bitmap__doc__); + FT2Image::write_bitmap__doc__); add_varargs_method("draw_rect", &FT2Image::py_draw_rect, - FT2Image::draw_rect__doc__); + FT2Image::draw_rect__doc__); add_varargs_method("draw_rect_filled", &FT2Image::py_draw_rect_filled, - FT2Image::draw_rect_filled__doc__); + FT2Image::draw_rect_filled__doc__); add_varargs_method("as_array", &FT2Image::py_as_array, - FT2Image::as_array__doc__); + FT2Image::as_array__doc__); add_varargs_method("as_str", &FT2Image::py_as_str, - FT2Image::as_str__doc__); + FT2Image::as_str__doc__); add_varargs_method("as_rgb_str", &FT2Image::py_as_rgb_str, - FT2Image::as_rgb_str__doc__); + FT2Image::as_rgb_str__doc__); add_varargs_method("as_rgba_str", &FT2Image::py_as_rgba_str, - FT2Image::as_rgba_str__doc__); + FT2Image::as_rgba_str__doc__); add_varargs_method("get_width", &FT2Image::py_get_width, - "Returns the width of the image"); + "Returns the width of the image"); add_varargs_method("get_height", &FT2Image::py_get_height, - "Returns the height of the image"); + "Returns the height of the image"); } void @@ -1840,49 +1840,49 @@ FT2Font::init_type() { behaviors().doc("FT2Font"); add_varargs_method("clear", &FT2Font::clear, - FT2Font::clear__doc__); + FT2Font::clear__doc__); add_varargs_method("draw_glyph_to_bitmap", &FT2Font::draw_glyph_to_bitmap, - FT2Font::draw_glyph_to_bitmap__doc__); + FT2Font::draw_glyph_to_bitmap__doc__); add_varargs_method("draw_glyphs_to_bitmap", &FT2Font::draw_glyphs_to_bitmap, - FT2Font::draw_glyphs_to_bitmap__doc__); + FT2Font::draw_glyphs_to_bitmap__doc__); add_varargs_method("get_xys", &FT2Font::get_xys, - FT2Font::get_xys__doc__); + FT2Font::get_xys__doc__); add_varargs_method("get_num_glyphs", &FT2Font::get_num_glyphs, - FT2Font::get_num_glyphs__doc__); + FT2Font::get_num_glyphs__doc__); add_keyword_method("load_char", &FT2Font::load_char, - FT2Font::load_char__doc__); + FT2Font::load_char__doc__); add_keyword_method("load_glyph", &FT2Font::load_glyph, FT2Font::load_glyph__doc__); add_keyword_method("set_text", &FT2Font::set_text, - FT2Font::set_text__doc__); + FT2Font::set_text__doc__); add_varargs_method("set_size", &FT2Font::set_size, - FT2Font::set_size__doc__); + FT2Font::set_size__doc__); add_varargs_method("set_charmap", &FT2Font::set_charmap, - FT2Font::set_charmap__doc__); + FT2Font::set_charmap__doc__); add_varargs_method("select_charmap", &FT2Font::select_charmap, FT2Font::select_charmap__doc__); add_varargs_method("get_width_height", &FT2Font::get_width_height, - FT2Font::get_width_height__doc__); + FT2Font::get_width_height__doc__); add_varargs_method("get_descent", &FT2Font::get_descent, - FT2Font::get_descent__doc__); + FT2Font::get_descent__doc__); add_varargs_method("get_glyph_name", &FT2Font::get_glyph_name, - FT2Font::get_glyph_name__doc__); + FT2Font::get_glyph_name__doc__); add_varargs_method("get_charmap", &FT2Font::get_charmap, - FT2Font::get_charmap__doc__); + FT2Font::get_charmap__doc__); add_varargs_method("get_kerning", &FT2Font::get_kerning, - FT2Font::get_kerning__doc__); + FT2Font::get_kerning__doc__); add_varargs_method("get_sfnt", &FT2Font::get_sfnt, - FT2Font::get_sfnt__doc__); + FT2Font::get_sfnt__doc__); add_varargs_method("get_name_index", &FT2Font::get_name_index, - FT2Font::get_name_index__doc__); + FT2Font::get_name_index__doc__); add_varargs_method("get_ps_font_info", &FT2Font::get_ps_font_info, - FT2Font::get_ps_font_info__doc__); + FT2Font::get_ps_font_info__doc__); add_varargs_method("get_sfnt_table", &FT2Font::get_sfnt_table, - FT2Font::get_sfnt_table__doc__); + FT2Font::get_sfnt_table__doc__); add_varargs_method("get_image", &FT2Font::get_image, - FT2Font::get_image__doc__); + FT2Font::get_image__doc__); add_varargs_method("attach_file", &FT2Font::attach_file, FT2Font::attach_file__doc__); @@ -1956,28 +1956,28 @@ initft2font(void) import_array(); Py::Dict d = ft2font->moduleDictionary(); - d["SCALABLE"] = Py::Int(FT_FACE_FLAG_SCALABLE); - d["FIXED_SIZES"] = Py::Int(FT_FACE_FLAG_FIXED_SIZES); - d["FIXED_WIDTH"] = Py::Int(FT_FACE_FLAG_FIXED_WIDTH); - d["SFNT"] = Py::Int(FT_FACE_FLAG_SFNT); - d["HORIZONTAL"] = Py::Int(FT_FACE_FLAG_HORIZONTAL); - d["VERTICAL"] = Py::Int(FT_FACE_FLAG_SCALABLE); - d["KERNING"] = Py::Int(FT_FACE_FLAG_KERNING); - d["FAST_GLYPHS"] = Py::Int(FT_FACE_FLAG_FAST_GLYPHS); + d["SCALABLE"] = Py::Int(FT_FACE_FLAG_SCALABLE); + d["FIXED_SIZES"] = Py::Int(FT_FACE_FLAG_FIXED_SIZES); + d["FIXED_WIDTH"] = Py::Int(FT_FACE_FLAG_FIXED_WIDTH); + d["SFNT"] = Py::Int(FT_FACE_FLAG_SFNT); + d["HORIZONTAL"] = Py::Int(FT_FACE_FLAG_HORIZONTAL); + d["VERTICAL"] = Py::Int(FT_FACE_FLAG_SCALABLE); + d["KERNING"] = Py::Int(FT_FACE_FLAG_KERNING); + d["FAST_GLYPHS"] = Py::Int(FT_FACE_FLAG_FAST_GLYPHS); d["MULTIPLE_MASTERS"] = Py::Int(FT_FACE_FLAG_MULTIPLE_MASTERS); - d["GLYPH_NAMES"] = Py::Int(FT_FACE_FLAG_GLYPH_NAMES); - d["EXTERNAL_STREAM"] = Py::Int(FT_FACE_FLAG_EXTERNAL_STREAM); - d["ITALIC"] = Py::Int(FT_STYLE_FLAG_ITALIC); - d["BOLD"] = Py::Int(FT_STYLE_FLAG_BOLD); + d["GLYPH_NAMES"] = Py::Int(FT_FACE_FLAG_GLYPH_NAMES); + d["EXTERNAL_STREAM"] = Py::Int(FT_FACE_FLAG_EXTERNAL_STREAM); + d["ITALIC"] = Py::Int(FT_STYLE_FLAG_ITALIC); + d["BOLD"] = Py::Int(FT_STYLE_FLAG_BOLD); d["KERNING_DEFAULT"] = Py::Int(FT_KERNING_DEFAULT); d["KERNING_UNFITTED"] = Py::Int(FT_KERNING_UNFITTED); d["KERNING_UNSCALED"] = Py::Int(FT_KERNING_UNSCALED); - d["LOAD_DEFAULT"] = Py::Long(FT_LOAD_DEFAULT); - d["LOAD_NO_SCALE"] = Py::Long(FT_LOAD_NO_SCALE); - d["LOAD_NO_HINTING"] = Py::Long(FT_LOAD_NO_HINTING); - d["LOAD_RENDER"] = Py::Long(FT_LOAD_RENDER); - d["LOAD_NO_BITMAP"] = Py::Long(FT_LOAD_NO_BITMAP); + d["LOAD_DEFAULT"] = Py::Long(FT_LOAD_DEFAULT); + d["LOAD_NO_SCALE"] = Py::Long(FT_LOAD_NO_SCALE); + d["LOAD_NO_HINTING"] = Py::Long(FT_LOAD_NO_HINTING); + d["LOAD_RENDER"] = Py::Long(FT_LOAD_RENDER); + d["LOAD_NO_BITMAP"] = Py::Long(FT_LOAD_NO_BITMAP); d["LOAD_VERTICAL_LAYOUT"] = Py::Long(FT_LOAD_VERTICAL_LAYOUT); d["LOAD_FORCE_AUTOHINT"] = Py::Long(FT_LOAD_FORCE_AUTOHINT); d["LOAD_CROP_BITMAP"] = Py::Long(FT_LOAD_CROP_BITMAP); From 0994463be30cfc561f3f240d59ac886cab34c3c0 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Thu, 3 Dec 2009 20:21:21 +0000 Subject: [PATCH 0412/1000] Backport a number of mathtext fixes from mathtex project. Add unit tests. svn path=/trunk/matplotlib/; revision=8005 --- lib/matplotlib/__init__.py | 1 + lib/matplotlib/mathtext.py | 130 +- lib/matplotlib/testing/decorators.py | 2 +- .../test_mathtext/mathtext.pdf | Bin 0 -> 96115 bytes .../test_mathtext/mathtext.png | Bin 0 -> 113909 bytes .../test_mathtext/mathtext.svg | 1299 +++++++++++++++++ .../test_mathtext/mathtext_stix.pdf | Bin 0 -> 85390 bytes .../test_mathtext/mathtext_stix.png | Bin 0 -> 108728 bytes .../test_mathtext/mathtext_stix.svg | 1298 ++++++++++++++++ .../test_mathtext/mathtext_stixsans.pdf | Bin 0 -> 83339 bytes .../test_mathtext/mathtext_stixsans.png | Bin 0 -> 108412 bytes .../test_mathtext/mathtext_stixsans.svg | 1297 ++++++++++++++++ 12 files changed, 4003 insertions(+), 24 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext.png create mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix.png create mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix.svg create mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans.pdf create mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans.png create mode 100644 lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans.svg diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index 8a0089dc6da2..ffb735a4fb60 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -912,6 +912,7 @@ def tk_window_focus(): 'matplotlib.tests.test_spines', 'matplotlib.tests.test_image', 'matplotlib.tests.test_simplification', + 'matplotlib.tests.test_mathtext' ] def test(verbosity=0): diff --git a/lib/matplotlib/mathtext.py b/lib/matplotlib/mathtext.py index 0e8d450d3289..0995d07d9448 100644 --- a/lib/matplotlib/mathtext.py +++ b/lib/matplotlib/mathtext.py @@ -999,6 +999,11 @@ def get_sized_alternatives_for_symbol(self, fontname, sym): if glyphindex is not None: alternatives.append((i, unichr(uniindex))) + # The largest size of the radical symbol in STIX has incorrect + # metrics that cause it to be disconnected from the stem. + if sym == r'\__sqrt__': + alternatives = alternatives[:-1] + self._size_alternatives[sym] = alternatives return alternatives @@ -1186,7 +1191,7 @@ def get_underline_thickness(self, font, fontsize, dpi): GROW_FACTOR = 1.0 / SHRINK_FACTOR # The number of different sizes of chars to use, beyond which they will not # get any smaller -NUM_SIZE_LEVELS = 4 +NUM_SIZE_LEVELS = 6 # Percentage of x-height of additional horiz. space after sub/superscripts SCRIPT_SPACE = 0.2 # Percentage of x-height that sub/superscripts drop below the baseline @@ -1648,9 +1653,10 @@ class Hrule(Rule): """ Convenience class to create a horizontal rule. """ - def __init__(self, state): - thickness = state.font_output.get_underline_thickness( - state.font, state.fontsize, state.dpi) + def __init__(self, state, thickness=None): + if thickness is None: + thickness = state.font_output.get_underline_thickness( + state.font, state.fontsize, state.dpi) height = depth = thickness * 0.5 Rule.__init__(self, inf, height, depth, state) @@ -2202,6 +2208,41 @@ def __init__(self): | Error(r"Expected \frac{num}{den}")) ).setParseAction(self.frac).setName("frac") + stackrel = Group( + Suppress(Literal(r"\stackrel")) + + ((group + group) + | Error(r"Expected \stackrel{num}{den}")) + ).setParseAction(self.stackrel).setName("stackrel") + + + binom = Group( + Suppress(Literal(r"\binom")) + + ((group + group) + | Error(r"Expected \binom{num}{den}")) + ).setParseAction(self.binom).setName("binom") + + ambiDelim = oneOf(list(self._ambiDelim)) + leftDelim = oneOf(list(self._leftDelim)) + rightDelim = oneOf(list(self._rightDelim)) + rightDelimSafe = oneOf(list(self._rightDelim - set(['}']))) + genfrac = Group( + Suppress(Literal(r"\genfrac")) + + ((Suppress(Literal('{')) + + oneOf(list(self._ambiDelim | self._leftDelim | set(['']))) + + Suppress(Literal('}')) + + Suppress(Literal('{')) + + oneOf(list(self._ambiDelim | + (self._rightDelim - set(['}'])) | + set(['', r'\}']))) + + Suppress(Literal('}')) + + Suppress(Literal('{')) + + Regex("[0-9]*(\.?[0-9]*)?") + + Suppress(Literal('}')) + + group + group + group) + | Error(r"Expected \genfrac{ldelim}{rdelim}{rulesize}{style}{num}{den}")) + ).setParseAction(self.genfrac).setName("genfrac") + + sqrt = Group( Suppress(Literal(r"\sqrt")) + Optional( @@ -2218,6 +2259,9 @@ def __init__(self): ^ accent ^ group ^ frac + ^ stackrel + ^ binom + ^ genfrac ^ sqrt ) @@ -2239,9 +2283,6 @@ def __init__(self): | placeable ) - ambiDelim = oneOf(list(self._ambiDelim)) - leftDelim = oneOf(list(self._leftDelim)) - rightDelim = oneOf(list(self._rightDelim)) autoDelim <<(Suppress(Literal(r"\left")) + ((leftDelim | ambiDelim) | Error("Expected a delimiter")) + Group( @@ -2626,9 +2667,9 @@ def subsuperscript(self, s, loc, toks): hlist = HCentered([sub]) hlist.hpack(width, 'exactly') vlist.extend([Kern(rule_thickness * 3.0), hlist]) - shift = hlist.height + hlist.depth + rule_thickness * 2.0 + shift = hlist.height vlist = Vlist(vlist) - vlist.shift_amount = shift + nucleus.depth * 0.5 + vlist.shift_amount = shift + nucleus.depth result = Hlist([vlist]) return [result] @@ -2677,39 +2718,77 @@ def subsuperscript(self, s, loc, toks): result = Hlist([nucleus, x]) return [result] - def frac(self, s, loc, toks): - assert(len(toks)==1) - assert(len(toks[0])==2) + def _genfrac(self, ldelim, rdelim, rule, style, num, den): state = self.get_state() thickness = state.font_output.get_underline_thickness( state.font, state.fontsize, state.dpi) - num, den = toks[0] + rule = float(rule) num.shrink() den.shrink() cnum = HCentered([num]) cden = HCentered([den]) - width = max(num.width, den.width) + thickness * 10. + width = max(num.width, den.width) cnum.hpack(width, 'exactly') cden.hpack(width, 'exactly') vlist = Vlist([cnum, # numerator Vbox(0, thickness * 2.0), # space - Hrule(state), # rule - Vbox(0, thickness * 4.0), # space + Hrule(state, rule), # rule + Vbox(0, thickness * 2.0), # space cden # denominator ]) # Shift so the fraction line sits in the middle of the # equals sign metrics = state.font_output.get_metrics( - state.font, rcParams['mathtext.default'], '=', state.fontsize, state.dpi) + state.font, rcParams['mathtext.default'], + '=', state.fontsize, state.dpi) shift = (cden.height - ((metrics.ymax + metrics.ymin) / 2 - thickness * 3.0)) vlist.shift_amount = shift - hlist = Hlist([vlist, Hbox(thickness * 2.)]) - return [hlist] + result = [Hlist([vlist, Hbox(thickness * 2.)])] + if ldelim or rdelim: + if ldelim == '': + ldelim = '.' + if rdelim == '': + rdelim = '.' + elif rdelim == r'\}': + rdelim = '}' + return self._auto_sized_delimiter(ldelim, result, rdelim) + return result + + def genfrac(self, s, loc, toks): + assert(len(toks)==1) + assert(len(toks[0])==6) + + return self._genfrac(*tuple(toks[0])) + + def frac(self, s, loc, toks): + assert(len(toks)==1) + assert(len(toks[0])==2) + state = self.get_state() + + thickness = state.font_output.get_underline_thickness( + state.font, state.fontsize, state.dpi) + num, den = toks[0] + + return self._genfrac('', '', thickness, '', num, den) + + def stackrel(self, s, loc, toks): + assert(len(toks)==1) + assert(len(toks[0])==2) + num, den = toks[0] + + return self._genfrac('', '', 0.0, '', num, den) + + def binom(self, s, loc, toks): + assert(len(toks)==1) + assert(len(toks[0])==2) + num, den = toks[0] + + return self._genfrac('(', ')', 0.0, '', num, den) def sqrt(self, s, loc, toks): #~ print "sqrt", toks @@ -2756,9 +2835,7 @@ def sqrt(self, s, loc, toks): rightside]) # Body return [hlist] - def auto_sized_delimiter(self, s, loc, toks): - #~ print "auto_sized_delimiter", toks - front, middle, back = toks + def _auto_sized_delimiter(self, front, middle, back): state = self.get_state() height = max([x.height for x in middle]) depth = max([x.depth for x in middle]) @@ -2766,12 +2843,19 @@ def auto_sized_delimiter(self, s, loc, toks): # \left. and \right. aren't supposed to produce any symbols if front != '.': parts.append(AutoHeightChar(front, height, depth, state)) - parts.extend(middle.asList()) + parts.extend(middle) if back != '.': parts.append(AutoHeightChar(back, height, depth, state)) hlist = Hlist(parts) return hlist + + def auto_sized_delimiter(self, s, loc, toks): + #~ print "auto_sized_delimiter", toks + front, middle, back = toks + + return self._auto_sized_delimiter(front, middle.asList(), back) + ### ############################################################################## diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index 1e91375e7a84..144f2a85d0f1 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -88,7 +88,7 @@ def compare_images_generator(): orig_expected_fnames = [os.path.join(baseline_dir,fname) + '.' + extension for fname in baseline_images] expected_fnames = [os.path.join(result_dir,'expected-'+fname) + '.' + extension for fname in baseline_images] for src,dst in zip( orig_expected_fnames, expected_fnames ): - if not os.path.exists(dst): + if os.path.exists(src) and not os.path.exists(dst): shutil.copyfile(src,dst) actual_fnames = [os.path.join(result_dir, fname) + '.' + extension for fname in baseline_images] have_baseline_images = [os.path.exists(expected) for expected in expected_fnames] diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext.pdf b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c4275bf89b28b0d9ec320ce04f34302c17f9d416 GIT binary patch literal 96115 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 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix.pdf b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix.pdf new file mode 100644 index 0000000000000000000000000000000000000000..bde65399c42c2e49022cc5423c1954580644711c GIT binary patch literal 85390 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 y_PBILtoS!yXudKZ9}=bk$Jyo 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 ChrU(- literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix.png b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix.png new file mode 100644 index 0000000000000000000000000000000000000000..70fac039d5ee62c3e5b3a763cf78fa4413abe5a0 GIT binary patch literal 108728 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 literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix.svg new file mode 100644 index 000000000000..0d98eb725f40 --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stix.svg @@ -0,0 +1,1298 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans.pdf b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans.pdf new file mode 100644 index 0000000000000000000000000000000000000000..d2db3cdb7b1724309329e4536be55e0845932b16 GIT binary patch literal 83339 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�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 KCdTylt^W&&rTqQ? literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans.svg b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans.svg new file mode 100644 index 000000000000..d40ee1e7342e --- /dev/null +++ b/lib/matplotlib/tests/baseline_images/test_mathtext/mathtext_stixsans.svg @@ -0,0 +1,1297 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + From c2d389353bda85e8ba1ecd27b6fcf39eebf92201 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Thu, 3 Dec 2009 20:51:21 +0000 Subject: [PATCH 0413/1000] Adding test_mathtest.py file forgotten in last commit svn path=/trunk/matplotlib/; revision=8006 --- lib/matplotlib/tests/test_mathtext.py | 116 ++++++++++++++++++++++++++ 1 file changed, 116 insertions(+) create mode 100644 lib/matplotlib/tests/test_mathtext.py diff --git a/lib/matplotlib/tests/test_mathtext.py b/lib/matplotlib/tests/test_mathtext.py new file mode 100644 index 000000000000..677e2481c40f --- /dev/null +++ b/lib/matplotlib/tests/test_mathtext.py @@ -0,0 +1,116 @@ +import numpy as np +import matplotlib +from matplotlib.testing.decorators import image_comparison, knownfailureif +import matplotlib.pyplot as plt + +math_tests = [ + r'$a+b+\dots+\dot{s}+\ldots$', + r'$x \doteq y$', + r'\$100.00 $\alpha \_$', + r'$\frac{\$100.00}{y}$', + r'$x y$', + r'$x+y\ x=y\ x1}f\left(t\right) d\pi \left(t\right)$', + # mathtex doesn't support array + # 'mmltt23' : r'$\left(\begin{array}{cc}\hfill \left(\begin{array}{cc}\hfill a\hfill & \hfill b\hfill \\ \hfill c\hfill & \hfill d\hfill \end{array}\right)\hfill & \hfill \left(\begin{array}{cc}\hfill e\hfill & \hfill f\hfill \\ \hfill g\hfill & \hfill h\hfill \end{array}\right)\hfill \\ \hfill 0\hfill & \hfill \left(\begin{array}{cc}\hfill i\hfill & \hfill j\hfill \\ \hfill k\hfill & \hfill l\hfill \end{array}\right)\hfill \end{array}\right)$', + # mathtex doesn't support array + # 'mmltt24' : u'$det|\\begin{array}{ccccc}\\hfill {c}_{0}\\hfill & \\hfill {c}_{1}\\hfill & \\hfill {c}_{2}\\hfill & \\hfill \\dots \\hfill & \\hfill {c}_{n}\\hfill \\\\ \\hfill {c}_{1}\\hfill & \\hfill {c}_{2}\\hfill & \\hfill {c}_{3}\\hfill & \\hfill \\dots \\hfill & \\hfill {c}_{n+1}\\hfill \\\\ \\hfill {c}_{2}\\hfill & \\hfill {c}_{3}\\hfill & \\hfill {c}_{4}\\hfill & \\hfill \\dots \\hfill & \\hfill {c}_{n+2}\\hfill \\\\ \\hfill \\u22ee\\hfill & \\hfill \\u22ee\\hfill & \\hfill \\u22ee\\hfill & \\hfill \\hfill & \\hfill \\u22ee\\hfill \\\\ \\hfill {c}_{n}\\hfill & \\hfill {c}_{n+1}\\hfill & \\hfill {c}_{n+2}\\hfill & \\hfill \\dots \\hfill & \\hfill {c}_{2n}\\hfill \\end{array}|>0$', + r'${y}_{{x}_{2}}$', + r'${x}_{92}^{31415}+\pi $', + r'${x}_{{y}_{b}^{a}}^{{z}_{c}^{d}}$', + r'${y}_{3}^{\prime \prime \prime }$' +] + +def _run_all_tests(): + fig = plt.figure(figsize=(5, len(math_tests) / 2.0)) + for i, test in enumerate(math_tests): + fig.text(0, float(len(math_tests) - i - 1) / len(math_tests), test) + return fig + +@image_comparison(baseline_images=['mathtext']) +def test_mathtext(): + fig = _run_all_tests() + fig.savefig('mathtext') + +@image_comparison(baseline_images=['mathtext_stix']) +def test_mathtext_stix(): + matplotlib.rcParams['mathtext.fontset'] = 'stix' + + fig = _run_all_tests() + fig.savefig('mathtext_stix') + + matplotlib.rcParams['mathtext.fontset'] = 'cm' + +@image_comparison(baseline_images=['mathtext_stixsans']) +def test_mathtext_stixsans(): + matplotlib.rcParams['mathtext.fontset'] = 'stixsans' + + fig = _run_all_tests() + fig.savefig('mathtext_stixsans') + + matplotlib.rcParams['mathtext.fontset'] = 'cm' + + From 75490b958316f95b578612210359924735718a18 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Mon, 7 Dec 2009 01:16:36 +0000 Subject: [PATCH 0414/1000] reimplmenting AxisArtist svn path=/trunk/matplotlib/; revision=8008 --- examples/axes_grid/demo_axes_grid2.py | 29 +- examples/axes_grid/demo_axisline_style.py | 2 +- examples/axes_grid/demo_curvelinear_grid.py | 2 + lib/mpl_toolkits/axes_grid/angle_helper.py | 6 +- lib/mpl_toolkits/axes_grid/axis_artist.py | 1468 +++++++++++++++++ lib/mpl_toolkits/axes_grid/axisline_style.py | 166 +- lib/mpl_toolkits/axes_grid/axislines.py | 1018 ++---------- lib/mpl_toolkits/axes_grid/clip_path.py | 10 +- lib/mpl_toolkits/axes_grid/grid_finder.py | 37 +- .../axes_grid/grid_helper_curvelinear.py | 300 +++- lib/mpl_toolkits/axes_grid/parasite_axes.py | 7 + 11 files changed, 1977 insertions(+), 1068 deletions(-) create mode 100644 lib/mpl_toolkits/axes_grid/axis_artist.py diff --git a/examples/axes_grid/demo_axes_grid2.py b/examples/axes_grid/demo_axes_grid2.py index 802286eec8f5..62cc90c14933 100644 --- a/examples/axes_grid/demo_axes_grid2.py +++ b/examples/axes_grid/demo_axes_grid2.py @@ -11,27 +11,16 @@ def get_demo_image(): def add_inner_title(ax, title, loc, size=None, **kwargs): - from matplotlib.offsetbox import AuxTransformBox, AnchoredOffsetbox - from matplotlib.font_manager import FontProperties - from matplotlib.patches import PathPatch - from matplotlib.textpath import TextPath - from matplotlib.transforms import IdentityTransform + from matplotlib.offsetbox import AnchoredText + from matplotlib.patheffects import withStroke if size is None: - size = FontProperties(size=plt.rcParams['legend.fontsize']) - text_path = TextPath((0, 0), title, size=10) - p1 = PathPatch(text_path, ec="w", lw=3, transform=IdentityTransform()) - p2 = PathPatch(text_path, ec="none", fc="k", transform=IdentityTransform()) - - offsetbox = AuxTransformBox(IdentityTransform()) - offsetbox.add_artist(p1) - offsetbox.add_artist(p2) - - ao = AnchoredOffsetbox(loc=loc, child=offsetbox, - pad=0., borderpad=0.5, - frameon=False, **kwargs) - ax.add_artist(ao) - - return ao + size = dict(size=plt.rcParams['legend.fontsize']) + at = AnchoredText(title, loc=loc, prop=size, + pad=0., borderpad=0.5, + frameon=False, **kwargs) + ax.add_artist(at) + at.txt._text.set_path_effects([withStroke(foreground="w", linewidth=3)]) + return at if 1: F = plt.figure(1, (6, 6)) diff --git a/examples/axes_grid/demo_axisline_style.py b/examples/axes_grid/demo_axisline_style.py index 1e6ea49a97b2..3d0b0d6f5dab 100644 --- a/examples/axes_grid/demo_axisline_style.py +++ b/examples/axes_grid/demo_axisline_style.py @@ -9,7 +9,7 @@ fig.add_subplot(ax) for direction in ["xzero", "yzero"]: - ax.axis[direction].set_axisline_style("->") + ax.axis[direction].set_axisline_style("-|>") ax.axis[direction].set_visible(True) for direction in ["left", "right", "bottom", "top"]: diff --git a/examples/axes_grid/demo_curvelinear_grid.py b/examples/axes_grid/demo_curvelinear_grid.py index 6da0434f25f9..c4926e106be6 100644 --- a/examples/axes_grid/demo_curvelinear_grid.py +++ b/examples/axes_grid/demo_curvelinear_grid.py @@ -42,6 +42,8 @@ def inv_tr(x,y): ax1.set_xlim(0, 10.) ax1.set_ylim(0, 10.) + ax1.axis["t"]=ax1.new_floating_axis(0, 3.) + ax1.axis["t2"]=ax1.new_floating_axis(1, 7.) ax1.grid(True) diff --git a/lib/mpl_toolkits/axes_grid/angle_helper.py b/lib/mpl_toolkits/axes_grid/angle_helper.py index 45e88e07bbb7..b64808533303 100644 --- a/lib/mpl_toolkits/axes_grid/angle_helper.py +++ b/lib/mpl_toolkits/axes_grid/angle_helper.py @@ -147,7 +147,7 @@ def select_step(v1, v2, nv, hour=False): levs = np.arange(0, nv, 1) * step n = len(levs) - return levs, n, factor + return np.array(levs), n, factor def select_step24(v1, v2, nv): @@ -214,7 +214,7 @@ def __call__(self, direction, factor, values): # hour #return [fmt % (ss[0]*degree, floor(v/60.), v%60) \ # for s, v in zip(ss, values-3600*degree)] else: # factor > 3600. - return ["$%s$" % (str(v),) for v in values] + return [r"$%s^{\mathrm{h}}$" % (str(v),) for v in ss*values] class FormatterDMS(object): @@ -255,7 +255,7 @@ def __call__(self, direction, factor, values): #return [fmt % (ss[0]*degree, floor(v/60.), v%60) \ # for s, v in zip(ss, values-3600*degree)] else: # factor > 3600. - return ["$%s$" % (str(v),) for v in ss*values] + return [r"$%s^{\circ}$" % (str(v),) for v in ss*values] diff --git a/lib/mpl_toolkits/axes_grid/axis_artist.py b/lib/mpl_toolkits/axes_grid/axis_artist.py new file mode 100644 index 000000000000..e5244cafe0cb --- /dev/null +++ b/lib/mpl_toolkits/axes_grid/axis_artist.py @@ -0,0 +1,1468 @@ +""" +axis_artist.py module provides axis-related artists. They are + + * axis line + * tick lines + * tick labels + * axis label + * grid lines + +The main artist class is a AxisArtist and a GridLineCollection. The +GridLineCollection is responsible for drawing grid lines and the +AxisArtist is responsible for all other artists. The AxisArtist class +has attributest that are associated with each type of artists. + + * line : axis line + * major_ticks : major tick lines + * major_ticklabels : major tick labels + * minor_ticks : minor tick lines + * minor_ticklabels : minor tick labels + * label : axis label + +Typically, the AxisArtist associated with a axes will be accessed with +the *axis* dictionary of the axes, i.e., the AxisArtist for the bottom +axis is + + ax.axis["bottom"] + +where *ax* is an instance of axes (mpl_toolkits.axes_grid.axislines.Axes). +Thus, ax.axis["bottom"].line is an artist associated with the axis line, and ax.axis["bottom"].major_ticks is an artist associated with the major tick lines. + +You can change the colors, fonts, line widths, etc. of these artists +by calling sutable set method. For example, to change the color of the major ticks of the bottom axis to red, + + ax.axis["bottom"].major_ticks.set_color("r") + +However, things like the locations of ticks, and their ticklabels need +to be changed from the side of the grid_helper. + +axis_direction +-------------- + +AxisArtist, AxisLabel, TickLabels have *axis_drection* attribute, +which adjusts the location, angle, etc.,. The *axis_direction* must be +one of [left, right, bottom, top] and they follow the matplotlib +convention for the rectangle axis. + +For example, for the *bottom* axis (the left and right is relative to +the direction of the increasing coordinate), + + * ticklabels and axislabel are on the right + * ticklabels and axislabel have text angle of 0 + * ticklabels are baseline, center-aligned + * axislabel is top, center-aligned + + +The text angles are actually relative to (90 + angle of the direction +to the ticklabel), which gives 0 for bottom axis. + + left bottom right top + ticklabels location left right right left + axislabel location left right right left + ticklabels angle 90 0 -90 180 + axislabel angle 180 0 0 180 + ticklabel va center baseline center baseline + axislabel va center top center btoom + ticklabel ha right center right center + axislabel ha right center right center + + +Ticks are by default direct opposite side of the ticklabels. To make +ticks to the same side of the ticklabels, + + ax.axis["bottom"].major_ticks.set_ticks_out(True) + + +Following attributes can be customized (use set_xxx method) + + * Ticks : ticksize, tick_out + * TickLabels : pad + * AxisLabel : pad + +""" + + +# FIXME : + +# * : angles are given in data coordinate - need to convert it to canvas coordinate + + +import matplotlib.axes as maxes +import matplotlib.artist as martist +import matplotlib.text as mtext +import matplotlib.font_manager as font_manager + +from matplotlib.path import Path +from matplotlib.transforms import Affine2D, ScaledTranslation, \ + IdentityTransform, TransformedPath, Bbox +from matplotlib.collections import LineCollection + +from matplotlib import rcParams + +from matplotlib.artist import allow_rasterization + +import warnings + +import numpy as np + + +import matplotlib.lines as mlines +from axisline_style import AxislineStyle + + +class BezierPath(mlines.Line2D): + + def __init__(self, path, *kl, **kw): + mlines.Line2D.__init__(self, [], [], *kl, **kw) + self._path = path + self._invalid = False + + def recache(self): + + self._transformed_path = TransformedPath(self._path, self.get_transform()) + + self._invalid = False + + def set_path(self, path): + self._path = path + self._invalid = True + + + def draw(self, renderer): + if self._invalid: + self.recache() + + renderer.open_group('line2d') + + if not self._visible: return + gc = renderer.new_gc() + self._set_gc_clip(gc) + + gc.set_foreground(self._color) + gc.set_antialiased(self._antialiased) + gc.set_linewidth(self._linewidth) + gc.set_alpha(self._alpha) + if self.is_dashed(): + cap = self._dashcapstyle + join = self._dashjoinstyle + else: + cap = self._solidcapstyle + join = self._solidjoinstyle + gc.set_joinstyle(join) + gc.set_capstyle(cap) + + funcname = self._lineStyles.get(self._linestyle, '_draw_nothing') + if funcname != '_draw_nothing': + tpath, affine = self._transformed_path.get_transformed_path_and_affine() + lineFunc = getattr(self, funcname) + lineFunc(renderer, gc, tpath, affine.frozen()) + + gc.restore() + renderer.close_group('line2d') + + + +class UnimplementedException(Exception): + pass + +from matplotlib.artist import Artist + +class AttributeCopier(object): + def __init__(self, ref_artist, klass=Artist): + self._klass = klass + self._ref_artist = ref_artist + super(AttributeCopier, self).__init__() + + def set_ref_artist(self, artist): + self._ref_artist = artist + + def get_ref_artist(self): + raise RuntimeError("get_ref_artist must overriden") + #return self._ref_artist + + def get_attribute_from_ref_artist(self, attr_name, default_value): + get_attr_method_name = "get_"+attr_name + c = getattr(self._klass, get_attr_method_name)(self) + if c == 'auto': + ref_artist = self.get_ref_artist() + if ref_artist: + attr = getattr(ref_artist, + get_attr_method_name)() + return attr + else: + return default_value + + return c + + +from matplotlib.lines import Line2D + +class Ticks(Line2D, AttributeCopier): + """ + Ticks are derived from Line2D, and note that ticks themselves + are markers. Thus, you should use set_mec, set_mew, etc. + + To change the tick size (length), you need to use + set_ticksize. To change the direction of the ticks (ticks are + in opposite direction of ticklabels by default), use + set_tick_out(False). + """ + + def __init__(self, ticksize, tick_out=False, **kwargs): + self._ticksize = ticksize + self.locs_angles_labels = [] + + self.set_tick_out(tick_out) + + self._axis = kwargs.pop("axis", None) + if self._axis is not None: + if "color" not in kwargs: + kwargs["color"] = "auto" + if ("mew" not in kwargs) and ("markeredgewidth" not in kwargs): + kwargs["markeredgewidth"] = "auto" + + Line2D.__init__(self, [0.], [0.], **kwargs) + AttributeCopier.__init__(self, self._axis, klass=Line2D) + self.set_snap(True) + + def get_ref_artist(self): + return self._ref_artist.get_ticklines()[0] + + def get_color(self): + return self.get_attribute_from_ref_artist("color", "k") + + def get_markeredgecolor(self): + if self._markeredgecolor == 'auto': + return self.get_color() + else: + return self._markeredgecolor + + def get_markeredgewidth(self): + return self.get_attribute_from_ref_artist("markeredgewidth", .5) + + + def set_tick_out(self, b): + """ + set True if tick need to be rotated by 180 degree. + """ + self._tick_out = b + + def get_tick_out(self): + """ + Return True if the tick will be rotated by 180 degree. + """ + return self._tick_out + + + def set_ticksize(self, ticksize): + """ + set lenth of the ticks in points. + """ + self._ticksize = ticksize + + + def get_ticksize(self): + """ + Return length of the ticks in points. + """ + return self._ticksize + + def set_locs_angles(self, locs_angles): + self.locs_angles = locs_angles + + + def _update(self, renderer): + pass + + _tickvert_path = Path([[0., 0.], [1., 0.]]) + + def draw(self, renderer): + if not self.get_visible(): + return + + self._update(renderer) # update the tick + + size = self._ticksize + path_trans = self.get_transform() + + # set gc : copied from lines.py +# gc = renderer.new_gc() +# self._set_gc_clip(gc) + +# gc.set_foreground(self.get_color()) +# gc.set_antialiased(self._antialiased) +# gc.set_linewidth(self._linewidth) +# gc.set_alpha(self._alpha) +# if self.is_dashed(): +# cap = self._dashcapstyle +# join = self._dashjoinstyle +# else: +# cap = self._solidcapstyle +# join = self._solidjoinstyle +# gc.set_joinstyle(join) +# gc.set_capstyle(cap) +# gc.set_snap(self.get_snap()) + + + gc = renderer.new_gc() + self._set_gc_clip(gc) + gc.set_foreground(self.get_markeredgecolor()) + gc.set_linewidth(self.get_markeredgewidth()) + gc.set_alpha(self._alpha) + + offset = renderer.points_to_pixels(size) + marker_scale = Affine2D().scale(offset, offset) + + if self.get_tick_out(): + add_angle = 180 + else: + add_angle = 0 + + marker_rotation = Affine2D() + marker_transform = marker_scale + marker_rotation + + for loc, angle in self.locs_angles: + marker_rotation.rotate_deg(angle+add_angle) + locs = path_trans.transform_non_affine(np.array([loc, loc])) + renderer.draw_markers(gc, self._tickvert_path, marker_transform, + Path(locs), path_trans.get_affine()) + marker_rotation.clear() + + gc.restore() + + +def test_ticks(): + import matplotlib.pyplot as plt + fig = plt.figure(1) + fig.clf() + ax = fig.add_subplot(111) + ax.xaxis.set_visible(False) + ax.yaxis.set_visible(False) + ticks = Ticks(ticksize=10, axis=ax.xaxis) + ax.add_artist(ticks) + locs_angles = [((0.2, 0.), 90), + ((0.4, 0.), 120)] + ticks.set_locs_angles(locs_angles) + plt.draw() + + + + +class LabelBase(mtext.Text): + """ + A base class for AxisLabel and TickLabels. The position and angle + of the text are calculated by to offset_ref_angle, + text_ref_angle, and offset_radius attributes. + """ + + def __init__(self, *kl, **kwargs): + self.locs_angles_labels = [] + self._ref_angle = 0 + self._offset_radius = 0. + + super(LabelBase, self).__init__(*kl, + **kwargs) + + self.set_rotation_mode("anchor") + self._text_follow_ref_angle = True + #self._offset_ref_angle = 0 + + def _set_ref_angle(self, a): + self._ref_angle = a + + def _get_ref_angle(self): + return self._ref_angle + + def _get_text_ref_angle(self): + if self._text_follow_ref_angle: + return self._get_ref_angle()+90 + else: + return 0 #self.get_ref_angle() + + def _get_offset_ref_angle(self): + return self._get_ref_angle() + + def _set_offset_radius(self, offset_radius): + self._offset_radius = offset_radius + + def _get_offset_radius(self): + return self._offset_radius + + def _update(self, renderer): + pass + + def draw(self, renderer): + if not self.get_visible(): return + + self._update(renderer) + + # save original and adjust some properties + tr = self.get_transform() + angle_orig = self.get_rotation() + + offset_tr = Affine2D() + self.set_transform(tr+offset_tr) + + text_ref_angle = self._get_text_ref_angle() + offset_ref_angle = self._get_offset_ref_angle() + + theta = (offset_ref_angle)/180.*np.pi + dd = self._get_offset_radius() + dx, dy = dd * np.cos(theta), dd * np.sin(theta) + offset_tr.translate(dx, dy) + self.set_rotation(text_ref_angle+angle_orig) + super(LabelBase, self).draw(renderer) + offset_tr.clear() + + + # restore original properties + self.set_transform(tr) + self.set_rotation(angle_orig) + + + def get_window_extent(self, renderer): + + self._update(renderer) + + # save original and adjust some properties + tr = self.get_transform() + angle_orig = self.get_rotation() + + offset_tr = Affine2D() + self.set_transform(tr+offset_tr) + + text_ref_angle = self._get_text_ref_angle() + offset_ref_angle = self._get_offset_ref_angle() + + theta = (offset_ref_angle)/180.*np.pi + dd = self._get_offset_radius() + dx, dy = dd * np.cos(theta), dd * np.sin(theta) + offset_tr.translate(dx, dy) + self.set_rotation(text_ref_angle+angle_orig) + + bbox = super(LabelBase, self).get_window_extent(renderer) + + offset_tr.clear() + + + # restore original properties + self.set_transform(tr) + self.set_rotation(angle_orig) + + return bbox + + + +def test_labelbase(): + import matplotlib.pyplot as plt + fig = plt.figure(1) + fig.clf() + ax = fig.add_subplot(111) + + ax.plot([0.5], [0.5], "o") + label = LabelBase(0.5, 0.5, "Test") + + a = -90 + label._set_ref_angle(a) + label._set_offset_radius(offset_radius=50) + label.set_rotation(-90) + label.set(ha="center", va="top") + + ax.add_artist(label) + plt.draw() + + + + + + + + + +class AxisLabel(LabelBase, AttributeCopier): + """ + Axis Label. Derived from Text. The position of the text is updated + in the fly, so chaning text position has no effect. Otherwise, the + properties can be changed as a normal Text. + + To change the pad between ticklabels and axis label, use set_pad. + """ + + def __init__(self, *kl, **kwargs): + + axis_direction = kwargs.pop("axis_direction", "bottom") + self._axis = kwargs.pop("axis", None) + #super(AxisLabel, self).__init__(*kl, **kwargs) + LabelBase.__init__(self, *kl, **kwargs) + AttributeCopier.__init__(self, self._axis, klass=LabelBase) + + self.set_axis_direction(axis_direction) + self._pad = 5 + self._extra_pad = 0 + + def set_pad(self, pad): + """ + Set the pad in points. Note that the actual pad will be the + sum of the internal pad and the external pad (that are set + automatically by the AxisArtist), and it only set the internal + pad + """ + self._pad = pad + + def get_pad(self): + """ + return pad in points. See set_pad for more details. + """ + return self._pad + + + def _set_external_pad(self, p): + """ + Set external pad IN PIXELS. This is intended to be set by the + AxisArtist, bot by user.. + """ + self._extra_pad = p + + def _get_external_pad(self): + """ + Get external pad. + """ + return self._extra_pad + + + def get_ref_artist(self): + return self._axis.get_label() + + + def get_text(self): + t = super(AxisLabel, self).get_text() + if t == "__from_axes__": + return self._axis.get_label().get_text() + return self._text + + _default_alignments = dict(left=("bottom", "center"), + right=("top", "center"), + bottom=("top", "center"), + top=("bottom", "center")) + + + + def set_default_alignment(self, d): + if d not in ["left", "right", "top", "bottom"]: + raise ValueError('direction must be on of "left", "right", "top", "bottom"') + + va, ha = self._default_alignments[d] + self.set_va(va) + self.set_ha(ha) + + + _default_angles = dict(left=180, + right=0, + bottom=0, + top=180) + + + def set_default_angle(self, d): + if d not in ["left", "right", "top", "bottom"]: + raise ValueError('direction must be on of "left", "right", "top", "bottom"') + + self.set_rotation(self._default_angles[d]) + + + def set_axis_direction(self, d): + """ + Adjust the text angle and text alignment of axis label + according to the matplotlib convention. + + + ===================== ========== ========= ========== ========== + property left bottom right top + ===================== ========== ========= ========== ========== + axislabel angle 180 0 0 180 + axislabel va center top center btoom + axislabel ha right center right center + ===================== ========== ========= ========== ========== + + Note that the text angles are actually relative to (90 + angle + of the direction to the ticklabel), which gives 0 for bottom + axis. + + """ + if d not in ["left", "right", "top", "bottom"]: + raise ValueError('direction must be on of "left", "right", "top", "bottom"') + + self.set_default_alignment(d) + self.set_default_angle(d) + + def get_color(self): + return self.get_attribute_from_ref_artist("color", "k") + + def draw(self, renderer): + if not self.get_visible(): + return + + pad = renderer.points_to_pixels(self.get_pad()) + r = self._get_external_pad() + pad + self._set_offset_radius(r) + + super(AxisLabel, self).draw(renderer) + + +class TickLabels(AxisLabel, AttributeCopier): # mtext.Text + """ + Tick Labels. While derived from Text, this single artist draws all + ticklabels. As in AxisLabel, the position of the text is updated + in the fly, so changing text position has no effect. Otherwise, + the properties can be changed as a normal Text. Unlike the + ticklabels of the mainline matplotlib, properties of single + ticklabel alone cannot modified. + + To change the pad between ticks and ticklabels, use set_pad. + """ + + def __init__(self, **kwargs): + + axis_direction = kwargs.pop("axis_direction", "bottom") + AxisLabel.__init__(self, **kwargs) + self.set_axis_direction(axis_direction) + #self._axis_direction = axis_direction + self._axislabel_pad = 0 + #self._extra_pad = 0 + + + # attribute coper + def get_ref_artist(self): + return self._axis.get_ticklabels()[0] + + def set_axis_direction(self, label_direction): + """ + Adjust the text angle and text alignment of ticklabels + according to the matplotlib convention. + + The *label_direction* must be one of [left, right, bottom, + top]. + + ===================== ========== ========= ========== ========== + property left bottom right top + ===================== ========== ========= ========== ========== + ticklabels angle 90 0 -90 180 + ticklabel va center baseline center baseline + ticklabel ha right center right center + ===================== ========== ========= ========== ========== + + + Note that the text angles are actually relative to (90 + angle + of the direction to the ticklabel), which gives 0 for bottom + axis. + + """ + + if label_direction not in ["left", "right", "top", "bottom"]: + raise ValueError('direction must be one of "left", "right", "top", "bottom"') + + self._axis_direction = label_direction + self.set_default_alignment(label_direction) + self.set_default_angle(label_direction) + + def _get_ticklabels_offsets(self, renderer, label_direction): + """ + Calculates the offsets of the ticklabels from the tick and + their total heights. The offset only takes account the offset + due to the vertical alignment of the ticklabels, i.e.,if axis + direction is bottom and va is ;top', it will return 0. if va + is 'baseline', it will return (height-descent). + """ + whd_list = self.get_texts_widths_heights_descents(renderer) + + if not whd_list: + return 0, 0 + + r = 0 + va, ha = self.get_va(), self.get_ha() + + if label_direction == "left": + pad = max([w for (w, h, d) in whd_list]) + if ha == "left": + r = pad + elif ha == "center": + r = .5 * pad + elif label_direction == "right": + pad = max([w for (w, h, d) in whd_list]) + if ha == "right": + r = pad + elif ha == "center": + r = .5 * pad + elif label_direction == "bottom": + pad = max([h for (w, h, d) in whd_list]) + if va == "bottom": + r = pad + elif va == "center": + r =.5 * pad + elif va == "baseline": + max_ascent = max([(h-d) for (w, h, d) in whd_list]) + max_descent = max([d for (w, h, d) in whd_list]) + r = max_ascent + pad = max_ascent + max_descent + elif label_direction == "top": + pad = max([h for (w, h, d) in whd_list]) + if va == "top": + r = pad + elif va == "center": + r =.5 * pad + elif va == "baseline": + max_ascent = max([(h-d) for (w, h, d) in whd_list]) + max_descent = max([d for (w, h, d) in whd_list]) + r = max_descent + pad = max_ascent + max_descent + + #tick_pad = renderer.points_to_pixels(self.get_pad()) + + # r : offset + + # pad : total height of the ticklabels. This will be used to + # calculate the pad for the axislabel. + return r, pad + + + + _default_alignments = dict(left=("center", "right"), + right=("center", "left"), + bottom=("baseline", "center"), + top=("baseline", "center")) + + + + # set_default_alignments(self, d) + + _default_angles = dict(left=90, + right=-90, + bottom=0, + top=180) + + + def draw(self, renderer): + if not self.get_visible(): + self._axislabel_pad = self._get_external_pad() + return + + r, total_width = self._get_ticklabels_offsets(renderer, + self._axis_direction) + + #self._set_external_pad(r+self._get_external_pad()) + pad = self._get_external_pad() + \ + renderer.points_to_pixels(self.get_pad()) + self._set_offset_radius(r+pad) + + #self._set_offset_radius(r) + + for (x, y), a, l in self._locs_angles_labels: + self._set_ref_angle(a) #+ add_angle + self.set_x(x) + self.set_y(y) + self.set_text(l) + LabelBase.draw(self, renderer) + + self._axislabel_pad = total_width \ + + pad # the value saved will be used to draw axislabel. + + + def set_locs_angles_labels(self, locs_angles_labels): + self._locs_angles_labels = locs_angles_labels + + def get_window_extents(self, renderer): + + bboxes = [] + + r, total_width = self._get_ticklabels_offsets(renderer, + self._axis_direction) + + pad = self._get_external_pad() + \ + renderer.points_to_pixels(self.get_pad()) + self._set_offset_radius(r+pad) + + + for (x, y), a, l in self._locs_angles_labels: + self._set_ref_angle(a) #+ add_angle + self.set_x(x) + self.set_y(y) + self.set_text(l) + bb = LabelBase.get_window_extent(self, renderer) + bboxes.append(bb) + + return bboxes + + + def get_texts_widths_heights_descents(self, renderer): + """ + return a list of width, height, descent for ticklaels. + """ + whd_list = [] + for (x, y), a, l in self._locs_angles_labels: + clean_line, ismath = self.is_math_text(l) + whd = renderer.get_text_width_height_descent( + clean_line, self._fontproperties, ismath=ismath) + whd_list.append(whd) + + return whd_list + + + +def test_ticklabels(): + import matplotlib.pyplot as plt + fig = plt.figure(1) + fig.clf() + ax = fig.add_subplot(111) + ax.xaxis.set_visible(False) + ax.yaxis.set_visible(False) + ax.plot([0.2, 0.4], [0.5, 0.5], "o") + ticks = Ticks(ticksize=10, axis=ax.xaxis) + ax.add_artist(ticks) + locs_angles_labels = [((0.2, 0.5), -90, "0.2"), + ((0.4, 0.5), -120, "0.4")] + tick_locs_angles = [(xy, a+180) for xy, a, l in locs_angles_labels] + ticks.set_locs_angles(tick_locs_angles) + + + ax.plot([0.5], [0.5], ",") + axislabel = AxisLabel(0.5, 0.5, "Test") + axislabel._set_offset_radius(20) + axislabel._set_ref_angle(0) + axislabel.set_axis_direction("bottom") + #axislabel._text_follow_ref_angle = True + #axislabel.set(va="center", ha="right") + ax.add_artist(axislabel) + + if 1: + ticklabels = TickLabels(axis_direction="left") + ticklabels._locs_angles_labels = locs_angles_labels + #ticklabels.set_rotation(90) + ticklabels.set_pad(10) + + ax.add_artist(ticklabels) + + ax.set_xlim(0, 1); ax.set_ylim(0, 1) + + plt.draw() + + + + +class GridlinesCollection(LineCollection): + def __init__(self, *kl, **kwargs): + super(GridlinesCollection, self).__init__(*kl, **kwargs) + self.set_grid_helper(None) + + def set_grid_helper(self, grid_helper): + self._grid_helper = grid_helper + + def draw(self, renderer): + if self._grid_helper is not None: + self._grid_helper.update_lim(self.axes) + gl = self._grid_helper.get_gridlines() + if gl: + self.set_segments([np.transpose(l) for l in gl]) + else: + self.set_segments([]) + super(GridlinesCollection, self).draw(renderer) + + + + +class AxisArtist(martist.Artist): + """ + An artist which draws axis (a line along which the n-th axes coord + is constant) line, ticks, ticklabels, and axis label. + """ + + ZORDER=2.5 + + # LABELPAD : as property + def _set_labelpad(self, v): + return self.label.set_pad(v) + + def _get_labelpad(self): + return self.label.get_pad() + + LABELPAD = property(_get_labelpad, _set_labelpad) + + def __init__(self, axes, + helper, + offset=None, + axis_direction="bottom", + **kw): + """ + *axes* : axes + *helper* : an AxisArtistHelper instance. + """ + #axes is also used to follow the axis attribute (tick color, etc). + + super(AxisArtist, self).__init__(**kw) + + self.axes = axes + + self._axis_artist_helper = helper + + if offset is None: + offset = (0, 0) + self.dpi_transform = Affine2D() + self.offset_transform = ScaledTranslation(offset[0], offset[1], + self.dpi_transform) + + self._label_visible = True + self._majortick_visible = True + self._majorticklabel_visible = True + self._minortick_visible = True + self._minorticklabel_visible = True + + + #if self._axis_artist_helper._loc in ["left", "right"]: + if axis_direction in ["left", "right"]: + axis_name = "ytick" + self.axis = axes.yaxis + else: + axis_name = "xtick" + self.axis = axes.xaxis + + + self._axisline_style = None + + + self._axis_direction = axis_direction + + + self._init_line() + self._init_ticks(axis_name, **kw) + self._init_offsetText(axis_direction) + self._init_label() + + self.set_zorder(self.ZORDER) + + self._rotate_label_along_line = False + + # axis direction + self._tick_add_angle = 180. + self._ticklabel_add_angle = 0. + self._axislabel_add_angle = 0. + self.set_axis_direction(axis_direction) + + + # axis direction + + def set_axis_direction(self, axis_direction): + """ + Adjust the direction, text angle, text alignment of + ticklabels, labels following the matplotlib convention for + the rectangle axes. + + The *axis_direction* must be one of [left, right, bottom, + top]. + + ===================== ========== ========= ========== ========== + property left bottom right top + ===================== ========== ========= ========== ========== + ticklabels location "-" "+" "+" "-" + axislabel location "-" "+" "+" "-" + ticklabels angle 90 0 -90 180 + ticklabel va center baseline center baseline + ticklabel ha right center right center + axislabel angle 180 0 0 180 + axislabel va center top center btoom + axislabel ha right center right center + ===================== ========== ========= ========== ========== + + + Note that the direction "+" and "-" are relative to the direction of + the increasing coordinate. Also, the text angles are actually + relative to (90 + angle of the direction to the ticklabel), + which gives 0 for bottom axis. + + """ + + if axis_direction not in ["left", "right", "top", "bottom"]: + raise ValueError('direction must be on of "left", "right", "top", "bottom"') + self._axis_direction = axis_direction + if axis_direction in ["left", "top"]: + #self._set_tick_direction("+") + self.set_ticklabel_direction("-") + self.set_axislabel_direction("-") + else: + #self._set_tick_direction("-") + self.set_ticklabel_direction("+") + self.set_axislabel_direction("+") + + self.major_ticklabels.set_axis_direction(axis_direction) + self.label.set_axis_direction(axis_direction) + + # def _set_tick_direction(self, d): + # if d not in ["+", "-"]: + # raise ValueError('direction must be on of "in", "out"') + + # if d == "+": + # self._tick_add_angle = 0 #get_helper()._extremes=0, 10 + # else: + # self._tick_add_angle = 180 #get_helper()._extremes=0, 10 + + def set_ticklabel_direction(self, tick_direction): + """ + Adjust the direction of the ticklabel. + + ACCEPTS: [ "+" | "-" ] + + Note that the label_direction '+' and '-' are relative to the + direction of the increasing coordinate. + """ + + if tick_direction not in ["+", "-"]: + raise ValueError('direction must be one of "+", "-"') + + if tick_direction == "-": + self._ticklabel_add_angle = 180 + else: + self._ticklabel_add_angle = 0 + + def set_axislabel_direction(self, label_direction): + """ + Adjust the direction of the axislabel. + + ACCEPTS: [ "+" | "-" ] + + Note that the label_direction '+' and '-' are relative to the + direction of the increasing coordinate. + """ + if label_direction not in ["+", "-"]: + raise ValueError('direction must be one of "+", "-"') + + if label_direction == "-": + self._axislabel_add_angle = 180 + else: + self._axislabel_add_angle = 0 + + + + def get_transform(self): + return self.axes.transAxes + self.offset_transform + + def get_helper(self): + """ + Return axis artist helper instance. + """ + return self._axis_artist_helper + + + def set_axisline_style(self, axisline_style=None, **kw): + """ + Set the axisline style. + + *axisline_style* can be a string with axisline style name with optional + comma-separated attributes. Alternatively, the attrs can + be provided as keywords. + + set_arrowstyle("->,size=1.5") + set_arrowstyle("->", size=1.5) + + Old attrs simply are forgotten. + + Without argument (or with arrowstyle=None), return + available styles as a list of strings. + """ + + if axisline_style==None: + return AxislineStyle.pprint_styles() + + if isinstance(axisline_style, AxislineStyle._Base): + self._axisline_style = axisline_style + else: + self._axisline_style = AxislineStyle(axisline_style, **kw) + + + self._init_line() + + + def get_axisline_style(self): + """ + return the current axisline style. + """ + return self._axisline_style + + def _init_line(self): + """ + Initialize the *line* artist that is responsible to draw the axis line. + """ + tran = self._axis_artist_helper.get_line_transform(self.axes) \ + + self.offset_transform + + axisline_style = self.get_axisline_style() + if axisline_style is None: + self.line = BezierPath(self._axis_artist_helper.get_line(self.axes), + color=rcParams['axes.edgecolor'], + linewidth=rcParams['axes.linewidth'], + transform=tran) + else: + self.line = axisline_style(self, transform=tran) + + def _draw_line(self, renderer): + self.line.set_path(self._axis_artist_helper.get_line(self.axes)) + if self.get_axisline_style() is not None: + self.line.set_line_mutation_scale(self.major_ticklabels.get_size()) + self.line.draw(renderer) + + + def _init_ticks(self, axis_name, **kw): + + trans=self._axis_artist_helper.get_tick_transform(self.axes) \ + + self.offset_transform + + + major_tick_size = kw.get("major_tick_size", + rcParams['%s.major.size'%axis_name]) + major_tick_pad = kw.get("major_tick_pad", + rcParams['%s.major.pad'%axis_name]) + minor_tick_size = kw.get("minor_tick_size", + rcParams['%s.minor.size'%axis_name]) + minor_tick_pad = kw.get("minor_tick_pad", + rcParams['%s.minor.pad'%axis_name]) + + self.major_ticks = Ticks(major_tick_size, + axis=self.axis, + transform=trans) + self.minor_ticks = Ticks(minor_tick_size, + axis=self.axis, + transform=trans) + + if axis_name == "xaxis": + size = rcParams['xtick.labelsize'] + else: + size = rcParams['ytick.labelsize'] + + + fontprops = font_manager.FontProperties(size=size) + + self.major_ticklabels = TickLabels(size=size, axis=self.axis, + axis_direction=self._axis_direction) + self.minor_ticklabels = TickLabels(size=size, axis=self.axis, + axis_direction=self._axis_direction) + + + self.major_ticklabels.set(figure = self.axes.figure, + transform=trans, + fontproperties=fontprops) + self.major_ticklabels.set_pad(major_tick_pad) + + self.minor_ticklabels.set(figure = self.axes.figure, + transform=trans, + fontproperties=fontprops) + self.minor_ticklabels.set_pad(minor_tick_pad) + + + + def _get_tick_info(self, tick_iter): + """ + return ticks_loc_angle, ticklabels_loc_angle_label + + ticks_loc_angle : list of locs and angles for ticks + ticklabels_loc_angle_label : list of locs, angles and labels for tickslabels + """ + ticks_loc_angle = [] + ticklabels_loc_angle_label = [] + + tick_add_angle = self._tick_add_angle + ticklabel_add_angle = self._ticklabel_add_angle + + for loc, angle_normal, angle_tangent, label in tick_iter: + angle_label = angle_tangent - 90 + angle_label += ticklabel_add_angle + + if np.cos((angle_label - angle_normal)/180.*np.pi) < 0.: + angle_tick = angle_normal + else: + angle_tick = angle_normal + 180 + + ticks_loc_angle.append([loc, angle_tick]) + ticklabels_loc_angle_label.append([loc, angle_label, label]) + + return ticks_loc_angle, ticklabels_loc_angle_label + + + def _draw_ticks(self, renderer): + + + # set extra pad for major and minor ticklabels: + # use ticksize of majorticks even for minor ticks. not clear what is best. + + if self.major_ticks.get_visible() and self.major_ticks.get_tick_out(): + self.major_ticklabels._set_external_pad(self.major_ticks._ticksize) + self.minor_ticklabels._set_external_pad(self.major_ticks._ticksize) + else: + self.major_ticklabels._set_external_pad(0) + self.minor_ticklabels._set_external_pad(0) + + + majortick_iter, minortick_iter = \ + self._axis_artist_helper.get_tick_iterators(self.axes) + + tick_loc_angle, ticklabel_loc_angle_label \ + = self._get_tick_info(majortick_iter) + + self.major_ticks.set_locs_angles(tick_loc_angle) + self.major_ticklabels.set_locs_angles_labels(ticklabel_loc_angle_label) + + self.major_ticks.draw(renderer) + self.major_ticklabels.draw(renderer) + + + # minor ticks + tick_loc_angle, ticklabel_loc_angle_label \ + = self._get_tick_info(minortick_iter) + + self.minor_ticks.set_locs_angles(tick_loc_angle) + self.minor_ticklabels.set_locs_angles_labels(ticklabel_loc_angle_label) + + self.minor_ticks.draw(renderer) + self.minor_ticklabels.draw(renderer) + + + if (self.major_ticklabels.get_visible() or self.minor_ticklabels.get_visible()): + self._draw_offsetText(renderer) + + return self.major_ticklabels.get_window_extents(renderer) + + + + + _offsetText_pos = dict(left=(0, 1, "bottom", "right"), + right=(1, 1, "bottom", "left"), + bottom=(1, 0, "top", "right"), + top=(1, 1, "bottom", "right")) + + def _init_offsetText(self, direction): + + x,y,va,ha = self._offsetText_pos[direction] + + self.offsetText = mtext.Annotation("", + xy=(x,y), xycoords="axes fraction", + xytext=(0,0), textcoords="offset points", + #fontproperties = fp, + color = rcParams['xtick.color'], + verticalalignment=va, + horizontalalignment=ha, + ) + self.offsetText.set_transform(IdentityTransform()) + self.axes._set_artist_props(self.offsetText) + + + def _update_offsetText(self): + self.offsetText.set_text( self.axis.major.formatter.get_offset() ) + self.offsetText.set_size(self.major_ticklabels.get_size()) + offset = self.major_ticklabels.get_pad() + self.major_ticklabels.get_size() + 2. + self.offsetText.xytext= (0, offset) + + + def _draw_offsetText(self, renderer): + self._update_offsetText() + self.offsetText.draw(renderer) + + + + def _init_label(self, **kw): + # x in axes coords, y in display coords (to be updated at draw + # time by _update_label_positions) + + labelsize = kw.get("labelsize", + rcParams['axes.labelsize']) + #labelcolor = kw.get("labelcolor", + # rcParams['axes.labelcolor']) + fontprops = font_manager.FontProperties(size=labelsize) + textprops = dict(fontproperties = fontprops) + #color = labelcolor) + + tr = self._axis_artist_helper.get_axislabel_transform(self.axes) \ + + self.offset_transform + + self.label = AxisLabel(0, 0, "__from_axes__", + color = "auto", #rcParams['axes.labelcolor'], + fontproperties=fontprops, + axis=self.axis, + transform=tr, + axis_direction=self._axis_direction, + ) + + self.label.set_figure(self.axes.figure) + + labelpad = kw.get("labelpad", 5) + self.label.set_pad(labelpad) + + def _draw_label(self, renderer): + + if not self.label.get_visible(): + return + + fontprops = font_manager.FontProperties(size=rcParams['axes.labelsize']) + + #pad_points = self.major_tick_pad + + axislabel_pad = max([self.major_ticklabels._axislabel_pad, + self.minor_ticklabels._axislabel_pad]) + + #label_offset = axislabel_pad + self.LABELPAD + + #self.label._set_offset_radius(label_offset) + self.label._set_external_pad(axislabel_pad) + + xy, angle_tangent = self._axis_artist_helper.get_axislabel_pos_angle(self.axes) + if xy is None: return + + angle_label = angle_tangent - 90 + + + x, y = xy + self.label._set_ref_angle(angle_label+self._axislabel_add_angle) + self.label.set(x=x, y=y) + self.label.draw(renderer) + + + + def set_label(self, s): + self.label.set_text(s) + + + @allow_rasterization + def draw(self, renderer): + 'Draw the axis lines, tick lines and labels' + + if not self.get_visible(): return + + renderer.open_group(__name__) + + self._axis_artist_helper.update_lim(self.axes) + + dpi_cor = renderer.points_to_pixels(1.) + self.dpi_transform.clear().scale(dpi_cor, dpi_cor) + + + self._draw_line(renderer) + self._draw_ticks(renderer) + + #self._draw_offsetText(renderer) + self._draw_label(renderer) + + renderer.close_group(__name__) + + #def get_ticklabel_extents(self, renderer): + # pass + + def toggle(self, all=None, ticks=None, ticklabels=None, label=None): + """ + Toggle visibility of ticks, ticklabels, and (axis) label. + To turn all off, :: + + axis.toggle(all=False) + + To turn all off but ticks on :: + + axis.toggle(all=False, ticks=True) + + To turn all on but (axis) label off :: + + axis.toggle(all=True, label=False)) + + """ + if all: + _ticks, _ticklabels, _label = True, True, True + elif all is not None: + _ticks, _ticklabels, _label = False, False, False + else: + _ticks, _ticklabels, _label = None, None, None + + if ticks is not None: + _ticks = ticks + if ticklabels is not None: + _ticklabels = ticklabels + if label is not None: + _label = label + + if _ticks is not None: + self.major_ticks.set_visible(_ticks) + self.minor_ticks.set_visible(_ticks) + if _ticklabels is not None: + self.major_ticklabels.set_visible(_ticklabels) + self.minor_ticklabels.set_visible(_ticklabels) + if _label is not None: + self.label.set_visible(_label) + + + + + +def test_axis_artist(): + global axisline + + #self._axislines[loc] = new_fixed_axis(loc=loc, axes=axes) + from mpl_toolkits.axes_grid.axislines import AxisArtistHelperRectlinear + fig = plt.figure(1) + fig.clf() + ax=fig.add_subplot(111) + ax.xaxis.set_visible(False) + ax.yaxis.set_visible(False) + + if 1: + + _helper = AxisArtistHelperRectlinear.Fixed(ax, loc="left") + axisline = AxisArtist(ax, _helper, offset=None, axis_direction="left") + ax.add_artist(axisline) + _helper = AxisArtistHelperRectlinear.Fixed(ax, loc="right") + axisline = AxisArtist(ax, _helper, offset=None, axis_direction="right") + ax.add_artist(axisline) + + _helper = AxisArtistHelperRectlinear.Fixed(ax, loc="bottom") + axisline = AxisArtist(ax, _helper, offset=None, axis_direction="bottom") + axisline.set_label("TTT") + #axisline.label.set_visible(False) + ax.add_artist(axisline) + + #axisline.major_ticklabels.set_axis_direction("bottom") + axisline.major_ticks.set_tick_out(False) + + ax.set_ylabel("Test") + + axisline.label.set_pad(5) + + + plt.draw() + +def test_axis_artist2(): + global axisline + + #self._axislines[loc] = new_fixed_axis(loc=loc, axes=axes) + from mpl_toolkits.axes_grid.axislines import AxisArtistHelperRectlinear + fig = plt.figure(1) + fig.clf() + ax=fig.add_subplot(111) + ax.xaxis.set_visible(False) + ax.yaxis.set_visible(False) + + + _helper = AxisArtistHelperRectlinear.Fixed(ax, loc="bottom") + axisline = AxisArtist(ax, _helper, offset=None, axis_direction="bottom") + axisline.set_label("TTT") + ax.add_artist(axisline) + + #axisline.major_ticklabels.set_axis_direction("bottom") + axisline.major_ticks.set_tick_out(False) + + + ax.set_ylabel("Test") + + plt.draw() + +if __name__ == "__main__": + #test_labelbase() + #test_ticklabels() + test_axis_artist() + #test_axis_artist2() + + +# DONE +# *. ticks, ticklabels, axislabels +# *. workon axisartist + +# TODO diff --git a/lib/mpl_toolkits/axes_grid/axisline_style.py b/lib/mpl_toolkits/axes_grid/axisline_style.py index 268adba89f85..13c4fb76b592 100644 --- a/lib/mpl_toolkits/axes_grid/axisline_style.py +++ b/lib/mpl_toolkits/axes_grid/axisline_style.py @@ -3,6 +3,83 @@ from matplotlib.path import Path import numpy as np +class _FancyAxislineStyle: + class SimpleArrow(FancyArrowPatch): + """ + The artist class that will be returend for SimpleArrow style. + """ + _ARROW_STYLE = "->" + + def __init__(self, axis_artist, line_path, transform, + line_mutation_scale): + self._axis_artist = axis_artist + self._line_transform = transform + self._line_path = line_path + self._line_mutation_scale = line_mutation_scale + + FancyArrowPatch.__init__(self, + path=self._line_path, + arrowstyle=self._ARROW_STYLE, + arrow_transmuter=None, + patchA=None, + patchB=None, + shrinkA=0., + shrinkB=0., + mutation_scale=line_mutation_scale, + mutation_aspect=None, + transform=IdentityTransform(), + ) + + def set_line_mutation_scale(self, scale): + self.set_mutation_scale(scale*self._line_mutation_scale) + + def _extend_path(self, path, mutation_size=10): + """ + Extend the path to make a room for drawing arrow. + """ + from matplotlib.bezier import get_cos_sin + + x0, y0 = path.vertices[-2] + x1, y1 = path.vertices[-1] + cost, sint = get_cos_sin(x0, y0, x1, y1) + + d = mutation_size * 1. + x2, y2 = x1 + cost*d, y1+sint*d + + if path.codes is None: + _path = Path(np.concatenate([path.vertices, [[x2, y2]]])) + else: + _path = Path(np.concatenate([path.vertices, [[x2, y2]]]), + np.concatenate([path.codes, [Path.LINETO]])) + + return _path + + def set_path(self, path): + self._line_path = path + + def draw(self, renderer): + """ + Draw the axis line. + 1) transform the path to the display cooridnate. + 2) extend the path to make a room for arrow + 3) update the path of the FancyArrowPatch. + 4) draw + """ + path_in_disp = self._line_transform.transform_path(self._line_path) + mutation_size = self.get_mutation_scale() #line_mutation_scale() + extented_path = self._extend_path(path_in_disp, + mutation_size=mutation_size) + + self._path_original = extented_path + FancyArrowPatch.draw(self, renderer) + + class FilledArrow(SimpleArrow): + """ + The artist class that will be returend for SimpleArrow style. + """ + _ARROW_STYLE = "-|>" + + class AxislineStyle(_Style): """ :class:`AxislineStyle` is a container class which defines style classes @@ -18,14 +95,14 @@ class AxislineStyle(_Style): def set_path(self, path): # set the path for axisline. - + def set_line_mutation_scale(self, scale): # set the scale - + def draw(self, renderer): # draw - + """ _style_list = {} @@ -52,81 +129,14 @@ def __call__(self, axis_artist, transform): """ return self.new_line(axis_artist, transform) - + class SimpleArrow(_Base): """ A simple arrow. """ - - class ArrowAxisline(FancyArrowPatch): - """ - The artist class that will be returend for SimpleArrow style. - """ - def __init__(self, axis_artist, line_path, transform, - line_mutation_scale): - self._axis_artist = axis_artist - self._line_transform = transform - self._line_path = line_path - self._line_mutation_scale = line_mutation_scale - - FancyArrowPatch.__init__(self, - path=self._line_path, - arrowstyle="->", - arrow_transmuter=None, - patchA=None, - patchB=None, - shrinkA=0., - shrinkB=0., - mutation_scale=line_mutation_scale, - mutation_aspect=None, - transform=IdentityTransform(), - ) - - def set_line_mutation_scale(self, scale): - self.set_mutation_scale(scale*self._line_mutation_scale) - - def _extend_path(self, path, mutation_size=10): - """ - Extend the path to make a room for drawing arrow. - """ - from matplotlib.bezier import get_cos_sin - - x0, y0 = path.vertices[-2] - x1, y1 = path.vertices[-1] - cost, sint = get_cos_sin(x0, y0, x1, y1) - - d = mutation_size * 1. - x2, y2 = x1 + cost*d, y1+sint*d - - if path.codes is None: - _path = Path(np.concatenate([path.vertices, [[x2, y2]]])) - else: - _path = Path(np.concatenate([path.vertices, [[x2, y2]]]), - np.concatenate([path.codes, [Path.LINETO]])) - - return _path - - def set_path(self, path): - self._line_path = path - - def draw(self, renderer): - """ - Draw the axis line. - 1) transform the path to the display cooridnate. - 2) extend the path to make a room for arrow - 3) update the path of the FancyArrowPatch. - 4) draw - """ - path_in_disp = self._line_transform.transform_path(self._line_path) - mutation_size = self.get_mutation_scale() #line_mutation_scale() - extented_path = self._extend_path(path_in_disp, - mutation_size=mutation_size) - - self._path_original = extented_path - FancyArrowPatch.draw(self, renderer) - + ArrowAxisClass = _FancyAxislineStyle.SimpleArrow def __init__(self, size=1): """ @@ -140,9 +150,15 @@ def __init__(self, size=1): def new_line(self, axis_artist, transform): linepath = Path([(0,0), (0, 1)]) - axisline = self.ArrowAxisline(axis_artist, linepath, transform, - line_mutation_scale=self.size) + axisline = self.ArrowAxisClass(axis_artist, linepath, transform, + line_mutation_scale=self.size) return axisline - + _style_list["->"] = SimpleArrow + + class FilledArrow(SimpleArrow): + ArrowAxisClass = _FancyAxislineStyle.FilledArrow + + _style_list["-|>"] = FilledArrow + diff --git a/lib/mpl_toolkits/axes_grid/axislines.py b/lib/mpl_toolkits/axes_grid/axislines.py index 9d8b1b187ab1..174b1fc342ac 100644 --- a/lib/mpl_toolkits/axes_grid/axislines.py +++ b/lib/mpl_toolkits/axes_grid/axislines.py @@ -66,62 +66,7 @@ from axisline_style import AxislineStyle -class BezierPath(mlines.Line2D): - - def __init__(self, path, *kl, **kw): - mlines.Line2D.__init__(self, [], [], *kl, **kw) - self._path = path - self._invalid = False - - def recache(self): - - self._transformed_path = TransformedPath(self._path, self.get_transform()) - - self._invalid = False - - def set_path(self, path): - self._path = path - self._invalid = True - - - def draw(self, renderer): - if self._invalid: - self.recache() - - renderer.open_group('line2d') - - if not self._visible: return - gc = renderer.new_gc() - self._set_gc_clip(gc) - - gc.set_foreground(self._color) - gc.set_antialiased(self._antialiased) - gc.set_linewidth(self._linewidth) - gc.set_alpha(self._alpha) - if self.is_dashed(): - cap = self._dashcapstyle - join = self._dashjoinstyle - else: - cap = self._solidcapstyle - join = self._solidjoinstyle - gc.set_joinstyle(join) - gc.set_capstyle(cap) - - funcname = self._lineStyles.get(self._linestyle, '_draw_nothing') - if funcname != '_draw_nothing': - tpath, affine = self._transformed_path.get_transformed_path_and_affine() - lineFunc = getattr(self, funcname) - lineFunc(renderer, gc, tpath, affine.frozen()) - - gc.restore() - renderer.close_group('line2d') - - - -class UnimplementedException(Exception): - pass - - +from axis_artist import AxisArtist, GridlinesCollection class AxisArtistHelper(object): """ @@ -167,7 +112,7 @@ def get_tick_iterators(self, axes): # iter : iteratoable object that yields (c, angle, l) where # c, angle, l is position, tick angle, and label - return iter_major, iter_minot + return iter_major, iter_minor """ @@ -176,120 +121,14 @@ class _Base(object): """ Base class for axis helper. """ - def __init__(self, label_direction): + def __init__(self): """ - label direction must be one of - ["left", "right", "bottom", "top", - "curved"] """ - self.label_direction = label_direction - self.delta1, self.delta2 = 0.00001, 0.00001 def update_lim(self, axes): pass - _label_angles = dict(left=90, right=90, bottom=0, top=0) - _ticklabel_angles = dict(left=0, right=0, bottom=0, top=0) - - def _get_label_offset_transform(self, pad_points, fontprops, - renderer, bboxes=None): - - """ - Returns (offset-transform, vertical-alignment, horiz-alignment) - of (tick or axis) labels appropriate for the label - direction. - - The offset-transform represents a required pixel offset - from the reference point. For example, x-axis center will - be the referece point for xlabel. - - pad_points : padding from axis line or tick labels (see bboxes) - fontprops : font properties for label - renderer : renderer - bboxes=None : list of bboxes (window extents) of the tick labels. - This only make sense for axis label. - - all the above parameters are used to estimate the offset. - - """ - if renderer: - pad_pixels = renderer.points_to_pixels(pad_points) - font_size_points = fontprops.get_size_in_points() - font_size_pixels = renderer.points_to_pixels(font_size_points) - else: - pad_pixels = pad_points - font_size_points = fontprops.get_size_in_points() - font_size_pixels = font_size_points - - if bboxes: - bbox = Bbox.union(bboxes) - w, h = bbox.width, bbox.height - else: - w, h = 0, 0 - - - tr = Affine2D() - if self.label_direction == "left": - tr.translate(-(pad_pixels+w), 0.) - - return tr, "center", "right" - - elif self.label_direction == "right": - tr.translate(+(pad_pixels+w), 0.) - - return tr, "center", "left" - - elif self.label_direction == "bottom": - tr.translate(0, -(pad_pixels+font_size_pixels+h)) - - return tr, "baseline", "center" - - elif self.label_direction == "top": - tr.translate(0, +(pad_pixels+h)) - - return tr, "baseline", "center" - - elif self.label_direction == "curved": - #tr.translate(0, +(pad_pixels+h)) - - return tr, "baseline", "center" - - else: - raise ValueError("Unknown label direction : %s" \ - % (self.label_direction,)) - - - def get_label_offset_transform(self, axes, - pad_points, fontprops, renderer, - bboxes, - ): - """ - offset transform for axis label. - """ - - tr, va, ha = self._get_label_offset_transform( \ - pad_points, fontprops, renderer, bboxes) - - a = self._label_angles[self.label_direction] - return tr, va, ha, a - - - def get_ticklabel_offset_transform(self, axes, - pad_points, fontprops, - renderer, - ): - """ - offset transform for ticklabels. - """ - - tr, va, ha = self._get_label_offset_transform( \ - pad_points, fontprops, renderer, None) - - a = self._ticklabel_angles[self.label_direction] - return tr, va, ha, a - - class Fixed(_Base): """ @@ -302,28 +141,29 @@ class Fixed(_Base): top=(0, 1)) def __init__(self, - loc, - label_direction=None): + loc, nth_coord=None, + ): """ nth_coord = along which coordinate value varies in 2d, nth_coord = 0 -> x axis, nth_coord = 1 -> y axis """ + + self._loc = loc + if loc not in ["left", "right", "bottom", "top"]: raise ValueError("%s" % loc) - #if nth_coord is None: - if loc in ["left", "right"]: - nth_coord = 1 - elif loc in ["bottom", "top"]: - nth_coord = 0 + if nth_coord is None: + if loc in ["left", "right"]: + nth_coord = 1 + elif loc in ["bottom", "top"]: + nth_coord = 0 self.nth_coord = nth_coord - super(AxisArtistHelper.Fixed, self).__init__(loc) + super(AxisArtistHelper.Fixed, self).__init__() self.passthru_pt = self._default_passthru_pt[loc] - if label_direction is None: - label_direction = loc @@ -349,31 +189,22 @@ def get_line_transform(self, axes): # LABEL - def get_label_pos(self, axes): + def get_axislabel_transform(self, axes): + return axes.transAxes + + def get_axislabel_pos_angle(self, axes): """ label reference position in transAxes. get_label_transform() returns a transform of (transAxes+offset) """ - _verts = [0.5, 0.5] - nth_coord = self.nth_coord - fixed_coord = 1-nth_coord - _verts[fixed_coord] = self.passthru_pt[fixed_coord] - return _verts, axes.transAxes - - - def get_label_offset_transform(self, axes, - pad_points, fontprops, renderer, - bboxes, - ): + loc = self._loc + pos, angle_tangent = dict(left=((0., 0.5), 90), + right=((1., 0.5), 90), + bottom=((0.5, 0.), 0), + top=((0.5, 1.), 0))[loc] - tr, va, ha = self._get_label_offset_transform( \ - pad_points, fontprops, renderer, bboxes, - ) - - a = self._label_angles[self.label_direction] - - return tr, va, ha, a + return pos, angle_tangent @@ -389,14 +220,14 @@ def get_tick_transform(self, axes): class Floating(_Base): def __init__(self, nth_coord, - value, label_direction): + value): self.nth_coord = nth_coord - self._value = value + self._value = value super(AxisArtistHelper.Floating, - self).__init__(label_direction) + self).__init__() def get_nth_coord(self): @@ -413,15 +244,15 @@ class AxisArtistHelperRectlinear: class Fixed(AxisArtistHelper.Fixed): def __init__(self, - axes, loc, #nth_coord=None, - label_direction=None): + axes, loc, nth_coord=None, + ): """ nth_coord = along which coordinate value varies in 2d, nth_coord = 0 -> x axis, nth_coord = 1 -> y axis """ super(AxisArtistHelperRectlinear.Fixed, self).__init__( \ - loc, label_direction) + loc, nth_coord) self.axis = [axes.xaxis, axes.yaxis][self.nth_coord] @@ -432,16 +263,12 @@ def __init__(self, def get_tick_iterators(self, axes): """tick_loc, tick_angle, tick_label""" - angle = 0 - 90 * self.nth_coord - if self.passthru_pt[1 - self.nth_coord] > 0.5: - angle = 180+angle - + loc = self._loc - # take care the tick direction - if self.nth_coord == 0 and rcParams["xtick.direction"] == "out": - angle += 180 - elif self.nth_coord == 1 and rcParams["ytick.direction"] == "out": - angle += 180 + if loc in ["bottom", "top"]: + angle_normal, angle_tangent = 90, 0 + else: + angle_normal, angle_tangent = 0, 90 major = self.axis.major majorLocs = major.locator() @@ -467,7 +294,7 @@ def _f(locs, labels): c2 = tr2ax.transform_point(c) #delta=0.00001 if 0. -self.delta1<= c2[self.nth_coord] <= 1.+self.delta2: - yield c, angle, l + yield c, angle_normal, angle_tangent, l return _f(majorLocs, majorLabels), _f(minorLocs, minorLabels) @@ -475,10 +302,11 @@ def _f(locs, labels): class Floating(AxisArtistHelper.Floating): def __init__(self, axes, nth_coord, - passingthrough_point, label_direction): + passingthrough_point, axis_direction="bottom"): super(AxisArtistHelperRectlinear.Floating, self).__init__( \ - nth_coord, passingthrough_point, label_direction) + nth_coord, passingthrough_point) + self._axis_direction = axis_direction self.axis = [axes.xaxis, axes.yaxis][self.nth_coord] @@ -498,7 +326,21 @@ def get_line(self, axes): def get_line_transform(self, axes): return axes.transAxes - def get_label_pos(self, axes): + def get_axislabel_transform(self, axes): + return axes.transAxes + + def get_axislabel_pos_angle(self, axes): + """ + label reference position in transAxes. + + get_label_transform() returns a transform of (transAxes+offset) + """ + loc = self._axis_direction + angle = dict(left=0, + right=0, + bottom=.5*np.pi, + top=.5*np.pi)[loc] + _verts = [0.5, 0.5] fixed_coord = 1-self.nth_coord @@ -509,20 +351,8 @@ def get_label_pos(self, axes): if not (0. <= _verts[fixed_coord] <= 1.): return None, None else: - return _verts, axes.transAxes - - def get_label_transform(self, axes, - pad_points, fontprops, renderer, - bboxes, - ): + return _verts, angle - tr, va, ha = self._get_label_offset_transform(pad_points, fontprops, - renderer, bboxes) - - a = self._label_angles[self.label_direction] - tr = axes.transAxes + tr - - return tr, va, ha, a def get_tick_transform(self, axes): @@ -532,7 +362,14 @@ def get_tick_transform(self, axes): def get_tick_iterators(self, axes): """tick_loc, tick_angle, tick_label""" - angle = 0 - 90 * self.nth_coord + loc = self._axis_direction + + if loc in ["bottom", "top"]: + angle_normal, angle_tangent = 90, 0 + else: + angle_normal, angle_tangent = 0, 90 + + #angle = 90 - 90 * self.nth_coord major = self.axis.major majorLocs = major.locator() @@ -554,7 +391,7 @@ def _f(locs, labels): c1, c2 = tr2ax.transform_point(c) if 0. <= c1 <= 1. and 0. <= c2 <= 1.: if 0. - self.delta1 <= [c1, c2][self.nth_coord] <= 1. + self.delta2: - yield c, angle, l + yield c, angle_normal, angle_tangent, l return _f(majorLocs, majorLabels), _f(minorLocs, minorLabels) @@ -608,8 +445,7 @@ def __init__(self, axes): def new_fixed_axis(self, loc, nth_coord=None, - tick_direction="in", - label_direction=None, + axis_direction=None, offset=None, axes=None, ): @@ -620,14 +456,17 @@ def new_fixed_axis(self, loc, _helper = AxisArtistHelperRectlinear.Fixed(axes, loc, nth_coord) - axisline = AxisArtist(axes, _helper, offset=offset) + if axis_direction is None: + axis_direction = loc + axisline = AxisArtist(axes, _helper, offset=offset, + axis_direction=axis_direction, + ) return axisline def new_floating_axis(self, nth_coord, value, - tick_direction="in", - label_direction=None, + axis_direction="bottom", axes=None, ): @@ -639,7 +478,7 @@ def new_floating_axis(self, nth_coord, value, transform = axes.transData _helper = AxisArtistHelperRectlinear.Floating( \ - axes, nth_coord, value, label_direction) + axes, nth_coord, value, axis_direction) axisline = AxisArtist(axes, _helper) @@ -675,655 +514,25 @@ def get_gridlines(self): for y in locs: gridlines.append([[x1, x2], [y, y]]) - - return gridlines - - -from matplotlib.lines import Line2D - -class Ticks(Line2D): - def __init__(self, ticksize, tick_out=False, **kwargs): - """ - ticksize : ticksize - tick_out : tick is directed outside (rotated by 180 degree) if True. default is False. - """ - self.ticksize = ticksize - self.locs_angles = [] - - self.set_tick_out(tick_out) - - self._axis = kwargs.pop("axis", None) - if self._axis is not None: - if "color" not in kwargs: - kwargs["color"] = "auto" - if ("mew" not in kwargs) and ("markeredgewidth" not in kwargs): - kwargs["markeredgewidth"] = "auto" - - super(Ticks, self).__init__([0.], [0.], **kwargs) - self.set_snap(True) - - def set_tick_out(self, b): - """ - set True if tick need to be rotated by 180 degree. - """ - self._tick_out = b - - def get_tick_out(self): - """ - Return True if the tick will be rotated by 180 degree. - """ - return self._tick_out - - def get_color(self): - if self._color == 'auto': - if self._axis is not None: - ticklines = self._axis.get_ticklines() - if ticklines: - color_from_axis = ticklines[0].get_color() - return color_from_axis - return "k" - - return super(Ticks, self).get_color() - - - def get_markeredgecolor(self): - if self._markeredgecolor == 'auto': - return self.get_color() - else: - return self._markeredgecolor - - def get_markeredgewidth(self): - if self._markeredgewidth == 'auto': - if self._axis is not None: - ticklines = self._axis.get_ticklines() - if ticklines: - width_from_axis = ticklines[0].get_markeredgewidth() - return width_from_axis - return .5 - - else: - return self._markeredgewidth - - - def update_ticks(self, locs_angles_labels, renderer): - self.locs_angles_labels = locs_angles_labels - - _tickvert_path = Path([[0., 0.], [0., 1.]]) - - def draw(self, renderer): - if not self.get_visible(): - return - size = self.ticksize - path_trans = self.get_transform() - - # set gc : copied from lines.py -# gc = renderer.new_gc() -# self._set_gc_clip(gc) - -# gc.set_foreground(self.get_color()) -# gc.set_antialiased(self._antialiased) -# gc.set_linewidth(self._linewidth) -# gc.set_alpha(self._alpha) -# if self.is_dashed(): -# cap = self._dashcapstyle -# join = self._dashjoinstyle -# else: -# cap = self._solidcapstyle -# join = self._solidjoinstyle -# gc.set_joinstyle(join) -# gc.set_capstyle(cap) -# gc.set_snap(self.get_snap()) - - - gc = renderer.new_gc() - self._set_gc_clip(gc) - gc.set_foreground(self.get_markeredgecolor()) - gc.set_linewidth(self.get_markeredgewidth()) - gc.set_alpha(self._alpha) - - offset = renderer.points_to_pixels(size) - marker_scale = Affine2D().scale(offset, offset) - - tick_out = self.get_tick_out() - for loc, angle, _ in self.locs_angles_labels: - - if tick_out: - angle += 180 - marker_rotation = Affine2D().rotate_deg(angle) - #marker_rotation.clear().rotate_deg(angle) - marker_transform = marker_scale + marker_rotation - locs = path_trans.transform_non_affine(np.array([loc, loc])) - renderer.draw_markers(gc, self._tickvert_path, marker_transform, - Path(locs), path_trans.get_affine()) - - gc.restore() - - - - -class TickLabels(mtext.Text): - - def __init__(self, size, **kwargs): - self.locs_angles_labels = [] - - self._axis = kwargs.pop("axis", None) - if self._axis is not None: - if "color" not in kwargs: - kwargs["color"] = "auto" - - super(TickLabels, self).__init__(x=0., y=0., text="", - **kwargs - ) - self._rotate_ticklabel = None - - def set_rotate_along_line(self, b): - self._rotate_ticklabel = b - - def get_rotate_along_line(self): - return self._rotate_ticklabel - - def update_ticks(self, locs_angles_labels, renderer): - self.locs_angles_labels = locs_angles_labels - - def get_color(self): - if self._color == 'auto': - if self._axis is not None: - ticklabels = self._axis.get_ticklabels() - if ticklabels: - color_from_axis = ticklabels[0].get_color() - return color_from_axis - return "k" - - return super(TickLabels, self).get_color() - - - def draw(self, renderer): - if not self.get_visible(): return - - if self.get_rotate_along_line(): - # curved axis - - # save original and adjust some properties - tr = self.get_transform() - rm = self.get_rotation_mode() - - self.set_rotation_mode("anchor") - offset_tr = Affine2D() - self.set_transform(tr+offset_tr) - - # estimate pad - dd = 5 + renderer.points_to_pixels(self.get_size()) - - for (x, y), a, l in self.locs_angles_labels: - theta = (a+90.)/180.*np.pi - dx, dy = dd * np.cos(theta), dd * np.sin(theta) - offset_tr.translate(dx, dy) - self.set_rotation(a-180) - self.set_x(x) - self.set_y(y) - self.set_text(l) - super(TickLabels, self).draw(renderer) - offset_tr.clear() - - # restore original properties - self.set_transform(tr) - self.set_rotation_mode(rm) - else: - for (x, y), a, l in self.locs_angles_labels: - self.set_x(x) - self.set_y(y) - self.set_text(l) - super(TickLabels, self).draw(renderer) - - - def get_window_extents(self, renderer): - bboxes = [] - for (x, y), a, l in self.locs_angles_labels: - self.set_x(x) - self.set_y(y) - self.set_text(l) - - bboxes.append(self.get_window_extent()) - - return [b for b in bboxes if b.width!=0 or b.height!=0] - - - - -class AxisLabel(mtext.Text): - def __init__(self, *kl, **kwargs): - self._axis = kwargs.pop("axis", None) - if self._axis is not None: - if "color" not in kwargs: - kwargs["color"] = "auto" - super(AxisLabel, self).__init__(*kl, **kwargs) - - def get_color(self): - if self._color == 'auto': - if self._axis is not None: - label = self._axis.get_label() - if label: - color_from_axis = label.get_color() - return color_from_axis - return "k" - - return super(AxisLabel, self).get_color() - - def get_text(self): - t = super(AxisLabel, self).get_text() - if t == "__from_axes__": - return self._axis.get_label().get_text() - return self._text - - -class GridlinesCollection(LineCollection): - def __init__(self, *kl, **kwargs): - super(GridlinesCollection, self).__init__(*kl, **kwargs) - self.set_grid_helper(None) - - def set_grid_helper(self, grid_helper): - self._grid_helper = grid_helper - - def draw(self, renderer): - if self._grid_helper is not None: - self._grid_helper.update_lim(self.axes) - gl = self._grid_helper.get_gridlines() - if gl: - self.set_segments([np.transpose(l) for l in gl]) - else: - self.set_segments([]) - super(GridlinesCollection, self).draw(renderer) - - - - -class AxisArtist(martist.Artist): - """ - an artist which draws axis (a line along which the n-th axes coord - is constant) line, ticks, ticklabels, and axis label. - - It requires an AxisArtistHelper instance. - """ - - LABELPAD = 5 - ZORDER=2.5 - - def __init__(self, axes, - helper, - offset=None, - major_tick_size=None, - major_tick_pad=None, - minor_tick_size=None, - minor_tick_pad=None, - **kw): - """ - axes is also used to follow the axis attribute (tick color, etc). - """ - super(AxisArtist, self).__init__(**kw) - - self.axes = axes - - self._axis_artist_helper = helper - - if offset is None: - offset = (0, 0) - self.dpi_transform = Affine2D() - self.offset_transform = ScaledTranslation(offset[0], offset[1], - self.dpi_transform) - - self._label_visible = True - self._majortick_visible = True - self._majorticklabel_visible = True - self._minortick_visible = True - self._minorticklabel_visible = True - - - if self._axis_artist_helper.label_direction in ["left", "right"]: - axis_name = "ytick" - self.axis = axes.yaxis - else: - axis_name = "xtick" - self.axis = axes.xaxis - - - if major_tick_size is None: - self.major_tick_size = rcParams['%s.major.size'%axis_name] - if major_tick_pad is None: - self.major_tick_pad = rcParams['%s.major.pad'%axis_name] - if minor_tick_size is None: - self.minor_tick_size = rcParams['%s.minor.size'%axis_name] - if minor_tick_pad is None: - self.minor_tick_pad = rcParams['%s.minor.pad'%axis_name] - - self._axisline_style = None - - self._init_line() - self._init_ticks() - self._init_offsetText(self._axis_artist_helper.label_direction) - self._init_label() - - self.set_zorder(self.ZORDER) - - self._rotate_label_along_line = False - - - def set_rotate_label_along_line(self, b): - self._rotate_label_along_line = b - - def get_rotate_label_along_line(self): - return self._rotate_label_along_line - - def get_transform(self): - return self.axes.transAxes + self.offset_transform - - def get_helper(self): - return self._axis_artist_helper - - - def set_axisline_style(self, axisline_style=None, **kw): - """ - Set the axisline style. - - *axislin_style* can be a string with axisline style name with optional - comma-separated attributes. Alternatively, the attrs can - be provided as keywords. - - set_arrowstyle("->,size=1.5") - set_arrowstyle("->", size=1.5) - - Old attrs simply are forgotten. - - Without argument (or with arrowstyle=None), return - available styles as a list of strings. - """ - - if axisline_style==None: - return AxislineStyle.pprint_styles() - - if isinstance(axisline_style, AxislineStyle._Base): - self._axisline_style = axisline_style - else: - self._axisline_style = AxislineStyle(axisline_style, **kw) - - - self._init_line() - - - def get_axisline_style(self): - """ - return the current axisline style. - """ - return self._axisline_style - - def _init_line(self): - """ - Initialize the *line* artist that is responsible to draw the axis line. - """ - tran = self._axis_artist_helper.get_line_transform(self.axes) \ - + self.offset_transform - - axisline_style = self.get_axisline_style() - if axisline_style is None: - self.line = BezierPath(self._axis_artist_helper.get_line(self.axes), - color=rcParams['axes.edgecolor'], - linewidth=rcParams['axes.linewidth'], - transform=tran) - else: - self.line = axisline_style(self, transform=tran) - - def _draw_line(self, renderer): - self.line.set_path(self._axis_artist_helper.get_line(self.axes)) - if self.get_axisline_style() is not None: - self.line.set_line_mutation_scale(self.major_ticklabels.get_size()) - self.line.draw(renderer) - - - def _init_ticks(self): - - transform=self._axis_artist_helper.get_tick_transform(self.axes) \ - + self.offset_transform - - self.major_ticks = Ticks(self.major_tick_size, - axis=self.axis, - transform=transform) - self.minor_ticks = Ticks(self.minor_tick_size, - axis=self.axis, - transform=transform) - - - size = rcParams['xtick.labelsize'] - - fontprops = font_manager.FontProperties(size=size) - tvhl = self._axis_artist_helper.get_ticklabel_offset_transform( \ - self.axes, self.major_tick_pad, - fontprops=fontprops, renderer=None) - - trans, vert, horiz, label_a = tvhl - trans = transform + trans - - # ignore ticklabel angle during the drawing time (but respect - # during init). Instead, use angle set by the TickLabel - # artist. - - self.major_ticklabels = TickLabels(size, axis=self.axis) - self.minor_ticklabels = TickLabels(size, axis=self.axis) - - - self.major_ticklabels.set(figure = self.axes.figure, - transform=trans, - va=vert, - ha=horiz, - fontproperties=fontprops) - - self.minor_ticklabels.set(figure = self.axes.figure, - transform=trans, - va=vert, - ha=horiz, - fontproperties=fontprops) - - - _offsetText_pos = dict(left=(0, 1, "bottom", "right"), - right=(1, 1, "bottom", "left"), - bottom=(1, 0, "top", "right"), - top=(1, 1, "bottom", "right")) - - def _init_offsetText(self, direction): - - x,y,va,ha = self._offsetText_pos[direction] - - self.offsetText = mtext.Annotation("", - xy=(x,y), xycoords="axes fraction", - xytext=(0,0), textcoords="offset points", - #fontproperties = fp, - color = rcParams['xtick.color'], - verticalalignment=va, - horizontalalignment=ha, - ) - self.offsetText.set_transform(IdentityTransform()) - self.axes._set_artist_props(self.offsetText) - - - def _update_offsetText(self): - self.offsetText.set_text( self.axis.major.formatter.get_offset() ) - self.offsetText.set_size(self.major_ticklabels.get_size()) - offset = self.major_tick_pad + self.major_ticklabels.get_size() + 2. - self.offsetText.xytext= (0, offset) - - - def _draw_offsetText(self, renderer): - self._update_offsetText() - self.offsetText.draw(renderer) - - - def _draw_ticks(self, renderer): - - majortick_iter, minortick_iter = \ - self._axis_artist_helper.get_tick_iterators(self.axes) - - tick_loc_angle_label = list(majortick_iter) - - transform=self._axis_artist_helper.get_tick_transform(self.axes) \ - + self.offset_transform - fontprops = font_manager.FontProperties(size=12) - tvhl = self._axis_artist_helper.get_ticklabel_offset_transform( \ - self.axes, - self.major_tick_pad, - fontprops=fontprops, - renderer=renderer, - ) - - trans, va, ha, a = tvhl - trans = transform + trans - - # ignore va, ha, angle during the drawing time - - self.major_ticklabels.set_transform(trans) - - - self.major_ticks.update_ticks(tick_loc_angle_label, renderer) - self.major_ticklabels.update_ticks(tick_loc_angle_label, renderer) - - self.major_ticks.draw(renderer) - self.major_ticklabels.draw(renderer) - - tick_loc_angle_label = list(minortick_iter) - - self.minor_ticks.update_ticks(tick_loc_angle_label, renderer) - self.minor_ticklabels.update_ticks(tick_loc_angle_label, renderer) - - self.minor_ticks.draw(renderer) - self.minor_ticklabels.draw(renderer) - - if (self.major_ticklabels.get_visible() or self.minor_ticklabels.get_visible()): - self._draw_offsetText(renderer) - - return self.major_ticklabels.get_window_extents(renderer) - - - def _init_label(self): - # x in axes coords, y in display coords (to be updated at draw - # time by _update_label_positions) - - fontprops = font_manager.FontProperties(size=rcParams['axes.labelsize']) - textprops = dict(fontproperties = fontprops, - color = rcParams['axes.labelcolor'], - ) - - self.label = AxisLabel(0, 0, "__from_axes__", - color = "auto", #rcParams['axes.labelcolor'], - fontproperties=fontprops, - axis=self.axis, - ) - - self.label.set_figure(self.axes.figure) - - - def _draw_label(self, renderer, bboxes): - - if not self.label.get_visible(): - return - - fontprops = font_manager.FontProperties(size=rcParams['axes.labelsize']) - - pad_points = self.major_tick_pad - - if self.get_rotate_label_along_line(): - xy, tr, label_a = self._axis_artist_helper.get_label_pos( \ - self.axes, with_angle=True) - if xy is None: return - - x, y = xy - - offset_tr = Affine2D() - if self.major_ticklabels.get_visible(): - dd = renderer.points_to_pixels(self.major_ticklabels.get_size() \ - + pad_points + 2*self.LABELPAD ) - else: - dd = renderer.points_to_pixels(pad_points + 2*self.LABELPAD) - - theta = label_a - 0.5 * np.pi #(label_a)/180.*np.pi - dx, dy = dd * np.cos(theta), dd * np.sin(theta) - offset_tr.translate(dx, dy) - tr2 = (tr+offset_tr) #+ tr2 - - self.label.set(x=x, y=y, - rotation_mode="anchor", - transform=tr2, - va="center", ha="center", - rotation=label_a/np.pi*180.) - else: - xy, tr = self._axis_artist_helper.get_label_pos(self.axes) - if xy is None: return - - x, y = xy - tr2, va, ha, a = self._axis_artist_helper.get_label_offset_transform(\ - self.axes, - pad_points+2*self.LABELPAD, fontprops, - renderer, - bboxes=bboxes, - ) - tr2 = (tr+self.offset_transform) + tr2 - - self.label.set(x=x, y=y, - transform=tr2, - va=va, ha=ha, rotation=a) - - self.label.draw(renderer) - - - def set_label(self, s): - self.label.set_text(s) - - - @allow_rasterization - def draw(self, renderer): - 'Draw the axis lines, tick lines and labels' - - if not self.get_visible(): return - - renderer.open_group(__name__) - - self._axis_artist_helper.update_lim(self.axes) - - dpi_cor = renderer.points_to_pixels(1.) - self.dpi_transform.clear().scale(dpi_cor, dpi_cor) + return gridlines - self._draw_line(renderer) - bboxes = self._draw_ticks(renderer) - #self._draw_offsetText(renderer) - self._draw_label(renderer, bboxes) - renderer.close_group(__name__) - def get_ticklabel_extents(self, renderer): - pass - def toggle(self, all=None, ticks=None, ticklabels=None, label=None): - if all: - _ticks, _ticklabels, _label = True, True, True - elif all is not None: - _ticks, _ticklabels, _label = False, False, False - else: - _ticks, _ticklabels, _label = None, None, None +class SimpleChainedObjects(object): + def __init__(self, objects): + self._objects = objects - if ticks is not None: - _ticks = ticks - if ticklabels is not None: - _ticklabels = ticklabels - if label is not None: - _label = label + def __getattr__(self, k): + _a = SimpleChainedObjects([getattr(a, k) for a in self._objects]) + return _a - if _ticks is not None: - self.major_ticks.set_visible(_ticks) - self.minor_ticks.set_visible(_ticks) - if _ticklabels is not None: - self.major_ticklabels.set_visible(_ticklabels) - self.minor_ticklabels.set_visible(_ticklabels) - if _label is not None: - self.label.set_visible(_label) + def __call__(self, *kl, **kwargs): + for m in self._objects: + m(*kl, **kwargs) class Axes(maxes.Axes): @@ -1333,6 +542,19 @@ def __init__(self, axes): self.axes = axes super(Axes.AxisDict, self).__init__() + def __getitem__(self, k): + if isinstance(k, tuple): + r = SimpleChainedObjects([dict.__getitem__(self, k1) for k1 in k]) + return r + elif isinstance(k, slice): + if k.start == None and k.stop == None and k.step == None: + r = SimpleChainedObjects(self.values()) + return r + else: + raise ValueError("Unsupported slice") + else: + return dict.__getitem__(self, k) + def __call__(self, *v, **kwargs): return maxes.Axes.axis(self.axes, *v, **kwargs) @@ -1375,11 +597,15 @@ def _init_axis(self): super(Axes, self)._init_axis() - def _init_axis_artists(self): + def _init_axis_artists(self, axes=None): + if axes is None: + axes = self + self._axislines = self.AxisDict(self) new_fixed_axis = self.get_grid_helper().new_fixed_axis for loc in ["bottom", "top", "left", "right"]: - self._axislines[loc] = new_fixed_axis(loc=loc, axes=self) + self._axislines[loc] = new_fixed_axis(loc=loc, axes=axes, + axis_direction=loc) for axisline in [self._axislines["top"], self._axislines["right"]]: axisline.label.set_visible(False) @@ -1443,7 +669,7 @@ def grid(self, b=None, **kwargs): b=True else: b=False - + self.gridlines.set_visible(b) if len(kwargs): @@ -1462,13 +688,11 @@ def invalidate_grid_helper(self): def new_floating_axis(self, nth_coord, value, - tick_direction="in", - label_direction=None, + axis_direction="bottom", ): gh = self.get_grid_helper() axis = gh.new_floating_axis(nth_coord, value, - tick_direction=tick_direction, - label_direction=label_direction, + axis_direction=axis_direction, axes=self) return axis @@ -1537,8 +761,7 @@ def _init_axis_artists(self): new_floating_axis = self._grid_helper.new_floating_axis xaxis_zero = new_floating_axis(nth_coord=0, value=0., - tick_direction="in", - label_direction="bottom", + axis_direction="bottom", axes=self) xaxis_zero.line.set_clip_path(self.patch) @@ -1547,8 +770,7 @@ def _init_axis_artists(self): yaxis_zero = new_floating_axis(nth_coord=1, value=0., - tick_direction="in", - label_direction="left", + axis_direction="left", axes=self) @@ -1559,7 +781,8 @@ def _init_axis_artists(self): SubplotZero = maxes.subplot_class_factory(AxesZero) -if __name__ == "__main__": +if 0: +#if __name__ == "__main__": import matplotlib.pyplot as plt fig = plt.figure(1, (4,3)) @@ -1570,7 +793,7 @@ def _init_axis_artists(self): ax.axis["xzero"].set_visible(True) ax.axis["xzero"].label.set_text("Axis Zero") - for n in ["bottom", "top", "right"]: + for n in ["top", "right"]: ax.axis[n].set_visible(False) xx = np.arange(0, 2*np.pi, 0.01) @@ -1580,3 +803,26 @@ def _init_axis_artists(self): plt.show() +if __name__ == "__main__": +#if 1: + import matplotlib.pyplot as plt + + fig = plt.figure(1, (4,3)) + + ax = Subplot(fig, 1, 1, 1) + fig.add_subplot(ax) + + xx = np.arange(0, 2*np.pi, 0.01) + ax.plot(xx, np.sin(xx)) + ax.set_ylabel("Test") + + ax.axis["top"].major_ticks.set_tick_out(True) #set_tick_direction("out") + ax.axis["bottom"].major_ticks.set_tick_out(True) #set_tick_direction("out") + #ax.axis["bottom"].set_tick_direction("in") + + ax.axis["bottom"].set_label("Tk0") + + plt.draw() + plt.show() + + diff --git a/lib/mpl_toolkits/axes_grid/clip_path.py b/lib/mpl_toolkits/axes_grid/clip_path.py index 67931e4575e0..bf3b06dd0821 100644 --- a/lib/mpl_toolkits/axes_grid/clip_path.py +++ b/lib/mpl_toolkits/axes_grid/clip_path.py @@ -87,13 +87,15 @@ def clip_line_to_rect(xline, yline, bbox): ly3, lx3, c_top_ = clip(ly2, lx2, y1, clip="right") ly4, lx4, c_bottom_ = clip(ly3, lx3, y0, clip="left") - c_left = [((x, y), (a+90)%180-180) for (x, y, a) in c_left_ \ + #c_left = [((x, y), (a+90)%180-180) for (x, y, a) in c_left_ \ + # if bbox.containsy(y)] + c_left = [((x, y), (a+90)%180-90) for (x, y, a) in c_left_ \ if bbox.containsy(y)] - c_bottom = [((x, y), (90 - a)%180-90) for (y, x, a) in c_bottom_ \ + c_bottom = [((x, y), (90 - a)%180) for (y, x, a) in c_bottom_ \ if bbox.containsx(x)] - c_right = [((x, y), (a+90)%180) for (x, y, a) in c_right_ \ + c_right = [((x, y), (a+90)%180+90) for (x, y, a) in c_right_ \ if bbox.containsy(y)] - c_top = [((x, y), (90 - a)%180+90) for (y, x, a) in c_top_ \ + c_top = [((x, y), (90 - a)%180+180) for (y, x, a) in c_top_ \ if bbox.containsx(x)] return zip(lx4, ly4), [c_left, c_bottom, c_right, c_top] diff --git a/lib/mpl_toolkits/axes_grid/grid_finder.py b/lib/mpl_toolkits/axes_grid/grid_finder.py index a4dd46706075..f3d1d46b795e 100644 --- a/lib/mpl_toolkits/axes_grid/grid_finder.py +++ b/lib/mpl_toolkits/axes_grid/grid_finder.py @@ -104,6 +104,7 @@ def get_grid_info(self, bb = Bbox.from_extents(x1-ddx, y1-ddy, x2+ddx, y2+ddy) grid_info = {} + grid_info["extremes"] = extremes grid_info["lon_lines"] = lon_lines grid_info["lat_lines"] = lat_lines @@ -263,8 +264,18 @@ def __init__(self, nbins = 10, steps = None, def __call__(self, v1, v2): self.set_bounds(v1, v2) locs = mticker.MaxNLocator.__call__(self) - return locs, len(locs), None + return np.array(locs), len(locs), None + + +class FixedLocator(object): + def __init__(self, locs): + self._locs = locs + + def __call__(self, v1, v2): + v1, v2 = sorted([v1, v2]) + locs = np.array([l for l in self._locs if ((v1 <= l) and (l <= v2))]) + return locs, len(locs), None @@ -284,6 +295,30 @@ def __call__(self, direction, factor, values): return [self._fmt(v) for v in values] +class DictFormatter(object): + def __init__(self, format_dict, formatter=None): + """ + format_dict : dictionary for format strings to be used. + formatter : fall-back formatter + """ + super(DictFormatter, self).__init__() + self._format_dict = format_dict + self._fallback_formatter = formatter + + def __call__(self, direction, factor, values): + """ + factor is ignored if value is found in the dictionary + """ + + if self._fallback_formatter: + fallback_strings = self._fallback_formatter(direction, factor, values) + else: + fallback_strings = [""]*len(values) + + r = [self._format_dict.get(k, v) for k, v in zip(values, + fallback_strings)] + return r + if __name__ == "__main__": locator = MaxNLocator() diff --git a/lib/mpl_toolkits/axes_grid/grid_helper_curvelinear.py b/lib/mpl_toolkits/axes_grid/grid_helper_curvelinear.py index 8da5604e4133..4132133d3ce9 100644 --- a/lib/mpl_toolkits/axes_grid/grid_helper_curvelinear.py +++ b/lib/mpl_toolkits/axes_grid/grid_helper_curvelinear.py @@ -6,7 +6,8 @@ from mpl_toolkits.axes_grid.grid_finder import GridFinder from mpl_toolkits.axes_grid.axislines import \ - AxisArtistHelper, GridHelperBase, AxisArtist + AxisArtistHelper, GridHelperBase +from mpl_toolkits.axes_grid.axis_artist import AxisArtist from matplotlib.transforms import Affine2D import numpy as np @@ -23,7 +24,7 @@ def __init__(self, grid_helper, side, nth_coord_ticks=None): super(FixedAxisArtistHelper, self).__init__( \ loc=side, - label_direction=None) + ) self.grid_helper = grid_helper if nth_coord_ticks is None: @@ -62,7 +63,7 @@ def get_tick_iterators(self, axes): class FloatingAxisArtistHelper(AxisArtistHelper.Floating): - def __init__(self, grid_helper, nth_coord, value, label_direction=None): + def __init__(self, grid_helper, nth_coord, value, axis_direction=None): """ nth_coord = along which coordinate value varies. nth_coord = 0 -> x axis, nth_coord = 1 -> y axis @@ -70,12 +71,15 @@ def __init__(self, grid_helper, nth_coord, value, label_direction=None): super(FloatingAxisArtistHelper, self).__init__(nth_coord, value, - label_direction, ) self.value = value self.grid_helper = grid_helper + self._extremes = None, None + def set_extremes(self, e1, e2): + self._extremes = e1, e2 + def update_lim(self, axes): self.grid_helper.update_lim(axes) @@ -85,6 +89,19 @@ def update_lim(self, axes): extremes = grid_finder.extreme_finder(grid_finder.inv_transform_xy, x1, y1, x2, y2) + extremes = list(extremes) + e1, e2 = self._extremes # ranges of other coordinates + if self.nth_coord == 0: + if e1 is not None: + extremes[2] = max(e1, extremes[2]) + if e2 is not None: + extremes[3] = min(e2, extremes[3]) + elif self.nth_coord == 1: + if e1 is not None: + extremes[0] = max(e1, extremes[0]) + if e2 is not None: + extremes[1] = min(e2, extremes[1]) + grid_info = dict() lon_min, lon_max, lat_min, lat_max = extremes lon_levs, lon_n, lon_factor = \ @@ -105,6 +122,8 @@ def update_lim(self, axes): lat_levs) grid_finder = self.grid_helper.grid_finder + + #e1, e2 = self._extremes # ranges of other coordinates if self.nth_coord == 0: xx0 = np.linspace(self.value, self.value, 100) yy0 = np.linspace(extremes[2], extremes[3], 100) @@ -117,8 +136,10 @@ def update_lim(self, axes): grid_info["line_xy"] = xx, yy self.grid_info = grid_info + def get_axislabel_transform(self, axes): + return Affine2D() #axes.transData - def get_label_pos(self, axes, with_angle=False): + def get_axislabel_pos_angle(self, axes): extremes = self.grid_info["extremes"] @@ -139,92 +160,100 @@ def get_label_pos(self, axes, with_angle=False): if (0. <= p[0] <= 1.) and (0. <= p[1] <= 1.): - if with_angle: - xx1c, yy1c = axes.transData.transform_point([xx1[0], yy1[0]]) - xx2, yy2 = grid_finder.transform_xy([xx0+dxx], [yy0+dyy]) - xx2c, yy2c = axes.transData.transform_point([xx2[0], yy2[0]]) - - return (xx1c, yy1c), Affine2D(), \ - np.arctan2(yy2c-yy1c, xx2c-xx1c) - else: - return p, axes.transAxes - else: - if with_angle: - return None, None, None - else: - return None, None - - + xx1c, yy1c = axes.transData.transform_point([xx1[0], yy1[0]]) + xx2, yy2 = grid_finder.transform_xy([xx0+dxx], [yy0+dyy]) + xx2c, yy2c = axes.transData.transform_point([xx2[0], yy2[0]]) + return (xx1c, yy1c), np.arctan2(yy2c-yy1c, xx2c-xx1c)/np.pi*180. + else: + return None, None - def get_ticklabel_offset_transform(self, axes, - pad_points, fontprops, - renderer, - ): - tr, va, ha = self._get_label_offset_transform(pad_points, fontprops, - renderer, - None, - ) - a = self._ticklabel_angles[self.label_direction] - return Affine2D(), "baseline", "center", 0 def get_tick_transform(self, axes): return axes.transData def get_tick_iterators(self, axes): - """tick_loc, tick_angle, tick_label""" + """tick_loc, tick_angle, tick_label, (optionally) tick_label""" grid_finder = self.grid_helper.grid_finder + lat_levs, lat_n, lat_factor = self.grid_info["lat_info"] + lat_levs = np.asarray(lat_levs) + if lat_factor is not None: + yy0 = lat_levs / lat_factor + dy = 0.01 / lat_factor + else: + yy0 = lat_levs + dy = 0.01 + + lon_levs, lon_n, lon_factor = self.grid_info["lon_info"] + lon_levs = np.asarray(lon_levs) + if lon_factor is not None: + xx0 = lon_levs / lon_factor + dx = 0.01 / lon_factor + else: + xx0 = lon_levs + dx = 0.01 + + e0, e1 = sorted(self._extremes) + if e0 is None: + e0 = -np.inf + if e1 is None: + e1 = np.inf + + if self.nth_coord == 0: + mask = (e0 <= yy0) & (yy0 <= e1) + #xx0, yy0 = xx0[mask], yy0[mask] + yy0 = yy0[mask] + elif self.nth_coord == 1: + mask = (e0 <= xx0) & (xx0 <= e1) + #xx0, yy0 = xx0[mask], yy0[mask] + xx0 = xx0[mask] + # find angles if self.nth_coord == 0: - lat_levs, lat_n, lat_factor = self.grid_info["lat_info"] - if lat_factor is not None: - yy0 = lat_levs / lat_factor - dy = 0.01 / lat_factor - else: - yy0 = lat_levs - dy = 0.01 xx0 = np.empty_like(yy0) xx0.fill(self.value) xx1, yy1 = grid_finder.transform_xy(xx0, yy0) - xx2, yy2 = grid_finder.transform_xy(xx0, yy0+dy) + xx2, yy2 = grid_finder.transform_xy(xx0+dx, yy0) + xx3, yy3 = grid_finder.transform_xy(xx0, yy0+dy) labels = self.grid_info["lat_labels"] + labels = [l for l, m in zip(labels, mask) if m] + elif self.nth_coord == 1: - lon_levs, lon_n, lon_factor = self.grid_info["lon_info"] - if lon_factor is not None: - xx0 = lon_levs / lon_factor - dx = 0.01 / lon_factor - else: - xx0 = lon_levs - dx = 0.01 yy0 = np.empty_like(xx0) yy0.fill(self.value) xx1, yy1 = grid_finder.transform_xy(xx0, yy0) - xx2, yy2 = grid_finder.transform_xy(xx0+dx, yy0) + xx2, yy2 = grid_finder.transform_xy(xx0, yy0+dy) + xx3, yy3 = grid_finder.transform_xy(xx0+dx, yy0) labels = self.grid_info["lon_labels"] + labels = [l for l, m in zip(labels, mask) if m] - if self.label_direction == "top": - da = 180. - else: - da = 0. def f1(): - dd = np.arctan2(yy2-yy1, xx2-xx1) + dd = np.arctan2(yy2-yy1, xx2-xx1) # angle normal + dd2 = np.arctan2(yy3-yy1, xx3-xx1) # angle tangent + mm = ((yy2-yy1)==0.) & ((xx2-xx1)==0.) # mask where dd1 is not defined + dd[mm] = dd2[mm]+3.14159/2. + + #dd += 3.14159 + + #dd = np.arctan2(xx2-xx1, angle_tangent-yy1) trans_tick = self.get_tick_transform(axes) tr2ax = trans_tick + axes.transAxes.inverted() - for x, y, d, lab in zip(xx1, yy1, dd, labels): + for x, y, d, d2, lab in zip(xx1, yy1, dd, dd2, labels): c2 = tr2ax.transform_point((x, y)) delta=0.00001 if (0. -delta<= c2[0] <= 1.+delta) and \ (0. -delta<= c2[1] <= 1.+delta): - yield [x, y], d/3.14159*180.+da, lab + d1 = d/3.14159*180. + d2 = d2/3.14159*180. + yield [x, y], d1, d2, lab return f1(), iter([]) - def get_line_transform(self, axes): return axes.transData @@ -260,6 +289,7 @@ def __init__(self, aux_trans, self.grid_info = None self._old_values = None #self._grid_params = dict() + self._aux_trans = aux_trans self.grid_finder = GridFinder(aux_trans, extreme_finder, @@ -294,8 +324,7 @@ def _update(self, x1, x2, y1, y2): def new_fixed_axis(self, loc, nth_coord=None, - tick_direction="in", - label_direction=None, + axis_direction=None, offset=None, axes=None): @@ -303,38 +332,46 @@ def new_fixed_axis(self, loc, if axes is None: axes = self.axes + if axis_direction is None: + axis_direction = loc _helper = FixedAxisArtistHelper(self, loc, #nth_coord, - nth_coord_ticks=nth_coord) + nth_coord_ticks=nth_coord, + ) - axisline = AxisArtist(axes, _helper) + axisline = AxisArtist(axes, _helper, axis_direction=axis_direction) return axisline def new_floating_axis(self, nth_coord, value, - tick_direction="in", - label_direction=None, axes=None, + axis_direction="bottom" ): - if label_direction is None: - label_direction = "top" + if axes is None: + axes = self.axes - _helper = FloatingAxisArtistHelper(self, nth_coord, - value, - label_direction=label_direction, - ) + _helper = FloatingAxisArtistHelper( \ + self, nth_coord, value, axis_direction) axisline = AxisArtist(axes, _helper) + + #_helper = FloatingAxisArtistHelper(self, nth_coord, + # value, + # label_direction=label_direction, + # ) + + #axisline = AxisArtistFloating(axes, _helper, + # axis_direction=axis_direction) axisline.line.set_clip_on(True) axisline.line.set_clip_box(axisline.axes.bbox) #axisline.major_ticklabels.set_visible(True) #axisline.minor_ticklabels.set_visible(False) - axisline.major_ticklabels.set_rotate_along_line(True) - axisline.set_rotate_label_along_line(True) + #axisline.major_ticklabels.set_rotate_along_line(True) + #axisline.set_rotate_label_along_line(True) return axisline @@ -356,19 +393,22 @@ def get_gridlines(self): def get_tick_iterator(self, nth_coord, axis_side, minor=False): - axisnr = dict(left=0, bottom=1, right=2, top=3)[axis_side] - angle = [0, 90, 180, 270][axisnr] + #axisnr = dict(left=0, bottom=1, right=2, top=3)[axis_side] + angle_tangent = dict(left=90, right=90, bottom=0, top=0)[axis_side] + #angle = [0, 90, 180, 270][axisnr] lon_or_lat = ["lon", "lat"][nth_coord] if not minor: # major ticks def f(): for (xy, a), l in zip(self.grid_info[lon_or_lat]["tick_locs"][axis_side], self.grid_info[lon_or_lat]["tick_labels"][axis_side]): - yield xy, a, l + angle_normal = a + yield xy, angle_normal, angle_tangent, l else: def f(): for (xy, a), l in zip(self.grid_info[lon_or_lat]["tick_locs"][axis_side], self.grid_info[lon_or_lat]["tick_labels"][axis_side]): - yield xy, a, "" + angle_normal = a + yield xy, angle_normal, angle_tangent, "" #for xy, a, l in self.grid_info[lon_or_lat]["ticks"][axis_side]: # yield xy, a, "" @@ -496,7 +536,7 @@ def curvelinear_test2(fig): lat_minmax = (0, np.inf), ) - grid_locator1 = angle_helper.LocatorDMS(12) + grid_locator1 = angle_helper.LocatorDMS(5) # Find a grid values appropriate for the coordinate (degree, # minute, second). @@ -530,14 +570,17 @@ def curvelinear_test2(fig): ax1.axis["lat"] = axis = grid_helper.new_floating_axis(0, 60, axes=ax1) axis.label.set_text("Test") axis.label.set_visible(True) + #axis._extremes = 2, 10 #axis.label.set_text("Test") #axis.major_ticklabels.set_visible(False) #axis.major_ticks.set_visible(False) + axis.get_helper()._extremes=2, 10 ax1.axis["lon"] = axis = grid_helper.new_floating_axis(1, 6, axes=ax1) #axis.major_ticklabels.set_visible(False) #axis.major_ticks.set_visible(False) axis.label.set_text("Test 2") + axis.get_helper()._extremes=-180, 90 # A parasite axes with given transform ax2 = ParasiteAxesAuxTrans(ax1, tr, "equal") @@ -554,15 +597,116 @@ def curvelinear_test2(fig): ax1.grid(True) + +def curvelinear_test3(fig): + """ + polar projection, but in a rectangular box. + """ + global ax1, axis + import numpy as np + import mpl_toolkits.axes_grid.angle_helper as angle_helper + from matplotlib.projections import PolarAxes + from matplotlib.transforms import Affine2D + + from mpl_toolkits.axes_grid.parasite_axes import SubplotHost, \ + ParasiteAxesAuxTrans + import matplotlib.cbook as cbook + + # PolarAxes.PolarTransform takes radian. However, we want our coordinate + # system in degree + tr = Affine2D().scale(np.pi/180., 1.) + PolarAxes.PolarTransform() + + # polar projection, which involves cycle, and also has limits in + # its coordinates, needs a special method to find the extremes + # (min, max of the coordinate within the view). + + # 20, 20 : number of sampling points along x, y direction + extreme_finder = angle_helper.ExtremeFinderCycle(20, 20, + lon_cycle = 360, + lat_cycle = None, + lon_minmax = None, + lat_minmax = (0, np.inf), + ) + + grid_locator1 = angle_helper.LocatorDMS(12) + # Find a grid values appropriate for the coordinate (degree, + # minute, second). + + tick_formatter1 = angle_helper.FormatterDMS() + # And also uses an appropriate formatter. Note that,the + # acceptable Locator and Formatter class is a bit different than + # that of mpl's, and you cannot directly use mpl's Locator and + # Formatter here (but may be possible in the future). + + grid_helper = GridHelperCurveLinear(tr, + extreme_finder=extreme_finder, + grid_locator1=grid_locator1, + tick_formatter1=tick_formatter1 + ) + + + ax1 = SubplotHost(fig, 1, 1, 1, grid_helper=grid_helper) + + for axis in ax1.axis.itervalues(): + axis.set_visible(False) + + fig.add_subplot(ax1) + + grid_helper = ax1.get_grid_helper() + ax1.axis["lat1"] = axis = grid_helper.new_floating_axis(0, 130, + axes=ax1, + axis_direction="left" + ) + axis.label.set_text("Test") + axis.label.set_visible(True) + axis.get_helper()._extremes=0.001, 10 + + + + grid_helper = ax1.get_grid_helper() + ax1.axis["lat2"] = axis = grid_helper.new_floating_axis(0, 50, axes=ax1, + axis_direction="right") + axis.label.set_text("Test") + axis.label.set_visible(True) + axis.get_helper()._extremes=0.001, 10 + + ax1.axis["lon"] = axis = grid_helper.new_floating_axis(1, 10, + axes=ax1, + axis_direction="bottom") + axis.label.set_text("Test 2") + axis.get_helper()._extremes= 50, 130 + axis.major_ticklabels.set_axis_direction("top") + axis.label.set_axis_direction("top") + + grid_helper.grid_finder.grid_locator1.den = 5 + grid_helper.grid_finder.grid_locator2._nbins = 5 + + +# # A parasite axes with given transform +# ax2 = ParasiteAxesAuxTrans(ax1, tr, "equal") +# # note that ax2.transData == tr + ax1.transData +# # Anthing you draw in ax2 will match the ticks and grids of ax1. +# ax1.parasites.append(ax2) +# intp = cbook.simple_linear_interpolation +# ax2.plot(intp(np.array([0, 30]), 50), +# intp(np.array([10., 10.]), 50)) + + ax1.set_aspect(1.) + ax1.set_xlim(-5, 12) + ax1.set_ylim(-5, 10) + + ax1.grid(True) + if __name__ == "__main__": import matplotlib.pyplot as plt fig = plt.figure(1, figsize=(5, 5)) fig.clf() - #curvelinear_test1(fig) - curvelinear_test2(fig) + #test3() + #curvelinear_test2(fig) + curvelinear_test3(fig) - plt.draw() + #plt.draw() plt.show() diff --git a/lib/mpl_toolkits/axes_grid/parasite_axes.py b/lib/mpl_toolkits/axes_grid/parasite_axes.py index 6b165dce3d68..6e4127b5f434 100644 --- a/lib/mpl_toolkits/axes_grid/parasite_axes.py +++ b/lib/mpl_toolkits/axes_grid/parasite_axes.py @@ -391,6 +391,13 @@ def twin(self, aux_trans=None): return ax2 + def get_aux_axes(self, tr, viewlim_mode="equal"): + ax2 = ParasiteAxesAuxTrans(self, tr, viewlim_mode) + # note that ax2.transData == tr + ax1.transData + # Anthing you draw in ax2 will match the ticks and grids of ax1. + self.parasites.append(ax2) + return ax2 + SubplotHost = subplot_class_factory(HostAxes) From 4fa92715657533854db6d6ae7252024f215817ba Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Mon, 7 Dec 2009 01:16:44 +0000 Subject: [PATCH 0415/1000] support FloatingAxes svn path=/trunk/matplotlib/; revision=8009 --- lib/mpl_toolkits/axes_grid/floating_axes.py | 691 ++++++++++++++++++++ 1 file changed, 691 insertions(+) create mode 100644 lib/mpl_toolkits/axes_grid/floating_axes.py diff --git a/lib/mpl_toolkits/axes_grid/floating_axes.py b/lib/mpl_toolkits/axes_grid/floating_axes.py new file mode 100644 index 000000000000..9e30885e2195 --- /dev/null +++ b/lib/mpl_toolkits/axes_grid/floating_axes.py @@ -0,0 +1,691 @@ +""" +An experimental support for curvelinear grid. +""" + + +# TODO : + +# *. see if tick_iterator method can be simplified by reusing the parent method. + +from itertools import chain +from mpl_toolkits.axes_grid.grid_finder import GridFinder + +from mpl_toolkits.axes_grid.axislines import AxisArtistHelper, GridHelperBase +from mpl_toolkits.axes_grid.axis_artist import AxisArtist +from matplotlib.transforms import Affine2D +import numpy as np + + +import mpl_toolkits.axes_grid.grid_helper_curvelinear as grid_helper_curvelinear + +class FloatingAxisArtistHelper(grid_helper_curvelinear.FloatingAxisArtistHelper): + pass + +class FixedAxisArtistHelper(grid_helper_curvelinear.FloatingAxisArtistHelper): + + + def __init__(self, grid_helper, side, nth_coord_ticks=None): + """ + nth_coord = along which coordinate value varies. + nth_coord = 0 -> x axis, nth_coord = 1 -> y axis + """ + + value, nth_coord = grid_helper.get_data_boundary(side) # return v= 0 , nth=1, extremes of the other coordinate. + super(FixedAxisArtistHelper, self).__init__(grid_helper, + nth_coord, + value, + axis_direction=side, + ) + #self.grid_helper = grid_helper + if nth_coord_ticks is None: + nth_coord_ticks = nth_coord + self.nth_coord_ticks = nth_coord_ticks + + self.value = value + self.grid_helper = grid_helper + self._side = side + + + def update_lim(self, axes): + self.grid_helper.update_lim(axes) + + self.grid_info = self.grid_helper.grid_info + + + + def get_axislabel_pos_angle(self, axes): + + extremes = self.grid_info["extremes"] + + if self.nth_coord == 0: + xx0 = self.value + yy0 = (extremes[2]+extremes[3])/2. + dxx, dyy = 0., abs(extremes[2]-extremes[3])/1000. + elif self.nth_coord == 1: + xx0 = (extremes[0]+extremes[1])/2. + yy0 = self.value + dxx, dyy = abs(extremes[0]-extremes[1])/1000., 0. + + grid_finder = self.grid_helper.grid_finder + xx1, yy1 = grid_finder.transform_xy([xx0], [yy0]) + + trans_passingthrough_point = axes.transData + axes.transAxes.inverted() + p = trans_passingthrough_point.transform_point([xx1[0], yy1[0]]) + + + if (0. <= p[0] <= 1.) and (0. <= p[1] <= 1.): + xx1c, yy1c = axes.transData.transform_point([xx1[0], yy1[0]]) + xx2, yy2 = grid_finder.transform_xy([xx0+dxx], [yy0+dyy]) + xx2c, yy2c = axes.transData.transform_point([xx2[0], yy2[0]]) + + return (xx1c, yy1c), np.arctan2(yy2c-yy1c, xx2c-xx1c)/np.pi*180. + else: + return None, None + + + + def get_tick_transform(self, axes): + return axes.transData + + def get_tick_iterators(self, axes): + """tick_loc, tick_angle, tick_label, (optionally) tick_label""" + + + grid_finder = self.grid_helper.grid_finder + + lat_levs, lat_n, lat_factor = self.grid_info["lat_info"] + lon_levs, lon_n, lon_factor = self.grid_info["lon_info"] + + lon_levs, lat_levs = np.asarray(lon_levs), np.asarray(lat_levs) + if lat_factor is not None: + yy0 = lat_levs / lat_factor + dy = 0.01 / lat_factor + else: + yy0 = lat_levs + dy = 0.01 + + if lon_factor is not None: + xx0 = lon_levs / lon_factor + dx = 0.01 / lon_factor + else: + xx0 = lon_levs + dx = 0.01 + + _extremes = self.grid_helper._extremes + xmin, xmax = sorted(_extremes[:2]) + ymin, ymax = sorted(_extremes[2:]) + if self.nth_coord == 0: + mask = (ymin <= yy0) & (yy0 <= ymax) + yy0 = yy0[mask] + elif self.nth_coord == 1: + mask = (xmin <= xx0) & (xx0 <= xmax) + xx0 = xx0[mask] + + # find angles + if self.nth_coord == 0: + xx0 = np.empty_like(yy0) + xx0.fill(self.value) + xx1, yy1 = grid_finder.transform_xy(xx0, yy0) + xx2, yy2 = grid_finder.transform_xy(xx0+dx, yy0) + xx3, yy3 = grid_finder.transform_xy(xx0, yy0+dy) + labels = self.grid_info["lat_labels"] + labels = [l for l, m in zip(labels, mask) if m] + + elif self.nth_coord == 1: + yy0 = np.empty_like(xx0) + yy0.fill(self.value) + xx1, yy1 = grid_finder.transform_xy(xx0, yy0) + xx2, yy2 = grid_finder.transform_xy(xx0, yy0+dy) + xx3, yy3 = grid_finder.transform_xy(xx0+dx, yy0) + labels = self.grid_info["lon_labels"] + labels = [l for l, m in zip(labels, mask) if m] + + + def f1(): + dd = np.arctan2(yy2-yy1, xx2-xx1) # angle normal + dd2 = np.arctan2(yy3-yy1, xx3-xx1) # angle tangent + mm = ((yy2-yy1)==0.) & ((xx2-xx1)==0.) # mask where dd1 is not defined + dd[mm] = dd2[mm]+3.14159/2. + + #dd += 3.14159 + #dd = np.arctan2(xx2-xx1, angle_tangent-yy1) + trans_tick = self.get_tick_transform(axes) + tr2ax = trans_tick + axes.transAxes.inverted() + for x, y, d, d2, lab in zip(xx1, yy1, dd, dd2, labels): + c2 = tr2ax.transform_point((x, y)) + delta=0.00001 + if (0. -delta<= c2[0] <= 1.+delta) and \ + (0. -delta<= c2[1] <= 1.+delta): + d1 = d/3.14159*180. + d2 = d2/3.14159*180. + #_mod = (d2-d1+180)%360 + #if _mod < 180: + # d1 += 180 + ##_div, _mod = divmod(d2-d1, 360) + yield [x, y], d1, d2, lab + #, d2/3.14159*180.+da) + + return f1(), iter([]) + + def get_line_transform(self, axes): + return axes.transData + + def get_line(self, axes): + + self.update_lim(axes) + from matplotlib.path import Path + k, v = dict(left=("lon_lines0", 0), + right=("lon_lines0", 1), + bottom=("lat_lines0", 0), + top=("lat_lines0", 1))[self._side] + + xx, yy = self.grid_info[k][v] + return Path(zip(xx, yy)) + + + +from mpl_toolkits.axes_grid.grid_finder import ExtremeFinderSimple + +class ExtremeFinderFixed(ExtremeFinderSimple): + def __init__(self, extremes): + self._extremes = extremes + + def __call__(self, transform_xy, x1, y1, x2, y2): + """ + get extreme values. + + x1, y1, x2, y2 in image coordinates (0-based) + nx, ny : number of dvision in each axis + """ + #lon_min, lon_max, lat_min, lat_max = self._extremes + return self._extremes + + + +class GridHelperCurveLinear(grid_helper_curvelinear.GridHelperCurveLinear): + + def __init__(self, aux_trans, extremes, + grid_locator1=None, + grid_locator2=None, + tick_formatter1=None, + tick_formatter2=None): + """ + aux_trans : a transform from the source (curved) coordinate to + target (rectlinear) coordinate. An instance of MPL's Transform + (inverse transform should be defined) or a tuple of two callable + objects which defines the transform and its inverse. The callables + need take two arguments of array of source coordinates and + should return two target coordinates: + e.g. x2, y2 = trans(x1, y1) + """ + + self._old_values = None + + self._extremes = extremes + extreme_finder = ExtremeFinderFixed(extremes) + + super(GridHelperCurveLinear, self).__init__(aux_trans, + extreme_finder, + grid_locator1=grid_locator1, + grid_locator2=grid_locator2, + tick_formatter1=tick_formatter1, + tick_formatter2=tick_formatter2) + + + # def update_grid_finder(self, aux_trans=None, **kw): + + # if aux_trans is not None: + # self.grid_finder.update_transform(aux_trans) + + # self.grid_finder.update(**kw) + # self.invalidate() + + + # def _update(self, x1, x2, y1, y2): + # "bbox in 0-based image coordinates" + # # update wcsgrid + + # if self.valid() and self._old_values == (x1, x2, y1, y2): + # return + + # self._update_grid(x1, y1, x2, y2) + + # self._old_values = (x1, x2, y1, y2) + + # self._force_update = False + + + def get_data_boundary(self, side): + """ + return v= 0 , nth=1 + """ + lon1, lon2, lat1, lat2 = self._extremes + return dict(left=(lon1, 0), + right=(lon2, 0), + bottom=(lat1, 1), + top=(lat2, 1))[side] + + + def new_fixed_axis(self, loc, + nth_coord=None, + axis_direction=None, + offset=None, + axes=None): + + if axes is None: + axes = self.axes + + if axis_direction is None: + axis_direction = loc + + _helper = FixedAxisArtistHelper(self, loc, + nth_coord_ticks=nth_coord) + + + axisline = AxisArtist(axes, _helper, axis_direction=axis_direction) + axisline.line.set_clip_on(True) + axisline.line.set_clip_box(axisline.axes.bbox) + + + return axisline + + + # new_floating_axis will inheirt the grid_helper's extremes. + + # def new_floating_axis(self, nth_coord, + # value, + # axes=None, + # axis_direction="bottom" + # ): + + # axis = super(GridHelperCurveLinear, + # self).new_floating_axis(nth_coord, + # value, axes=axes, + # axis_direction=axis_direction) + + # # set extreme values of the axis helper + # if nth_coord == 1: + # axis.get_helper().set_extremes(*self._extremes[:2]) + # elif nth_coord == 0: + # axis.get_helper().set_extremes(*self._extremes[2:]) + + # return axis + + + def _update_grid(self, x1, y1, x2, y2): + + #self.grid_info = self.grid_finder.get_grid_info(x1, y1, x2, y2) + + if self.grid_info is None: + self.grid_info = dict() + + grid_info = self.grid_info + + grid_finder = self.grid_finder + extremes = grid_finder.extreme_finder(grid_finder.inv_transform_xy, + x1, y1, x2, y2) + + lon_min, lon_max = sorted(extremes[:2]) + lat_min, lat_max = sorted(extremes[2:]) + lon_levs, lon_n, lon_factor = \ + grid_finder.grid_locator1(lon_min, lon_max) + lat_levs, lat_n, lat_factor = \ + grid_finder.grid_locator2(lat_min, lat_max) + grid_info["extremes"] = lon_min, lon_max, lat_min, lat_max #extremes + + grid_info["lon_info"] = lon_levs, lon_n, lon_factor + grid_info["lat_info"] = lat_levs, lat_n, lat_factor + + grid_info["lon_labels"] = grid_finder.tick_formatter1("bottom", + lon_factor, + lon_levs) + + grid_info["lat_labels"] = grid_finder.tick_formatter2("bottom", + lat_factor, + lat_levs) + + if lon_factor is None: + lon_values = np.asarray(lon_levs[:lon_n]) + else: + lon_values = np.asarray(lon_levs[:lon_n]/lon_factor) + if lat_factor is None: + lat_values = np.asarray(lat_levs[:lat_n]) + else: + lat_values = np.asarray(lat_levs[:lat_n]/lat_factor) + + lon_values0 = lon_values[(lon_min Date: Mon, 7 Dec 2009 01:17:16 +0000 Subject: [PATCH 0416/1000] axes_grid : doc update and new examples svn path=/trunk/matplotlib/; revision=8010 --- .../axes_grid/api/axes_grid_api.rst | 6 +- .../axes_grid/api/axis_artist_api.rst | 16 +++ doc/mpl_toolkits/axes_grid/api/index.rst | 1 + .../axes_grid/figures/demo_axis_direction.py | 98 +++++++++++++ .../figures/demo_ticklabel_alignment.py | 38 +++++ .../figures/demo_ticklabel_direction.py | 52 +++++++ .../axes_grid/users/axislines.rst | 45 +++++- doc/mpl_toolkits/axes_grid/users/overview.rst | 10 +- examples/axes_grid/demo_curvelinear_grid2.py | 63 +++++++++ examples/axes_grid/demo_floating_axes.py | 130 ++++++++++++++++++ 10 files changed, 453 insertions(+), 6 deletions(-) create mode 100644 doc/mpl_toolkits/axes_grid/api/axis_artist_api.rst create mode 100644 doc/mpl_toolkits/axes_grid/figures/demo_axis_direction.py create mode 100644 doc/mpl_toolkits/axes_grid/figures/demo_ticklabel_alignment.py create mode 100644 doc/mpl_toolkits/axes_grid/figures/demo_ticklabel_direction.py create mode 100644 examples/axes_grid/demo_curvelinear_grid2.py create mode 100644 examples/axes_grid/demo_floating_axes.py diff --git a/doc/mpl_toolkits/axes_grid/api/axes_grid_api.rst b/doc/mpl_toolkits/axes_grid/api/axes_grid_api.rst index 3e9074e438ba..15fa8bd2a2c1 100644 --- a/doc/mpl_toolkits/axes_grid/api/axes_grid_api.rst +++ b/doc/mpl_toolkits/axes_grid/api/axes_grid_api.rst @@ -2,6 +2,10 @@ :mod:`mpl_toolkits.axes_grid.axes_grid` ======================================= -.. autoclass:: mpl_toolkits.axes_grid.axes_grid.AxesGrid +.. autoclass:: mpl_toolkits.axes_grid.axes_grid.Grid + :members: + :undoc-members: + +.. autoclass:: mpl_toolkits.axes_grid.axes_grid.ImageGrid :members: :undoc-members: diff --git a/doc/mpl_toolkits/axes_grid/api/axis_artist_api.rst b/doc/mpl_toolkits/axes_grid/api/axis_artist_api.rst new file mode 100644 index 000000000000..8e2b62dacd50 --- /dev/null +++ b/doc/mpl_toolkits/axes_grid/api/axis_artist_api.rst @@ -0,0 +1,16 @@ + +:mod:`mpl_toolkits.axes_grid.axis_artist` +======================================= + +.. autoclass:: mpl_toolkits.axes_grid.axis_artist.AxisArtist + :members: + :undoc-members: + +.. autoclass:: mpl_toolkits.axes_grid.axis_artist.Ticks + :members: + +.. autoclass:: mpl_toolkits.axes_grid.axis_artist.AxisLabel + :members: + +.. autoclass:: mpl_toolkits.axes_grid.axis_artist.TickLabels + :members: diff --git a/doc/mpl_toolkits/axes_grid/api/index.rst b/doc/mpl_toolkits/axes_grid/api/index.rst index 8e3f9bfd6f04..399548928147 100644 --- a/doc/mpl_toolkits/axes_grid/api/index.rst +++ b/doc/mpl_toolkits/axes_grid/api/index.rst @@ -12,3 +12,4 @@ axes_size_api.rst axes_divider_api.rst axes_grid_api.rst + axis_artist_api.rst diff --git a/doc/mpl_toolkits/axes_grid/figures/demo_axis_direction.py b/doc/mpl_toolkits/axes_grid/figures/demo_axis_direction.py new file mode 100644 index 000000000000..4ffcbb023f6a --- /dev/null +++ b/doc/mpl_toolkits/axes_grid/figures/demo_axis_direction.py @@ -0,0 +1,98 @@ + + +import numpy as np +import mpl_toolkits.axes_grid.angle_helper as angle_helper +import mpl_toolkits.axes_grid.grid_finder as grid_finder +from matplotlib.projections import PolarAxes +from matplotlib.transforms import Affine2D + +import mpl_toolkits.axes_grid.axislines as axislines + +from mpl_toolkits.axes_grid.grid_helper_curvelinear import GridHelperCurveLinear + + +def setup_axes(fig, rect): + """ + polar projection, but in a rectangular box. + """ + + # see demo_curvelinear_grid.py for details + tr = Affine2D().scale(np.pi/180., 1.) + PolarAxes.PolarTransform() + + extreme_finder = angle_helper.ExtremeFinderCycle(20, 20, + lon_cycle = 360, + lat_cycle = None, + lon_minmax = None, + lat_minmax = (0, np.inf), + ) + + grid_locator1 = angle_helper.LocatorDMS(12) + grid_locator2 = grid_finder.MaxNLocator(5) + + tick_formatter1 = angle_helper.FormatterDMS() + + grid_helper = GridHelperCurveLinear(tr, + extreme_finder=extreme_finder, + grid_locator1=grid_locator1, + grid_locator2=grid_locator2, + tick_formatter1=tick_formatter1 + ) + + + ax1 = axislines.Subplot(fig, rect, grid_helper=grid_helper) + ax1.axis[:].toggle(ticklabels=False) + + fig.add_subplot(ax1) + + ax1.set_aspect(1.) + ax1.set_xlim(-5, 12) + ax1.set_ylim(-5, 10) + + #ax1.grid(True) + + return ax1 + + +def add_floating_axis1(ax1): + ax1.axis["lat"] = axis = ax1.new_floating_axis(0, 30) + axis.label.set_text(r"$\theta = 30^{\circ}$") + axis.label.set_visible(True) + + return axis + + +def add_floating_axis2(ax1): + ax1.axis["lon"] = axis = ax1.new_floating_axis(1, 6) + axis.label.set_text(r"$r = 6$") + axis.label.set_visible(True) + + return axis + + +import matplotlib.pyplot as plt +fig = plt.figure(1, figsize=(8, 4.)) +fig.clf() +fig.subplots_adjust(left=0.01, right=0.99, bottom=0.01, top=0.99, + wspace=0.01, hspace=0.01) + +for i, d in enumerate(["bottom", "left", "top", "right"]): + ax1 = setup_axes(fig, rect=241++i) + axis = add_floating_axis1(ax1) + axis.set_axis_direction(d) + ax1.annotate(d, (0, 1), (5, -5), + xycoords="axes fraction", textcoords="offset points", + va="top", ha="left") + +for i, d in enumerate(["bottom", "left", "top", "right"]): + ax1 = setup_axes(fig, rect=245++i) + axis = add_floating_axis2(ax1) + axis.set_axis_direction(d) + ax1.annotate(d, (0, 1), (5, -5), + xycoords="axes fraction", textcoords="offset points", + va="top", ha="left") + + + +plt.show() + + diff --git a/doc/mpl_toolkits/axes_grid/figures/demo_ticklabel_alignment.py b/doc/mpl_toolkits/axes_grid/figures/demo_ticklabel_alignment.py new file mode 100644 index 000000000000..420e7a2c3258 --- /dev/null +++ b/doc/mpl_toolkits/axes_grid/figures/demo_ticklabel_alignment.py @@ -0,0 +1,38 @@ + + +import matplotlib.pyplot as plt +import mpl_toolkits.axes_grid.axislines as axislines + + +def setup_axes(fig, rect): + + ax = axislines.Subplot(fig, rect) + fig.add_subplot(ax) + + ax.set_yticks([0.2, 0.8]) + ax.set_yticklabels(["short", "loooong"]) + ax.set_xticks([0.2, 0.8]) + ax.set_xticklabels([r"$\frac{1}{2}\pi$", r"$\pi$"]) + + return ax + +fig = plt.figure(1, figsize=(3, 5)) +fig.subplots_adjust(left=0.5, hspace=0.7) + + + +ax = setup_axes(fig, 311) +ax.set_ylabel("ha=right") +ax.set_xlabel("va=baseline") + +ax = setup_axes(fig, 312) +ax.axis["left"].major_ticklabels.set_ha("center") +ax.axis["bottom"].major_ticklabels.set_va("top") +ax.set_ylabel("ha=center") +ax.set_xlabel("va=top") + +ax = setup_axes(fig, 313) +ax.axis["left"].major_ticklabels.set_ha("left") +ax.axis["bottom"].major_ticklabels.set_va("bottom") +ax.set_ylabel("ha=left") +ax.set_xlabel("va=bottom") diff --git a/doc/mpl_toolkits/axes_grid/figures/demo_ticklabel_direction.py b/doc/mpl_toolkits/axes_grid/figures/demo_ticklabel_direction.py new file mode 100644 index 000000000000..380a6681e61d --- /dev/null +++ b/doc/mpl_toolkits/axes_grid/figures/demo_ticklabel_direction.py @@ -0,0 +1,52 @@ + +import matplotlib.pyplot as plt +import mpl_toolkits.axes_grid.axislines as axislines + + +def setup_axes(fig, rect): + + ax = axislines.Subplot(fig, rect) + fig.add_subplot(ax) + + ax.set_yticks([0.2, 0.8]) + #ax.set_yticklabels(["short", "loooong"]) + ax.set_xticks([0.2, 0.8]) + #ax.set_xticklabels([r"$\frac{1}{2}\pi$", r"$\pi$"]) + + return ax + +fig = plt.figure(1, figsize=(6, 3)) +fig.subplots_adjust(bottom=0.2) + + + +ax = setup_axes(fig, 131) +for axis in ax.axis.values(): axis.major_ticks.set_tick_out(True) +#or you can simply do "ax.axis[:].major_ticks.set_tick_out(True)" + + + + +ax = setup_axes(fig, 132) +ax.axis["left"].set_axis_direction("right") +ax.axis["bottom"].set_axis_direction("top") +ax.axis["right"].set_axis_direction("left") +ax.axis["top"].set_axis_direction("bottom") + +ax.axis["left"].major_ticklabels.set_pad(0) +ax.axis["bottom"].major_ticklabels.set_pad(10) + + + +ax = setup_axes(fig, 133) +ax.axis["left"].set_axis_direction("right") +ax.axis[:].major_ticks.set_tick_out(True) + +ax.axis["left"].label.set_text("Long Label Left") +ax.axis["bottom"].label.set_text("Label Bottom") +ax.axis["right"].label.set_text("Long Label Right") +ax.axis["right"].label.set_visible(True) +ax.axis["left"].label.set_pad(0) +ax.axis["bottom"].label.set_pad(10) + +plt.show() diff --git a/doc/mpl_toolkits/axes_grid/users/axislines.rst b/doc/mpl_toolkits/axes_grid/users/axislines.rst index d1137a5620f7..d54ef558f866 100644 --- a/doc/mpl_toolkits/axes_grid/users/axislines.rst +++ b/doc/mpl_toolkits/axes_grid/users/axislines.rst @@ -42,7 +42,7 @@ to not visible. As separate artists are used for rendering axis, some axis-related method in mpl may have no effect. In addition to AxisArtist instances, the axes_grid.axislines.Axes will have *gridlines* attribute (Gridlines), which obviously draws grid -lines. +lines. In both AxisArtist and Gridlines, the calculation of tick and grid location is delegated to an instance of GridHelper class. @@ -119,6 +119,43 @@ HowTo ax.axis["left"].major_ticklabels.set_color("r") +3. To change the attributes of multiple axis:: + + ax.axis["left","bottom"].major_ticklabels.set_color("r") + + or to change the attributes of all axis:: + + ax.axis[:].major_ticklabels.set_color("r") + +4. To change the tick size (length), you need to use + axis.major_ticks.set_ticksize method. To change the direction of + the ticks (ticks are in opposite direction of ticklabels by + default), use axis.major_ticks.set_tick_out method. + + To change the pad between ticks and ticklabels, use + axis.major_ticklabels.set_pad method. + + To change the pad between ticklabels and axis label, + axis.label.set_pad method. + +Examples +======== + +Adjusting axis_direction +------------------------ + +.. plot:: mpl_toolkits/axes_grid/figures/demo_axis_direction.py + +Adjusting ticklabels alignment +------------------------------ + +.. plot:: mpl_toolkits/axes_grid/figures/demo_ticklabel_alignment.py + +Adjusting ticklabels pad +------------------------ + +.. plot:: mpl_toolkits/axes_grid/figures/demo_ticklabel_direction.py + GridHelper ========== @@ -138,7 +175,7 @@ transform of the axes itself (ax.transData) is still rectlinear from mpl_toolkits.axes_grid.axislines import Subplot # from curved coordinate to rectlinear coordinate. - def tr(x, y): + def tr(x, y): x, y = np.asarray(x), np.asarray(y) return x, y-x @@ -171,7 +208,7 @@ required. :: # extreme finder : find a range of coordinate. # 20, 20 : number of sampling points along x, y direction - # The first coordinate (longitude, but theta in polar) + # The first coordinate (longitude, but theta in polar) # has a cycle of 360 degree. # The second coordinate (latitude, but radius in polar) has a minimum of 0 extreme_finder = angle_helper.ExtremeFinderCycle(20, 20, @@ -225,7 +262,7 @@ limits changes. A floating axis can be created using the resulting AxisArtist is properly added to the axes. A recommended way is to add it as an item of Axes's axis attribute.:: - # floating axis whose first (index starts from 0) coordinate + # floating axis whose first (index starts from 0) coordinate # (theta) is fixed at 60 ax1.axis["lat"] = axis = ax1.new_floating_axis(0, 60) diff --git a/doc/mpl_toolkits/axes_grid/users/overview.rst b/doc/mpl_toolkits/axes_grid/users/overview.rst index 05b4ca443746..8b0ef6cadc8f 100644 --- a/doc/mpl_toolkits/axes_grid/users/overview.rst +++ b/doc/mpl_toolkits/axes_grid/users/overview.rst @@ -35,7 +35,7 @@ ratio. For example, displaying images of a same size with some fixed padding between them cannot be easily done in matplotlib. AxesGrid is used in such case. -.. plot:: mpl_examples/axes_grid/simple_axesgrid.py +.. plot:: mpl_toolkits/axes_grid/examples/simple_axesgrid.py :include-source: * The postion of each axes is determined at the drawing time (see @@ -398,3 +398,11 @@ created. See :ref:`axislines-manual` for more details. .. plot:: mpl_toolkits/axes_grid/examples/demo_floating_axis.py +Floating Axes +============= + +An axes whose outer axis are defined as floating axis. + +.. plot:: mpl_toolkits/axes_grid/examples/demo_floating_axes.py + + diff --git a/examples/axes_grid/demo_curvelinear_grid2.py b/examples/axes_grid/demo_curvelinear_grid2.py new file mode 100644 index 000000000000..2d96044a2a70 --- /dev/null +++ b/examples/axes_grid/demo_curvelinear_grid2.py @@ -0,0 +1,63 @@ +import numpy as np +#from matplotlib.path import Path + +import matplotlib.pyplot as plt + +from mpl_toolkits.axes_grid.grid_helper_curvelinear import GridHelperCurveLinear +from mpl_toolkits.axes_grid.axislines import Subplot + +import mpl_toolkits.axes_grid.angle_helper as angle_helper + +def curvelinear_test1(fig): + """ + grid for custom transform. + """ + + def tr(x, y): + sgn = np.sign(x) + x, y = np.abs(np.asarray(x)), np.asarray(y) + return sgn*x**.5, y + + def inv_tr(x,y): + sgn = np.sign(x) + x, y = np.asarray(x), np.asarray(y) + return sgn*x**2, y + + extreme_finder = angle_helper.ExtremeFinderCycle(20, 20, + lon_cycle = None, + lat_cycle = None, + lon_minmax = None, #(0, np.inf), + lat_minmax = None, + ) + + grid_helper = GridHelperCurveLinear((tr, inv_tr), + extreme_finder=extreme_finder) + + ax1 = Subplot(fig, 111, grid_helper=grid_helper) + # ax1 will have a ticks and gridlines defined by the given + # transform (+ transData of the Axes). Note that the transform of + # the Axes itself (i.e., transData) is not affected by the given + # transform. + + fig.add_subplot(ax1) + + ax1.imshow(np.arange(25).reshape(5,5), + vmax = 50, cmap=plt.cm.gray_r, + interpolation="nearest", + origin="lower") + + # tick density + grid_helper.grid_finder.grid_locator1._nbins = 6 + grid_helper.grid_finder.grid_locator2._nbins = 6 + + + +if 1: + fig = plt.figure(1, figsize=(7, 4)) + fig.clf() + + curvelinear_test1(fig) + plt.show() + + + diff --git a/examples/axes_grid/demo_floating_axes.py b/examples/axes_grid/demo_floating_axes.py new file mode 100644 index 000000000000..9bc61c551aad --- /dev/null +++ b/examples/axes_grid/demo_floating_axes.py @@ -0,0 +1,130 @@ +from matplotlib.transforms import Affine2D + +from mpl_toolkits.axes_grid.floating_axes import FloatingSubplot,\ + GridHelperCurveLinear + +import numpy as np +import mpl_toolkits.axes_grid.angle_helper as angle_helper +from matplotlib.projections import PolarAxes +from mpl_toolkits.axes_grid.grid_finder import FixedLocator, MaxNLocator, \ + DictFormatter + +def setup_axes1(fig, rect): + + #tr_scale = Affine2D().scale(np.pi/180., 1.) + + tr = PolarAxes.PolarTransform() + + pi = np.pi + angle_ticks = [(0, r"$0$"), + (.25*pi, r"$\frac{1}{4}\pi$"), + (.5*pi, r"$\frac{1}{2}\pi$")] + grid_locator1 = FixedLocator([v for v, s in angle_ticks]) + tick_formatter1 = DictFormatter(dict(angle_ticks)) + + grid_locator2 = MaxNLocator(2) + + grid_helper = GridHelperCurveLinear(tr, + extremes=(.5*pi, 0, 2, 1), + #extremes=(0, .5*pi, 1, 2), + #extremes=(0, 1, 1, 2), + grid_locator1=grid_locator1, + grid_locator2=grid_locator2, + tick_formatter1=tick_formatter1, + tick_formatter2=None, + ) + + ax1 = FloatingSubplot(fig, rect, grid_helper=grid_helper) + fig.add_subplot(ax1) + + #ax1.axis[:] + + # create a parasite axes whose transData in RA, cz + aux_ax = ax1.get_aux_axes(tr) + + aux_ax.patch = ax1.patch # for aux_ax to have a clip path as in ax + ax1.patch.zorder=0.9 # but this has a side effect that the patch is + # drawn twice, and possibly over some other + # artists. So, we decrease the zorder a bit to + # prevent this. + + return ax1, aux_ax + + +def setup_axes2(fig, rect): + + # rotate a bit for better orientation + tr_rotate = Affine2D().translate(-95, 0) + + # scale degree to radians + tr_scale = Affine2D().scale(np.pi/180., 1.) + + tr = tr_rotate + tr_scale + PolarAxes.PolarTransform() + + grid_locator1 = angle_helper.LocatorHMS(4) + tick_formatter1 = angle_helper.FormatterHMS() + + grid_locator2 = MaxNLocator(3) + + ra0, ra1 = 8.*15, 14.*15 + cz0, cz1 = 0, 14000 + grid_helper = GridHelperCurveLinear(tr, + extremes=(ra0, ra1, cz0, cz1), + grid_locator1=grid_locator1, + grid_locator2=grid_locator2, + tick_formatter1=tick_formatter1, + tick_formatter2=None, + ) + + ax1 = FloatingSubplot(fig, rect, grid_helper=grid_helper) + fig.add_subplot(ax1) + + # adjust axis + ax1.axis["left"].set_axis_direction("bottom") + ax1.axis["right"].set_axis_direction("top") + + ax1.axis["bottom"].set_visible(False) + ax1.axis["top"].set_axis_direction("bottom") + ax1.axis["top"].toggle(ticklabels=True, label=True) + ax1.axis["top"].major_ticklabels.set_axis_direction("top") + ax1.axis["top"].label.set_axis_direction("top") + + ax1.axis["left"].label.set_text(r"cz [km$^{-1}$]") + ax1.axis["top"].label.set_text(r"$\alpha_{1950}$") + + + # create a parasite axes whose transData in RA, cz + aux_ax = ax1.get_aux_axes(tr) + + aux_ax.patch = ax1.patch # for aux_ax to have a clip path as in ax + ax1.patch.zorder=0.9 # but this has a side effect that the patch is + # drawn twice, and possibly over some other + # artists. So, we decrease the zorder a bit to + # prevent this. + + return ax1, aux_ax + + +def sixty(d, m, s): + return d + (m + s/60.)/60. + + + +if 1: + import matplotlib.pyplot as plt + fig = plt.figure(1, figsize=(7, 5)) + + ax1, aux_ax1 = setup_axes1(fig, 121) + + theta = np.random.rand(10)*.5*np.pi + radius = np.random.rand(10)+1. + aux_ax1.scatter(theta, radius) + + ax2, aux_ax2 = setup_axes2(fig, 122) + + theta = (8 + np.random.rand(10)*(14-8))*15. # indegree + radius = np.random.rand(10)*14000. + aux_ax2.scatter(theta, radius) + + plt.show() + From a34d29a20d8312c09c3eac308e23c902e9055a45 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Mon, 7 Dec 2009 01:17:27 +0000 Subject: [PATCH 0417/1000] update CHANGELOG for the axes_grid change svn path=/trunk/matplotlib/; revision=8011 --- CHANGELOG | 3 +++ 1 file changed, 3 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index da98433082b9..4b46c155c5fe 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2009-12-06 axes_grid: reimplemented AxisArtist with FloatingAxes support. + Added new examples. - JJL + 2009-12-01 Applied Laurent Dufrechou's patch to improve blitting with the qt4 backend - DSD From 00264396c5f994b52a70fdd4b8fda34f2017734e Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Wed, 9 Dec 2009 20:29:10 +0000 Subject: [PATCH 0418/1000] print out more meaningful messages when legend is called with artists that are not supported svn path=/trunk/matplotlib/; revision=8014 --- lib/matplotlib/legend.py | 70 +++++++++++++++++++++---------------- lib/matplotlib/offsetbox.py | 3 ++ 2 files changed, 42 insertions(+), 31 deletions(-) diff --git a/lib/matplotlib/legend.py b/lib/matplotlib/legend.py index 9aa753bddcc6..1fcebd5ade59 100644 --- a/lib/matplotlib/legend.py +++ b/lib/matplotlib/legend.py @@ -432,14 +432,6 @@ def _init_legend_box(self, handles, labels): ) labelboxes = [] - - for l in labels: - textbox = TextArea(l, textprops=label_prop, - multilinebaseline=True, minimumdescent=True) - text_list.append(textbox._text) - - labelboxes.append(textbox) - handleboxes = [] @@ -457,7 +449,8 @@ def _init_legend_box(self, handles, labels): # default trasnform (eg, Collections), you need to # manually set their transform to the self.get_transform(). - for handle in handles: + + for handle, lab in zip(handles, labels): if isinstance(handle, RegularPolyCollection) or \ isinstance(handle, CircleCollection): npoints = self.scatterpoints @@ -578,32 +571,47 @@ def _init_legend_box(self, handles, labels): p.set_clip_path(None) handle_list.append(p) else: + handle_type = type(handle) + warnings.warn("Legend does not support %s\nUse proxy artist instead.\n\nhttp://matplotlib.sourceforge.net/users/legend_guide.html#using-proxy-artist\n" % (str(handle_type),)) handle_list.append(None) - handlebox = DrawingArea(width=self.handlelength*fontsize, - height=height, - xdescent=0., ydescent=descent) - - handle = handle_list[-1] - handlebox.add_artist(handle) - if hasattr(handle, "_legmarker"): - handlebox.add_artist(handle._legmarker) - handleboxes.append(handlebox) - # We calculate number of lows in each column. The first - # (num_largecol) columns will have (nrows+1) rows, and remaing - # (num_smallcol) columns will have (nrows) rows. - ncol = min(self._ncol, len(handleboxes)) - nrows, num_largecol = divmod(len(handleboxes), ncol) - num_smallcol = ncol-num_largecol - - # starting index of each column and number of rows in it. - largecol = safezip(range(0, num_largecol*(nrows+1), (nrows+1)), - [nrows+1] * num_largecol) - smallcol = safezip(range(num_largecol*(nrows+1), len(handleboxes), nrows), - [nrows] * num_smallcol) - + handle = handle_list[-1] + if handle is not None: # handle is None is the artist is not supproted + textbox = TextArea(lab, textprops=label_prop, + multilinebaseline=True, minimumdescent=True) + text_list.append(textbox._text) + + labelboxes.append(textbox) + + handlebox = DrawingArea(width=self.handlelength*fontsize, + height=height, + xdescent=0., ydescent=descent) + + handlebox.add_artist(handle) + if hasattr(handle, "_legmarker"): + handlebox.add_artist(handle._legmarker) + handleboxes.append(handlebox) + + + if len(handleboxes) > 0: + + # We calculate number of lows in each column. The first + # (num_largecol) columns will have (nrows+1) rows, and remaing + # (num_smallcol) columns will have (nrows) rows. + ncol = min(self._ncol, len(handleboxes)) + nrows, num_largecol = divmod(len(handleboxes), ncol) + num_smallcol = ncol-num_largecol + + # starting index of each column and number of rows in it. + largecol = safezip(range(0, num_largecol*(nrows+1), (nrows+1)), + [nrows+1] * num_largecol) + smallcol = safezip(range(num_largecol*(nrows+1), len(handleboxes), nrows), + [nrows] * num_smallcol) + else: + largecol, smallcol = [], [] + handle_label = safezip(handleboxes, labelboxes) columnbox = [] for i0, di in largecol+smallcol: diff --git a/lib/matplotlib/offsetbox.py b/lib/matplotlib/offsetbox.py index 846016fefac1..f4350e5776da 100644 --- a/lib/matplotlib/offsetbox.py +++ b/lib/matplotlib/offsetbox.py @@ -375,6 +375,9 @@ def get_extent_offsets(self, renderer): whd_list = [c.get_extent(renderer) for c in self.get_visible_children()] + if not whd_list: + return 2*pad, 2*pad, pad, pad, [] + if self.height is None: height_descent = max([h-yd for w,h,xd,yd in whd_list]) ydescent = max([yd for w,h,xd,yd in whd_list]) From 94cda01e2e81f7b3ee57eca137497f6f18ada9d3 Mon Sep 17 00:00:00 2001 From: Reinier Heeres Date: Thu, 10 Dec 2009 00:03:03 +0000 Subject: [PATCH 0419/1000] mplot3d updates: * Fix scatter markers * Add facecolor support for plot_surface * Fix XYZ-pane order drawing * Add examples (animations, colored surface) svn path=/trunk/matplotlib/; revision=8015 --- examples/mplot3d/bars3d_demo.py | 7 +- examples/mplot3d/hist3d_demo.py | 1 + examples/mplot3d/rotate_axes3d_demo.py | 15 +++ examples/mplot3d/scatter3d_demo.py | 5 +- examples/mplot3d/surface3d_demo.py | 10 +- examples/mplot3d/surface3d_demo3.py | 31 ++++++ examples/mplot3d/wire3d_animation_demo.py | 34 ++++++ lib/mpl_toolkits/mplot3d/art3d.py | 8 +- lib/mpl_toolkits/mplot3d/axes3d.py | 122 +++++++++++++++++----- lib/mpl_toolkits/mplot3d/axis3d.py | 57 ++++++---- 10 files changed, 237 insertions(+), 53 deletions(-) create mode 100644 examples/mplot3d/rotate_axes3d_demo.py create mode 100644 examples/mplot3d/surface3d_demo3.py create mode 100644 examples/mplot3d/wire3d_animation_demo.py diff --git a/examples/mplot3d/bars3d_demo.py b/examples/mplot3d/bars3d_demo.py index 6887d894b253..6f1c5305ff24 100644 --- a/examples/mplot3d/bars3d_demo.py +++ b/examples/mplot3d/bars3d_demo.py @@ -7,7 +7,12 @@ for c, z in zip(['r', 'g', 'b', 'y'], [30, 20, 10, 0]): xs = np.arange(20) ys = np.random.rand(20) - ax.bar(xs, ys, zs=z, zdir='y', color=c, alpha=0.8) + + # You can provide either a single color or an array. To demonstrate this, + # the first bar of each set will be colored cyan. + cs = [c] * len(xs) + cs[0] = 'c' + ax.bar(xs, ys, zs=z, zdir='y', color=cs, alpha=0.8) ax.set_xlabel('X') ax.set_ylabel('Y') diff --git a/examples/mplot3d/hist3d_demo.py b/examples/mplot3d/hist3d_demo.py index b3d5bee8b42b..f5471cacb833 100644 --- a/examples/mplot3d/hist3d_demo.py +++ b/examples/mplot3d/hist3d_demo.py @@ -16,6 +16,7 @@ dx = 0.5 * np.ones_like(zpos) dy = dx.copy() dz = hist.flatten() + ax.bar3d(xpos, ypos, zpos, dx, dy, dz, color='b') plt.show() diff --git a/examples/mplot3d/rotate_axes3d_demo.py b/examples/mplot3d/rotate_axes3d_demo.py new file mode 100644 index 000000000000..749065da3b76 --- /dev/null +++ b/examples/mplot3d/rotate_axes3d_demo.py @@ -0,0 +1,15 @@ +from mpl_toolkits.mplot3d import axes3d +import matplotlib.pyplot as plt +import numpy as np + +plt.ion() + +fig = plt.figure() +ax = axes3d.Axes3D(fig) +X, Y, Z = axes3d.get_test_data(0.1) +ax.plot_wireframe(X, Y, Z, rstride=5, cstride=5) + +for angle in range(0, 360): + ax.view_init(30, angle) + plt.draw() + diff --git a/examples/mplot3d/scatter3d_demo.py b/examples/mplot3d/scatter3d_demo.py index 6cb50486aad7..5bb7e19d7296 100644 --- a/examples/mplot3d/scatter3d_demo.py +++ b/examples/mplot3d/scatter3d_demo.py @@ -2,18 +2,17 @@ from mpl_toolkits.mplot3d import Axes3D import matplotlib.pyplot as plt - def randrange(n, vmin, vmax): return (vmax-vmin)*np.random.rand(n) + vmin fig = plt.figure() ax = Axes3D(fig) n = 100 -for c, zl, zh in [('r', -50, -25), ('b', -30, -5)]: +for c, m, zl, zh in [('r', 'o', -50, -25), ('b', '^', -30, -5)]: xs = randrange(n, 23, 32) ys = randrange(n, 0, 100) zs = randrange(n, zl, zh) - ax.scatter(xs, ys, zs, c=c) + ax.scatter(xs, ys, zs, c=c, marker=m) ax.set_xlabel('X Label') ax.set_ylabel('Y Label') diff --git a/examples/mplot3d/surface3d_demo.py b/examples/mplot3d/surface3d_demo.py index ab15ca880367..b62ab7df8360 100644 --- a/examples/mplot3d/surface3d_demo.py +++ b/examples/mplot3d/surface3d_demo.py @@ -1,5 +1,6 @@ from mpl_toolkits.mplot3d import Axes3D from matplotlib import cm +from matplotlib.ticker import LinearLocator, FixedLocator, FormatStrFormatter import matplotlib.pyplot as plt import numpy as np @@ -10,7 +11,14 @@ X, Y = np.meshgrid(X, Y) R = np.sqrt(X**2 + Y**2) Z = np.sin(R) -ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet) +surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, cmap=cm.jet, + linewidth=0, antialiased=False) +ax.set_zlim3d(-1.01, 1.01) + +ax.w_zaxis.set_major_locator(LinearLocator(10)) +ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f')) + +fig.colorbar(surf, shrink=0.5, aspect=5) plt.show() diff --git a/examples/mplot3d/surface3d_demo3.py b/examples/mplot3d/surface3d_demo3.py new file mode 100644 index 000000000000..bf31f13aa4c1 --- /dev/null +++ b/examples/mplot3d/surface3d_demo3.py @@ -0,0 +1,31 @@ +from mpl_toolkits.mplot3d import Axes3D +from matplotlib import cm +from matplotlib.ticker import LinearLocator, FixedLocator, FormatStrFormatter +import matplotlib.pyplot as plt +import numpy as np + +fig = plt.figure() +ax = Axes3D(fig) +X = np.arange(-5, 5, 0.25) +xlen = len(X) +Y = np.arange(-5, 5, 0.25) +ylen = len(Y) +X, Y = np.meshgrid(X, Y) +R = np.sqrt(X**2 + Y**2) +Z = np.sin(R) + +colortuple = ('y', 'b') +colors = np.empty(X.shape, dtype=str) +for y in range(ylen): + for x in range(xlen): + colors[x, y] = colortuple[(x + y) % len(colortuple)] + +surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=colors, + linewidth=0, antialiased=False) + +ax.set_zlim3d(-1.01, 1.01) +ax.w_zaxis.set_major_locator(LinearLocator(10)) +ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f')) + +plt.show() + diff --git a/examples/mplot3d/wire3d_animation_demo.py b/examples/mplot3d/wire3d_animation_demo.py new file mode 100644 index 000000000000..f5bd8c79f3dc --- /dev/null +++ b/examples/mplot3d/wire3d_animation_demo.py @@ -0,0 +1,34 @@ +from mpl_toolkits.mplot3d import axes3d +import matplotlib.pyplot as plt +import numpy as np +import time + +def generate(X, Y, phi): + R = 1 - np.sqrt(X**2 + Y**2) + return np.cos(2 * np.pi * X + phi) * R + +plt.ion() +fig = plt.figure() +ax = axes3d.Axes3D(fig) + +xs = np.linspace(-1, 1, 50) +ys = np.linspace(-1, 1, 50) +X, Y = np.meshgrid(xs, ys) +Z = generate(X, Y, 0.0) + +wframe = None +tstart = time.time() +for phi in np.linspace(0, 360 / 2 / np.pi, 100): + + oldcol = wframe + + Z = generate(X, Y, phi) + wframe = ax.plot_wireframe(X, Y, Z, rstride=2, cstride=2) + + # Remove old line collection before drawing + if oldcol is not None: + ax.collections.remove(oldcol) + + plt.draw() + +print 'FPS: %f' % (100 / (time.time() - tstart)) diff --git a/lib/mpl_toolkits/mplot3d/art3d.py b/lib/mpl_toolkits/mplot3d/art3d.py index a9dfae7742ae..63057116f1f7 100644 --- a/lib/mpl_toolkits/mplot3d/art3d.py +++ b/lib/mpl_toolkits/mplot3d/art3d.py @@ -274,6 +274,7 @@ class Patch3DCollection(PatchCollection): def __init__(self, *args, **kwargs): PatchCollection.__init__(self, *args, **kwargs) + self._old_draw = lambda x: PatchCollection.draw(self, x) def set_3d_properties(self, zs, zdir): xs, ys = zip(*self.get_offsets()) @@ -293,10 +294,15 @@ def do_3d_projection(self, renderer): return min(vzs) def draw(self, renderer): - PatchCollection.draw(self, renderer) + self._old_draw(renderer) def patch_collection_2d_to_3d(col, zs=0, zdir='z'): """Convert a PatchCollection to a Patch3DCollection object.""" + + # The tricky part here is that there are several classes that are + # derived from PatchCollection. We need to use the right draw method. + col._old_draw = col.draw + col.__class__ = Patch3DCollection col.set_3d_properties(zs, zdir) diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 1f62c7e98598..7adb5019432c 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -13,7 +13,7 @@ from matplotlib.transforms import Bbox from matplotlib import collections import numpy as np -from matplotlib.colors import Normalize, colorConverter +from matplotlib.colors import Normalize, colorConverter, LightSource import art3d import proj3d @@ -37,6 +37,21 @@ class Axes3D(Axes): """ def __init__(self, fig, rect=None, *args, **kwargs): + ''' + Build an :class:`Axes3D` instance in + :class:`~matplotlib.figure.Figure` *fig* with + *rect=[left, bottom, width, height]* in + :class:`~matplotlib.figure.Figure` coordinates + + Optional keyword arguments: + + ================ ========================================= + Keyword Description + ================ ========================================= + *azim* Azimuthal viewing angle (default -60) + *elev* Elevation viewing angle (default 30) + ''' + if rect is None: rect = [0.0, 0.0, 1.0, 1.0] self.fig = fig @@ -146,9 +161,12 @@ def draw(self, renderer): for i, (z, patch) in enumerate(zlist): patch.zorder = i - self.w_xaxis.draw(renderer) - self.w_yaxis.draw(renderer) - self.w_zaxis.draw(renderer) + axes = (self.w_xaxis, self.w_yaxis, self.w_zaxis) + for ax in axes: + ax.draw_pane(renderer) + for ax in axes: + ax.draw(renderer) + Axes.draw(self, renderer) def get_axis_position(self): @@ -322,8 +340,9 @@ def cla(self): self.grid(rcParams['axes3d.grid']) def _button_press(self, event): - self.button_pressed = event.button - self.sx, self.sy = event.xdata, event.ydata + if event.inaxes == self: + self.button_pressed = event.button + self.sx, self.sy = event.xdata, event.ydata def _button_release(self, event): self.button_pressed = None @@ -565,6 +584,12 @@ def plot_surface(self, X, Y, Z, *args, **kwargs): *cstride* Array column stride (step size) *color* Color of the surface patches *cmap* A colormap for the surface patches. + *facecolors* Face colors for the individual patches + *norm* An instance of Normalize to map values to colors + *vmin* Minimum value to map + *vmax* Maximum value to map + *shade* Whether to shade the facecolors, default: + false when cmap specified, true otherwise ========== ================================================ ''' @@ -575,13 +600,28 @@ def plot_surface(self, X, Y, Z, *args, **kwargs): rstride = kwargs.pop('rstride', 10) cstride = kwargs.pop('cstride', 10) - color = kwargs.pop('color', 'b') - color = np.array(colorConverter.to_rgba(color)) + if 'facecolors' in kwargs: + fcolors = kwargs.pop('facecolors') + else: + color = np.array(colorConverter.to_rgba(kwargs.pop('color', 'b'))) + fcolors = None + cmap = kwargs.get('cmap', None) + norm = kwargs.pop('norm', None) + vmin = kwargs.pop('vmin', None) + vmax = kwargs.pop('vmax', None) + linewidth = kwargs.get('linewidth', None) + shade = kwargs.pop('shade', cmap is None) + lightsource = kwargs.pop('lightsource', None) + + # Shade the data + if shade and cmap is not None and fcolors is not None: + fcolors = self._shade_colors_lightsource(Z, cmap, lightsource) polys = [] normals = [] - avgz = [] + #colset contains the data for coloring: either average z or the facecolor + colset = [] for rs in np.arange(0, rows-1, rstride): for cs in np.arange(0, cols-1, cstride): ps = [] @@ -609,19 +649,38 @@ def plot_surface(self, X, Y, Z, *args, **kwargs): lastp = p avgzsum += p[2] polys.append(ps2) - avgz.append(avgzsum / len(ps2)) - v1 = np.array(ps2[0]) - np.array(ps2[1]) - v2 = np.array(ps2[2]) - np.array(ps2[0]) - normals.append(np.cross(v1, v2)) + if fcolors is not None: + colset.append(fcolors[rs][cs]) + else: + colset.append(avgzsum / len(ps2)) + + # Only need vectors to shade if no cmap + if cmap is None and shade: + v1 = np.array(ps2[0]) - np.array(ps2[1]) + v2 = np.array(ps2[2]) - np.array(ps2[0]) + normals.append(np.cross(v1, v2)) polyc = art3d.Poly3DCollection(polys, *args, **kwargs) - if cmap is not None: - polyc.set_array(np.array(avgz)) - polyc.set_linewidth(0) + + if fcolors is not None: + if shade: + colset = self._shade_colors(colset, normals) + polyc.set_facecolors(colset) + polyc.set_edgecolors(colset) + elif cmap: + colset = np.array(colset) + polyc.set_array(colset) + if vmin is not None or vmax is not None: + polyc.set_clim(vmin, vmax) + if norm is not None: + polyc.set_norm(norm) else: - colors = self._shade_colors(color, normals) - polyc.set_facecolors(colors) + if shade: + colset = self._shade_colors(color, normals) + else: + colset = color + polyc.set_facecolors(colset) self.add_collection(polyc) self.auto_scale_xyz(X, Y, Z, had_data) @@ -643,24 +702,39 @@ def _generate_normals(self, polygons): return normals def _shade_colors(self, color, normals): + ''' + Shade *color* using normal vectors given by *normals*. + *color* can also be an array of the same length as *normals*. + ''' + shade = [] for n in normals: - n = n / proj3d.mod(n) * 5 + n = n / proj3d.mod(n) shade.append(np.dot(n, [-1, -1, 0.5])) shade = np.array(shade) mask = ~np.isnan(shade) if len(shade[mask]) > 0: - norm = Normalize(min(shade[mask]), max(shade[mask])) - color = color.copy() - color[3] = 1 - colors = [color * (0.5 + norm(v) * 0.5) for v in shade] + norm = Normalize(min(shade[mask]), max(shade[mask])) + if art3d.iscolor(color): + color = color.copy() + color[3] = 1 + colors = [color * (0.5 + norm(v) * 0.5) for v in shade] + else: + colors = [np.array(colorConverter.to_rgba(c)) * \ + (0.5 + norm(v) * 0.5) \ + for c, v in zip(color, shade)] else: - colors = color.copy() + colors = color.copy() return colors + def _shade_colors_lightsource(self, data, cmap, lightsource): + if lightsource is None: + lightsource = LightSource(azdeg=135, altdeg=55) + return lightsource.shade(data, cmap) + def plot_wireframe(self, X, Y, Z, *args, **kwargs): ''' Plot a 3D wireframe. diff --git a/lib/mpl_toolkits/mplot3d/axis3d.py b/lib/mpl_toolkits/mplot3d/axis3d.py index 5ad0906b7134..b52c2da90f45 100644 --- a/lib/mpl_toolkits/mplot3d/axis3d.py +++ b/lib/mpl_toolkits/mplot3d/axis3d.py @@ -75,7 +75,7 @@ def __init__(self, adir, v_intervalx, d_intervalx, axes, *args, **kwargs): maxis.XAxis.__init__(self, axes, *args, **kwargs) self.line = mlines.Line2D(xdata=(0, 0), ydata=(0, 0), linewidth=0.75, - color=(0,0, 0,0), + color=(0, 0, 0, 1), antialiased=True, ) @@ -100,8 +100,8 @@ def get_tick_positions(self): majorLabels = [self.major.formatter(val, i) for i, val in enumerate(majorLocs)] return majorLabels, majorLocs - def get_major_ticks(self): - ticks = maxis.XAxis.get_major_ticks(self) + def get_major_ticks(self, numticks=None): + ticks = maxis.XAxis.get_major_ticks(self, numticks) for t in ticks: t.tick1line.set_transform(self.axes.transData) t.tick2line.set_transform(self.axes.transData) @@ -132,23 +132,7 @@ def get_rotate_label(self, text): else: return len(text) > 4 - def draw(self, renderer): - self.label._transform = self.axes.transData - renderer.open_group('axis3d') - - # code from XAxis - majorTicks = self.get_major_ticks() - majorLocs = self.major.locator() - - # filter locations here so that no extra grid lines are drawn - interval = self.get_view_interval() - majorLocs = [loc for loc in majorLocs if \ - interval[0] < loc < interval[1]] - self.major.formatter.set_locs(majorLocs) - majorLabels = [self.major.formatter(val, i) - for i, val in enumerate(majorLocs)] - - # Determine bounds + def _get_coord_info(self, renderer): minx, maxx, miny, maxy, minz, maxz = self.axes.get_w_lims() mins = np.array((minx, miny, minz)) maxs = np.array((maxx, maxy, maxz)) @@ -157,15 +141,19 @@ def draw(self, renderer): mins = mins - deltas / 4. maxs = maxs + deltas / 4. - # Determine which planes should be visible by the avg z value vals = mins[0], maxs[0], mins[1], maxs[1], mins[2], maxs[2] tc = self.axes.tunit_cube(vals, renderer.M) - #raise RuntimeError('WTF: p1=%s'%p1) avgz = [tc[p1][2] + tc[p2][2] + tc[p3][2] + tc[p4][2] for \ p1, p2, p3, p4 in self._PLANES] highs = np.array([avgz[2*i] < avgz[2*i+1] for i in range(3)]) - # Draw plane + return mins, maxs, centers, deltas, tc, highs + + def draw_pane(self, renderer): + renderer.open_group('pane3d') + + mins, maxs, centers, deltas, tc, highs = self._get_coord_info(renderer) + info = self._AXINFO[self.adir] index = info['i'] if not highs[index]: @@ -176,6 +164,29 @@ def draw(self, renderer): self.set_pane(xys, info['color']) self.pane.draw(renderer) + renderer.close_group('pane3d') + + def draw(self, renderer): + self.label._transform = self.axes.transData + renderer.open_group('axis3d') + + # code from XAxis + majorTicks = self.get_major_ticks() + majorLocs = self.major.locator() + + info = self._AXINFO[self.adir] + index = info['i'] + + # filter locations here so that no extra grid lines are drawn + interval = self.get_view_interval() + majorLocs = [loc for loc in majorLocs if \ + interval[0] < loc < interval[1]] + self.major.formatter.set_locs(majorLocs) + majorLabels = [self.major.formatter(val, i) + for i, val in enumerate(majorLocs)] + + mins, maxs, centers, deltas, tc, highs = self._get_coord_info(renderer) + # Determine grid lines minmax = np.where(highs, maxs, mins) From 719a1f749aab9e73f06398d4ade954c9759ec267 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Thu, 10 Dec 2009 19:05:35 +0000 Subject: [PATCH 0420/1000] add BracketAB arrow style svn path=/trunk/matplotlib/; revision=8017 --- lib/matplotlib/patches.py | 62 +++++++++++++++++++++++++++++++++++++-- 1 file changed, 59 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 2e34ad76805b..3de99852db13 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -3193,7 +3193,7 @@ def transmute(self, path, mutation_size, linewidth): cos_t, sin_t = get_cos_sin(x1, y1, x0, y0) verticesA, codesA = self._get_bracket(x0, y0, cos_t, sin_t, self.widthA*scaleA, - self.legnthA*scaleA) + self.lengthA*scaleA) vertices_list.append(verticesA) codes_list.append(codesA) @@ -3218,6 +3218,63 @@ def transmute(self, path, mutation_size, linewidth): return p, False + class BracketAB(_Bracket): + """ + An arrow with a bracket(]) at both ends. + """ + + def __init__(self, + widthA=1., lengthA=0.2, angleA=None, + widthB=1., lengthB=0.2, angleB=None): + """ + *widthA* + width of the bracket + + *lengthA* + length of the bracket + + *angleA* + angle between the bracket and the line + + *widthB* + width of the bracket + + *lengthB* + length of the bracket + + *angleB* + angle between the bracket and the line + """ + + super(ArrowStyle.BracketAB, self).__init__(True, True, \ + widthA=widthA, lengthA=lengthA, angleA=angleA, + widthB=widthB, lengthB=lengthB, angleB=angleB) + + _style_list["]-["] = BracketAB + + + class BracketA(_Bracket): + """ + An arrow with a bracket(]) at its end. + """ + + def __init__(self, widthA=1., lengthA=0.2, angleA=None): + """ + *widthA* + width of the bracket + + *lengthA* + length of the bracket + + *angleA* + angle between the bracket and the line + """ + + super(ArrowStyle.BracketA, self).__init__(None, True, + widthA=widthA, lengthA=lengthA, angleA=angleA ) + + _style_list["]-"] = BracketA + class BracketB(_Bracket): """ @@ -3237,9 +3294,8 @@ def __init__(self, widthB=1., lengthB=0.2, angleB=None): """ super(ArrowStyle.BracketB, self).__init__(None, True, - widthB=widthB, lengthB=lengthB, angleB=None ) + widthB=widthB, lengthB=lengthB, angleB=angleB ) - #_style_list["-["] = BracketB _style_list["-["] = BracketB From d5eb691c1c07b87015cd554c03cdf400c6d1a394 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Thu, 10 Dec 2009 20:05:58 +0000 Subject: [PATCH 0421/1000] FancyArrowPatch.__str__ updated svn path=/trunk/matplotlib/; revision=8018 --- lib/matplotlib/patches.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index 3de99852db13..ec7ffdc3cc36 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -3535,8 +3535,16 @@ class FancyArrowPatch(Patch): def __str__(self): - return self.__class__.__name__ \ - + "FancyArrowPatch(%g,%g,%g,%g,%g,%g)" % tuple(self._q_bezier) + + + if self._posA_posB is not None: + (x1, y1), (x2, y2) = self._posA_posB + return self.__class__.__name__ \ + + "(%g,%g->%g,%g)" % (x1, y1, x2, y2) + else: + return self.__class__.__name__ \ + + "(%s)" % (str(self._path_original),) + @docstring.dedent_interpd def __init__(self, posA=None, posB=None, From 787755e6b4835528e0600dadb3b6c128854d6d1d Mon Sep 17 00:00:00 2001 From: Reinier Heeres Date: Thu, 10 Dec 2009 23:32:41 +0000 Subject: [PATCH 0422/1000] mplot3d: support contours in directions other than z svn path=/trunk/matplotlib/; revision=8019 --- examples/mplot3d/contour3d_demo3.py | 20 ++++++++++++++++++++ lib/mpl_toolkits/mplot3d/art3d.py | 8 +++++++- lib/mpl_toolkits/mplot3d/axes3d.py | 17 ++++++++++++----- lib/mpl_toolkits/mplot3d/axis3d.py | 8 ++++---- 4 files changed, 43 insertions(+), 10 deletions(-) create mode 100644 examples/mplot3d/contour3d_demo3.py diff --git a/examples/mplot3d/contour3d_demo3.py b/examples/mplot3d/contour3d_demo3.py new file mode 100644 index 000000000000..9e44fa489acf --- /dev/null +++ b/examples/mplot3d/contour3d_demo3.py @@ -0,0 +1,20 @@ +from mpl_toolkits.mplot3d import axes3d +import matplotlib.pyplot as plt + +fig = plt.figure() +ax = axes3d.Axes3D(fig) +X, Y, Z = axes3d.get_test_data(0.05) +ax.plot_surface(X, Y, Z, rstride=8, cstride=8, alpha=0.3) +cset = ax.contour(X, Y, Z, zdir='z', offset=-100) +cset = ax.contour(X, Y, Z, zdir='x', offset=-40) +cset = ax.contour(X, Y, Z, zdir='y', offset=40) + +ax.set_xlabel('X') +ax.set_xlim3d(-40, 40) +ax.set_ylabel('Y') +ax.set_ylim3d(-40, 40) +ax.set_zlabel('Z') +ax.set_zlim3d(-100, 100) + +plt.show() + diff --git a/lib/mpl_toolkits/mplot3d/art3d.py b/lib/mpl_toolkits/mplot3d/art3d.py index 63057116f1f7..54f85b6ca065 100644 --- a/lib/mpl_toolkits/mplot3d/art3d.py +++ b/lib/mpl_toolkits/mplot3d/art3d.py @@ -437,9 +437,15 @@ def juggle_axes(xs, ys, zs, zdir): Reorder coordinates so that zdir """ if zdir == 'x': + return ys, zs, xs + elif zdir == '-x': return zs, xs, ys + elif zdir == 'y': - return xs, zs, ys + return zs, xs, ys + elif zdir == '-y': + return ys, zs, xs + else: return xs, ys, zs diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index 7adb5019432c..e635839e8b18 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -839,10 +839,11 @@ def contour(self, X, Y, Z, levels=10, **kwargs): ========== ================================================ *X*, *Y*, Data values as numpy.arrays *Z* - *levels* Number of levels to use, defaults to 10. Can - also be a tuple of specific levels. *extend3d* Whether to extend contour in 3D (default: False) *stride* Stride (step size) for extending contour + *zdir* The direction to use: x, y or z (default) + *offset* If specified plot a projection of the contour + lines on this position in plane normal to zdir ========== ================================================ Other keyword arguments are passed on to @@ -851,16 +852,22 @@ def contour(self, X, Y, Z, levels=10, **kwargs): extend3d = kwargs.pop('extend3d', False) stride = kwargs.pop('stride', 5) - nlevels = kwargs.pop('nlevels', 15) + zdir = kwargs.pop('zdir', 'z') + offset = kwargs.pop('offset', None) had_data = self.has_data() - cset = Axes.contour(self, X, Y, Z, levels, **kwargs) + jX, jY, jZ = art3d.juggle_axes(X, Y, Z, zdir) + cset = Axes.contour(self, jX, jY, jZ, **kwargs) + + zdir = '-' + zdir if extend3d: self._3d_extend_contour(cset, stride) else: for z, linec in zip(cset.levels, cset.collections): - art3d.line_collection_2d_to_3d(linec, z) + if offset is not None: + z = offset + art3d.line_collection_2d_to_3d(linec, z, zdir=zdir) self.auto_scale_xyz(X, Y, Z, had_data) return cset diff --git a/lib/mpl_toolkits/mplot3d/axis3d.py b/lib/mpl_toolkits/mplot3d/axis3d.py index b52c2da90f45..e01cd15b427b 100644 --- a/lib/mpl_toolkits/mplot3d/axis3d.py +++ b/lib/mpl_toolkits/mplot3d/axis3d.py @@ -57,11 +57,11 @@ class Axis(maxis.XAxis): # Some properties for the axes _AXINFO = { - 'x': {'i': 0, 'tickdir': 1, + 'x': {'i': 0, 'tickdir': 1, 'juggled': (1, 0, 2), 'color': (0.95, 0.95, 0.95, 0.5)}, - 'y': {'i': 1, 'tickdir': 0, + 'y': {'i': 1, 'tickdir': 0, 'juggled': (0, 1, 2), 'color': (0.90, 0.90, 0.90, 0.5)}, - 'z': {'i': 2, 'tickdir': 0, + 'z': {'i': 2, 'tickdir': 0, 'juggled': (0, 2, 1), 'color': (0.925, 0.925, 0.925, 0.5)}, } @@ -191,7 +191,7 @@ def draw(self, renderer): minmax = np.where(highs, maxs, mins) # Draw main axis line - juggled = art3d.juggle_axes(0, 2, 1, self.adir) + juggled = info['juggled'] edgep1 = minmax.copy() edgep1[juggled[0]] = get_flip_min_max(edgep1, juggled[0], mins, maxs) From d1cc3b05ce792e40fb5237f43a259e873045ceda Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Fri, 11 Dec 2009 00:59:25 +0000 Subject: [PATCH 0423/1000] tests: add tests for rec2csv and csv2rec svn path=/trunk/matplotlib/; revision=8020 --- lib/matplotlib/tests/test_mlab.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/lib/matplotlib/tests/test_mlab.py b/lib/matplotlib/tests/test_mlab.py index 21a7a75d06ca..1d3d33856dbd 100644 --- a/lib/matplotlib/tests/test_mlab.py +++ b/lib/matplotlib/tests/test_mlab.py @@ -1,5 +1,7 @@ import numpy as np import matplotlib.mlab as mlab +import tempfile +from nose.tools import raises def test_colinear_pca(): a = mlab.PCA._get_colinear() @@ -8,3 +10,25 @@ def test_colinear_pca(): assert(np.allclose(pca.fracs[2:], 0.)) assert(np.allclose(pca.Y[:,2:], 0.)) +def test_recarray_csv_roundtrip(): + expected = np.recarray((99,), + [('x',np.float),('y',np.float),('t',np.float)]) + expected['x'][0] = 1 + expected['y'][1] = 2 + expected['t'][2] = 3 + fd = tempfile.TemporaryFile(suffix='csv') + mlab.rec2csv(expected,fd) + fd.seek(0) + actual = mlab.csv2rec(fd) + fd.close() + assert np.allclose( expected['x'], actual['x'] ) + assert np.allclose( expected['y'], actual['y'] ) + assert np.allclose( expected['t'], actual['t'] ) + +@raises(ValueError) +def test_rec2csv_bad_shape(): + bad = np.recarray((99,4),[('x',np.float),('y',np.float)]) + fd = tempfile.TemporaryFile(suffix='csv') + + # the bad recarray should trigger a ValueError for having ndim > 1. + mlab.rec2csv(bad,fd) From cd969164a0dc1a452ed08ab654a044b48879be11 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Fri, 11 Dec 2009 00:59:34 +0000 Subject: [PATCH 0424/1000] rec2csv raises explicit error when recarray ndim not 1 svn path=/trunk/matplotlib/; revision=8021 --- lib/matplotlib/mlab.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/matplotlib/mlab.py b/lib/matplotlib/mlab.py index 91c0cbeef5b0..a6be0b183e00 100644 --- a/lib/matplotlib/mlab.py +++ b/lib/matplotlib/mlab.py @@ -2598,6 +2598,9 @@ def newfunc(val, mask, mval): return func(val) return newfunc + if r.ndim != 1: + raise ValueError('rec2csv only operates on 1 dimensional recarrays') + formatd = get_formatd(r, formatd) funcs = [] for i, name in enumerate(r.dtype.names): From 18d19b7af6c76c1da5d8034251b2d180c201dedc Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Fri, 11 Dec 2009 16:57:46 +0000 Subject: [PATCH 0425/1000] Axes.draw rearranged to support rasterization svn path=/trunk/matplotlib/; revision=8022 --- lib/matplotlib/axes.py | 21 +++++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index 6db0df933c33..17f226d39df0 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -30,6 +30,8 @@ import matplotlib.ticker as mticker import matplotlib.transforms as mtransforms +from operator import itemgetter + iterable = cbook.iterable is_string_like = cbook.is_string_like is_sequence_of_strings = cbook.is_sequence_of_strings @@ -1698,11 +1700,22 @@ def draw(self, renderer=None, inframe=False): artists.extend(self.spines.itervalues()) + dsu = [ (a.zorder, a) for a in artists if not a.get_animated() ] - dsu.sort(key=lambda x: x[0]) + # add images to dsu if the backend support compositing. + # otherwise, does the manaul compositing without adding images to dsu. + if len(self.images)<=1 or renderer.option_image_nocomposite(): + dsu.extend([(im.zorder, im) for im in self.images]) + _do_composite = False + else: + _do_composite = True + + + dsu.sort(key=itemgetter(0)) + # rasterize artists with negative zorder # if the minimum zorder is negative, start rasterization rasterization_zorder = self._rasterization_zorder @@ -1719,11 +1732,7 @@ def draw(self, renderer=None, inframe=False): if self.axison and self._frameon: self.patch.draw(renderer) - if len(self.images)<=1 or renderer.option_image_nocomposite(): - for im in self.images: - dsu.append( (im.zorder, im) ) - dsu.sort(key=lambda x: x[0]) # re-sort with images now - else: + if _do_composite: # make a composite image blending alpha # list of (mimage.Image, ox, oy) From 7b2a3ecee3a7940e3834371ce60e6a924fc3ee3d Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Fri, 11 Dec 2009 16:57:53 +0000 Subject: [PATCH 0426/1000] add ArrowStyle |-| svn path=/trunk/matplotlib/; revision=8023 --- examples/pylab_examples/fancyarrow_demo.py | 10 +++++-- lib/matplotlib/patches.py | 35 ++++++++++++++++++++++ 2 files changed, 43 insertions(+), 2 deletions(-) diff --git a/examples/pylab_examples/fancyarrow_demo.py b/examples/pylab_examples/fancyarrow_demo.py index 11727e655b8a..4d3c45534196 100644 --- a/examples/pylab_examples/fancyarrow_demo.py +++ b/examples/pylab_examples/fancyarrow_demo.py @@ -4,7 +4,7 @@ styles = mpatches.ArrowStyle.get_styles() ncol=2 -nrow = len(styles) // ncol + 1 +nrow = (len(styles)+1) // ncol figheight = (nrow+0.5) fig1 = plt.figure(1, (4.*ncol/1.5, figheight/1.5)) fontsize = 0.2 * 70 @@ -15,13 +15,19 @@ ax.set_xlim(0, 4*ncol) ax.set_ylim(0, figheight) +def to_texstring(s): + s = s.replace("<", r"$<$") + s = s.replace(">", r"$>$") + s = s.replace("|", r"$|$") + return s + for i, (stylename, styleclass) in enumerate(sorted(styles.items())): x = 3.2 + (i//nrow)*4 y = (figheight - 0.7 - i%nrow) # /figheight p = mpatches.Circle((x, y), 0.2, fc="w") ax.add_patch(p) - ax.annotate(stylename, (x, y), + ax.annotate(to_texstring(stylename), (x, y), (x-1.2, y), #xycoords="figure fraction", textcoords="figure fraction", ha="right", va="center", diff --git a/lib/matplotlib/patches.py b/lib/matplotlib/patches.py index ec7ffdc3cc36..3e62a05d509d 100644 --- a/lib/matplotlib/patches.py +++ b/lib/matplotlib/patches.py @@ -3299,6 +3299,41 @@ def __init__(self, widthB=1., lengthB=0.2, angleB=None): _style_list["-["] = BracketB + class BarAB(_Bracket): + """ + An arrow with a bracket(]) at both ends. + """ + + def __init__(self, + widthA=1., angleA=None, + widthB=1., angleB=None): + """ + *widthA* + width of the bracket + + *lengthA* + length of the bracket + + *angleA* + angle between the bracket and the line + + *widthB* + width of the bracket + + *lengthB* + length of the bracket + + *angleB* + angle between the bracket and the line + """ + + super(ArrowStyle.BarAB, self).__init__(True, True, \ + widthA=widthA, lengthA=0, angleA=angleA, + widthB=widthB, lengthB=0, angleB=angleB) + + _style_list["|-|"] = BarAB + + class Simple(_Base): """ A simple arrow. Only works with a quadratic bezier curve. From ed9eaba85bd329e195cf70ebfda178aa94cf35a6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Sun, 13 Dec 2009 12:06:07 +0000 Subject: [PATCH 0427/1000] Address mathtext problem with non-BMP characters: http://thread.gmane.org/gmane.comp.python.matplotlib.general/19963/focus=19978 svn path=/trunk/matplotlib/; revision=8026 --- doc/users/mathtext.rst | 7 +++++++ lib/matplotlib/mathtext.py | 17 +++++++++++++---- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/doc/users/mathtext.rst b/doc/users/mathtext.rst index 3205f2d24879..d7b07556f40f 100644 --- a/doc/users/mathtext.rst +++ b/doc/users/mathtext.rst @@ -23,6 +23,13 @@ that you provide. The mathtext font can be selected with the customization variable ``mathtext.fontset`` (see :ref:`customizing-matplotlib`) +.. note:: + On `"narrow" `_ builds + of Python, if you use the STIX fonts you should also set + ``ps.fonttype`` and ``pdf.fonttype`` to 3 (the default), not 42. + Otherwise `some characters will not be visible + `_. + Here is a simple example:: # plain text diff --git a/lib/matplotlib/mathtext.py b/lib/matplotlib/mathtext.py index 0995d07d9448..164dc2fec39b 100644 --- a/lib/matplotlib/mathtext.py +++ b/lib/matplotlib/mathtext.py @@ -82,6 +82,14 @@ def get_unicode_index(symbol): TeX/Type1 symbol"""%locals() raise ValueError, message +def unichr_safe(index): + """Return the Unicode character corresponding to the index, +or the replacement character if this is a narrow build of Python +and the requested character is outside the BMP.""" + try: + return unichr(index) + except ValueError: + return unichr(0xFFFD) class MathtextBackend(object): """ @@ -321,7 +329,8 @@ def __init__(self): def render_glyph(self, ox, oy, info): oy = self.height - oy + info.offset - thetext = unichr(info.num) + thetext = unichr_safe(info.num) + self.svg_glyphs.append( (info.font, info.fontsize, thetext, ox, oy, info.metrics)) @@ -351,7 +360,7 @@ def __init__(self): def render_glyph(self, ox, oy, info): oy = self.height - oy + info.offset - thetext = unichr(info.num) + thetext = unichr_safe(info.num) self.glyphs.append( (info.font, info.fontsize, thetext, ox, oy)) @@ -379,7 +388,7 @@ def __init__(self): def render_glyph(self, ox, oy, info): oy = oy - info.offset - self.height - thetext = unichr(info.num) + thetext = unichr_safe(info.num) self.glyphs.append( (info.font, info.fontsize, thetext, ox, oy)) @@ -997,7 +1006,7 @@ def get_sized_alternatives_for_symbol(self, fontname, sym): cached_font = self._get_font(i) glyphindex = cached_font.charmap.get(uniindex) if glyphindex is not None: - alternatives.append((i, unichr(uniindex))) + alternatives.append((i, unichr_safe(uniindex))) # The largest size of the radical symbol in STIX has incorrect # metrics that cause it to be disconnected from the stem. From c309666cf0745804f953d96908181f2e120480cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Sun, 13 Dec 2009 19:19:28 +0000 Subject: [PATCH 0428/1000] Add test for figimage bug svn path=/trunk/matplotlib/; revision=8027 --- lib/matplotlib/tests/test_image.py | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/lib/matplotlib/tests/test_image.py b/lib/matplotlib/tests/test_image.py index 73f28b4f5a11..aa3d49d107a1 100644 --- a/lib/matplotlib/tests/test_image.py +++ b/lib/matplotlib/tests/test_image.py @@ -29,6 +29,25 @@ def test_image_interps(): fig.savefig('image_interps') +@image_comparison(baseline_images=['figimage-0', 'figimage-1'], extensions=['png']) +def test_figimage(): + 'test the figimage method' + + for suppressComposite in False, True: + fig = plt.figure(figsize=(2,2), dpi=100) + fig.suppressComposite=suppressComposite + x,y = np.ix_(np.arange(100.0)/100.0, np.arange(100.0)/100.0) + z = np.sin(x**2 + y**2 - x*y) + c = np.sin(20*x**2 + 50*y**2) + img = z + c/5 + + fig.figimage(img, xo=0, yo=0, origin='lower') + fig.figimage(img, xo=0, yo=100, origin='upper') + fig.figimage(img[:,::-1], xo=100, yo=0, origin='lower') + fig.figimage(img[:,::-1], xo=100, yo=100, origin='upper') + + fig.savefig('figimage-%d' % int(suppressComposite), dpi=100) + def test_image_python_io(): fig = plt.figure() ax = fig.add_subplot(111) From b2cf412d632e07004546792d20df08016a729ff5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Sun, 13 Dec 2009 19:28:22 +0000 Subject: [PATCH 0429/1000] Add baseline images for figimage test svn path=/trunk/matplotlib/; revision=8028 --- .../baseline_images/test_image/figimage-0.png | Bin 0 -> 59270 bytes .../baseline_images/test_image/figimage-1.png | Bin 0 -> 59270 bytes 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_image/figimage-0.png create mode 100644 lib/matplotlib/tests/baseline_images/test_image/figimage-1.png diff --git a/lib/matplotlib/tests/baseline_images/test_image/figimage-0.png b/lib/matplotlib/tests/baseline_images/test_image/figimage-0.png new file mode 100644 index 0000000000000000000000000000000000000000..509a6bf5b75ebb4cdd20f59d3b543b94cac5af3e GIT binary patch literal 59270 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

    `s& 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 P00000NkvXXu0mjfAhhzM literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_image/figimage-1.png b/lib/matplotlib/tests/baseline_images/test_image/figimage-1.png new file mode 100644 index 0000000000000000000000000000000000000000..509a6bf5b75ebb4cdd20f59d3b543b94cac5af3e GIT binary patch literal 59270 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

    `s& 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 P00000NkvXXu0mjfAhhzM literal 0 HcmV?d00001 From a5138b96085566b45103e4e3b30b71f7bc9a1881 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Sun, 13 Dec 2009 19:59:15 +0000 Subject: [PATCH 0430/1000] Fix figimage test to really exercise both branches in figure.draw svn path=/trunk/matplotlib/; revision=8029 --- lib/matplotlib/tests/test_image.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/tests/test_image.py b/lib/matplotlib/tests/test_image.py index aa3d49d107a1..7ff1a60e5fc3 100644 --- a/lib/matplotlib/tests/test_image.py +++ b/lib/matplotlib/tests/test_image.py @@ -35,16 +35,16 @@ def test_figimage(): for suppressComposite in False, True: fig = plt.figure(figsize=(2,2), dpi=100) - fig.suppressComposite=suppressComposite + fig.suppressComposite = suppressComposite x,y = np.ix_(np.arange(100.0)/100.0, np.arange(100.0)/100.0) z = np.sin(x**2 + y**2 - x*y) c = np.sin(20*x**2 + 50*y**2) img = z + c/5 fig.figimage(img, xo=0, yo=0, origin='lower') - fig.figimage(img, xo=0, yo=100, origin='upper') + fig.figimage(img[::-1,:], xo=0, yo=100, origin='lower') fig.figimage(img[:,::-1], xo=100, yo=0, origin='lower') - fig.figimage(img[:,::-1], xo=100, yo=100, origin='upper') + fig.figimage(img[::-1,::-1], xo=100, yo=100, origin='lower') fig.savefig('figimage-%d' % int(suppressComposite), dpi=100) From 1113012054f5dce26fe6fa1bd167576801fb10ab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Sun, 13 Dec 2009 20:24:23 +0000 Subject: [PATCH 0431/1000] Fix AttributeError in figure.draw when compositing images svn path=/trunk/matplotlib/; revision=8030 --- lib/matplotlib/figure.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index ae3e17293d82..5951b05978cd 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -755,11 +755,12 @@ def draw(self, renderer): # override the renderer default if self.suppressComposite # is not None - composite = renderer.option_image_nocomposite() + not_composite = renderer.option_image_nocomposite() if self.suppressComposite is not None: - composite = self.suppressComposite + not_composite = self.suppressComposite - if len(self.images)<=1 or composite or not allequal([im.origin for im in self.images]): + if len(self.images)<=1 or not_composite or \ + not allequal([im.origin for im in self.images]): for a in self.images: dsu.append( (a.get_zorder(), a.draw, [renderer])) else: @@ -783,8 +784,7 @@ def draw_composite(): renderer.draw_image(gc, l, b, im) gc.restore() - if len(ims): - dsu.append((ims[0].get_zorder(), draw_composite, [])) + dsu.append((self.images[0].get_zorder(), draw_composite, [])) # render the axes for a in self.axes: From 3d6d64be3ddf9c3a14a628e907b31fd27da25eea Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Sun, 13 Dec 2009 21:02:05 +0000 Subject: [PATCH 0432/1000] update demo_floating_axes.py svn path=/trunk/matplotlib/; revision=8031 --- examples/axes_grid/demo_floating_axes.py | 53 +++++++++++++++++------- 1 file changed, 39 insertions(+), 14 deletions(-) diff --git a/examples/axes_grid/demo_floating_axes.py b/examples/axes_grid/demo_floating_axes.py index 9bc61c551aad..6dbe199f94b4 100644 --- a/examples/axes_grid/demo_floating_axes.py +++ b/examples/axes_grid/demo_floating_axes.py @@ -10,6 +10,27 @@ DictFormatter def setup_axes1(fig, rect): + """ + A simple one. + """ + tr = Affine2D().scale(2, 1).rotate_deg(30) + + grid_helper = GridHelperCurveLinear(tr, extremes=(0, 4, 0, 4)) + + ax1 = FloatingSubplot(fig, rect, grid_helper=grid_helper) + fig.add_subplot(ax1) + + grid_helper.grid_finder.grid_locator1._nbins = 4 + grid_helper.grid_finder.grid_locator2._nbins = 4 + + return ax1 + + +def setup_axes2(fig, rect): + """ + With custom locator and formatter. + Note that the extreme values are swapped. + """ #tr_scale = Affine2D().scale(np.pi/180., 1.) @@ -26,8 +47,6 @@ def setup_axes1(fig, rect): grid_helper = GridHelperCurveLinear(tr, extremes=(.5*pi, 0, 2, 1), - #extremes=(0, .5*pi, 1, 2), - #extremes=(0, 1, 1, 2), grid_locator1=grid_locator1, grid_locator2=grid_locator2, tick_formatter1=tick_formatter1, @@ -37,8 +56,6 @@ def setup_axes1(fig, rect): ax1 = FloatingSubplot(fig, rect, grid_helper=grid_helper) fig.add_subplot(ax1) - #ax1.axis[:] - # create a parasite axes whose transData in RA, cz aux_ax = ax1.get_aux_axes(tr) @@ -51,7 +68,10 @@ def setup_axes1(fig, rect): return ax1, aux_ax -def setup_axes2(fig, rect): +def setup_axes3(fig, rect): + """ + Sometimes, things like axis_direction need to be adjusted. + """ # rotate a bit for better orientation tr_rotate = Affine2D().translate(-95, 0) @@ -105,26 +125,31 @@ def setup_axes2(fig, rect): return ax1, aux_ax -def sixty(d, m, s): - return d + (m + s/60.)/60. - - if 1: import matplotlib.pyplot as plt - fig = plt.figure(1, figsize=(7, 5)) + fig = plt.figure(1, figsize=(8, 4)) + fig.subplots_adjust(wspace=0.3, left=0.05, right=0.95) + + ax1 = setup_axes1(fig, 131) + + #theta = np.random.rand(10) #*.5*np.pi + #radius = np.random.rand(10) #+1. + #aux_ax1.scatter(theta, radius) - ax1, aux_ax1 = setup_axes1(fig, 121) + + ax2, aux_ax2 = setup_axes2(fig, 132) theta = np.random.rand(10)*.5*np.pi radius = np.random.rand(10)+1. - aux_ax1.scatter(theta, radius) + aux_ax2.scatter(theta, radius) - ax2, aux_ax2 = setup_axes2(fig, 122) + + ax3, aux_ax3 = setup_axes3(fig, 133) theta = (8 + np.random.rand(10)*(14-8))*15. # indegree radius = np.random.rand(10)*14000. - aux_ax2.scatter(theta, radius) + aux_ax3.scatter(theta, radius) plt.show() From 506f26c2c91ed64c42e73774c1181cbdec10427d Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Sun, 13 Dec 2009 21:03:44 +0000 Subject: [PATCH 0433/1000] fix wrong tick direction at the boudary of floating axes svn path=/trunk/matplotlib/; revision=8032 --- lib/mpl_toolkits/axes_grid/floating_axes.py | 60 ++++++++++++++----- .../axes_grid/grid_helper_curvelinear.py | 48 +++++++++++---- 2 files changed, 82 insertions(+), 26 deletions(-) diff --git a/lib/mpl_toolkits/axes_grid/floating_axes.py b/lib/mpl_toolkits/axes_grid/floating_axes.py index 9e30885e2195..52321046f81b 100644 --- a/lib/mpl_toolkits/axes_grid/floating_axes.py +++ b/lib/mpl_toolkits/axes_grid/floating_axes.py @@ -12,7 +12,7 @@ from mpl_toolkits.axes_grid.axislines import AxisArtistHelper, GridHelperBase from mpl_toolkits.axes_grid.axis_artist import AxisArtist -from matplotlib.transforms import Affine2D +from matplotlib.transforms import Affine2D, IdentityTransform import numpy as np @@ -85,7 +85,7 @@ def get_axislabel_pos_angle(self, axes): def get_tick_transform(self, axes): - return axes.transData + return IdentityTransform() #axes.transData def get_tick_iterators(self, axes): """tick_loc, tick_angle, tick_label, (optionally) tick_label""" @@ -99,17 +99,17 @@ def get_tick_iterators(self, axes): lon_levs, lat_levs = np.asarray(lon_levs), np.asarray(lat_levs) if lat_factor is not None: yy0 = lat_levs / lat_factor - dy = 0.01 / lat_factor + dy = 0.001 / lat_factor else: yy0 = lat_levs - dy = 0.01 + dy = 0.001 if lon_factor is not None: xx0 = lon_levs / lon_factor - dx = 0.01 / lon_factor + dx = 0.001 / lon_factor else: xx0 = lon_levs - dx = 0.01 + dx = 0.001 _extremes = self.grid_helper._extremes xmin, xmax = sorted(_extremes[:2]) @@ -121,30 +121,60 @@ def get_tick_iterators(self, axes): mask = (xmin <= xx0) & (xx0 <= xmax) xx0 = xx0[mask] + def transform_xy(x, y): + x1, y1 = grid_finder.transform_xy(x, y) + x2y2 = axes.transData.transform(np.array([x1, y1]).transpose()) + x2, y2 = x2y2.transpose() + return x2, y2 + # find angles if self.nth_coord == 0: xx0 = np.empty_like(yy0) xx0.fill(self.value) - xx1, yy1 = grid_finder.transform_xy(xx0, yy0) - xx2, yy2 = grid_finder.transform_xy(xx0+dx, yy0) - xx3, yy3 = grid_finder.transform_xy(xx0, yy0+dy) + + #yy0_ = yy0.copy() + + xx1, yy1 = transform_xy(xx0, yy0) + + xx00 = xx0.copy() + xx00[xx0+dx>xmax] -= dx + xx1a, yy1a = transform_xy(xx00, yy0) + xx1b, yy1b = transform_xy(xx00+dx, yy0) + + yy00 = yy0.copy() + yy00[yy0+dy>ymax] -= dy + xx2a, yy2a = transform_xy(xx0, yy00) + xx2b, yy2b = transform_xy(xx0, yy00+dy) + labels = self.grid_info["lat_labels"] labels = [l for l, m in zip(labels, mask) if m] elif self.nth_coord == 1: yy0 = np.empty_like(xx0) yy0.fill(self.value) - xx1, yy1 = grid_finder.transform_xy(xx0, yy0) - xx2, yy2 = grid_finder.transform_xy(xx0, yy0+dy) - xx3, yy3 = grid_finder.transform_xy(xx0+dx, yy0) + + #xx0_ = xx0.copy() + xx1, yy1 = transform_xy(xx0, yy0) + + + yy00 = yy0.copy() + yy00[yy0+dy>ymax] -= dy + xx1a, yy1a = transform_xy(xx0, yy00) + xx1b, yy1b = transform_xy(xx0, yy00+dy) + + xx00 = xx0.copy() + xx00[xx0+dx>xmax] -= dx + xx2a, yy2a = transform_xy(xx00, yy0) + xx2b, yy2b = transform_xy(xx00+dx, yy0) + labels = self.grid_info["lon_labels"] labels = [l for l, m in zip(labels, mask) if m] def f1(): - dd = np.arctan2(yy2-yy1, xx2-xx1) # angle normal - dd2 = np.arctan2(yy3-yy1, xx3-xx1) # angle tangent - mm = ((yy2-yy1)==0.) & ((xx2-xx1)==0.) # mask where dd1 is not defined + dd = np.arctan2(yy1b-yy1a, xx1b-xx1a) # angle normal + dd2 = np.arctan2(yy2b-yy2a, xx2b-xx2a) # angle tangent + mm = ((yy1b-yy1a)==0.) & ((xx1b-xx1a)==0.) # mask where dd1 is not defined dd[mm] = dd2[mm]+3.14159/2. #dd += 3.14159 diff --git a/lib/mpl_toolkits/axes_grid/grid_helper_curvelinear.py b/lib/mpl_toolkits/axes_grid/grid_helper_curvelinear.py index 4132133d3ce9..4e7e166c0616 100644 --- a/lib/mpl_toolkits/axes_grid/grid_helper_curvelinear.py +++ b/lib/mpl_toolkits/axes_grid/grid_helper_curvelinear.py @@ -8,7 +8,7 @@ from mpl_toolkits.axes_grid.axislines import \ AxisArtistHelper, GridHelperBase from mpl_toolkits.axes_grid.axis_artist import AxisArtist -from matplotlib.transforms import Affine2D +from matplotlib.transforms import Affine2D, IdentityTransform import numpy as np class FixedAxisArtistHelper(AxisArtistHelper.Fixed): @@ -172,7 +172,7 @@ def get_axislabel_pos_angle(self, axes): def get_tick_transform(self, axes): - return axes.transData + return IdentityTransform() #axes.transData def get_tick_iterators(self, axes): """tick_loc, tick_angle, tick_label, (optionally) tick_label""" @@ -212,31 +212,57 @@ def get_tick_iterators(self, axes): #xx0, yy0 = xx0[mask], yy0[mask] xx0 = xx0[mask] + def transform_xy(x, y): + x1, y1 = grid_finder.transform_xy(x, y) + x2y2 = axes.transData.transform(np.array([x1, y1]).transpose()) + x2, y2 = x2y2.transpose() + return x2, y2 + # find angles if self.nth_coord == 0: xx0 = np.empty_like(yy0) xx0.fill(self.value) - xx1, yy1 = grid_finder.transform_xy(xx0, yy0) - xx2, yy2 = grid_finder.transform_xy(xx0+dx, yy0) - xx3, yy3 = grid_finder.transform_xy(xx0, yy0+dy) + + xx1, yy1 = transform_xy(xx0, yy0) + + xx00 = xx0.copy() + xx00[xx0+dx>e1] -= dx + xx1a, yy1a = transform_xy(xx00, yy0) + xx1b, yy1b = transform_xy(xx00+dx, yy0) + + xx2a, yy2a = transform_xy(xx0, yy0) + xx2b, yy2b = transform_xy(xx0, yy0+dy) + labels = self.grid_info["lat_labels"] labels = [l for l, m in zip(labels, mask) if m] elif self.nth_coord == 1: yy0 = np.empty_like(xx0) yy0.fill(self.value) - xx1, yy1 = grid_finder.transform_xy(xx0, yy0) - xx2, yy2 = grid_finder.transform_xy(xx0, yy0+dy) - xx3, yy3 = grid_finder.transform_xy(xx0+dx, yy0) + + xx1, yy1 = transform_xy(xx0, yy0) + + xx1a, yy1a = transform_xy(xx0, yy0) + xx1b, yy1b = transform_xy(xx0, yy0+dy) + + xx00 = xx0.copy() + xx00[xx0+dx>e1] -= dx + xx2a, yy2a = transform_xy(xx00, yy0) + xx2b, yy2b = transform_xy(xx00+dx, yy0) + labels = self.grid_info["lon_labels"] labels = [l for l, m in zip(labels, mask) if m] def f1(): - dd = np.arctan2(yy2-yy1, xx2-xx1) # angle normal - dd2 = np.arctan2(yy3-yy1, xx3-xx1) # angle tangent - mm = ((yy2-yy1)==0.) & ((xx2-xx1)==0.) # mask where dd1 is not defined + dd = np.arctan2(yy1b-yy1a, xx1b-xx1a) # angle normal + dd2 = np.arctan2(yy2b-yy2a, xx2b-xx2a) # angle tangent + mm = ((yy1b-yy1a)==0.) & ((xx1b-xx1a)==0.) # mask where dd1 is not defined dd[mm] = dd2[mm]+3.14159/2. + #dd = np.arctan2(yy2-yy1, xx2-xx1) # angle normal + #dd2 = np.arctan2(yy3-yy1, xx3-xx1) # angle tangent + #mm = ((yy2-yy1)==0.) & ((xx2-xx1)==0.) # mask where dd1 is not defined + #dd[mm] = dd2[mm]+3.14159/2. #dd += 3.14159 From 70149d6cc6f28f7c7938e3adcce92730dd262c11 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Tue, 15 Dec 2009 02:57:32 +0000 Subject: [PATCH 0434/1000] boxplot demo 2: set random seed so plots are identical svn path=/trunk/matplotlib/; revision=8033 --- examples/pylab_examples/boxplot_demo2.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/pylab_examples/boxplot_demo2.py b/examples/pylab_examples/boxplot_demo2.py index 1e7e1171b723..a6d4f0ff7a97 100644 --- a/examples/pylab_examples/boxplot_demo2.py +++ b/examples/pylab_examples/boxplot_demo2.py @@ -16,6 +16,9 @@ randomDists = ['Normal(1,1)',' Lognormal(1,1)', 'Exp(1)', 'Gumbel(6,4)', 'Triangular(2,9,11)'] N = 500 + +np.random.seed(3) # make identical plots each time + norm = np.random.normal(1,1, N) logn = np.random.lognormal(1,1, N) expo = np.random.exponential(1, N) From 2932deb5f9d5cde8221259ca2992e78f849c98f5 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Tue, 15 Dec 2009 02:57:46 +0000 Subject: [PATCH 0435/1000] Add patch_artist kwarg to boxplot svn path=/trunk/matplotlib/; revision=8034 --- CHANGELOG | 3 ++ examples/pylab_examples/boxplot_demo2.py | 25 ++++--------- lib/matplotlib/axes.py | 46 +++++++++++++++++++++--- lib/matplotlib/pyplot.py | 6 ++-- 4 files changed, 54 insertions(+), 26 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 4b46c155c5fe..b8b0385697e2 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2009-12-14 Add patch_artist kwarg to boxplot, but keep old default. + Convert boxplot_demo2.py to use the new patch_artist. - ADS + 2009-12-06 axes_grid: reimplemented AxisArtist with FloatingAxes support. Added new examples. - JJL diff --git a/examples/pylab_examples/boxplot_demo2.py b/examples/pylab_examples/boxplot_demo2.py index a6d4f0ff7a97..443feb39c574 100644 --- a/examples/pylab_examples/boxplot_demo2.py +++ b/examples/pylab_examples/boxplot_demo2.py @@ -42,8 +42,8 @@ ax1 = fig.add_subplot(111) plt.subplots_adjust(left=0.075, right=0.95, top=0.9, bottom=0.25) -bp = plt.boxplot(data, notch=0, sym='+', vert=1, whis=1.5) -plt.setp(bp['boxes'], color='black') +bp = plt.boxplot(data, notch=0, sym='+', vert=1, whis=1.5, patch_artist=True) +plt.setp(bp['boxes'], edgecolor='black') plt.setp(bp['whiskers'], color='black') plt.setp(bp['fliers'], color='red', marker='+') @@ -64,25 +64,12 @@ medians = range(numBoxes) for i in range(numBoxes): box = bp['boxes'][i] - boxX = [] - boxY = [] - for j in range(5): - boxX.append(box.get_xdata()[j]) - boxY.append(box.get_ydata()[j]) - boxCoords = zip(boxX,boxY) - # Alternate between Dark Khaki and Royal Blue k = i % 2 - boxPolygon = Polygon(boxCoords, facecolor=boxColors[k]) - ax1.add_patch(boxPolygon) - # Now draw the median lines back over what we just filled in + # Set the box colors + box.set_facecolor(boxColors[k]) + # Now get the medians med = bp['medians'][i] - medianX = [] - medianY = [] - for j in range(2): - medianX.append(med.get_xdata()[j]) - medianY.append(med.get_ydata()[j]) - plt.plot(medianX, medianY, 'k') - medians[i] = medianY[0] + medians[i] = med.get_ydata()[0] # Finally, overplot the sample averages, with horixzontal alignment # in the center of each box plt.plot([np.average(med.get_xdata())], [np.average(data[i])], diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index 17f226d39df0..6869cbd88779 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -21,6 +21,7 @@ import matplotlib.legend as mlegend import matplotlib.lines as mlines import matplotlib.mlab as mlab +import matplotlib.path as mpath import matplotlib.patches as mpatches import matplotlib.spines as mspines import matplotlib.quiver as mquiver @@ -4892,12 +4893,12 @@ def xywhere(xs, ys, mask): return (l0, caplines, barcols) def boxplot(self, x, notch=0, sym='b+', vert=1, whis=1.5, - positions=None, widths=None): + positions=None, widths=None, patch_artist=False): """ call signature:: boxplot(x, notch=0, sym='+', vert=1, whis=1.5, - positions=None, widths=None) + positions=None, widths=None, patch_artist=False) Make a box and whisker plot for each column of *x* or each vector in sequence *x*. The box extends from the lower to @@ -4905,6 +4906,8 @@ def boxplot(self, x, notch=0, sym='b+', vert=1, whis=1.5, The whiskers extend from the box to show the range of the data. Flier points are those past the end of the whiskers. + *x* is an array or a sequence of vectors. + - *notch* = 0 (default) produces a rectangular box plot. - *notch* = 1 will produce a notched box plot @@ -4927,7 +4930,8 @@ def boxplot(self, x, notch=0, sym='b+', vert=1, whis=1.5, each box. The default is 0.5, or ``0.15*(distance between extreme positions)`` if that is smaller. - *x* is an array or a sequence of vectors. + - *patch_artist* = False (default) produces boxes with the Line2D artist + - *patch_artist* = True produces boxes with the Patch artist Returns a dictionary mapping each component of the boxplot to a list of the :class:`matplotlib.lines.Line2D` @@ -5045,23 +5049,55 @@ def boxplot(self, x, notch=0, sym='b+', vert=1, whis=1.5, med_x = [cap_x_min, cap_x_max] med_y = [med, med] + def to_vc(xs,ys): + # convert arguments to verts and codes + verts = [] + #codes = [] + for xi,yi in zip(xs,ys): + verts.append( (xi,yi) ) + verts.append( (0,0) ) # ignored + codes = [mpath.Path.MOVETO] + \ + [mpath.Path.LINETO]*(len(verts)-2) + \ + [mpath.Path.CLOSEPOLY] + return verts,codes + + def patch_list(xs,ys): + verts,codes = to_vc(xs,ys) + path = mpath.Path( verts, codes ) + patch = mpatches.PathPatch(path) + self.add_artist(patch) + return [patch] + # vertical or horizontal plot? if vert: def doplot(*args): return self.plot(*args) + def dopatch(xs,ys): + return patch_list(xs,ys) else: def doplot(*args): shuffled = [] for i in xrange(0, len(args), 3): shuffled.extend([args[i+1], args[i], args[i+2]]) return self.plot(*shuffled) + def dopatch(xs,ys): + xs,ys = ys,xs # flip X, Y + return patch_list(xs,ys) + + if patch_artist: + median_color = 'k' + else: + median_color = 'r' whiskers.extend(doplot(wisk_x, [q1, wisk_lo], 'b--', wisk_x, [q3, wisk_hi], 'b--')) caps.extend(doplot(cap_x, [wisk_hi, wisk_hi], 'k-', cap_x, [wisk_lo, wisk_lo], 'k-')) - boxes.extend(doplot(box_x, box_y, 'b-')) - medians.extend(doplot(med_x, med_y, 'r-')) + if patch_artist: + boxes.extend(dopatch(box_x, box_y)) + else: + boxes.extend(doplot(box_x, box_y, 'b-')) + medians.extend(doplot(med_x, med_y, median_color+'-')) fliers.extend(doplot(flier_hi_x, flier_hi, sym, flier_lo_x, flier_lo, sym)) diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index 8cadb036e68a..cde5d717b3c0 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -1767,7 +1767,8 @@ def broken_barh(xranges, yrange, hold=None, **kwargs): # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost @autogen_docstring(Axes.boxplot) -def boxplot(x, notch=0, sym='b+', vert=1, whis=1.5, positions=None, widths=None, hold=None): +def boxplot(x, notch=0, sym='b+', vert=1, whis=1.5, positions=None, widths=None, + hold=None, patch_artist=False): ax = gca() # allow callers to override the hold state by passing hold=True|False washold = ax.ishold() @@ -1775,7 +1776,8 @@ def boxplot(x, notch=0, sym='b+', vert=1, whis=1.5, positions=None, widths=None, if hold is not None: ax.hold(hold) try: - ret = ax.boxplot(x, notch, sym, vert, whis, positions, widths) + ret = ax.boxplot(x, notch, sym, vert, whis, positions, widths, + patch_artist=patch_artist) draw_if_interactive() finally: ax.hold(washold) From 671344045de3ae4d4dd351ced03e94825627ba4c Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Wed, 16 Dec 2009 01:22:41 +0000 Subject: [PATCH 0436/1000] support unsampled image for ps backend svn path=/trunk/matplotlib/; revision=8035 --- CHANGELOG | 2 + lib/matplotlib/backend_bases.py | 7 + lib/matplotlib/backends/backend_mixed.py | 2 +- lib/matplotlib/backends/backend_ps.py | 18 +- lib/matplotlib/image.py | 205 +++++++++++++++-------- 5 files changed, 159 insertions(+), 75 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index b8b0385697e2..467f4f3e7dfa 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +2009-12-15 Add raw-image (unsampled) support for the ps backend. - JJL + 2009-12-14 Add patch_artist kwarg to boxplot, but keep old default. Convert boxplot_demo2.py to use the new patch_artist. - ADS diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 0e953aecf4c2..b7189f828e4b 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -340,6 +340,13 @@ def option_image_nocomposite(self): """ return False + def option_scale_image(self): + """ + override this method for renderers that support arbitrary + scaling of image (most of the vector backend). + """ + return False + def draw_tex(self, gc, x, y, s, prop, angle, ismath='TeX!'): """ """ diff --git a/lib/matplotlib/backends/backend_mixed.py b/lib/matplotlib/backends/backend_mixed.py index 36241bb5af04..eafda5f89b9c 100644 --- a/lib/matplotlib/backends/backend_mixed.py +++ b/lib/matplotlib/backends/backend_mixed.py @@ -59,7 +59,7 @@ def __init__(self, figure, width, height, dpi, vector_renderer, get_texmanager get_text_width_height_descent new_gc open_group option_image_nocomposite points_to_pixels strip_math start_filter stop_filter draw_gouraud_triangle - draw_gouraud_triangles + draw_gouraud_triangles option_scale_image """.split() def _set_current_renderer(self, renderer): self._renderer = renderer diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py index db2a2ce7ba60..d19bbed8a9a2 100644 --- a/lib/matplotlib/backends/backend_ps.py +++ b/lib/matplotlib/backends/backend_ps.py @@ -380,7 +380,13 @@ def get_image_magnification(self): """ return self.image_magnification - def draw_image(self, gc, x, y, im): + def option_scale_image(self): + """ + ps backend support arbitrary scaling of image. + """ + return True + + def draw_image(self, gc, x, y, im, sx=None, sy=None): """ Draw the Image instance into the current axes; x is the distance in pixels from the left hand side of the canvas and y @@ -400,9 +406,13 @@ def draw_image(self, gc, x, y, im): imagecmd = "false 3 colorimage" hexlines = '\n'.join(self._hex_lines(bits)) - xscale, yscale = ( - w/self.image_magnification, h/self.image_magnification) - + if sx is None: + sx = 1./self.image_magnification + if sy is None: + sy = 1./self.image_magnification + + xscale, yscale = (w*sx, h*sy) + figh = self.height*72 #print 'values', origin, flipud, figh, h, y diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index 0341e10db288..7ab39a0bc79a 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -127,21 +127,140 @@ def changed(self): def make_image(self, magnification=1.0): raise RuntimeError('The make_image method must be overridden.') + + def _get_unsampled_image(self, A, image_extents, viewlim): + """ + convert numpy array A with given extents ([x1, x2, y1, y2] in + data coordinate) into the Image, given the vielim (should be a + bbox instance). Image will be clipped if the extents is + significantly larger than the viewlim. + """ + xmin, xmax, ymin, ymax = image_extents + dxintv = xmax-xmin + dyintv = ymax-ymin + + # the viewport scale factor + sx = dxintv/viewlim.width + sy = dyintv/viewlim.height + numrows, numcols = A.shape[:2] + if sx > 2: + x0 = (viewim.x0-xmin)/dxintv * numcols + ix0 = max(0, int(x0 - self._filterrad)) + x1 = (viewlim.x1-xmin)/dxintv * numcols + ix1 = min(numcols, int(x1 + self._filterrad)) + xslice = slice(ix0, ix1) + xmin_old = xmin + xmin = xmin_old + ix0*dxintv/numcols + xmax = xmin_old + ix1*dxintv/numcols + dxintv = xmax - xmin + sx = dxintv/viewlim.width + else: + xslice = slice(0, numcols) + + if sy > 2: + y0 = (viewlim.y0-ymin)/dyintv * numrows + iy0 = max(0, int(y0 - self._filterrad)) + y1 = (viewlim.y1-ymin)/dyintv * numrows + iy1 = min(numrows, int(y1 + self._filterrad)) + if self.origin == 'upper': + yslice = slice(numrows-iy1, numrows-iy0) + else: + yslice = slice(iy0, iy1) + ymin_old = ymin + ymin = ymin_old + iy0*dyintv/numrows + ymax = ymin_old + iy1*dyintv/numrows + dyintv = ymax - ymin + sy = dyintv/self.axes.viewLim.height + else: + yslice = slice(0, numrows) + + if xslice != self._oldxslice or yslice != self._oldyslice: + self._imcache = None + self._oldxslice = xslice + self._oldyslice = yslice + + if self._imcache is None: + if self._A.dtype == np.uint8 and len(self._A.shape) == 3: + im = _image.frombyte(self._A[yslice,xslice,:], 0) + im.is_grayscale = False + else: + if self._rgbacache is None: + x = self.to_rgba(self._A, self._alpha) + self._rgbacache = x + else: + x = self._rgbacache + im = _image.fromarray(x[yslice,xslice], 0) + if len(self._A.shape) == 2: + im.is_grayscale = self.cmap.is_gray() + else: + im.is_grayscale = False + self._imcache = im + + if self.origin=='upper': + im.flipud_in() + else: + im = self._imcache + + return im, xmin, ymin, dxintv, dyintv, sx, sy + + + def _draw_unsampled_image(self, renderer, gc): + """ + draw unsampled image. The renderer should support a draw_image method + with scale parameter. + """ + im, xmin, ymin, dxintv, dyintv, sx, sy = \ + self._get_unsampled_image(self._A, self.get_extent(), self.axes.viewLim) + + if im is None: return # I'm not if this check is required. -JJL + + transData = self.axes.transData + xx1, yy1 = transData.transform_point((xmin, ymin)) + xx2, yy2 = transData.transform_point((xmin+dxintv, ymin+dyintv)) + + fc = self.axes.patch.get_facecolor() + bg = mcolors.colorConverter.to_rgba(fc, 0) + im.set_bg( *bg) + + # image input dimensions + im.reset_matrix() + numrows, numcols = im.get_size() + + im.resize(numcols, numrows) # just to create im.bufOut that is required by backends. There may be better solution -JJL + + sx = (xx2-xx1)/numcols + sy = (yy2-yy1)/numrows + im._url = self.get_url() + renderer.draw_image(gc, xx1, yy1, im, sx, sy) + + + def _check_unsampled_image(self, renderer): + """ + return True if the image is better to be drawn unsampled. + The derived class needs to override it. + """ + return False + @allow_rasterization def draw(self, renderer, *args, **kwargs): if not self.get_visible(): return if (self.axes.get_xscale() != 'linear' or self.axes.get_yscale() != 'linear'): warnings.warn("Images are not supported on non-linear axes.") - im = self.make_image(renderer.get_image_magnification()) - if im is None: - return - im._url = self.get_url() + l, b, widthDisplay, heightDisplay = self.axes.bbox.bounds gc = renderer.new_gc() gc.set_clip_rectangle(self.axes.bbox.frozen()) gc.set_clip_path(self.get_clip_path()) - renderer.draw_image(gc, l, b, im) + + if self._check_unsampled_image(renderer): + self._draw_unsampled_image(renderer, gc) + else: + im = self.make_image(renderer.get_image_magnification()) + if im is None: + return + im._url = self.get_url() + renderer.draw_image(gc, l, b, im) gc.restore() def contains(self, mouseevent): @@ -338,71 +457,8 @@ def make_image(self, magnification=1.0): if self._A is None: raise RuntimeError('You must first set the image array or the image attribute') - xmin, xmax, ymin, ymax = self.get_extent() - dxintv = xmax-xmin - dyintv = ymax-ymin - - # the viewport scale factor - sx = dxintv/self.axes.viewLim.width - sy = dyintv/self.axes.viewLim.height - numrows, numcols = self._A.shape[:2] - if sx > 2: - x0 = (self.axes.viewLim.x0-xmin)/dxintv * numcols - ix0 = max(0, int(x0 - self._filterrad)) - x1 = (self.axes.viewLim.x1-xmin)/dxintv * numcols - ix1 = min(numcols, int(x1 + self._filterrad)) - xslice = slice(ix0, ix1) - xmin_old = xmin - xmin = xmin_old + ix0*dxintv/numcols - xmax = xmin_old + ix1*dxintv/numcols - dxintv = xmax - xmin - sx = dxintv/self.axes.viewLim.width - else: - xslice = slice(0, numcols) - - if sy > 2: - y0 = (self.axes.viewLim.y0-ymin)/dyintv * numrows - iy0 = max(0, int(y0 - self._filterrad)) - y1 = (self.axes.viewLim.y1-ymin)/dyintv * numrows - iy1 = min(numrows, int(y1 + self._filterrad)) - if self.origin == 'upper': - yslice = slice(numrows-iy1, numrows-iy0) - else: - yslice = slice(iy0, iy1) - ymin_old = ymin - ymin = ymin_old + iy0*dyintv/numrows - ymax = ymin_old + iy1*dyintv/numrows - dyintv = ymax - ymin - sy = dyintv/self.axes.viewLim.height - else: - yslice = slice(0, numrows) - - if xslice != self._oldxslice or yslice != self._oldyslice: - self._imcache = None - self._oldxslice = xslice - self._oldyslice = yslice - - if self._imcache is None: - if self._A.dtype == np.uint8 and len(self._A.shape) == 3: - im = _image.frombyte(self._A[yslice,xslice,:], 0) - im.is_grayscale = False - else: - if self._rgbacache is None: - x = self.to_rgba(self._A, self._alpha) - self._rgbacache = x - else: - x = self._rgbacache - im = _image.fromarray(x[yslice,xslice], 0) - if len(self._A.shape) == 2: - im.is_grayscale = self.cmap.is_gray() - else: - im.is_grayscale = False - self._imcache = im - - if self.origin=='upper': - im.flipud_in() - else: - im = self._imcache + im, xmin, ymin, dxintv, dyintv, sx, sy = \ + self._get_unsampled_image(self._A, self.get_extent(), self.axes.viewLim) fc = self.axes.patch.get_facecolor() bg = mcolors.colorConverter.to_rgba(fc, 0) @@ -435,6 +491,15 @@ def make_image(self, magnification=1.0): return im + def _check_unsampled_image(self, renderer): + """ + return True if the image is better to be drawn unsampled. + """ + if renderer.option_scale_image() and self.get_interpolation() == "nearest": + return True + else: + return False + def set_extent(self, extent): """ extent is data axes (left, right, bottom, top) for making image plots From 559d5528275fbe7bd31da3c127fc01daacafe68e Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Thu, 17 Dec 2009 19:31:21 +0000 Subject: [PATCH 0437/1000] draw_image api to use an arbitrary affine transform svn path=/trunk/matplotlib/; revision=8037 --- lib/matplotlib/backends/backend_ps.py | 31 ++++++++++++++++++--------- lib/matplotlib/image.py | 24 ++++++++++----------- 2 files changed, 33 insertions(+), 22 deletions(-) diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py index d19bbed8a9a2..7d9a7bed834a 100644 --- a/lib/matplotlib/backends/backend_ps.py +++ b/lib/matplotlib/backends/backend_ps.py @@ -386,14 +386,15 @@ def option_scale_image(self): """ return True - def draw_image(self, gc, x, y, im, sx=None, sy=None): + def draw_image(self, gc, x, y, im, dx=None, dy=None, transform=None): """ Draw the Image instance into the current axes; x is the distance in pixels from the left hand side of the canvas and y is the distance from bottom - bbox is a matplotlib.transforms.BBox instance for clipping, or - None + dx, dy is the width and height of the image. If a transform + (which must be an affine transform) is given, x, y, dx, dy are + interpreted as the coordinate of the transform. """ im.flipud_out() @@ -406,13 +407,22 @@ def draw_image(self, gc, x, y, im, sx=None, sy=None): imagecmd = "false 3 colorimage" hexlines = '\n'.join(self._hex_lines(bits)) - if sx is None: - sx = 1./self.image_magnification - if sy is None: - sy = 1./self.image_magnification - - xscale, yscale = (w*sx, h*sy) - + if dx is None: + xscale = w / self.image_magnification + else: + xscale = dx + + if dy is None: + yscale = h/self.image_magnification + else: + yscale = dy + + + if transform is None: + matrix = "1 0 0 1 0 0" + else: + matrix = " ".join(map(str, transform.to_values())) + figh = self.height*72 #print 'values', origin, flipud, figh, h, y @@ -431,6 +441,7 @@ def draw_image(self, gc, x, y, im, sx=None, sy=None): #y = figh-(y+h) ps = """gsave %(clip)s +[%(matrix)s] concat %(x)s %(y)s translate %(xscale)s %(yscale)s scale /DataString %(w)s string def diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index 7ab39a0bc79a..8baab049ce52 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -144,7 +144,7 @@ def _get_unsampled_image(self, A, image_extents, viewlim): sy = dyintv/viewlim.height numrows, numcols = A.shape[:2] if sx > 2: - x0 = (viewim.x0-xmin)/dxintv * numcols + x0 = (viewlim.x0-xmin)/dxintv * numcols ix0 = max(0, int(x0 - self._filterrad)) x1 = (viewlim.x1-xmin)/dxintv * numcols ix1 = min(numcols, int(x1 + self._filterrad)) @@ -170,7 +170,7 @@ def _get_unsampled_image(self, A, image_extents, viewlim): ymin = ymin_old + iy0*dyintv/numrows ymax = ymin_old + iy1*dyintv/numrows dyintv = ymax - ymin - sy = dyintv/self.axes.viewLim.height + sy = dyintv/viewlim.height else: yslice = slice(0, numrows) @@ -203,7 +203,7 @@ def _get_unsampled_image(self, A, image_extents, viewlim): return im, xmin, ymin, dxintv, dyintv, sx, sy - + def _draw_unsampled_image(self, renderer, gc): """ draw unsampled image. The renderer should support a draw_image method @@ -213,10 +213,6 @@ def _draw_unsampled_image(self, renderer, gc): self._get_unsampled_image(self._A, self.get_extent(), self.axes.viewLim) if im is None: return # I'm not if this check is required. -JJL - - transData = self.axes.transData - xx1, yy1 = transData.transform_point((xmin, ymin)) - xx2, yy2 = transData.transform_point((xmin+dxintv, ymin+dyintv)) fc = self.axes.patch.get_facecolor() bg = mcolors.colorConverter.to_rgba(fc, 0) @@ -228,19 +224,23 @@ def _draw_unsampled_image(self, renderer, gc): im.resize(numcols, numrows) # just to create im.bufOut that is required by backends. There may be better solution -JJL - sx = (xx2-xx1)/numcols - sy = (yy2-yy1)/numrows im._url = self.get_url() - renderer.draw_image(gc, xx1, yy1, im, sx, sy) - + trans = self.get_transform() #axes.transData + xx1, yy1 = trans.transform_non_affine((xmin, ymin)) + xx2, yy2 = trans.transform_non_affine((xmin+dxintv, ymin+dyintv)) + + renderer.draw_image(gc, xx1, yy1, im, xx2-xx1, yy2-yy1, + trans.get_affine()) + + def _check_unsampled_image(self, renderer): """ return True if the image is better to be drawn unsampled. The derived class needs to override it. """ return False - + @allow_rasterization def draw(self, renderer, *args, **kwargs): if not self.get_visible(): return From cdd5facce678eaeaf66e2dd6bef68d1b98dbc44d Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Fri, 18 Dec 2009 22:25:16 +0000 Subject: [PATCH 0438/1000] tests: add unit test for prctile svn path=/trunk/matplotlib/; revision=8038 --- lib/matplotlib/tests/test_mlab.py | 23 +++++++++++++++++++++++ 1 file changed, 23 insertions(+) diff --git a/lib/matplotlib/tests/test_mlab.py b/lib/matplotlib/tests/test_mlab.py index 1d3d33856dbd..8ff3aec566aa 100644 --- a/lib/matplotlib/tests/test_mlab.py +++ b/lib/matplotlib/tests/test_mlab.py @@ -32,3 +32,26 @@ def test_rec2csv_bad_shape(): # the bad recarray should trigger a ValueError for having ndim > 1. mlab.rec2csv(bad,fd) + +def test_prctile(): + # test odd lengths + x=[1,2,3] + assert mlab.prctile(x,50)==np.median(x) + + # test even lengths + x=[1,2,3,4] + assert mlab.prctile(x,50)==np.median(x) + + # derived from email sent by jason-sage to MPL-user on 20090914 + ob1=[1,1,2,2,1,2,4,3,2,2,2,3,4,5,6,7,8,9,7,6,4,5,5] + p = [0, 75, 100] + expected = [1, 5.5, 9] + + # test vectorized + actual = mlab.prctile(ob1,p) + assert np.allclose( expected, actual ) + + # test scalar + for pi, expectedi in zip(p,expected): + actuali = mlab.prctile(ob1,pi) + assert np.allclose( expectedi, actuali ) From d3f139f01a15714bac14f8a238eb7bc936d7cafe Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Fri, 18 Dec 2009 22:25:26 +0000 Subject: [PATCH 0439/1000] bugfix: mlab.prctile handles even-length data svn path=/trunk/matplotlib/; revision=8039 --- CHANGELOG | 3 +++ lib/matplotlib/mlab.py | 42 +++++++++++++++++++++++++++++++----------- 2 files changed, 34 insertions(+), 11 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 467f4f3e7dfa..29fb85b06c2f 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2009-12-18 mlab.prctile handles even-length data, such that the median + is the mean of the two middle values. - ADS + 2009-12-15 Add raw-image (unsampled) support for the ps backend. - JJL 2009-12-14 Add patch_artist kwarg to boxplot, but keep old default. diff --git a/lib/matplotlib/mlab.py b/lib/matplotlib/mlab.py index a6be0b183e00..818f76c72599 100644 --- a/lib/matplotlib/mlab.py +++ b/lib/matplotlib/mlab.py @@ -904,18 +904,38 @@ def prctile(x, p = (0.0, 25.0, 50.0, 75.0, 100.0)): the *p* percentage point in the sequence is returned. """ + # This implementation derived from scipy.stats.scoreatpercentile + def _interpolate(a, b, fraction): + """Returns the point at the given fraction between a and b, where + 'fraction' must be between 0 and 1. + """ + return a + (b - a)*fraction + + scalar = True + if cbook.iterable(p): + scalar = False + per = np.array(p) + values = np.array(x).ravel() # copy + values.sort() + + idxs = per /100. * (values.shape[0] - 1) + ai = idxs.astype(np.int) + bi = ai + 1 + frac = idxs % 1 + + # handle cases where attempting to interpolate past last index + cond = bi >= len(values) + if scalar: + if cond: + ai -= 1 + bi -= 1 + frac += 1 + else: + ai[cond] -= 1 + bi[cond] -= 1 + frac[cond] += 1 - x = np.array(x).ravel() # we need a copy - x.sort() - Nx = len(x) - - if not cbook.iterable(p): - return x[int(p*Nx/100.0)] - - p = np.asarray(p)* Nx/100.0 - ind = p.astype(int) - ind = np.where(ind>=Nx, Nx-1, ind) - return x.take(ind) + return _interpolate(values[ai],values[bi],frac) def prctile_rank(x, p): """ From d77a57f6b99b4da75b950f4ff6db8473f4da1631 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Fri, 18 Dec 2009 22:25:35 +0000 Subject: [PATCH 0440/1000] Don't limit notch size in boxplot to q1-q3 range svn path=/trunk/matplotlib/; revision=8040 --- CHANGELOG | 3 +++ lib/matplotlib/axes.py | 4 ---- 2 files changed, 3 insertions(+), 4 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 29fb85b06c2f..3a1bfd9faa00 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2009-12-18 Don't limit notch size in boxplot to q1-q3 range, as this + is effectively making the data look better than it is. - ADS + 2009-12-18 mlab.prctile handles even-length data, such that the median is the mean of the two middle values. - ADS diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index 6869cbd88779..59eddb091f2a 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -5035,10 +5035,6 @@ def boxplot(self, x, notch=0, sym='b+', vert=1, whis=1.5, else: notch_max = med + 1.57*iq/np.sqrt(row) notch_min = med - 1.57*iq/np.sqrt(row) - if notch_max > q3: - notch_max = q3 - if notch_min < q1: - notch_min = q1 # make our notched box vectors box_x = [box_x_min, box_x_max, box_x_max, cap_x_max, box_x_max, box_x_max, box_x_min, box_x_min, cap_x_min, box_x_min, From 9a445724a48607aebdc6da98f3fca7c5e2a882de Mon Sep 17 00:00:00 2001 From: Reinier Heeres Date: Sun, 20 Dec 2009 08:03:40 +0000 Subject: [PATCH 0441/1000] mplot3d: fix axes juggle issue, fix ticks on end of axes range svn path=/trunk/matplotlib/; revision=8041 --- examples/mplot3d/polys3d_demo.py | 3 +++ examples/mplot3d/surface3d_demo3.py | 4 ++-- lib/mpl_toolkits/mplot3d/art3d.py | 19 ++++++++++++++++++- lib/mpl_toolkits/mplot3d/axes3d.py | 2 +- lib/mpl_toolkits/mplot3d/axis3d.py | 2 +- 5 files changed, 25 insertions(+), 5 deletions(-) diff --git a/examples/mplot3d/polys3d_demo.py b/examples/mplot3d/polys3d_demo.py index 6dcaef5cf490..afea2170dec1 100644 --- a/examples/mplot3d/polys3d_demo.py +++ b/examples/mplot3d/polys3d_demo.py @@ -22,8 +22,11 @@ poly.set_alpha(0.7) ax.add_collection3d(poly, zs=zs, zdir='y') +ax.set_xlabel('X') ax.set_xlim3d(0, 10) +ax.set_ylabel('Y') ax.set_ylim3d(-1, 4) +ax.set_zlabel('Z') ax.set_zlim3d(0, 1) plt.show() diff --git a/examples/mplot3d/surface3d_demo3.py b/examples/mplot3d/surface3d_demo3.py index bf31f13aa4c1..f3582b912418 100644 --- a/examples/mplot3d/surface3d_demo3.py +++ b/examples/mplot3d/surface3d_demo3.py @@ -23,8 +23,8 @@ surf = ax.plot_surface(X, Y, Z, rstride=1, cstride=1, facecolors=colors, linewidth=0, antialiased=False) -ax.set_zlim3d(-1.01, 1.01) -ax.w_zaxis.set_major_locator(LinearLocator(10)) +ax.set_zlim3d(-1, 1) +ax.w_zaxis.set_major_locator(LinearLocator(6)) ax.w_zaxis.set_major_formatter(FormatStrFormatter('%.03f')) plt.show() diff --git a/lib/mpl_toolkits/mplot3d/art3d.py b/lib/mpl_toolkits/mplot3d/art3d.py index 54f85b6ca065..4e99fac4d373 100644 --- a/lib/mpl_toolkits/mplot3d/art3d.py +++ b/lib/mpl_toolkits/mplot3d/art3d.py @@ -434,7 +434,24 @@ def poly_collection_2d_to_3d(col, zs=0, zdir='z'): def juggle_axes(xs, ys, zs, zdir): """ - Reorder coordinates so that zdir + Reorder coordinates so that 2D xs, ys can be plotted in the plane + orthogonal to zdir. zdir is normally x, y or z. However, if zdir + starts with a '-' it is interpreted as a compensation for rotate_axes. + """ + if zdir == 'x': + return zs, xs, ys + elif zdir == 'y': + return xs, zs, ys + elif zdir[0] == '-': + return rotate_axes(xs, ys, zs, zdir) + else: + return xs, ys, zs + +def rotate_axes(xs, ys, zs, zdir): + """ + Reorder coordinates so that the axes are rotated with zdir along + the original z axis. Prepending the axis with a '-' does the + inverse transform, so zdir can be x, -x, y, -y, z or -z """ if zdir == 'x': return ys, zs, xs diff --git a/lib/mpl_toolkits/mplot3d/axes3d.py b/lib/mpl_toolkits/mplot3d/axes3d.py index e635839e8b18..7f473c400fb0 100644 --- a/lib/mpl_toolkits/mplot3d/axes3d.py +++ b/lib/mpl_toolkits/mplot3d/axes3d.py @@ -857,7 +857,7 @@ def contour(self, X, Y, Z, levels=10, **kwargs): had_data = self.has_data() - jX, jY, jZ = art3d.juggle_axes(X, Y, Z, zdir) + jX, jY, jZ = art3d.rotate_axes(X, Y, Z, zdir) cset = Axes.contour(self, jX, jY, jZ, **kwargs) zdir = '-' + zdir diff --git a/lib/mpl_toolkits/mplot3d/axis3d.py b/lib/mpl_toolkits/mplot3d/axis3d.py index e01cd15b427b..78fa2c7f73e8 100644 --- a/lib/mpl_toolkits/mplot3d/axis3d.py +++ b/lib/mpl_toolkits/mplot3d/axis3d.py @@ -180,7 +180,7 @@ def draw(self, renderer): # filter locations here so that no extra grid lines are drawn interval = self.get_view_interval() majorLocs = [loc for loc in majorLocs if \ - interval[0] < loc < interval[1]] + interval[0] <= loc <= interval[1]] self.major.formatter.set_locs(majorLocs) majorLabels = [self.major.formatter(val, i) for i, val in enumerate(majorLocs)] From f4773e0fffb8ac958e9857017a684836474fd122 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 21 Dec 2009 00:45:55 +0000 Subject: [PATCH 0442/1000] spines: new example svn path=/trunk/matplotlib/; revision=8042 --- .../pylab_examples/spine_placement_demo.py | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/examples/pylab_examples/spine_placement_demo.py b/examples/pylab_examples/spine_placement_demo.py index 2535f6b954c3..6017b96d9c39 100644 --- a/examples/pylab_examples/spine_placement_demo.py +++ b/examples/pylab_examples/spine_placement_demo.py @@ -113,4 +113,34 @@ def adjust_spines(ax,spines): ax.plot(x,y) adjust_spines(ax,['bottom']) +# ---------------------------------------------------- + +fig = plt.figure() + +x = np.linspace(0,2*np.pi,50) +y = np.sin(x) +y2 = y + 0.1*np.random.normal( size=x.shape ) + +# plot data +ax = fig.add_subplot(1,1,1) +line1,=ax.plot(x,y,'--') +line2,=ax.plot(x,y2,'bo') + +# adjust the spines +adjust_spines(ax,['left','bottom']) + +# set ticks and tick labels +# x +ax.set_xlim((0,2*np.pi)) +ax.set_xticks([0,np.pi,2*np.pi]) +pichr = unichr(0x03C0) +ax.set_xticklabels(['0',pichr,'2 '+pichr]) + +# y +ax.set_yticks([-1,0,1]) + +# disable clipping of data points by axes range +for artist in (line1,line2): + artist.set_clip_on(False) + show() From 4ab2610eb8ee075e675cf1037ed40c9c757c29d0 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 21 Dec 2009 00:46:30 +0000 Subject: [PATCH 0443/1000] spines: simplify code svn path=/trunk/matplotlib/; revision=8043 --- lib/matplotlib/spines.py | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/spines.py b/lib/matplotlib/spines.py index 20a7eda67b92..985effc195b3 100644 --- a/lib/matplotlib/spines.py +++ b/lib/matplotlib/spines.py @@ -250,14 +250,12 @@ def get_spine_transform(self): if what == 'data': # special case data based spine locations + data_xform = self.axes.transScale + \ + (how+self.axes.transLimits + self.axes.transAxes) if self.spine_type in ['left','right']: - data_xform = self.axes.transScale + \ - (how+self.axes.transLimits + self.axes.transAxes) result = mtransforms.blended_transform_factory( data_xform,self.axes.transData) elif self.spine_type in ['top','bottom']: - data_xform = self.axes.transScale + \ - (how+self.axes.transLimits + self.axes.transAxes) result = mtransforms.blended_transform_factory( self.axes.transData,data_xform) else: From 00cfd281f03e4fbe6f8e6a9cd9f0afc402e0da8a Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 21 Dec 2009 00:46:59 +0000 Subject: [PATCH 0444/1000] spines: default transform is in data units, add set_bounds() call svn path=/trunk/matplotlib/; revision=8044 --- CHANGELOG | 3 +++ lib/matplotlib/axes.py | 7 +++++++ lib/matplotlib/spines.py | 20 +++++++++++++++++--- 3 files changed, 27 insertions(+), 3 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 3a1bfd9faa00..0ef6f8e907b6 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2009-12-20 spines: put spines in data coordinates, add set_bounds() + call. -ADS + 2009-12-18 Don't limit notch size in boxplot to q1-q3 range, as this is effectively making the data look better than it is. - ADS diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index 59eddb091f2a..3d0d126c75d0 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -2065,6 +2065,9 @@ def set_xlim(self, xmin=None, xmax=None, emit=True, **kwargs): other.figure.canvas is not None): other.figure.canvas.draw_idle() + for loc in ('bottom','top'): + self.spines[loc].set_bounds(xmin,xmax) + return xmin, xmax def get_xscale(self): @@ -2238,6 +2241,10 @@ def set_ylim(self, ymin=None, ymax=None, emit=True, **kwargs): if (other.figure != self.figure and other.figure.canvas is not None): other.figure.canvas.draw_idle() + + for loc in ('left','right'): + self.spines[loc].set_bounds(ymin,ymax) + return ymin, ymax def get_yscale(self): diff --git a/lib/matplotlib/spines.py b/lib/matplotlib/spines.py index 985effc195b3..d1bfc3029a58 100644 --- a/lib/matplotlib/spines.py +++ b/lib/matplotlib/spines.py @@ -55,7 +55,7 @@ def __init__(self,axes,spine_type,path,**kwargs): self.axis = None self.set_zorder(2.5) - self.set_transform(self.axes.transAxes) # default transform + self.set_transform(self.axes.transData) # default transform # Defer initial position determination. (Not much support for # non-rectangular axes is currently implemented, and this lets @@ -82,6 +82,7 @@ def set_patch_circle(self,center,radius): self._width = radius*2 self._height = radius*2 self._angle = 0 + self.set_transform(self.axes.transAxes) # circle drawn on axes transform def set_patch_line(self): """set the spine to be linear""" @@ -229,9 +230,9 @@ def set_position(self,position): t = self.get_spine_transform() if self.spine_type in ['left','right']: t2 = mtransforms.blended_transform_factory(t, - self.axes.transAxes) + self.axes.transData) elif self.spine_type in ['bottom','top']: - t2 = mtransforms.blended_transform_factory(self.axes.transAxes, + t2 = mtransforms.blended_transform_factory(self.axes.transData, t) self.set_transform(t2) @@ -278,6 +279,19 @@ def get_spine_transform(self): else: raise ValueError("unknown spine_transform type: %s"%what) + def set_bounds( self, low, high ): + v1 = self._path.vertices[:] # copy + assert v1.shape == (2,2), 'unexpected vertices shape' + if self.spine_type in ['left','right']: + v1[0,1] = low + v1[1,1] = high + elif self.spine_type in ['bottom','top']: + v1[0,0] = low + v1[1,0] = high + else: + raise ValueError('unable to set bounds for spine "%s"'%spine_type) + self._path.vertices = v1 # replace + @classmethod def linear_spine(cls, axes, spine_type, **kwargs): """ From 11149df804739dea201e623ddfd3aca6c305ab7d Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 21 Dec 2009 00:47:22 +0000 Subject: [PATCH 0445/1000] spines: be clear about meaning of location vertices svn path=/trunk/matplotlib/; revision=8045 --- lib/matplotlib/spines.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/spines.py b/lib/matplotlib/spines.py index d1bfc3029a58..d8a1f04479a3 100644 --- a/lib/matplotlib/spines.py +++ b/lib/matplotlib/spines.py @@ -297,14 +297,15 @@ def linear_spine(cls, axes, spine_type, **kwargs): """ (staticmethod) Returns a linear :class:`Spine`. """ + # all values of 13 get replaced upon call to set_bounds() if spine_type=='left': - path = mpath.Path([(0.0, 0.0), (0.0, 1.0)]) + path = mpath.Path([(0.0, 13), (0.0, 13)]) elif spine_type=='right': - path = mpath.Path([(1.0, 0.0), (1.0, 1.0)]) + path = mpath.Path([(1.0, 13), (1.0, 13)]) elif spine_type=='bottom': - path = mpath.Path([(0.0, 0.0), (1.0, 0.0)]) + path = mpath.Path([(13, 0.0), (13, 0.0)]) elif spine_type=='top': - path = mpath.Path([(0.0, 1.0), (1.0, 1.0)]) + path = mpath.Path([(13, 1.0), (13, 1.0)]) else: raise ValueError('unable to make path for spine "%s"'%spine_type) result = cls(axes,spine_type,path,**kwargs) From c3693f680d5c285e48e92a31608c70c063884bf5 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 21 Dec 2009 00:47:49 +0000 Subject: [PATCH 0446/1000] spines: limit range in example svn path=/trunk/matplotlib/; revision=8046 --- examples/pylab_examples/spine_placement_demo.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/examples/pylab_examples/spine_placement_demo.py b/examples/pylab_examples/spine_placement_demo.py index 6017b96d9c39..544dc7123ce8 100644 --- a/examples/pylab_examples/spine_placement_demo.py +++ b/examples/pylab_examples/spine_placement_demo.py @@ -143,4 +143,7 @@ def adjust_spines(ax,spines): for artist in (line1,line2): artist.set_clip_on(False) +# adjust spine to be within ticks +ax.spines['left'].set_bounds( -1, 1 ) + show() From f5899e13ad1f13866dba2debb05908daae3828e5 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 21 Dec 2009 02:24:14 +0000 Subject: [PATCH 0447/1000] spines: attempt to fix initial placement bug svn path=/trunk/matplotlib/; revision=8047 --- lib/matplotlib/axes.py | 6 ----- lib/matplotlib/spines.py | 51 +++++++++++++++++++++++++++++++--------- 2 files changed, 40 insertions(+), 17 deletions(-) diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index 3d0d126c75d0..1bfab1f48c27 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -2065,9 +2065,6 @@ def set_xlim(self, xmin=None, xmax=None, emit=True, **kwargs): other.figure.canvas is not None): other.figure.canvas.draw_idle() - for loc in ('bottom','top'): - self.spines[loc].set_bounds(xmin,xmax) - return xmin, xmax def get_xscale(self): @@ -2242,9 +2239,6 @@ def set_ylim(self, ymin=None, ymax=None, emit=True, **kwargs): other.figure.canvas is not None): other.figure.canvas.draw_idle() - for loc in ('left','right'): - self.spines[loc].set_bounds(ymin,ymax) - return ymin, ymax def get_yscale(self): diff --git a/lib/matplotlib/spines.py b/lib/matplotlib/spines.py index d8a1f04479a3..e994c0fb9fff 100644 --- a/lib/matplotlib/spines.py +++ b/lib/matplotlib/spines.py @@ -11,6 +11,7 @@ import matplotlib.patches as mpatches import matplotlib.path as mpath import matplotlib.cbook as cbook +import numpy as np import warnings class Spine(mpatches.Patch): @@ -57,6 +58,8 @@ def __init__(self,axes,spine_type,path,**kwargs): self.set_zorder(2.5) self.set_transform(self.axes.transData) # default transform + self._bounds = None # default bounds + # Defer initial position determination. (Not much support for # non-rectangular axes is currently implemented, and this lets # them pass through the spines machinery without errors.) @@ -138,6 +141,39 @@ def cla(self): if self.axis is not None: self.axis.cla() + def _adjust_location(self): + """automatically set spine bounds to the view interval""" + + if self.spine_type == 'circle': + return + + if self._bounds is None: + if self.spine_type in ('left','right'): + low,high = self.axes.viewLim.intervaly + elif self.spine_type in ('top','bottom'): + low,high = self.axes.viewLim.intervalx + else: + raise ValueError('unknown spine spine_type: %s'%self.spine_type) + else: + low,high = self._bounds + + v1 = self._path.vertices[:] # copy + assert v1.shape == (2,2), 'unexpected vertices shape' + if self.spine_type in ['left','right']: + v1[0,1] = low + v1[1,1] = high + elif self.spine_type in ['bottom','top']: + v1[0,0] = low + v1[1,0] = high + else: + raise ValueError('unable to set bounds for spine "%s"'%spine_type) + self._path.vertices = v1 # replace + + @allow_rasterization + def draw(self, renderer): + self._adjust_location() + return super( Spine, self).draw(renderer) + def _calc_offset_transform(self): """calculate the offset transform performed by the spine""" self._ensure_position_is_set() @@ -280,17 +316,10 @@ def get_spine_transform(self): raise ValueError("unknown spine_transform type: %s"%what) def set_bounds( self, low, high ): - v1 = self._path.vertices[:] # copy - assert v1.shape == (2,2), 'unexpected vertices shape' - if self.spine_type in ['left','right']: - v1[0,1] = low - v1[1,1] = high - elif self.spine_type in ['bottom','top']: - v1[0,0] = low - v1[1,0] = high - else: - raise ValueError('unable to set bounds for spine "%s"'%spine_type) - self._path.vertices = v1 # replace + if self.spine_type == 'circle': + raise ValueError( + 'set_bounds() method incompatible with circular spines') + self._bounds = (low, high) @classmethod def linear_spine(cls, axes, spine_type, **kwargs): From a5761e821844bc028309aa48828e4c3b445b6e61 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 21 Dec 2009 03:49:59 +0000 Subject: [PATCH 0448/1000] spines and ticks: implement smart bounds svn path=/trunk/matplotlib/; revision=8048 --- .../pylab_examples/spine_placement_demo.py | 10 +- lib/matplotlib/axis.py | 53 ++++++++++- lib/matplotlib/spines.py | 95 +++++++++++++++++++ 3 files changed, 156 insertions(+), 2 deletions(-) diff --git a/examples/pylab_examples/spine_placement_demo.py b/examples/pylab_examples/spine_placement_demo.py index 544dc7123ce8..ffe0632191ae 100644 --- a/examples/pylab_examples/spine_placement_demo.py +++ b/examples/pylab_examples/spine_placement_demo.py @@ -37,6 +37,8 @@ ax.spines['right'].set_color('none') ax.spines['bottom'].set_position('center') ax.spines['top'].set_color('none') +ax.spines['left'].set_smart_bounds(True) +ax.spines['bottom'].set_smart_bounds(True) ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') @@ -47,6 +49,8 @@ ax.spines['right'].set_color('none') ax.spines['bottom'].set_position('zero') ax.spines['top'].set_color('none') +ax.spines['left'].set_smart_bounds(True) +ax.spines['bottom'].set_smart_bounds(True) ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') @@ -57,6 +61,8 @@ ax.spines['right'].set_color('none') ax.spines['bottom'].set_position(('axes',0.1)) ax.spines['top'].set_color('none') +ax.spines['left'].set_smart_bounds(True) +ax.spines['bottom'].set_smart_bounds(True) ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') @@ -67,15 +73,17 @@ ax.spines['right'].set_color('none') ax.spines['bottom'].set_position(('data',2)) ax.spines['top'].set_color('none') +ax.spines['left'].set_smart_bounds(True) +ax.spines['bottom'].set_smart_bounds(True) ax.xaxis.set_ticks_position('bottom') ax.yaxis.set_ticks_position('left') - # ---------------------------------------------------- def adjust_spines(ax,spines): for loc, spine in ax.spines.iteritems(): if loc in spines: spine.set_position(('outward',10)) # outward by 10 points + spine.set_smart_bounds(True) else: spine.set_color('none') # don't draw spine diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index 9f757c3a8d42..c22c90b571ae 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -15,6 +15,7 @@ import matplotlib.ticker as mticker import matplotlib.transforms as mtransforms import matplotlib.units as munits +import numpy as np GRIDLINE_INTERPOLATION_STEPS = 180 @@ -539,6 +540,8 @@ def __init__(self, axes, pickradius=15): #self.minor = dummy() self._autolabelpos = True + self._smart_bounds = False + self.label = self._get_label() self.labelpad = 5 self.offsetText = self._get_offset_text() @@ -737,6 +740,14 @@ def get_ticklabel_extents(self, renderer): bbox2 = mtransforms.Bbox.from_extents(0, 0, 0, 0) return bbox, bbox2 + def set_smart_bounds(self,value): + """set the axis to have smart bounds""" + self._smart_bounds = value + + def get_smart_bounds(self): + """get whether the axis has smart bounds""" + return self._smart_bounds + @allow_rasterization def draw(self, renderer, *args, **kwargs): 'Draw the axis lines, grid lines, tick lines and labels' @@ -746,7 +757,47 @@ def draw(self, renderer, *args, **kwargs): if not self.get_visible(): return renderer.open_group(__name__) interval = self.get_view_interval() - for tick, loc, label in self.iter_ticks(): + tick_tups = [ t for t in self.iter_ticks()] + if self._smart_bounds: + # handle inverted limits + view_low, view_high = min(*interval), max(*interval) + data_low, data_high = self.get_data_interval() + if data_low > data_high: + data_low, data_high = data_high, data_low + locs = [ti[1] for ti in tick_tups] + locs.sort() + locs = np.array(locs) + if len(locs): + if data_low <= view_low: + # data extends beyond view, take view as limit + ilow = view_low + else: + # data stops within view, take best tick + cond = locs <= data_low + good_locs = locs[cond] + if len(good_locs) > 0: + # last tick prior or equal to first data point + ilow = good_locs[-1] + else: + # No ticks (why not?), take first tick + ilow = locs[0] + if data_high >= view_high: + # data extends beyond view, take view as limit + ihigh = view_high + else: + # data stops within view, take best tick + cond = locs >= data_high + good_locs = locs[cond] + if len(good_locs) > 0: + # first tick after or equal to last data point + ihigh = good_locs[0] + else: + # No ticks (why not?), take last tick + ihigh = locs[-1] + tick_tups = [ ti for ti in tick_tups + if (ti[1] >= ilow) and (ti[1] <= ihigh)] + + for tick, loc, label in tick_tups: if tick is None: continue if not mtransforms.interval_contains(interval, loc): continue tick.update_position(loc) diff --git a/lib/matplotlib/spines.py b/lib/matplotlib/spines.py index e994c0fb9fff..cf752660c5fe 100644 --- a/lib/matplotlib/spines.py +++ b/lib/matplotlib/spines.py @@ -59,6 +59,7 @@ def __init__(self,axes,spine_type,path,**kwargs): self.set_transform(self.axes.transData) # default transform self._bounds = None # default bounds + self._smart_bounds = False # Defer initial position determination. (Not much support for # non-rectangular axes is currently implemented, and this lets @@ -78,6 +79,20 @@ def __init__(self,axes,spine_type,path,**kwargs): # Note: This cannot be calculated until this is added to an Axes self._patch_transform = mtransforms.IdentityTransform() + def set_smart_bounds(self,value): + """set the spine and associated axis to have smart bounds""" + self._smart_bounds = value + + # also set the axis if possible + if self.spine_type in ('left','right'): + self.axes.yaxis.set_smart_bounds(value) + elif self.spine_type in ('top','bottom'): + self.axes.xaxis.set_smart_bounds(value) + + def get_smart_bounds(self): + """get whether the spine has smart bounds""" + return self._smart_bounds + def set_patch_circle(self,center,radius): """set the spine to be circular""" self._patch_type = 'circle' @@ -141,6 +156,26 @@ def cla(self): if self.axis is not None: self.axis.cla() + def is_frame_like(self): + """return True if directly on axes frame + + This is useful for determining if a spine is the edge of an + old style MPL plot. If so, this function will return True. + """ + self._ensure_position_is_set() + position = self._position + if cbook.is_string_like(position): + if position=='center': + position = ('axes',0.5) + elif position=='zero': + position = ('data',0) + assert len(position)==2, "position should be 2-tuple" + position_type, amount = position + if position_type=='outward' and amount == 0: + return True + else: + return False + def _adjust_location(self): """automatically set spine bounds to the view interval""" @@ -154,6 +189,61 @@ def _adjust_location(self): low,high = self.axes.viewLim.intervalx else: raise ValueError('unknown spine spine_type: %s'%self.spine_type) + + if self._smart_bounds: + # attempt to set bounds in sophisticated way + if low > high: + # handle inverted limits + low,high=high,low + + viewlim_low = low + viewlim_high = high + + del low, high + + if self.spine_type in ('left','right'): + datalim_low,datalim_high = self.axes.dataLim.intervaly + ticks = self.axes.get_yticks() + elif self.spine_type in ('top','bottom'): + datalim_low,datalim_high = self.axes.dataLim.intervalx + ticks = self.axes.get_xticks() + # handle inverted limits + ticks = list(ticks) + ticks.sort() + ticks = np.array(ticks) + if datalim_low > datalim_high: + datalim_low, datalim_high = datalim_high, datalim_low + + if datalim_low < viewlim_low: + # Data extends past view. Clip line to view. + low = viewlim_low + else: + # Data ends before view ends. + cond = (ticks <= datalim_low) & (ticks >= viewlim_low) + tickvals = ticks[cond] + if len(tickvals): + # A tick is less than or equal to lowest data point. + low = tickvals[-1] + else: + # No tick is available + low = datalim_low + low = max(low,viewlim_low) + + if datalim_high > viewlim_high: + # Data extends past view. Clip line to view. + high = viewlim_high + else: + # Data ends before view ends. + cond = (ticks >= datalim_high) & (ticks <= viewlim_high) + tickvals = ticks[cond] + if len(tickvals): + # A tick is greater than or equal to highest data point. + high = tickvals[0] + else: + # No tick is available + high = datalim_high + high = min(high,viewlim_high) + else: low,high = self._bounds @@ -316,11 +406,16 @@ def get_spine_transform(self): raise ValueError("unknown spine_transform type: %s"%what) def set_bounds( self, low, high ): + """Set the bounds of the spine.""" if self.spine_type == 'circle': raise ValueError( 'set_bounds() method incompatible with circular spines') self._bounds = (low, high) + def get_bounds( self ): + """Get the bounds of the spine.""" + return self._bounds + @classmethod def linear_spine(cls, axes, spine_type, **kwargs): """ From 3493883c26e2b0f144a77cc6d858595e26168c6f Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Mon, 21 Dec 2009 19:49:17 +0000 Subject: [PATCH 0449/1000] zorder support in figure: use same sort idiom as in axes svn path=/trunk/matplotlib/; revision=8049 --- lib/matplotlib/figure.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index 5951b05978cd..36fe4236c857 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -33,6 +33,8 @@ import matplotlib.cbook as cbook from matplotlib import docstring +from operator import itemgetter + docstring.interpd.update(projection_names = get_projection_names()) class SubplotParams: @@ -742,8 +744,6 @@ def draw(self, renderer): # a list of (zorder, func_to_call, list_of_args) dsu = [] - - # todo: respect zorder for a in self.patches: dsu.append( (a.get_zorder(), a.draw, [renderer])) @@ -797,8 +797,7 @@ def draw_composite(): for a in self.legends: dsu.append( (a.get_zorder(), a.draw, [renderer])) - - dsu.sort(key=lambda x: x[0]) + dsu.sort(key=itemgetter(0)) for zorder, func, args in dsu: func(*args) From 26780667387f8c645c9101c7cff8df17adce622f Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 22 Dec 2009 17:03:29 +0000 Subject: [PATCH 0450/1000] Add docs for new features in mathtext svn path=/trunk/matplotlib/; revision=8050 --- doc/users/mathtext.rst | 18 ++++++++++-------- 1 file changed, 10 insertions(+), 8 deletions(-) diff --git a/doc/users/mathtext.rst b/doc/users/mathtext.rst index d7b07556f40f..790114d66945 100644 --- a/doc/users/mathtext.rst +++ b/doc/users/mathtext.rst @@ -23,11 +23,11 @@ that you provide. The mathtext font can be selected with the customization variable ``mathtext.fontset`` (see :ref:`customizing-matplotlib`) -.. note:: - On `"narrow" `_ builds +.. note:: + On `"narrow" `_ builds of Python, if you use the STIX fonts you should also set ``ps.fonttype`` and ``pdf.fonttype`` to 3 (the default), not 42. - Otherwise `some characters will not be visible + Otherwise `some characters will not be visible `_. Here is a simple example:: @@ -85,18 +85,20 @@ the operator. For example, to write the sum of :math:`x_i` from :math:`0` to \sum_{i=0}^\infty x_i -Fractions ---------- +Fractions, binomials and stacked numbers +---------------------------------------- -Fractions can be created with the ``\frac{}{}`` command:: +Fractions, binomials and stacked numbers can be created with the +``\frac{}{}``, ``\binom{}{}`` and ``\stackrel{}{}`` commands, +respectively:: - r'$\frac{3}{4}$' + r'$\frac{3}{4} \binom{3}{4} \stackrel{3}{4}$' produces .. math:: - \frac{3}{4} + \frac{3}{4} \binom{3}{4} \stackrel{3}{4} Fractions can be arbitrarily nested:: From 0b794ed3f1b67235bda21ba4a1c264766584b44e Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Tue, 22 Dec 2009 19:49:49 +0000 Subject: [PATCH 0451/1000] Fix cmap data for gist_earth_r, etc. svn path=/trunk/matplotlib/; revision=8051 --- CHANGELOG | 2 ++ lib/matplotlib/_cm.py | 16 ++++++++-------- 2 files changed, 10 insertions(+), 8 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 0ef6f8e907b6..f2b43f1666bd 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +2009-12-22 Fix cmap data for gist_earth_r, etc. -JJL + 2009-12-20 spines: put spines in data coordinates, add set_bounds() call. -ADS diff --git a/lib/matplotlib/_cm.py b/lib/matplotlib/_cm.py index 885a9f8bee2f..eb63d00fd1a1 100644 --- a/lib/matplotlib/_cm.py +++ b/lib/matplotlib/_cm.py @@ -1434,7 +1434,7 @@ def gfunc32(x): (0.5490, 0.4719, 0.4719), (0.6980, 0.7176, 0.7176), (0.7882, 0.7553, 0.7553), -(1.0000, 0.9922, 0), +(1.0000, 0.9922, 0.9922), ), 'green': ( (0.0, 0.0, 0.0000), (0.0275, 0.0000, 0.0000), @@ -1458,7 +1458,7 @@ def gfunc32(x): (0.9569, 0.8635, 0.8635), (0.9647, 0.8816, 0.8816), (0.9961, 0.9733, 0.9733), -(1.0000, 0.9843, 0), +(1.0000, 0.9843, 0.9843), ), 'blue': ( (0.0, 0.0, 0.0000), (0.0039, 0.1684, 0.1684), @@ -1470,7 +1470,7 @@ def gfunc32(x): (0.5451, 0.3205, 0.3205), (0.7843, 0.3961, 0.3961), (0.8941, 0.6651, 0.6651), -(1.0000, 0.9843, 0), +(1.0000, 0.9843, 0.9843), )} _gist_gray_data = { @@ -1495,7 +1495,7 @@ def gfunc32(x): (0.7922, 1.0000, 1.0000), (0.8471, 0.6218, 0.6218), (0.8980, 0.9235, 0.9235), -(1.0000, 0.9961, 0), +(1.0000, 0.9961, 0.9961), ), 'green': ( (0.0, 0.0, 0.0000), (0.0510, 0.3722, 0.3722), @@ -1516,9 +1516,9 @@ def gfunc32(x): (0.7922, 0.0000, 0.0000), (0.8431, 0.1753, 0.1753), (0.8980, 0.5000, 0.5000), -(1.0000, 0.9725, 0), +(1.0000, 0.9725, 0.9725), ), 'blue': ( -(0.0, 0.0, 0.5020), +(0.0, 0.5020, 0.5020), (0.0510, 0.0222, 0.0222), (0.1098, 1.0000, 1.0000), (0.2039, 1.0000, 1.0000), @@ -1535,7 +1535,7 @@ def gfunc32(x): (0.8000, 1.0000, 1.0000), (0.8431, 1.0000, 1.0000), (0.8980, 0.9341, 0.9341), -(1.0000, 0.9961, 0), +(1.0000, 0.9961, 0.9961), )} _gist_rainbow_data = ( @@ -1552,7 +1552,7 @@ def gfunc32(x): _gist_stern_data = { 'red': ( (0.000, 0.000, 0.000), (0.0547, 1.000, 1.000), - (0.250, 0.027, 0.027), (0.2500, 0.250, 0.250), + (0.250, 0.027, 0.250), #(0.2500, 0.250, 0.250), (1.000, 1.000, 1.000)), 'green': ((0, 0, 0), (1, 1, 0)), 'blue': ( From 11fdc78997c7c561bc709e9919b01461cce2c9db Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Tue, 22 Dec 2009 23:43:09 +0000 Subject: [PATCH 0452/1000] pyplot.spy should set current image only if it is making an image svn path=/trunk/matplotlib/; revision=8052 --- boilerplate.py | 4 ++-- lib/matplotlib/pyplot.py | 38 +++++++++++++++++++++----------------- 2 files changed, 23 insertions(+), 19 deletions(-) diff --git a/boilerplate.py b/boilerplate.py index 0acae9a8f496..9d456064271f 100644 --- a/boilerplate.py +++ b/boilerplate.py @@ -86,7 +86,7 @@ def %(func)s(%(argspec)s): 'semilogx', 'semilogy', 'specgram', - 'spy', + #'spy', 'stem', 'step', 'vlines', @@ -111,7 +111,7 @@ def %(func)s(%(argspec)s): 'pcolor' : 'sci(%(ret)s)', 'pcolormesh': 'sci(%(ret)s)', 'imshow' : 'sci(%(ret)s)', - 'spy' : 'sci(%(ret)s)', + #'spy' : 'sci(%(ret)s)', ### may return image or Line2D 'quiver' : 'sci(%(ret)s)', 'specgram' : 'sci(%(ret)s[-1])', diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index cde5d717b3c0..bec3f0f1cf9d 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -1600,6 +1600,27 @@ def autogen_docstring(base): addendum = docstring.Appender(msg, '\n\n') return lambda func: addendum(docstring.copy_dedent(base)(func)) + +# This function cannot be generated by boilerplate.py because it may +# return an image or a line. +@autogen_docstring(Axes.spy) +def spy(Z, precision=0, marker=None, markersize=None, aspect='equal', hold=None, **kwargs): + ax = gca() + # allow callers to override the hold state by passing hold=True|False + washold = ax.ishold() + + if hold is not None: + ax.hold(hold) + try: + ret = ax.spy(Z, precision, marker, markersize, aspect, **kwargs) + draw_if_interactive() + finally: + ax.hold(washold) + if isinstance(ret, cm.ScalarMappable): + sci(ret) + return ret + + ## Plotting part 2: autogenerated wrappers for axes methods ## # This function was autogenerated by boilerplate.py. Do not edit as @@ -2252,23 +2273,6 @@ def specgram(x, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window=mlab.win sci(ret[-1]) return ret -# This function was autogenerated by boilerplate.py. Do not edit as -# changes will be lost -@autogen_docstring(Axes.spy) -def spy(Z, precision=0, marker=None, markersize=None, aspect='equal', hold=None, **kwargs): - ax = gca() - # allow callers to override the hold state by passing hold=True|False - washold = ax.ishold() - - if hold is not None: - ax.hold(hold) - try: - ret = ax.spy(Z, precision, marker, markersize, aspect, **kwargs) - draw_if_interactive() - finally: - ax.hold(washold) - sci(ret) - return ret # This function was autogenerated by boilerplate.py. Do not edit as # changes will be lost From b1770f61213ad802003a51a7b33512edb5fbdced Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Sun, 27 Dec 2009 23:18:51 +0000 Subject: [PATCH 0453/1000] fix whitespace, one docstring in lines.py svn path=/trunk/matplotlib/; revision=8053 --- lib/matplotlib/lines.py | 66 ++++++++++++++++++++--------------------- 1 file changed, 33 insertions(+), 33 deletions(-) diff --git a/lib/matplotlib/lines.py b/lib/matplotlib/lines.py index 9ad1ea082fb3..b4605110c206 100644 --- a/lib/matplotlib/lines.py +++ b/lib/matplotlib/lines.py @@ -233,7 +233,7 @@ def __init__(self, xdata, ydata, self.set_markerfacecolor(markerfacecolor) self.set_markeredgecolor(markeredgecolor) self.set_markeredgewidth(markeredgewidth) - self.set_fillstyle(fillstyle) + self.set_fillstyle(fillstyle) self._point_size_reduction = 0.5 @@ -323,9 +323,9 @@ def set_pickradius(self,d): def get_fillstyle(self): """ - return the marker fillstyle + return the marker fillstyle """ - return self._fillstyle + return self._fillstyle def set_fillstyle(self, fs): """ @@ -335,7 +335,7 @@ def set_fillstyle(self, fs): ACCEPTS: ['full' | 'left' | 'right' | 'bottom' | 'top'] """ assert fs in ['full', 'left' , 'right' , 'bottom' , 'top'] - self._fillstyle = fs + self._fillstyle = fs def set_markevery(self, every): """ @@ -396,7 +396,7 @@ def set_data(self, *args): """ Set the x and y data - ACCEPTS: 2D array + ACCEPTS: 2D array (rows are x, y) or two 1D arrays """ if len(args)==1: x, y = args[0] @@ -931,8 +931,8 @@ def _draw_dotted(self, renderer, gc, path, trans): def _draw_point(self, renderer, gc, path, path_trans): - fs = self.get_fillstyle() - if fs!='full': + fs = self.get_fillstyle() + if fs!='full': raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') w = renderer.points_to_pixels(self._markersize) * \ @@ -946,8 +946,8 @@ def _draw_point(self, renderer, gc, path, path_trans): _draw_pixel_transform = Affine2D().translate(-0.5, -0.5) def _draw_pixel(self, renderer, gc, path, path_trans): - fs = self.get_fillstyle() - if fs!='full': + fs = self.get_fillstyle() + if fs!='full': raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') rgbFace = self._get_rgb_face() @@ -958,8 +958,8 @@ def _draw_pixel(self, renderer, gc, path, path_trans): def _draw_circle(self, renderer, gc, path, path_trans): - fs = self.get_fillstyle() - if fs!='full': + fs = self.get_fillstyle() + if fs!='full': raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') w = renderer.points_to_pixels(self._markersize) * 0.5 @@ -974,8 +974,8 @@ def _draw_circle(self, renderer, gc, path, path_trans): _triangle_path = Path([[0.0, 1.0], [-1.0, -1.0], [1.0, -1.0], [0.0, 1.0]]) def _draw_triangle_up(self, renderer, gc, path, path_trans): - fs = self.get_fillstyle() - if fs!='full': + fs = self.get_fillstyle() + if fs!='full': raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') gc.set_snap(renderer.points_to_pixels(self._markersize) >= 5.0) @@ -987,8 +987,8 @@ def _draw_triangle_up(self, renderer, gc, path, path_trans): def _draw_triangle_down(self, renderer, gc, path, path_trans): - fs = self.get_fillstyle() - if fs!='full': + fs = self.get_fillstyle() + if fs!='full': raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') gc.set_snap(renderer.points_to_pixels(self._markersize) >= 5.0) @@ -1000,8 +1000,8 @@ def _draw_triangle_down(self, renderer, gc, path, path_trans): def _draw_triangle_left(self, renderer, gc, path, path_trans): - fs = self.get_fillstyle() - if fs!='full': + fs = self.get_fillstyle() + if fs!='full': raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') gc.set_snap(renderer.points_to_pixels(self._markersize) >= 5.0) @@ -1013,8 +1013,8 @@ def _draw_triangle_left(self, renderer, gc, path, path_trans): def _draw_triangle_right(self, renderer, gc, path, path_trans): - fs = self.get_fillstyle() - if fs!='full': + fs = self.get_fillstyle() + if fs!='full': raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') gc.set_snap(renderer.points_to_pixels(self._markersize) >= 5.0) @@ -1030,8 +1030,8 @@ def _draw_square(self, renderer, gc, path, path_trans): side = renderer.points_to_pixels(self._markersize) transform = Affine2D().translate(-0.5, -0.5).scale(side) rgbFace = self._get_rgb_face() - fs = self.get_fillstyle() - if fs=='full': + fs = self.get_fillstyle() + if fs=='full': renderer.draw_markers(gc, Path.unit_rectangle(), transform, path, path_trans, rgbFace) else: @@ -1052,8 +1052,8 @@ def _draw_square(self, renderer, gc, path, path_trans): path, path_trans, None) def _draw_diamond(self, renderer, gc, path, path_trans): - fs = self.get_fillstyle() - if fs!='full': + fs = self.get_fillstyle() + if fs!='full': raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') gc.set_snap(renderer.points_to_pixels(self._markersize) >= 5.0) side = renderer.points_to_pixels(self._markersize) @@ -1064,8 +1064,8 @@ def _draw_diamond(self, renderer, gc, path, path_trans): def _draw_thin_diamond(self, renderer, gc, path, path_trans): - fs = self.get_fillstyle() - if fs!='full': + fs = self.get_fillstyle() + if fs!='full': raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') gc.set_snap(renderer.points_to_pixels(self._markersize) >= 3.0) offset = renderer.points_to_pixels(self._markersize) @@ -1077,8 +1077,8 @@ def _draw_thin_diamond(self, renderer, gc, path, path_trans): def _draw_pentagon(self, renderer, gc, path, path_trans): - fs = self.get_fillstyle() - if fs!='full': + fs = self.get_fillstyle() + if fs!='full': raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') gc.set_snap(renderer.points_to_pixels(self._markersize) >= 5.0) offset = 0.5 * renderer.points_to_pixels(self._markersize) @@ -1088,8 +1088,8 @@ def _draw_pentagon(self, renderer, gc, path, path_trans): path, path_trans, rgbFace) def _draw_star(self, renderer, gc, path, path_trans): - fs = self.get_fillstyle() - if fs!='full': + fs = self.get_fillstyle() + if fs!='full': raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') gc.set_snap(renderer.points_to_pixels(self._markersize) >= 5.0) offset = 0.5 * renderer.points_to_pixels(self._markersize) @@ -1101,8 +1101,8 @@ def _draw_star(self, renderer, gc, path, path_trans): def _draw_hexagon1(self, renderer, gc, path, path_trans): - fs = self.get_fillstyle() - if fs!='full': + fs = self.get_fillstyle() + if fs!='full': raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') gc.set_snap(renderer.points_to_pixels(self._markersize) >= 5.0) offset = 0.5 * renderer.points_to_pixels(self._markersize) @@ -1113,8 +1113,8 @@ def _draw_hexagon1(self, renderer, gc, path, path_trans): def _draw_hexagon2(self, renderer, gc, path, path_trans): - fs = self.get_fillstyle() - if fs!='full': + fs = self.get_fillstyle() + if fs!='full': raise NotImplementedError('non-full markers have not been implemented for this marker style yet; please contribute') gc.set_snap(renderer.points_to_pixels(self._markersize) >= 5.0) offset = 0.5 * renderer.points_to_pixels(self._markersize) From 01793268c97c78356e81e151480bf0c18d9ea531 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Mon, 28 Dec 2009 00:21:50 +0000 Subject: [PATCH 0454/1000] Line2D: simplify set_data functionality; recache only a coord. that was set. svn path=/trunk/matplotlib/; revision=8054 --- examples/pylab_examples/clippedline.py | 10 +++- lib/matplotlib/lines.py | 76 ++++++++++++-------------- 2 files changed, 43 insertions(+), 43 deletions(-) diff --git a/examples/pylab_examples/clippedline.py b/examples/pylab_examples/clippedline.py index d0bf422c03d8..03e67db1a246 100644 --- a/examples/pylab_examples/clippedline.py +++ b/examples/pylab_examples/clippedline.py @@ -1,6 +1,11 @@ """ Clip a line according to the current xlimits, and change the marker -style when zoomed in +style when zoomed in. + +It is not clear this example is still needed or valid; clipping +is now automatic for Line2D objects when x is sorted in +ascending order. + """ from matplotlib.lines import Line2D @@ -19,8 +24,7 @@ def __init__(self, ax, *args, **kwargs): def set_data(self, *args, **kwargs): Line2D.set_data(self, *args, **kwargs) - if self._invalid: - self.recache() + self.recache() self.xorig = np.array(self._x) self.yorig = np.array(self._y) diff --git a/lib/matplotlib/lines.py b/lib/matplotlib/lines.py index b4605110c206..1106d12abc26 100644 --- a/lib/matplotlib/lines.py +++ b/lib/matplotlib/lines.py @@ -248,7 +248,8 @@ def __init__(self, xdata, ydata, self._xorig = np.asarray([]) self._yorig = np.asarray([]) - self._invalid = True + self._invalidx = True + self._invalidy = True self.set_data(xdata, ydata) def contains(self, mouseevent): @@ -272,7 +273,7 @@ def contains(self, mouseevent): raise ValueError,"pick radius should be a distance" # Make sure we have data to plot - if self._invalid: + if self._invalidy or self._invalidx: self.recache() if len(self._xy)==0: return False,{} @@ -403,36 +404,28 @@ def set_data(self, *args): else: x, y = args - not_masked = 0 - if not ma.isMaskedArray(x): - x = np.asarray(x) - not_masked += 1 - if not ma.isMaskedArray(y): - y = np.asarray(y) - not_masked += 1 - - if (not_masked < 2 or - (x is not self._xorig and - (x.shape != self._xorig.shape or np.any(x != self._xorig))) or - (y is not self._yorig and - (y.shape != self._yorig.shape or np.any(y != self._yorig)))): - self._xorig = x - self._yorig = y - self._invalid = True + self.set_xdata(x) + self.set_ydata(y) def recache(self): - #if self.axes is None: print 'recache no axes' - #else: print 'recache units', self.axes.xaxis.units, self.axes.yaxis.units - if ma.isMaskedArray(self._xorig) or ma.isMaskedArray(self._yorig): - x = ma.asarray(self.convert_xunits(self._xorig), float) - y = ma.asarray(self.convert_yunits(self._yorig), float) - x = ma.ravel(x) - y = ma.ravel(y) + if self._invalidx: + xconv = self.convert_xunits(self._xorig) + if ma.isMaskedArray(self._xorig): + x = ma.asarray(xconv, float) + else: + x = np.asarray(xconv, float) + x = x.ravel() + else: + x = self._x + if self._invalidy: + yconv = self.convert_yunits(self._yorig) + if ma.isMaskedArray(self._yorig): + y = ma.asarray(yconv, float) + else: + y = np.asarray(yconv, float) + y = y.ravel() else: - x = np.asarray(self.convert_xunits(self._xorig), float) - y = np.asarray(self.convert_yunits(self._yorig), float) - x = np.ravel(x) - y = np.ravel(y) + y = self._y if len(x)==1 and len(y)>1: x = x * np.ones(y.shape, float) @@ -455,8 +448,7 @@ def recache(self): self._subslice = False if (self.axes and len(x) > 100 and self._is_sorted(x) and self.axes.name == 'rectilinear' and - self.axes.get_xscale() == 'linear' and - self.axes.get_yscale() == 'linear'): + self.axes.get_xscale() == 'linear'): self._subslice = True if hasattr(self, '_path'): interpolation_steps = self._path._interpolation_steps @@ -464,7 +456,8 @@ def recache(self): interpolation_steps = 1 self._path = Path(self._xy, None, interpolation_steps) self._transformed_path = None - self._invalid = False + self._invalidx = False + self._invalidy = False def _transform_path(self, subslice=None): # Masked arrays are now handled by the Path class itself @@ -482,7 +475,8 @@ def set_transform(self, t): ACCEPTS: a :class:`matplotlib.transforms.Transform` instance """ Artist.set_transform(self, t) - self._invalid = True + self._invalidx = True + self._invalidy = True def _is_sorted(self, x): "return true if x is sorted" @@ -491,7 +485,7 @@ def _is_sorted(self, x): @allow_rasterization def draw(self, renderer): - if self._invalid: + if self._invalidy or self._invalidx: self.recache() if self._subslice and self.axes: # Need to handle monotonically decreasing case also... @@ -619,7 +613,7 @@ def get_xdata(self, orig=True): """ if orig: return self._xorig - if self._invalid: + if self._invalidx: self.recache() return self._x @@ -632,7 +626,7 @@ def get_ydata(self, orig=True): """ if orig: return self._yorig - if self._invalid: + if self._invalidy: self.recache() return self._y @@ -641,7 +635,7 @@ def get_path(self): Return the :class:`~matplotlib.path.Path` object associated with this line. """ - if self._invalid: + if self._invalidy or self._invalidx: self.recache() return self._path @@ -649,7 +643,7 @@ def get_xydata(self): """ Return the *xy* data as a Nx2 numpy array. """ - if self._invalid: + if self._invalidy or self.invalidx: self.recache() return self._xy @@ -840,7 +834,8 @@ def set_xdata(self, x): ACCEPTS: 1D array """ - self.set_data(x, self._yorig) + self._xorig = x + self._invalidx = True def set_ydata(self, y): """ @@ -848,7 +843,8 @@ def set_ydata(self, y): ACCEPTS: 1D array """ - self.set_data(self._xorig, y) + self._yorig = y + self._invalidy = True def set_dashes(self, seq): """ From 605aebb2ccbfd608fa5f45cc1055fe3043cedd84 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Mon, 28 Dec 2009 01:34:06 +0000 Subject: [PATCH 0455/1000] Fix bug in Line2D from last commit: restore full recache in unit chane callback svn path=/trunk/matplotlib/; revision=8055 --- lib/matplotlib/lines.py | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/lib/matplotlib/lines.py b/lib/matplotlib/lines.py index 1106d12abc26..816cc79931f3 100644 --- a/lib/matplotlib/lines.py +++ b/lib/matplotlib/lines.py @@ -388,9 +388,9 @@ def get_window_extent(self, renderer): def set_axes(self, ax): Artist.set_axes(self, ax) if ax.xaxis is not None: - self._xcid = ax.xaxis.callbacks.connect('units', self.recache) + self._xcid = ax.xaxis.callbacks.connect('units', self.recache_always) if ax.yaxis is not None: - self._ycid = ax.yaxis.callbacks.connect('units', self.recache) + self._ycid = ax.yaxis.callbacks.connect('units', self.recache_always) set_axes.__doc__ = Artist.set_axes.__doc__ def set_data(self, *args): @@ -407,8 +407,11 @@ def set_data(self, *args): self.set_xdata(x) self.set_ydata(y) - def recache(self): - if self._invalidx: + def recache_always(self): + self.recache(always=True) + + def recache(self, always=False): + if always or self._invalidx: xconv = self.convert_xunits(self._xorig) if ma.isMaskedArray(self._xorig): x = ma.asarray(xconv, float) @@ -417,7 +420,7 @@ def recache(self): x = x.ravel() else: x = self._x - if self._invalidy: + if always or self._invalidy: yconv = self.convert_yunits(self._yorig) if ma.isMaskedArray(self._yorig): y = ma.asarray(yconv, float) From ed7a15f62d98259e674082c7462d75936cbdd33b Mon Sep 17 00:00:00 2001 From: Darren Dale Date: Thu, 31 Dec 2009 12:51:43 +0000 Subject: [PATCH 0456/1000] workaround for a regression in PyQt4-4.6.{0,1} svn path=/trunk/matplotlib/; revision=8056 --- CHANGELOG | 2 ++ lib/matplotlib/backends/backend_qt4.py | 18 +++++++++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index f2b43f1666bd..f8263ab315e8 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +2009-12-31 Commit a workaround for a regression in PyQt4-4.6.{0,1} - DSD + 2009-12-22 Fix cmap data for gist_earth_r, etc. -JJL 2009-12-20 spines: put spines in data coordinates, add set_bounds() diff --git a/lib/matplotlib/backends/backend_qt4.py b/lib/matplotlib/backends/backend_qt4.py index aa7f3bb4b4bf..564fa35b8ec0 100644 --- a/lib/matplotlib/backends/backend_qt4.py +++ b/lib/matplotlib/backends/backend_qt4.py @@ -206,6 +206,22 @@ def idle_draw(*args): self._idle = True if d: QtCore.QTimer.singleShot(0, idle_draw) + +# XXX Hackish fix: There's a bug in PyQt. See this thread for details: +# http://old.nabble.com/Qt4-backend:-critical-bug-with-PyQt4-v4.6%2B-td26205716.html +# Once a release of Qt/PyQt is available without the bug, the version check +# below can be tightened further to only be applied in the necessary versions. +if Qt.PYQT_VERSION_STR.startswith('4.6'): + class FigureWindow(QtGui.QMainWindow): + def __init__(self): + super(FigureWindow, self).__init__() + def closeEvent(self, event): + super(FigureWindow, self).closeEvent(event) + self.emit(Qt.SIGNAL('destroyed()')) +else: + FigureWindow = QtGui.QMainWindow +# /end pyqt hackish bugfix + class FigureManagerQT( FigureManagerBase ): """ Public attributes @@ -220,7 +236,7 @@ def __init__( self, canvas, num ): if DEBUG: print 'FigureManagerQT.%s' % fn_name() FigureManagerBase.__init__( self, canvas, num ) self.canvas = canvas - self.window = QtGui.QMainWindow() + self.window = FigureWindow() self.window.setAttribute(QtCore.Qt.WA_DeleteOnClose) self.window.setWindowTitle("Figure %d" % num) From 7851aaca8257f92a05ce306df20a175c2737f1a6 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Thu, 31 Dec 2009 15:48:55 +0000 Subject: [PATCH 0457/1000] Merged revisions 8016,8036,8057 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r8016 | heeres | 2009-12-09 19:09:03 -0500 (Wed, 09 Dec 2009) | 2 lines Mplot3d: fix scatter3d markers bug ........ r8036 | jdh2358 | 2009-12-16 14:21:44 -0500 (Wed, 16 Dec 2009) | 1 line add mpl book to index sidebar ........ r8057 | mdboom | 2009-12-31 10:46:58 -0500 (Thu, 31 Dec 2009) | 2 lines [2916753] Wrong API signature- yscale ........ svn path=/trunk/matplotlib/; revision=8058 --- doc/_templates/indexsidebar.html | 6 ++++++ lib/matplotlib/pyplot.py | 2 +- 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/doc/_templates/indexsidebar.html b/doc/_templates/indexsidebar.html index 878e5d7fef76..a06208ac6349 100644 --- a/doc/_templates/indexsidebar.html +++ b/doc/_templates/indexsidebar.html @@ -9,6 +9,12 @@

    News

    pathto('users/installing') }}">installing

    +

    Sandro Tosi has a new book +Matplotlib for python +developers +also +at amazon.

    +

    Build websites like matplotlib's, with sphinx and extensions for mpl plots, math, inheritance diagrams -- try diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index bec3f0f1cf9d..bfc3be9516ec 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -945,7 +945,7 @@ def yscale(*args, **kwargs): """ call signature:: - xscale(scale, **kwargs) + yscale(scale, **kwargs) Set the scaling for the y-axis: %(scale)s From 3df8dd106aeadb055a7afade26ba0179ee9326fa Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Thu, 31 Dec 2009 16:45:59 +0000 Subject: [PATCH 0458/1000] Add support for mathtext markers (thanks to tcb for original work) svn path=/trunk/matplotlib/; revision=8059 --- CHANGELOG | 31 +++++++------- examples/pylab_examples/line_styles.py | 21 +++++++--- lib/matplotlib/cbook.py | 9 ++++ lib/matplotlib/lines.py | 58 +++++++++++++++++++++----- lib/matplotlib/text.py | 5 +-- src/_path.cpp | 10 +++-- 6 files changed, 97 insertions(+), 37 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index f8263ab315e8..4df4c4fc32e7 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2009-12-31 Add support for using math text as marker symbols (Thanks to tcb) + - MGD + 2009-12-31 Commit a workaround for a regression in PyQt4-4.6.{0,1} - DSD 2009-12-22 Fix cmap data for gist_earth_r, etc. -JJL @@ -20,7 +23,7 @@ Added new examples. - JJL 2009-12-01 Applied Laurent Dufrechou's patch to improve blitting with - the qt4 backend - DSD + the qt4 backend - DSD 2009-11-13 The pdf backend now allows changing the contents of a pdf file's information dictionary via PdfPages.infodict. - JKS @@ -153,35 +156,35 @@ 2009-08-06 Tagging the 0.99.0 release at svn r7397 - JDH - * fixed an alpha colormapping bug posted on sf 2832575 + * fixed an alpha colormapping bug posted on sf 2832575 - * fix typo in axes_divider.py. use nanmin, nanmax in angle_helper.py + * fix typo in axes_divider.py. use nanmin, nanmax in angle_helper.py (patch by Christoph Gohlke) - * remove dup gui event in enter/leave events in gtk + * remove dup gui event in enter/leave events in gtk - * lots of fixes for os x binaries (Thanks Russell Owen) + * lots of fixes for os x binaries (Thanks Russell Owen) - * attach gtk events to mpl events -- fixes sf bug 2816580 + * attach gtk events to mpl events -- fixes sf bug 2816580 - * applied sf patch 2815064 (middle button events for wx) and + * applied sf patch 2815064 (middle button events for wx) and patch 2818092 (resize events for wx) - * fixed boilerplate.py so it doesn't break the ReST docs. + * fixed boilerplate.py so it doesn't break the ReST docs. - * removed a couple of cases of mlab.load + * removed a couple of cases of mlab.load - * fixed rec2csv win32 file handle bug from sf patch 2831018 + * fixed rec2csv win32 file handle bug from sf patch 2831018 - * added two examples from Josh Hemann: examples/pylab_examples/barchart_demo2.py + * added two examples from Josh Hemann: examples/pylab_examples/barchart_demo2.py and examples/pylab_examples/boxplot_demo2.py - * handled sf bugs 2831556 and 2830525; better bar error messages and + * handled sf bugs 2831556 and 2830525; better bar error messages and backend driver configs - * added miktex win32 patch from sf patch 2820194 + * added miktex win32 patch from sf patch 2820194 - * apply sf patches 2830233 and 2823885 for osx setup and 64 bit; thanks Michiel + * apply sf patches 2830233 and 2823885 for osx setup and 64 bit; thanks Michiel 2009-08-04 Made cbook.get_sample_data make use of the ETag and Last-Modified headers of mod_dav_svn. - JKS diff --git a/examples/pylab_examples/line_styles.py b/examples/pylab_examples/line_styles.py index 080a51618bc1..fdde90ee41a3 100644 --- a/examples/pylab_examples/line_styles.py +++ b/examples/pylab_examples/line_styles.py @@ -17,19 +17,28 @@ except TypeError: pass -styles = linestyles + markers +styles = markers + [ + r'$\lambda$', + r'$\bowtie$', + r'$\circlearrowleft$', + r'$\clubsuit$', + r'$\checkmark$'] colors = ('b', 'g', 'r', 'c', 'm', 'y', 'k') +plt.figure(figsize=(8,8)) axisNum = 0 -for row in range(5): +for row in range(6): for col in range(5): axisNum += 1 - ax = plt.subplot(5, 5, axisNum) - style = styles[axisNum % len(styles) ] - color = colors[axisNum % len(colors) ] - plt.plot(t,s, style + color, markersize=10) + ax = plt.subplot(6, 5, axisNum) + color = colors[axisNum % len(colors)] + if axisNum < len(linestyles): + plt.plot(t, s, linestyles[axisNum], color=color, markersize=10) + else: + style = styles[(axisNum - len(linestyles)) % len(styles)] + plt.plot(t, s, linestyle='None', marker=style, color=color, markersize=10) ax.set_yticklabels([]) ax.set_xticklabels([]) diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index fc51b854ab95..7947b1ea6a38 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -1676,6 +1676,15 @@ def __call__(self, key): else: break +def is_math_text(s): + # Did we find an even number of non-escaped dollar signs? + # If so, treat is as math text. + s = unicode(s) + + dollar_count = s.count(r'$') - s.count(r'\$') + even_dollars = (dollar_count > 0 and dollar_count % 2 == 0) + + return even_dollars if __name__=='__main__': diff --git a/lib/matplotlib/lines.py b/lib/matplotlib/lines.py index 816cc79931f3..4b7573f5b5bb 100644 --- a/lib/matplotlib/lines.py +++ b/lib/matplotlib/lines.py @@ -12,7 +12,7 @@ import artist from artist import Artist from cbook import iterable, is_string_like, is_numlike, ls_mapper, dedent,\ -flatten +flatten, is_math_text from colors import colorConverter from path import Path from transforms import Affine2D, Bbox, TransformedPath, IdentityTransform @@ -20,6 +20,7 @@ from matplotlib import rcParams from artist import allow_rasterization from matplotlib import docstring +from matplotlib.font_manager import FontProperties # special-purpose marker identifiers: (TICKLEFT, TICKRIGHT, TICKUP, TICKDOWN, @@ -139,7 +140,7 @@ class Line2D(Artist): } filled_markers = ('o', '^', 'v', '<', '>', - 's', 'd', 'D', 'h', 'H', 'p', '*') + 's', 'd', 'D', 'h', 'H', 'p', '*') zorder = 2 validCap = ('butt', 'round', 'projecting') @@ -535,7 +536,7 @@ def draw(self, renderer): gc.set_foreground(self.get_markeredgecolor()) gc.set_linewidth(self._markeredgewidth) gc.set_alpha(self._alpha) - funcname = self._markers.get(self._marker, '_draw_nothing') + funcname = self._markerFunc if funcname != '_draw_nothing': tpath, affine = self._transformed_path.get_transformed_points_and_affine() if len(tpath.vertices): @@ -573,7 +574,8 @@ def get_marker(self): return self._marker def get_markeredgecolor(self): if (is_string_like(self._markeredgecolor) and self._markeredgecolor == 'auto'): - if self._marker in self.filled_markers: + if (self._marker in self.filled_markers or + is_math_text(self._marker)): return 'k' else: return self._color @@ -774,6 +776,7 @@ def set_marker(self, marker): 'None' nothing ' ' nothing '' nothing + '$...$' render the string using mathtext ========== ========================== @@ -782,16 +785,18 @@ def set_marker(self, marker): | '<' | '>' | 'D' | 'H' | '^' | '_' | 'd' | 'h' | 'o' | 'p' | 's' | 'v' | 'x' | '|' | TICKUP | TICKDOWN | TICKLEFT | TICKRIGHT - | 'None' | ' ' | '' ] + | 'None' | ' ' | '' | '$...$'] """ - if marker not in self._markers: + if marker in self._markers: + self._marker = marker + self._markerFunc = self._markers[marker] + elif is_math_text(marker): + self._marker = marker + self._markerFunc = '_draw_mathtext_path' + else: #already handle ' ', '' in marker list verbose.report('Unrecognized marker style %s, %s' % (marker, type(marker))) - if marker in [' ','']: - marker = 'None' - self._marker = marker - self._markerFunc = self._markers[marker] def set_markeredgecolor(self, ec): """ @@ -867,6 +872,38 @@ def set_dashes(self, seq): def _draw_lines(self, renderer, gc, path, trans): self._lineFunc(renderer, gc, path, trans) + def _draw_mathtext_path(self, renderer, gc, path, trans): + """ + Draws mathtext markers '$...$' using TextPath object. + + Submitted by tcb + """ + from matplotlib.patches import PathPatch + from matplotlib.text import TextPath + + gc.set_snap(False) + + # again, the properties could be initialised just once outside + # this function + # Font size is irrelevant here, it will be rescaled based on + # the drawn size later + props = FontProperties(size=1.0) + text = TextPath(xy=(0,0), s=self.get_marker(), fontproperties=props, + usetex=rcParams['text.usetex']) + if len(text.vertices) == 0: + return + xmin, ymin = text.vertices.min(axis=0) + xmax, ymax = text.vertices.max(axis=0) + width = xmax - xmin + height = ymax - ymin + max_dim = max(width, height) + path_trans = Affine2D() \ + .translate(0.5 * -width, 0.5 * -height) \ + .scale((renderer.points_to_pixels(self.get_markersize()) / max_dim)) + + rgbFace = self._get_rgb_face() + renderer.draw_markers(gc, text, path_trans, path, trans, rgbFace) + def _draw_steps_pre(self, renderer, gc, path, trans): vertices = self._xy steps = ma.zeros((2*len(vertices)-1, 2), np.float_) @@ -1288,6 +1325,7 @@ def update_from(self, other): self._linestyle = other._linestyle self._marker = other._marker + self._markerFunc = other._markerFunc self._drawstyle = other._drawstyle diff --git a/lib/matplotlib/text.py b/lib/matplotlib/text.py index 66472adfda28..fc5a7819b0e7 100644 --- a/lib/matplotlib/text.py +++ b/lib/matplotlib/text.py @@ -997,13 +997,10 @@ def is_math_text(self, s): """ # Did we find an even number of non-escaped dollar signs? # If so, treat is as math text. - dollar_count = s.count(r'$') - s.count(r'\$') - even_dollars = (dollar_count > 0 and dollar_count % 2 == 0) - if rcParams['text.usetex']: return s, 'TeX' - if even_dollars: + if cbook.is_math_text(s): return s, True else: return s.replace(r'\$', '$'), False diff --git a/src/_path.cpp b/src/_path.cpp index 9802e3841a0d..064d002414c2 100644 --- a/src/_path.cpp +++ b/src/_path.cpp @@ -922,9 +922,13 @@ Py::Object _path_module::affine_transform(const Py::Tuple& args) vertices = (PyArrayObject*)PyArray_FromObject (vertices_obj.ptr(), PyArray_DOUBLE, 1, 2); if (!vertices || - (PyArray_NDIM(vertices) == 2 && PyArray_DIM(vertices, 1) != 2) || - (PyArray_NDIM(vertices) == 1 && PyArray_DIM(vertices, 0) != 2)) + (PyArray_NDIM(vertices) == 2 && PyArray_DIM(vertices, 0) != 0 && + PyArray_DIM(vertices, 1) != 2) || + (PyArray_NDIM(vertices) == 1 && + PyArray_DIM(vertices, 0) != 2 && PyArray_DIM(vertices, 0) != 0)) + { throw Py::ValueError("Invalid vertices array."); + } transform = (PyArrayObject*) PyArray_FromObject (transform_obj.ptr(), PyArray_DOUBLE, 2, 2); @@ -979,7 +983,7 @@ Py::Object _path_module::affine_transform(const Py::Tuple& args) vertex_in += stride0; } } - else + else if (PyArray_DIM(vertices, 0) != 0) { char* vertex_in = PyArray_BYTES(vertices); double* vertex_out = (double*)PyArray_DATA(result); From bbcb85a663bbbd797845d9a4f3f58c31ea96eb56 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sat, 2 Jan 2010 05:09:59 +0000 Subject: [PATCH 0459/1000] add linux/unix script for building docs in buildbox svn path=/trunk/matplotlib/; revision=8060 --- test/_buildbot_doc.sh | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100755 test/_buildbot_doc.sh diff --git a/test/_buildbot_doc.sh b/test/_buildbot_doc.sh new file mode 100755 index 000000000000..3b894c07e909 --- /dev/null +++ b/test/_buildbot_doc.sh @@ -0,0 +1,15 @@ +#!/bin/bash +set -e + +TARGET=`pwd`/PYmpl +TARGET_py=$TARGET/bin/python + +$TARGET_py -c "import shutil,matplotlib; x=matplotlib.get_configdir(); shutil.rmtree(x)" + +TARGET_easy_install=$TARGET/bin/easy_install + +$TARGET_easy_install sphinx + +cd doc + +$TARGET_py make.py all From e3ba48f2ef0df006d577df8f159571f28ea43adb Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sat, 2 Jan 2010 05:10:08 +0000 Subject: [PATCH 0460/1000] fix docstring svn path=/trunk/matplotlib/; revision=8061 --- test/_buildbot_test.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/_buildbot_test.py b/test/_buildbot_test.py index e1229110ea3d..31122f5215a1 100644 --- a/test/_buildbot_test.py +++ b/test/_buildbot_test.py @@ -1,5 +1,4 @@ -"""This script will install matplotlib to a virtual environment to -faciltate testing.""" +"""This script will test matplotlib in a virtual environment""" import os, glob from _buildbot_util import check_call From 65c69a38b9f138e3bcdb16984a98d9dc2f60f3e4 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sat, 2 Jan 2010 05:20:47 +0000 Subject: [PATCH 0461/1000] buildbot: build docs svn path=/trunk/matplotlib/; revision=8062 --- test/_buildbot_doc.sh | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/test/_buildbot_doc.sh b/test/_buildbot_doc.sh index 3b894c07e909..3e6626042145 100755 --- a/test/_buildbot_doc.sh +++ b/test/_buildbot_doc.sh @@ -2,14 +2,12 @@ set -e TARGET=`pwd`/PYmpl -TARGET_py=$TARGET/bin/python +source $TARGET/bin/activate -$TARGET_py -c "import shutil,matplotlib; x=matplotlib.get_configdir(); shutil.rmtree(x)" +python -c "import shutil,matplotlib; x=matplotlib.get_configdir(); shutil.rmtree(x)" -TARGET_easy_install=$TARGET/bin/easy_install - -$TARGET_easy_install sphinx +easy_install sphinx cd doc -$TARGET_py make.py all +python make.py all From 5e12fa559832f88e514b627de353a99e8cc0fdbd Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Sat, 2 Jan 2010 06:30:15 +0000 Subject: [PATCH 0462/1000] Include contourf examples in documentation svn path=/trunk/matplotlib/; revision=8063 --- lib/matplotlib/contour.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index 7909655ace1e..35878f71a559 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -987,9 +987,8 @@ def set_alpha(self, alpha): signatures and return values are the same for both versions. :func:`~matplotlib.pyplot.contourf` differs from the Matlab - (TM) version in that it does not draw the polygon edges, - because the contouring engine yields simply connected regions - with branch cuts. To draw the edges, add line contours with + (TM) version in that it does not draw the polygon edges. + To draw edges, add line contours with calls to :func:`~matplotlib.pyplot.contour`. @@ -1142,9 +1141,11 @@ def set_alpha(self, alpha): be removed. Chunking introduces artifacts at the chunk boundaries unless *antialiased* is *False*. - **Example:** + **Examples:** .. plot:: mpl_examples/pylab_examples/contour_demo.py + + .. plot:: mpl_examples/pylab_examples/contourf_demo.py """ def find_nearest_contour( self, x, y, indices=None, pixel=True ): From 0a9e8ff4317ca0d142f0c5a8a5b2aaabbb4e15dc Mon Sep 17 00:00:00 2001 From: John Hunter Date: Sun, 3 Jan 2010 18:30:04 +0000 Subject: [PATCH 0463/1000] added qt4_editor dialog svn path=/trunk/matplotlib/; revision=8064 --- CHANGELOG | 2 + LICENSE/LICENSE_QT4_EDITOR | 30 ++ lib/matplotlib/backends/backend_qt4.py | 37 ++ .../backends/qt4_editor/__init__.py | 0 .../backends/qt4_editor/figureoptions.py | 154 ++++++ .../backends/qt4_editor/formlayout.py | 487 ++++++++++++++++++ setup.py | 1 + 7 files changed, 711 insertions(+) create mode 100644 LICENSE/LICENSE_QT4_EDITOR create mode 100644 lib/matplotlib/backends/qt4_editor/__init__.py create mode 100644 lib/matplotlib/backends/qt4_editor/figureoptions.py create mode 100644 lib/matplotlib/backends/qt4_editor/formlayout.py diff --git a/CHANGELOG b/CHANGELOG index 4df4c4fc32e7..49920c26cce5 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +2010-01-03 Added Pierre's qt4 formlayout editor and toolbar button - JDH + 2009-12-31 Add support for using math text as marker symbols (Thanks to tcb) - MGD diff --git a/LICENSE/LICENSE_QT4_EDITOR b/LICENSE/LICENSE_QT4_EDITOR new file mode 100644 index 000000000000..1c9d941973ce --- /dev/null +++ b/LICENSE/LICENSE_QT4_EDITOR @@ -0,0 +1,30 @@ + +Module creating PyQt4 form dialogs/layouts to edit various type of parameters + + +formlayout License Agreement (MIT License) +------------------------------------------ + +Copyright (c) 2009 Pierre Raybaut + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +""" diff --git a/lib/matplotlib/backends/backend_qt4.py b/lib/matplotlib/backends/backend_qt4.py index 564fa35b8ec0..e4dc20b0e3aa 100644 --- a/lib/matplotlib/backends/backend_qt4.py +++ b/lib/matplotlib/backends/backend_qt4.py @@ -12,6 +12,7 @@ from matplotlib.figure import Figure from matplotlib.mathtext import MathTextParser from matplotlib.widgets import SubplotTool +import matplotlib.backends.qt4_editor.figureoptions as figureoptions try: from PyQt4 import QtCore, QtGui, Qt @@ -330,10 +331,16 @@ def _init_toolbar(self): a = self.addAction(self._icon('subplots.png'), 'Subplots', self.configure_subplots) a.setToolTip('Configure subplots') + + a = self.addAction(self._icon("qt4_editor_options.svg"), + 'Customize', self.edit_parameters) + a.setToolTip('Edit curves line and axes parameters') + a = self.addAction(self._icon('filesave.svg'), 'Save', self.save_figure) a.setToolTip('Save the figure') + self.buttons = {} # Add the x,y location widget at the right side of the toolbar @@ -352,6 +359,36 @@ def _init_toolbar(self): # reference holder for subplots_adjust window self.adj_window = None + def edit_parameters(self): + allaxes = self.canvas.figure.get_axes() + if len(allaxes) == 1: + axes = allaxes[0] + else: + titles = [] + for axes in allaxes: + title = axes.get_title() + ylabel = axes.get_ylabel() + if title: + text = title + if ylabel: + text += ": "+ylabel + text += " (%s)" + elif ylabel: + text = "%s (%s)" % ylabel + else: + text = "%s" + titles.append(text % repr(axes)) + item, ok = QtGui.QInputDialog.getItem(self, 'Customize', + 'Select axes:', titles, + 0, False) + if ok: + axes = allaxes[titles.index(unicode(item))] + else: + return + + figureoptions.figure_edit(axes, self) + + def dynamic_update( self ): self.canvas.draw() diff --git a/lib/matplotlib/backends/qt4_editor/__init__.py b/lib/matplotlib/backends/qt4_editor/__init__.py new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/lib/matplotlib/backends/qt4_editor/figureoptions.py b/lib/matplotlib/backends/qt4_editor/figureoptions.py new file mode 100644 index 000000000000..457e2f4b76d5 --- /dev/null +++ b/lib/matplotlib/backends/qt4_editor/figureoptions.py @@ -0,0 +1,154 @@ +# -*- coding: utf-8 -*- +# +# Copyright © 2009 Pierre Raybaut +# Licensed under the terms of the MIT License +# see the mpl licenses directory for a copy of the license + +"""Module that provides a GUI-based editor for matplotlib's figure options""" + +import os.path as osp + +import matplotlib.backends.qt4_editor.formlayout as formlayout +from PyQt4.QtGui import QIcon + +def get_icon(name): + import matplotlib + basedir = osp.join(matplotlib.rcParams['datapath'], 'images') + return QIcon(osp.join(basedir, name)) + +LINESTYLES = { + '-': 'Solid', + '--': 'Dashed', + '-.': 'DashDot', + ':': 'Dotted', + 'steps': 'Steps', + 'none': 'None', + } + +MARKERS = { + 'none': 'None', + 'o': 'circles', + '^': 'triangle_up', + 'v': 'triangle_down', + '<': 'triangle_left', + '>': 'triangle_right', + 's': 'square', + '+': 'plus', + 'x': 'cross', + '*': 'star', + 'D': 'diamond', + 'd': 'thin_diamond', + '1': 'tripod_down', + '2': 'tripod_up', + '3': 'tripod_left', + '4': 'tripod_right', + 'h': 'hexagon', + 'H': 'rotated_hexagon', + 'p': 'pentagon', + '|': 'vertical_line', + '_': 'horizontal_line', + '.': 'dots', + } + +COLORS = {'b': '#0000ff', 'g': '#00ff00', 'r': '#ff0000', 'c': '#ff00ff', + 'm': '#ff00ff', 'y': '#ffff00', 'k': '#000000', 'w': '#ffffff'} + +def col2hex(color): + """Convert matplotlib color to hex""" + return COLORS.get(color, color) + +def figure_edit(axes, parent=None): + """Edit matplotlib figure options""" + sep = (None, None) # separator + + has_curve = len(axes.get_lines()) > 0 + + # Get / General + xmin, xmax = axes.get_xlim() + ymin, ymax = axes.get_ylim() + general = [('Title', axes.get_title()), + sep, + (None, "X-Axis"), + ('Min', xmin), ('Max', xmax), + ('Label', axes.get_xlabel()), + ('Scale', [axes.get_xscale(), 'linear', 'log']), + sep, + (None, "Y-Axis"), + ('Min', ymin), ('Max', ymax), + ('Label', axes.get_ylabel()), + ('Scale', [axes.get_yscale(), 'linear', 'log']) + ] + + if has_curve: + # Get / Curves + linedict = {} + for line in axes.get_lines(): + label = line.get_label() + if label == '_nolegend_': + continue + linedict[label] = line + curves = [] + linestyles = LINESTYLES.items() + markers = MARKERS.items() + curvelabels = sorted(linedict.keys()) + for label in curvelabels: + line = linedict[label] + curvedata = [ + ('Label', label), + sep, + (None, 'Line'), + ('Style', [line.get_linestyle()] + linestyles), + ('Width', line.get_linewidth()), + ('Color', col2hex(line.get_color())), + sep, + (None, 'Marker'), + ('Style', [line.get_marker()] + markers), + ('Size', line.get_markersize()), + ('Facecolor', col2hex(line.get_markerfacecolor())), + ('Edgecolor', col2hex(line.get_markeredgecolor())), + ] + curves.append([curvedata, label, ""]) + + datalist = [(general, "Axes", "")] + if has_curve: + datalist.append((curves, "Curves", "")) + result = formlayout.fedit(datalist, title="Figure options", parent=parent, + icon=get_icon('qt4_editor_options.svg')) + if result is None: + return + + if has_curve: + general, curves = result + else: + general, = result + + # Set / General + title, xmin, xmax, xlabel, xscale, ymin, ymax, ylabel, yscale = general + axes.set_xscale(xscale) + axes.set_yscale(yscale) + axes.set_title(title) + axes.set_xlim(xmin, xmax) + axes.set_xlabel(xlabel) + axes.set_ylim(ymin, ymax) + axes.set_ylabel(ylabel) + + if has_curve: + # Set / Curves + for index, curve in enumerate(curves): + line = linedict[curvelabels[index]] + label, linestyle, linewidth, color, \ + marker, markersize, markerfacecolor, markeredgecolor = curve + line.set_label(label) + line.set_linestyle(linestyle) + line.set_linewidth(linewidth) + line.set_color(color) + if marker is not 'none': + line.set_marker(marker) + line.set_markersize(markersize) + line.set_markerfacecolor(markerfacecolor) + line.set_markeredgecolor(markeredgecolor) + + # Redraw + figure = axes.get_figure() + figure.canvas.draw() + diff --git a/lib/matplotlib/backends/qt4_editor/formlayout.py b/lib/matplotlib/backends/qt4_editor/formlayout.py new file mode 100644 index 000000000000..ef34562e1be4 --- /dev/null +++ b/lib/matplotlib/backends/qt4_editor/formlayout.py @@ -0,0 +1,487 @@ +# -*- coding: utf-8 -*- +""" +formlayout +========== + +Module creating PyQt4 form dialogs/layouts to edit various type of parameters + + +formlayout License Agreement (MIT License) +------------------------------------------ + +Copyright (c) 2009 Pierre Raybaut + +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. +""" + +__version__ = '1.0.5' +__license__ = __doc__ + +DEBUG = False + +import sys +STDERR = sys.stderr + +try: + from PyQt4.QtGui import QFormLayout +except ImportError: + raise ImportError, "Warning: formlayout requires PyQt4 >v4.3" + +from PyQt4.QtGui import (QWidget, QLineEdit, QComboBox, QLabel, QSpinBox, QIcon, + QStyle, QDialogButtonBox, QHBoxLayout, QVBoxLayout, + QDialog, QColor, QPushButton, QCheckBox, QColorDialog, + QPixmap, QTabWidget, QApplication, QStackedWidget, + QDateEdit, QDateTimeEdit, QFont, QFontComboBox, + QFontDatabase, QGridLayout) +from PyQt4.QtCore import (Qt, SIGNAL, SLOT, QSize, QString, + pyqtSignature, pyqtProperty) +from datetime import date + + +class ColorButton(QPushButton): + """ + Color choosing push button + """ + __pyqtSignals__ = ("colorChanged(QColor)",) + + def __init__(self, parent=None): + QPushButton.__init__(self, parent) + self.setFixedSize(20, 20) + self.setIconSize(QSize(12, 12)) + self.connect(self, SIGNAL("clicked()"), self.chooseColor) + self._color = QColor() + + def chooseColor(self): + rgba, valid = QColorDialog.getRgba(self._color.rgba(), + self.parentWidget()) + if valid: + color = QColor.fromRgba(rgba) + self.setColor(color) + + def color(self): + return self._color + + @pyqtSignature("QColor") + def setColor(self, color): + if color != self._color: + self._color = color + self.emit(SIGNAL("colorChanged(QColor)"), self._color) + pixmap = QPixmap(self.iconSize()) + pixmap.fill(color) + self.setIcon(QIcon(pixmap)) + + color = pyqtProperty("QColor", color, setColor) + + +def text_to_qcolor(text): + """ + Create a QColor from specified string + Avoid warning from Qt when an invalid QColor is instantiated + """ + color = QColor() + if isinstance(text, QString): + text = str(text) + if not isinstance(text, (unicode, str)): + return color + if text.startswith('#') and len(text)==7: + correct = '#0123456789abcdef' + for char in text: + if char.lower() not in correct: + return color + elif text not in list(QColor.colorNames()): + return color + color.setNamedColor(text) + return color + + +class ColorLayout(QHBoxLayout): + """Color-specialized QLineEdit layout""" + def __init__(self, color, parent=None): + QHBoxLayout.__init__(self) + assert isinstance(color, QColor) + self.lineedit = QLineEdit(color.name(), parent) + self.connect(self.lineedit, SIGNAL("textChanged(QString)"), + self.update_color) + self.addWidget(self.lineedit) + self.colorbtn = ColorButton(parent) + self.colorbtn.color = color + self.connect(self.colorbtn, SIGNAL("colorChanged(QColor)"), + self.update_text) + self.addWidget(self.colorbtn) + + def update_color(self, text): + color = text_to_qcolor(text) + if color.isValid(): + self.colorbtn.color = color + + def update_text(self, color): + self.lineedit.setText(color.name()) + + def text(self): + return self.lineedit.text() + + +def font_is_installed(font): + """Check if font is installed""" + return [fam for fam in QFontDatabase().families() if unicode(fam)==font] + +def tuple_to_qfont(tup): + """ + Create a QFont from tuple: + (family [string], size [int], italic [bool], bold [bool]) + """ + if not isinstance(tup, tuple) or len(tup) != 4 \ + or not font_is_installed(tup[0]) \ + or not isinstance(tup[1], int) \ + or not isinstance(tup[2], bool) \ + or not isinstance(tup[3], bool): + return None + font = QFont() + family, size, italic, bold = tup + font.setFamily(family) + font.setPointSize(size) + font.setItalic(italic) + font.setBold(bold) + return font + +def qfont_to_tuple(font): + return (unicode(font.family()), int(font.pointSize()), + font.italic(), font.bold()) + + +class FontLayout(QGridLayout): + """Font selection""" + def __init__(self, value, parent=None): + QGridLayout.__init__(self) + font = tuple_to_qfont(value) + assert font is not None + + # Font family + self.family = QFontComboBox(parent) + self.family.setCurrentFont(font) + self.addWidget(self.family, 0, 0, 1, -1) + + # Font size + self.size = QComboBox(parent) + self.size.setEditable(True) + sizelist = range(6, 12) + range(12, 30, 2) + [36, 48, 72] + size = font.pointSize() + if size not in sizelist: + sizelist.append(size) + sizelist.sort() + self.size.addItems([str(s) for s in sizelist]) + self.size.setCurrentIndex(sizelist.index(size)) + self.addWidget(self.size, 1, 0) + + # Italic or not + self.italic = QCheckBox(self.tr("Italic"), parent) + self.italic.setChecked(font.italic()) + self.addWidget(self.italic, 1, 1) + + # Bold or not + self.bold = QCheckBox(self.tr("Bold"), parent) + self.bold.setChecked(font.bold()) + self.addWidget(self.bold, 1, 2) + + def get_font(self): + font = self.family.currentFont() + font.setItalic(self.italic.isChecked()) + font.setBold(self.bold.isChecked()) + font.setPointSize(int(self.size.currentText())) + return qfont_to_tuple(font) + + +class FormWidget(QWidget): + def __init__(self, data, comment="", parent=None): + super(FormWidget, self).__init__(parent) + from copy import deepcopy + self.data = deepcopy(data) + self.widgets = [] + self.formlayout = QFormLayout(self) + if comment: + self.formlayout.addRow(QLabel(comment)) + self.formlayout.addRow(QLabel(" ")) + if DEBUG: + print "\n"+("*"*80) + print "DATA:", self.data + print "*"*80 + print "COMMENT:", comment + print "*"*80 + self.setup() + + def setup(self): + for label, value in self.data: + if DEBUG: + print "value:", value + if label is None and value is None: + # Separator: (None, None) + self.formlayout.addRow(QLabel(" "), QLabel(" ")) + self.widgets.append(None) + continue + elif label is None: + # Comment + self.formlayout.addRow(QLabel(value)) + self.widgets.append(None) + continue + elif tuple_to_qfont(value) is not None: + field = FontLayout(value, self) + elif text_to_qcolor(value).isValid(): + field = ColorLayout(QColor(value), self) + elif isinstance(value, (str, unicode)): + field = QLineEdit(value, self) + elif isinstance(value, (list, tuple)): + selindex = value.pop(0) + field = QComboBox(self) + if isinstance(value[0], (list, tuple)): + keys = [ key for key, _val in value ] + value = [ val for _key, val in value ] + else: + keys = value + field.addItems(value) + if selindex in value: + selindex = value.index(selindex) + elif selindex in keys: + selindex = keys.index(selindex) + elif not isinstance(selindex, int): + print >>STDERR, "Warning: '%s' index is invalid (label: " \ + "%s, value: %s)" % (selindex, label, value) + selindex = 0 + field.setCurrentIndex(selindex) + elif isinstance(value, bool): + field = QCheckBox(self) + field.setCheckState(Qt.Checked if value else Qt.Unchecked) + elif isinstance(value, float): + field = QLineEdit(repr(value), self) + elif isinstance(value, int): + field = QSpinBox(self) + field.setValue(value) + field.setMaximum(1e9) + elif isinstance(value, date): + if hasattr(value, 'hour'): + field = QDateTimeEdit(self) + field.setDateTime(value) + else: + field = QDateEdit(self) + field.setDate(value) + else: + field = QLineEdit(repr(value), self) + self.formlayout.addRow(label, field) + self.widgets.append(field) + + def get(self): + valuelist = [] + for index, (label, value) in enumerate(self.data): + field = self.widgets[index] + if label is None: + # Separator / Comment + continue + elif tuple_to_qfont(value) is not None: + value = field.get_font() + elif isinstance(value, (str, unicode)): + value = unicode(field.text()) + elif isinstance(value, (list, tuple)): + index = int(field.currentIndex()) + if isinstance(value[0], (list, tuple)): + value = value[index][0] + else: + value = value[index] + elif isinstance(value, bool): + value = field.checkState() == Qt.Checked + elif isinstance(value, float): + value = float(field.text()) + elif isinstance(value, int): + value = int(field.value()) + elif isinstance(value, date): + if hasattr(value, 'hour'): + value = field.dateTime().toPyDateTime() + else: + value = field.date().toPyDate() + else: + value = eval(str(field.text())) + valuelist.append(value) + return valuelist + + +class FormComboWidget(QWidget): + def __init__(self, datalist, comment="", parent=None): + super(FormComboWidget, self).__init__(parent) + layout = QVBoxLayout() + self.setLayout(layout) + self.combobox = QComboBox() + layout.addWidget(self.combobox) + + self.stackwidget = QStackedWidget(self) + layout.addWidget(self.stackwidget) + self.connect(self.combobox, SIGNAL("currentIndexChanged(int)"), + self.stackwidget, SLOT("setCurrentIndex(int)")) + + self.widgetlist = [] + for data, title, comment in datalist: + self.combobox.addItem(title) + widget = FormWidget(data, comment=comment, parent=self) + self.stackwidget.addWidget(widget) + self.widgetlist.append(widget) + + def get(self): + return [ widget.get() for widget in self.widgetlist] + + +class FormTabWidget(QWidget): + def __init__(self, datalist, comment="", parent=None): + super(FormTabWidget, self).__init__(parent) + layout = QVBoxLayout() + self.tabwidget = QTabWidget() + layout.addWidget(self.tabwidget) + self.setLayout(layout) + self.widgetlist = [] + for data, title, comment in datalist: + if len(data[0])==3: + widget = FormComboWidget(data, comment=comment, parent=self) + else: + widget = FormWidget(data, comment=comment, parent=self) + index = self.tabwidget.addTab(widget, title) + self.tabwidget.setTabToolTip(index, comment) + self.widgetlist.append(widget) + + def get(self): + return [ widget.get() for widget in self.widgetlist] + + +class FormDialog(QDialog): + """Form Dialog""" + def __init__(self, data, title="", comment="", + icon=None, parent=None): + super(FormDialog, self).__init__(parent) + + # Form + if isinstance(data[0][0], (list, tuple)): + self.formwidget = FormTabWidget(data, comment=comment, + parent=self) + elif len(data[0])==3: + self.formwidget = FormComboWidget(data, comment=comment, + parent=self) + else: + self.formwidget = FormWidget(data, comment=comment, + parent=self) + layout = QVBoxLayout() + layout.addWidget(self.formwidget) + + # Button box + bbox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) + self.connect(bbox, SIGNAL("accepted()"), SLOT("accept()")) + self.connect(bbox, SIGNAL("rejected()"), SLOT("reject()")) + layout.addWidget(bbox) + + self.setLayout(layout) + + self.setWindowTitle(title) + if not isinstance(icon, QIcon): + icon = QWidget().style().standardIcon(QStyle.SP_MessageBoxQuestion) + self.setWindowIcon(icon) + + def accept(self): + self.data = self.formwidget.get() + QDialog.accept(self) + + def reject(self): + self.data = None + QDialog.reject(self) + + def get(self): + """Return form result""" + return self.data + + +def fedit(data, title="", comment="", icon=None, parent=None): + """ + Create form dialog and return result + (if Cancel button is pressed, return None) + + data: datalist, datagroup + + datalist: list/tuple of (field_name, field_value) + datagroup: list/tuple of (datalist *or* datagroup, title, comment) + + -> one field for each member of a datalist + -> one tab for each member of a top-level datagroup + -> one page (of a multipage widget, each page can be selected with a combo + box) for each member of a datagroup inside a datagroup + + Supported types for field_value: + - int, float, str, unicode, bool + - colors: in Qt-compatible text form, i.e. in hex format or name (red,...) + (automatically detected from a string) + - list/tuple: + * the first element will be the selected index (or value) + * the other elements can be couples (key, value) or only values + """ + + # Create a QApplication instance if no instance currently exists + # (e.g. if the module is used directly from the interpreter) + if QApplication.startingUp(): + QApplication([]) + + dialog = FormDialog(data, title, comment, icon, parent) + if dialog.exec_(): + return dialog.get() + + + +if __name__ == "__main__": + + def create_datalist_example(): + return [('str', 'this is a string'), + ('list', [0, '1', '3', '4']), + ('list2', ['--', ('none', 'None'), ('--', 'Dashed'), + ('-.', 'DashDot'), ('-', 'Solid'), + ('steps', 'Steps'), (':', 'Dotted')]), + ('float', 1.2), + (None, 'Other:'), + ('int', 12), + ('font', ('Arial', 10, False, True)), + ('color', '#123409'), + ('bool', True), + ('datetime', date(2010, 10, 10)), + ] + + def create_datagroup_example(): + datalist = create_datalist_example() + return ((datalist, "Category 1", "Category 1 comment"), + (datalist, "Category 2", "Category 2 comment"), + (datalist, "Category 3", "Category 3 comment")) + + #--------- datalist example + datalist = create_datalist_example() + print "result:", fedit(datalist, title="Example", + comment="This is just an example.") + + #--------- datagroup example + datagroup = create_datagroup_example() + print "result:", fedit(datagroup, "Global title") + + #--------- datagroup inside a datagroup example + datalist = create_datalist_example() + datagroup = create_datagroup_example() + print "result:", fedit(((datagroup, "Title 1", "Tab 1 comment"), + (datalist, "Title 2", "Tab 2 comment"), + (datalist, "Title 3", "Tab 3 comment")), + "Global title") diff --git a/setup.py b/setup.py index 96cd1f364520..ea8f514bb4e8 100644 --- a/setup.py +++ b/setup.py @@ -49,6 +49,7 @@ packages = [ 'matplotlib', 'matplotlib.backends', + 'matplotlib.backends.qt4_editor', 'matplotlib.projections', 'matplotlib.testing', 'matplotlib.testing.jpl_units', From 0bf23f260b61fcdae424edf0ea013b21dddec5cb Mon Sep 17 00:00:00 2001 From: John Hunter Date: Sun, 3 Jan 2010 21:07:05 +0000 Subject: [PATCH 0464/1000] add qt editor icon svn path=/trunk/matplotlib/; revision=8065 --- .../mpl-data/images/qt4_editor_options.svg | 106 ++++++++++++++++++ 1 file changed, 106 insertions(+) create mode 100644 lib/matplotlib/mpl-data/images/qt4_editor_options.svg diff --git a/lib/matplotlib/mpl-data/images/qt4_editor_options.svg b/lib/matplotlib/mpl-data/images/qt4_editor_options.svg new file mode 100644 index 000000000000..b0d5c3186e4f --- /dev/null +++ b/lib/matplotlib/mpl-data/images/qt4_editor_options.svg @@ -0,0 +1,106 @@ + + + + + + + + + + + + + + + + image/svg+xml + + + + + + + + + + From 8cd0afdabcb2abc242b63e8b2d938aea6a8148c6 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Mon, 4 Jan 2010 02:22:26 +0000 Subject: [PATCH 0465/1000] Added rcParams['axes.color_cycle'] svn path=/trunk/matplotlib/; revision=8066 --- CHANGELOG | 2 ++ doc/api/api_changes.rst | 6 +++- examples/api/color_cycle.py | 2 +- lib/matplotlib/axes.py | 55 ++++++++++++++----------------------- lib/matplotlib/rcsetup.py | 11 ++++++++ matplotlibrc.template | 18 +++++++----- 6 files changed, 50 insertions(+), 44 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 49920c26cce5..58048202065e 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +2010-01-03 Added rcParams['axes.color_cycle'] - EF + 2010-01-03 Added Pierre's qt4 formlayout editor and toolbar button - JDH 2009-12-31 Add support for using math text as marker symbols (Thanks to tcb) diff --git a/doc/api/api_changes.rst b/doc/api/api_changes.rst index 8a6f20057d3c..3df460abc478 100644 --- a/doc/api/api_changes.rst +++ b/doc/api/api_changes.rst @@ -10,7 +10,11 @@ list may help describe what changes may be necessary in your code. Changes beyond 0.99.x ===================== -* You can now print several figures to one pdf file and modify the +* There is a new rc parameter ``axes.color_cycle``, and the color + cycle is now independent of the rc parameter ``lines.color``. + :func:`matplotlib.Axes.set_default_color_cycle` is deprecated. + +* You can now print several figures to one pdf file and modify the document information dictionary of a pdf file. See the docstrings of the class :class:`matplotlib.backends.backend_pdf.PdfPages` for more information. diff --git a/examples/api/color_cycle.py b/examples/api/color_cycle.py index b0482b9457cb..6b2abe873cd2 100644 --- a/examples/api/color_cycle.py +++ b/examples/api/color_cycle.py @@ -13,7 +13,7 @@ mpl.rc('lines', linewidth=4) fig = plt.figure() -mpl.axes.set_default_color_cycle(['r', 'g', 'b', 'c']) +mpl.rcParams['axes.color_cycle'] = ['r', 'g', 'b', 'c'] ax = fig.add_subplot(2,1,1) ax.plot(yy) ax.set_title('Changed default color cycle to rgbc') diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index 1bfab1f48c27..f0ebf40abab0 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -1,5 +1,7 @@ from __future__ import division, generators import math, sys, warnings, datetime, new +from operator import itemgetter +import itertools import numpy as np from numpy import ma @@ -31,7 +33,6 @@ import matplotlib.ticker as mticker import matplotlib.transforms as mtransforms -from operator import itemgetter iterable = cbook.iterable is_string_like = cbook.is_string_like @@ -115,11 +116,18 @@ def set_default_color_cycle(clist): :class:`Axes` to which it will apply; it will apply to all future axes. - *clist* is a sequence of mpl color specifiers + *clist* is a sequence of mpl color specifiers. + + See also: :meth:`~matplotlib.axes.Axes.set_color_cycle`. + + .. Note:: Deprecated 2010/01/03. + Set rcParams['axes.color_cycle'] directly. """ - _process_plot_var_args.defaultColors = clist[:] - rcParams['lines.color'] = clist[0] + rcParams['axes.color_cycle'] = clist + warnings.warn("Set rcParams['axes.color_cycle'] directly", + DeprecationWarning) + class _process_plot_var_args: """ @@ -134,42 +142,18 @@ class _process_plot_var_args: an arbitrary number of *x*, *y*, *fmt* are allowed """ - - defaultColors = ['b','g','r','c','m','y','k'] def __init__(self, axes, command='plot'): self.axes = axes self.command = command - self._clear_color_cycle() - - def _clear_color_cycle(self): - self.colors = _process_plot_var_args.defaultColors[:] - # if the default line color is a color format string, move it up - # in the que - try: - ind = self.colors.index(rcParams['lines.color']) - except ValueError: - self.firstColor = rcParams['lines.color'] - else: - self.colors[0], self.colors[ind] = self.colors[ind], self.colors[0] - self.firstColor = self.colors[0] - - self.Ncolors = len(self.colors) + self.set_color_cycle() - self.count = 0 - - def set_color_cycle(self, clist): - self.colors = clist[:] - self.firstColor = self.colors[0] - self.Ncolors = len(self.colors) - self.count = 0 + def set_color_cycle(self, clist=None): + if clist is None: + clist = rcParams['axes.color_cycle'] + self._colors = itertools.cycle(clist) def _get_next_cycle_color(self): - if self.count==0: - color = self.firstColor - else: - color = self.colors[int(self.count % self.Ncolors)] - self.count += 1 - return color + return self._colors.next() def __call__(self, *args, **kwargs): @@ -907,9 +891,10 @@ def set_color_cycle(self, clist): """ Set the color cycle for any future plot commands on this Axes. - clist is a list of mpl color specifiers. + *clist* is a list of mpl color specifiers. """ self._get_lines.set_color_cycle(clist) + self._get_patches_for_fill.set_color_cycle(clist) def ishold(self): diff --git a/lib/matplotlib/rcsetup.py b/lib/matplotlib/rcsetup.py index 01aeaba4dfb7..70e2c0efaa96 100644 --- a/lib/matplotlib/rcsetup.py +++ b/lib/matplotlib/rcsetup.py @@ -207,6 +207,14 @@ def validate_color(s): raise ValueError('%s does not look like a color arg%s'%(s, msg)) +def validate_colorlist(s): + 'return a list of colorspecs' + if type(s) is str: + return [validate_color(c.strip()) for c in s.split(',')] + else: + assert type(s) in [list, tuple] + return [validate_color(c) for c in s] + def validate_stringlist(s): 'return a list' if type(s) is str: @@ -440,6 +448,9 @@ def __call__(self, s): # of the axis range is smaller than the # first or larger than the second 'axes.unicode_minus' : [True, validate_bool], + 'axes.color_cycle' : [['b','g','r','c','m','y','k'], + validate_colorlist], # cycle of plot + # line colors 'polaraxes.grid' : [True, validate_bool], # display polar grid or not 'axes3d.grid' : [True, validate_bool], # display 3d grid diff --git a/matplotlibrc.template b/matplotlibrc.template index 576e9914de94..9da3378e932d 100644 --- a/matplotlibrc.template +++ b/matplotlibrc.template @@ -161,11 +161,11 @@ backend : %(backend)s #text.markup : 'plain' # Affects how text, such as titles and labels, are # interpreted by default. # 'plain': As plain, unformatted text - # 'tex': As TeX-like text. Text between $'s will be - # formatted as a TeX math expression. - # This setting has no effect when text.usetex is True. - # In that case, all text will be sent to TeX for - # processing. + # 'tex': As TeX-like text. Text between $'s will be + # formatted as a TeX math expression. + # This setting has no effect when text.usetex is True. + # In that case, all text will be sent to TeX for + # processing. #text.hinting : True # If True, text will be hinted, otherwise not. This only # affects the Agg backend. @@ -184,8 +184,8 @@ backend : %(backend)s #mathtext.fontset : cm # Should be 'cm' (Computer Modern), 'stix', # 'stixsans' or 'custom' #mathtext.fallback_to_cm : True # When True, use symbols from the Computer Modern - # fonts when a symbol can not be found in one of - # the custom math fonts. + # fonts when a symbol can not be found in one of + # the custom math fonts. #mathtext.default : it # The default font to use for math. # Can be any of the LaTeX font names, including @@ -211,6 +211,10 @@ backend : %(backend)s # first or larger than the second #axes.unicode_minus : True # use unicode for the minus symbol # rather than hypen. See http://en.wikipedia.org/wiki/Plus_sign#Plus_sign +#axes.color_cycle : b, g, r, c, m, y, k # color cycle for plot lines + # as list of string colorspecs: + # single letter, long name, or + # web-style hex #polaraxes.grid : True # display grid on polar axes #axes3d.grid : True # display grid on 3d axes From ca66d11425787556b66ca5fe0d5a740e6dfb05da Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Mon, 4 Jan 2010 04:30:24 +0000 Subject: [PATCH 0466/1000] Remove unnecessary private method. svn path=/trunk/matplotlib/; revision=8067 --- lib/matplotlib/axes.py | 17 +++++++---------- 1 file changed, 7 insertions(+), 10 deletions(-) diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index f0ebf40abab0..241470ff9ccf 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -150,10 +150,7 @@ def __init__(self, axes, command='plot'): def set_color_cycle(self, clist=None): if clist is None: clist = rcParams['axes.color_cycle'] - self._colors = itertools.cycle(clist) - - def _get_next_cycle_color(self): - return self._colors.next() + self.color_cycle = itertools.cycle(clist) def __call__(self, *args, **kwargs): @@ -225,7 +222,7 @@ def _xy_from_xy(self, x, y): def _makeline(self, x, y, kw, kwargs): kw = kw.copy() # Don't modify the original kw. if not 'color' in kw: - kw['color'] = self._get_next_cycle_color() + kw['color'] = self.color_cycle.next() # (can't use setdefault because it always evaluates # its second argument) seg = mlines.Line2D(x, y, @@ -239,7 +236,7 @@ def _makefill(self, x, y, kw, kwargs): try: facecolor = kw['color'] except KeyError: - facecolor = self._get_next_cycle_color() + facecolor = self.color_cycle.next() seg = mpatches.Polygon(np.hstack( (x[:,np.newaxis],y[:,np.newaxis])), facecolor = facecolor, @@ -4866,7 +4863,7 @@ def xywhere(xs, ys, mask): if ecolor is None: if l0 is None: - ecolor = self._get_lines._get_next_cycle_color() + ecolor = self._get_lines.color_cycle.next() else: ecolor = l0.get_color() @@ -7163,7 +7160,7 @@ def hist(self, x, bins=10, range=None, normed=False, weights=None, if orientation == 'horizontal': for m in n: - color = self._get_lines._get_next_cycle_color() + color = self._get_lines.color_cycle.next() patch = self.barh(bins[:-1]+boffset, m, height=width, left=bottom, align='center', log=log, color=color) @@ -7174,7 +7171,7 @@ def hist(self, x, bins=10, range=None, normed=False, weights=None, boffset += dw elif orientation == 'vertical': for m in n: - color = self._get_lines._get_next_cycle_color() + color = self._get_lines.color_cycle.next() patch = self.bar(bins[:-1]+boffset, m, width=width, bottom=bottom, align='center', log=log, color=color) @@ -7219,7 +7216,7 @@ def hist(self, x, bins=10, range=None, normed=False, weights=None, elif orientation != 'vertical': raise ValueError, 'invalid orientation: %s' % orientation - color = self._get_lines._get_next_cycle_color() + color = self._get_lines.color_cycle.next() if fill: patches.append( self.fill(x, y, closed=False, facecolor=color) ) From 18fa52f24fe2d46642e60e0c3409d26b025557b6 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 4 Jan 2010 14:27:02 +0000 Subject: [PATCH 0467/1000] Merged revisions 8068 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r8068 | mdboom | 2010-01-04 09:14:38 -0500 (Mon, 04 Jan 2010) | 2 lines Fix bug in PDF, PS, SVG and OS-X backends: do not simplify filled paths. ........ svn path=/trunk/matplotlib/; revision=8069 --- lib/matplotlib/backends/backend_pdf.py | 16 +++++--- lib/matplotlib/backends/backend_ps.py | 21 ++++++---- lib/matplotlib/backends/backend_svg.py | 27 +++++++------ src/_macosx.m | 54 +++++++++++++------------- 4 files changed, 66 insertions(+), 52 deletions(-) diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index 729f5b612820..6c7943034cba 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -1068,7 +1068,8 @@ def writeHatches(self): # an API change self.output(*self.pathOperations( Path.hatch(hatch_style[2]), - Affine2D().scale(sidelen))) + Affine2D().scale(sidelen), + simplify=False)) self.output(Op.stroke) self.endStream() @@ -1192,7 +1193,7 @@ def writeImages(self): def markerObject(self, path, trans, fillp, lw): """Return name of a marker XObject representing the given path.""" - pathops = self.pathOperations(path, trans) + pathops = self.pathOperations(path, trans, simplify=False) key = (tuple(pathops), bool(fillp)) result = self.markers.get(key) if result is None: @@ -1221,10 +1222,11 @@ def writeMarkers(self): self.endStream() @staticmethod - def pathOperations(path, transform, clip=None): + def pathOperations(path, transform, clip=None, simplify=None): cmds = [] last_points = None - for points, code in path.iter_segments(transform, clip=clip): + for points, code in path.iter_segments(transform, clip=clip, + simplify=simplify): if code == Path.MOVETO: # This is allowed anywhere in the path cmds.extend(points) @@ -1250,9 +1252,11 @@ def pathOperations(path, transform, clip=None): def writePath(self, path, transform, clip=False): if clip: clip = (0.0, 0.0, self.width * 72, self.height * 72) + simplify = path.should_simplify else: clip = None - cmds = self.pathOperations(path, transform, clip) + simplify = False + cmds = self.pathOperations(path, transform, clip, simplify=simplify) self.output(*cmds) def reserveObject(self, name=''): @@ -1969,7 +1973,7 @@ def clip_cmd(self, cliprect, clippath): if self._clippath != clippath: path, affine = clippath.get_transformed_path_and_affine() cmds.extend( - PdfFile.pathOperations(path, affine) + + PdfFile.pathOperations(path, affine, simplify=False) + [Op.clip, Op.endpath]) return cmds diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py index 7d9a7bed834a..a1366b3602ee 100644 --- a/lib/matplotlib/backends/backend_ps.py +++ b/lib/matplotlib/backends/backend_ps.py @@ -251,7 +251,8 @@ def create_hatch(self, hatch): 0 setlinewidth """ % locals()) self._pswriter.write( - self._convert_path(Path.hatch(hatch), Affine2D().scale(72.0))) + self._convert_path(Path.hatch(hatch), Affine2D().scale(72.0), + simplify=False)) self._pswriter.write("""\ stroke } bind @@ -457,7 +458,7 @@ def draw_image(self, gc, x, y, im, dx=None, dy=None, transform=None): # unflip im.flipud_out() - def _convert_path(self, path, transform, clip=False): + def _convert_path(self, path, transform, clip=False, simplify=None): ps = [] last_points = None if clip: @@ -465,7 +466,8 @@ def _convert_path(self, path, transform, clip=False): self.height * 72.0) else: clip = None - for points, code in path.iter_segments(transform, clip=clip): + for points, code in path.iter_segments(transform, clip=clip, + simplify=simplify): if code == Path.MOVETO: ps.append("%g %g m" % tuple(points)) elif code == Path.LINETO: @@ -488,7 +490,8 @@ def _get_clip_path(self, clippath, clippath_transform): if id is None: id = 'c%x' % len(self._clip_paths) ps_cmd = ['/%s {' % id] - ps_cmd.append(self._convert_path(clippath, clippath_transform)) + ps_cmd.append(self._convert_path(clippath, clippath_transform, + simplify=False)) ps_cmd.extend(['clip', 'newpath', '} bind def\n']) self._pswriter.write('\n'.join(ps_cmd)) self._clip_paths[(clippath, clippath_transform)] = id @@ -498,9 +501,10 @@ def draw_path(self, gc, path, transform, rgbFace=None): """ Draws a Path instance using the given affine transform. """ + clip = (rgbFace is None and gc.get_hatch_path() is None) + simplify = path.should_simplify and clip ps = self._convert_path( - path, transform, - clip=(rgbFace is None and gc.get_hatch_path() is None)) + path, transform, clip=clip, simplify=simplify) self._draw_ps(ps, gc, rgbFace) def draw_markers(self, gc, marker_path, marker_trans, path, trans, rgbFace=None): @@ -521,7 +525,8 @@ def draw_markers(self, gc, marker_path, marker_trans, path, trans, rgbFace=None) # construct the generic marker command: ps_cmd = ['/o {', 'gsave', 'newpath', 'translate'] # dont want the translate to be global - ps_cmd.append(self._convert_path(marker_path, marker_trans)) + ps_cmd.append(self._convert_path(marker_path, marker_trans, + simplify=False)) if rgbFace: ps_cmd.extend(['gsave', ps_color, 'fill', 'grestore']) @@ -547,7 +552,7 @@ def draw_path_collection(self, gc, master_transform, paths, all_transforms, name = 'p%x_%x' % (self._path_collection_id, i) ps_cmd = ['/%s {' % name, 'newpath', 'translate'] - ps_cmd.append(self._convert_path(path, transform)) + ps_cmd.append(self._convert_path(path, transform, simplify=False)) ps_cmd.extend(['} bind def\n']) write('\n'.join(ps_cmd)) path_codes.append(name) diff --git a/lib/matplotlib/backends/backend_svg.py b/lib/matplotlib/backends/backend_svg.py index e0be67e90f76..423332bcaedf 100644 --- a/lib/matplotlib/backends/backend_svg.py +++ b/lib/matplotlib/backends/backend_svg.py @@ -108,7 +108,8 @@ def _get_hatch(self, gc, rgbFace): self._svgwriter.write(' width="%d" height="%d" >\n' % (HATCH_SIZE, HATCH_SIZE)) path_data = self._convert_path( gc.get_hatch_path(), - Affine2D().scale(HATCH_SIZE).scale(1.0, -1.0).translate(0, HATCH_SIZE)) + Affine2D().scale(HATCH_SIZE).scale(1.0, -1.0).translate(0, HATCH_SIZE), + simplify=False) if rgbFace is None: fill = 'none' else: @@ -166,7 +167,7 @@ def _get_gc_clip_svg(self, gc): clippath, clippath_trans = gc.get_clip_path() if clippath is not None: clippath_trans = self._make_flip_transform(clippath_trans) - path_data = self._convert_path(clippath, clippath_trans) + path_data = self._convert_path(clippath, clippath_trans, simplify=False) path = '' % path_data elif cliprect is not None: x, y, w, h = cliprect.bounds @@ -217,7 +218,7 @@ def _make_flip_transform(self, transform): .scale(1.0, -1.0) .translate(0.0, self.height)) - def _convert_path(self, path, transform, clip=False): + def _convert_path(self, path, transform, clip=False, simplify=None): path_data = [] appender = path_data.append path_commands = self._path_commands @@ -226,7 +227,8 @@ def _convert_path(self, path, transform, clip=False): clip = (0.0, 0.0, self.width, self.height) else: clip = None - for points, code in path.iter_segments(transform, clip=clip): + for points, code in path.iter_segments(transform, clip=clip, + simplify=simplify): if code == Path.CLOSEPOLY: segment = 'z' else: @@ -241,15 +243,18 @@ def _convert_path(self, path, transform, clip=False): def draw_path(self, gc, path, transform, rgbFace=None): trans_and_flip = self._make_flip_transform(transform) + clip = (rgbFace is None and gc.get_hatch_path() is None) + simplify = path.should_simplify and clip path_data = self._convert_path( - path, trans_and_flip, - clip=(rgbFace is None and gc.get_hatch_path() is None)) + path, trans_and_flip, clip=clip, simplify=simplify) self._draw_svg_element('path', 'd="%s"' % path_data, gc, rgbFace) def draw_markers(self, gc, marker_path, marker_trans, path, trans, rgbFace=None): write = self._svgwriter.write - key = self._convert_path(marker_path, marker_trans + Affine2D().scale(1.0, -1.0)) + key = self._convert_path(marker_path, + marker_trans + Affine2D().scale(1.0, -1.0), + simplify=False) name = self._markers.get(key) if name is None: name = 'm%s' % md5(key).hexdigest() @@ -282,7 +287,7 @@ def draw_path_collection(self, gc, master_transform, paths, all_transforms, for i, (path, transform) in enumerate(self._iter_collection_raw_paths( master_transform, paths, all_transforms)): transform = Affine2D(transform.get_matrix()).scale(1.0, -1.0) - d = self._convert_path(path, transform) + d = self._convert_path(path, transform, simplify=False) name = 'coll%x_%x_%s' % (self._path_collection_id, i, md5(d).hexdigest()) write('\n' % (name, d)) @@ -456,7 +461,7 @@ def draw_text_as_path(self, gc, x, y, s, prop, angle, ismath): write('\n') for char_id, glyph_path in glyph_map_new.iteritems(): path = Path(*glyph_path) - path_data = self._convert_path(path, _flip) + path_data = self._convert_path(path, _flip, simplify=False) path_element = '\n' % (char_id, ''.join(path_data)) write(path_element) write('\n') @@ -504,7 +509,7 @@ def draw_text_as_path(self, gc, x, y, s, prop, angle, ismath): for char_id, glyph_path in glyph_map_new.iteritems(): char_id = self._adjust_char_id(char_id) path = Path(*glyph_path) - path_data = self._convert_path(path, None) #_flip) + path_data = self._convert_path(path, None, simplify=False) #_flip) path_element = '\n' % (char_id, ''.join(path_data)) write(path_element) write('\n') @@ -535,7 +540,7 @@ def draw_text_as_path(self, gc, x, y, s, prop, angle, ismath): for verts, codes in rects: path = Path(verts, codes) - path_data = self._convert_path(path, None) + path_data = self._convert_path(path, None, simplify=False) path_element = '\n' % (''.join(path_data)) svg.append(path_element) diff --git a/src/_macosx.m b/src/_macosx.m index 8107882091dc..c812755a3840 100644 --- a/src/_macosx.m +++ b/src/_macosx.m @@ -539,7 +539,7 @@ static int _get_snap(GraphicsContext* self, enum e_quantize_mode* mode) return NULL; } CGContextSetAlpha(cr, alpha); - + self->color[3] = alpha; Py_INCREF(Py_None); @@ -884,7 +884,7 @@ static int _get_snap(GraphicsContext* self, enum e_quantize_mode* mode) 0, rect, QUANTIZE_AUTO, - 1); + rgbFace == NULL); if (!iterator) { PyErr_SetString(PyExc_RuntimeError, @@ -961,7 +961,7 @@ static int _get_snap(GraphicsContext* self, enum e_quantize_mode* mode) 0, rect, QUANTIZE_AUTO, - 1); + 0); if (!iterator) { Py_DECREF(hatchpath); @@ -1146,14 +1146,14 @@ static BOOL _clip(CGContextRef cr, PyObject* object) Py_DECREF(translation); PyErr_SetString(PyExc_ValueError, "transform_point did not return a NumPy array"); - return false; + return false; } if (PyArray_NDIM(translation)!=1 || PyArray_DIM(translation, 0)!=2) { Py_DECREF(translation); PyErr_SetString(PyExc_ValueError, "transform_point did not return an approriate array"); - return false; + return false; } tx = (CGFloat)(*(double*)PyArray_GETPTR1(translation, 0)); ty = (CGFloat)(*(double*)PyArray_GETPTR1(translation, 1)); @@ -1397,7 +1397,7 @@ static BOOL _clip(CGContextRef cr, PyObject* object) Py_ssize_t Nlinestyles = PySequence_Size(linestyles); Py_ssize_t Naa = PySequence_Size(antialiaseds); if (N < Nlinestyles) Nlinestyles = N; - if ((Nfacecolors == 0 && Nedgecolors == 0) || Np == 0) goto exit; + if ((Nfacecolors == 0 && Nedgecolors == 0) || Np == 0) goto exit; /* Preset graphics context properties if possible */ if (Naa==1) @@ -1641,7 +1641,7 @@ static BOOL _clip(CGContextRef cr, PyObject* object) master.c = c; master.d = d; master.tx = tx; - master.ty = ty; + master.ty = ty; } else { @@ -2255,7 +2255,7 @@ static BOOL _clip(CGContextRef cr, PyObject* object) width = CTLineGetTypographicBounds(line, &ascent, &descent, NULL); rect = CTLineGetImageBounds(line, cr); - + CFRelease(line); return Py_BuildValue("fff", width, rect.size.height, descent); @@ -3022,7 +3022,7 @@ static void _data_provider_release(void* info, const void* data, size_t size) } /* NSSize contains CGFloat; cannot use size directly */ if(!PyArg_ParseTuple(args, "u#dd", - &characters, &n, &width, &height)) return NULL; + &characters, &n, &width, &height)) return NULL; size.width = width; size.height = height; @@ -3036,7 +3036,7 @@ static void _data_provider_release(void* info, const void* data, size_t size) NSRect rect = [view bounds]; NSString* filename = [NSString stringWithCharacters: characters - length: (unsigned)n]; + length: (unsigned)n]; NSString* extension = [filename pathExtension]; /* Calling dataWithPDFInsideRect on the view causes its update status @@ -3055,23 +3055,23 @@ static void _data_provider_release(void* info, const void* data, size_t size) if (! [extension isEqualToString: @"tiff"] && ! [extension isEqualToString: @"tif"]) { - NSBitmapImageFileType filetype; - NSBitmapImageRep* bitmapRep = [NSBitmapImageRep imageRepWithData: data]; - if ([extension isEqualToString: @"bmp"]) - filetype = NSBMPFileType; - else if ([extension isEqualToString: @"gif"]) - filetype = NSGIFFileType; - else if ([extension isEqualToString: @"jpg"] || - [extension isEqualToString: @"jpeg"]) - filetype = NSJPEGFileType; - else if ([extension isEqualToString: @"png"]) - filetype = NSPNGFileType; - else - { PyErr_SetString(PyExc_ValueError, "Unknown file type"); - return NULL; - } - - data = [bitmapRep representationUsingType:filetype properties:nil]; + NSBitmapImageFileType filetype; + NSBitmapImageRep* bitmapRep = [NSBitmapImageRep imageRepWithData: data]; + if ([extension isEqualToString: @"bmp"]) + filetype = NSBMPFileType; + else if ([extension isEqualToString: @"gif"]) + filetype = NSGIFFileType; + else if ([extension isEqualToString: @"jpg"] || + [extension isEqualToString: @"jpeg"]) + filetype = NSJPEGFileType; + else if ([extension isEqualToString: @"png"]) + filetype = NSPNGFileType; + else + { PyErr_SetString(PyExc_ValueError, "Unknown file type"); + return NULL; + } + + data = [bitmapRep representationUsingType:filetype properties:nil]; } [data writeToFile: filename atomically: YES]; From 01efb0227da2a79e77037469bacd25253ba8d91d Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 4 Jan 2010 14:32:39 +0000 Subject: [PATCH 0468/1000] Merged revisions 8070 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r8070 | mdboom | 2010-01-04 09:28:57 -0500 (Mon, 04 Jan 2010) | 1 line Fix doc 'clean' ........ svn path=/trunk/matplotlib/; revision=8071 --- doc/make.py | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/doc/make.py b/doc/make.py index 37c886a2df92..e5211a5bf645 100755 --- a/doc/make.py +++ b/doc/make.py @@ -67,13 +67,13 @@ def latex(): def clean(): shutil.rmtree("build") shutil.rmtree("examples") - for pattern in ['doc/mpl_examples/api/*.png', - 'doc/mpl_examples/pylab_examples/*.png', - 'doc/mpl_examples/pylab_examples/*.pdf', - 'doc/mpl_examples/units/*.png', - 'doc/pyplots/tex_demo.png', - 'doc/_static/matplotlibrc', - 'doc/_templates/gallery.html']: + for pattern in ['mpl_examples/api/*.png', + 'mpl_examples/pylab_examples/*.png', + 'mpl_examples/pylab_examples/*.pdf', + 'mpl_examples/units/*.png', + 'pyplots/tex_demo.png', + '_static/matplotlibrc', + '_templates/gallery.html']: for filename in glob.glob(pattern): if os.path.exists(filename): os.remove(filename) From b24eda13ec022003a5c4356c0f85a4fcfe6ec73e Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 4 Jan 2010 15:08:52 +0000 Subject: [PATCH 0469/1000] Clean docs before building them. svn path=/trunk/matplotlib/; revision=8072 --- test/_buildbot_doc.sh | 1 + 1 file changed, 1 insertion(+) diff --git a/test/_buildbot_doc.sh b/test/_buildbot_doc.sh index 3e6626042145..d23140afe7f2 100755 --- a/test/_buildbot_doc.sh +++ b/test/_buildbot_doc.sh @@ -10,4 +10,5 @@ easy_install sphinx cd doc +python make.py clean python make.py all From f9429f8a23e336e5c6d38dd5cc0a30cded96a0fd Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 4 Jan 2010 17:22:32 +0000 Subject: [PATCH 0470/1000] buildbot: debug documentation uploads svn path=/trunk/matplotlib/; revision=8073 --- test/_buildbot_doc.sh | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/test/_buildbot_doc.sh b/test/_buildbot_doc.sh index d23140afe7f2..71feaded6b1f 100755 --- a/test/_buildbot_doc.sh +++ b/test/_buildbot_doc.sh @@ -2,13 +2,31 @@ set -e TARGET=`pwd`/PYmpl +echo "activating virtual environment" source $TARGET/bin/activate +echo "removing MPL config dir" python -c "import shutil,matplotlib; x=matplotlib.get_configdir(); shutil.rmtree(x)" +echo "calling 'easy_install sphinx'" easy_install sphinx +echo "calling 'cd doc'" cd doc +echo "calling 'python make.py clean'" python make.py clean + +echo "calling 'python make.py all'" python make.py all + +# SourceForce needs the below +echo "configuring for upload to SourceForge" + +echo "Options +Indexes" > build/html/.htaccess + +chmod -R a+r build +find build -type d | xargs chmod a+rx + +echo "listing built files" +find build From 5e1c6ca9b4313fa98b100f6933ffaf6e05e13881 Mon Sep 17 00:00:00 2001 From: Reinier Heeres Date: Mon, 4 Jan 2010 22:58:43 +0000 Subject: [PATCH 0471/1000] Add EngFormatter + example (Jason Heeris, Matthias Michler) svn path=/trunk/matplotlib/; revision=8074 --- examples/api/engineering_formatter.py | 19 +++++ lib/matplotlib/ticker.py | 113 +++++++++++++++++++++++--- 2 files changed, 119 insertions(+), 13 deletions(-) create mode 100644 examples/api/engineering_formatter.py diff --git a/examples/api/engineering_formatter.py b/examples/api/engineering_formatter.py new file mode 100644 index 000000000000..a71f5e230450 --- /dev/null +++ b/examples/api/engineering_formatter.py @@ -0,0 +1,19 @@ +''' +Demo to show use of the engineering Formatter. +''' + +import matplotlib.pyplot as plt +import numpy as np + +from matplotlib.ticker import EngFormatter + +ax = plt.subplot(111) +ax.set_xscale('log') +formatter = EngFormatter(unit='Hz', places=1) +ax.xaxis.set_major_formatter(formatter) + +xs = np.logspace(1, 9, 100) +ys = (0.8 + 0.4 * np.random.uniform(size=100)) * np.log10(xs)**2 +ax.plot(xs, ys) + +plt.show() diff --git a/lib/matplotlib/ticker.py b/lib/matplotlib/ticker.py index b98cda2a706f..183d01bb9eb5 100644 --- a/lib/matplotlib/ticker.py +++ b/lib/matplotlib/ticker.py @@ -118,6 +118,7 @@ from __future__ import division +import decimal import math import numpy as np from matplotlib import rcParams @@ -507,23 +508,23 @@ def __init__(self, base=10.0, labelOnlyBase = True): is ``False`` """ self._base = base+0.0 - self.labelOnlyBase=labelOnlyBase + self.labelOnlyBase = labelOnlyBase self.decadeOnly = True - def base(self,base): + def base(self, base): 'change the *base* for labeling - warning: should always match the base used for :class:`LogLocator`' - self._base=base + self._base = base - def label_minor(self,labelOnlyBase): + def label_minor(self, labelOnlyBase): 'switch on/off minor ticks labeling' - self.labelOnlyBase=labelOnlyBase + self.labelOnlyBase = labelOnlyBase def __call__(self, x, pos=None): 'Return the format for tick val *x* at position *pos*' vmin, vmax = self.axis.get_view_interval() d = abs(vmax - vmin) - b=self._base + b = self._base if x == 0.0: return '0' sign = np.sign(x) @@ -533,13 +534,13 @@ def __call__(self, x, pos=None): if not isDecade and self.labelOnlyBase: s = '' elif x>10000: s= '%1.0e'%x elif x<1: s = '%1.0e'%x - else : s = self.pprint_val(x,d) + else : s = self.pprint_val(x, d) if sign == -1: s = '-%s' % s return self.fix_minus(s) - def format_data(self,value): + def format_data(self, value): self.labelOnlyBase = False value = cbook.strip_math(self.__call__(value)) self.labelOnlyBase = True @@ -554,14 +555,14 @@ def is_decade(self, x): return abs(x-n)<1e-10 def nearest_long(self, x): - if x==0: return 0L - elif x>0: return long(x+0.5) + if x == 0: return 0L + elif x > 0: return long(x+0.5) else: return long(x-0.5) def pprint_val(self, x, d): #if the number is not too big and it's an int, format it as an #int - if abs(x)<1e4 and x==int(x): return '%d' % x + if abs(x) < 1e4 and x == int(x): return '%d' % x if d < 1e-2: fmt = '%1.3e' elif d < 1e-1: fmt = '%1.3f' @@ -572,7 +573,7 @@ def pprint_val(self, x, d): s = fmt % x #print d, x, fmt, s tup = s.split('e') - if len(tup)==2: + if len(tup) == 2: mantissa = tup[0].rstrip('0').rstrip('.') sign = tup[1][0].replace('+', '') exponent = tup[1][1:].lstrip('0') @@ -645,10 +646,96 @@ def __call__(self, x, pos=None): if usetex: s = r'$%s%d^{%d}$'% (sign_string, b, self.nearest_long(fx)) else: - s = r'$\mathdefault{%s%d^{%d}}$'% (sign_string, b, self.nearest_long(fx)) + s = r'$\mathdefault{%s%d^{%d}}$'% (sign_string, b, + self.nearest_long(fx)) return s +class EngFormatter(Formatter): + """ + Formats axis values using engineering prefixes to represent powers of 1000, + plus a specified unit, eg. 10 MHz instead of 1e7. + """ + + # The SI engineering prefixes + ENG_PREFIXES = { + -24: "y", + -21: "z", + -18: "a", + -15: "f", + -12: "p", + -9: "n", + -6: u"\u03bc", # Greek letter mu + -3: "m", + 0: "", + 3: "k", + 6: "M", + 9: "G", + 12: "T", + 15: "P", + 18: "E", + 21: "Z", + 24: "Y" + } + + def __init__(self, unit="", places=None): + self.unit = unit + self.places = places + + def __call__(self, x, pos=None): + s = "%s%s" % (self.format_eng(x), self.unit) + return self.fix_minus(s) + + def format_eng(self, num): + """ Formats a number in engineering notation, appending a letter + representing the power of 1000 of the original number. Some examples: + + >>> format_eng(0) for self.places = 0 + '0' + + >>> format_eng(1000000) for self.places = 1 + '1.0 M' + + >>> format_eng("-1e-6") for self.places = 2 + u'-1.00 \u03bc' + + @param num: the value to represent + @type num: either a numeric value or a string that can be converted to + a numeric value (as per decimal.Decimal constructor) + + @return: engineering formatted string + """ + + dnum = decimal.Decimal(str(num)) + + sign = 1 + + if dnum < 0: + sign = -1 + dnum = -dnum + + if dnum != 0: + pow10 = decimal.Decimal(int(math.floor(dnum.log10()/3)*3)) + else: + pow10 = decimal.Decimal(0) + + pow10 = pow10.min(max(self.ENG_PREFIXES.keys())) + pow10 = pow10.max(min(self.ENG_PREFIXES.keys())) + + prefix = self.ENG_PREFIXES[int(pow10)] + + mant = sign*dnum/(10**pow10) + + if self.places is None: + format_str = u"%g %s" + elif self.places == 0: + format_str = u"%i %s" + elif self.places > 0: + format_str = (u"%%.%if %%s" % self.places) + + formatted = format_str % (mant, prefix) + + return formatted.strip() class Locator(TickHelper): """ From a58e9e8bc6016034d94bb29b10d9535dd17d62e0 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 11 Jan 2010 19:23:13 +0000 Subject: [PATCH 0472/1000] Fix centering of mathtext markers (thanks, tcb) svn path=/trunk/matplotlib/; revision=8076 --- lib/matplotlib/lines.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/lines.py b/lib/matplotlib/lines.py index 4b7573f5b5bb..7f3983bc49da 100644 --- a/lib/matplotlib/lines.py +++ b/lib/matplotlib/lines.py @@ -898,7 +898,7 @@ def _draw_mathtext_path(self, renderer, gc, path, trans): height = ymax - ymin max_dim = max(width, height) path_trans = Affine2D() \ - .translate(0.5 * -width, 0.5 * -height) \ + .translate(-xmin + 0.5 * -width, -ymin + 0.5 * -height) \ .scale((renderer.points_to_pixels(self.get_markersize()) / max_dim)) rgbFace = self._get_rgb_face() From 81d545ff12739138c892895e12a7160a5abaca75 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Mon, 11 Jan 2010 19:54:32 +0000 Subject: [PATCH 0473/1000] Tk backend supports Figure.set_size_inches with the forward parameter. svn path=/trunk/matplotlib/; revision=8077 --- lib/matplotlib/backends/backend_tkagg.py | 19 ++++++++++++++++--- 1 file changed, 16 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/backends/backend_tkagg.py b/lib/matplotlib/backends/backend_tkagg.py index e1d5befec5ee..1a91adbf4dac 100644 --- a/lib/matplotlib/backends/backend_tkagg.py +++ b/lib/matplotlib/backends/backend_tkagg.py @@ -367,9 +367,22 @@ def notify_axes_change(fig): self.canvas.figure.show = lambda *args: self.show() - def resize(self, event): - width, height = event.width, event.height - self.toolbar.configure(width=width) # , height=height) + def resize(self, width, height=None): + # before 09-12-22, the resize method takes a single *event* + # parameter. On the other hand, the resize method of other + # FigureManager class takes *width* and *height* parameter, + # which is used to change the size of the window. For the + # Figure.set_size_inches with forward=True work with Tk + # backend, I changed the function signature but tried to keep + # it backward compatible. -JJL + + # when a single parameter is given, consider it as a event + if height is None: + width = width.width + else: + self.canvas._tkcanvas.master.geometry("%dx%d" % (width, height)) + + self.toolbar.configure(width=width) def show(self): From 5fafc616eb90f4b4411bbc2936c4234b72bdf3a7 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Mon, 11 Jan 2010 19:54:58 +0000 Subject: [PATCH 0474/1000] Add add_click and pop_click methods in BlockingContourLabeler. svn path=/trunk/matplotlib/; revision=8078 --- CHANGELOG | 3 +++ lib/matplotlib/blocking_input.py | 8 +++++++- 2 files changed, 10 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 58048202065e..15b05441fecb 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2009-01-11 Add add_click and pop_click methods in + BlockingContourLabeler. -JJL + 2010-01-03 Added rcParams['axes.color_cycle'] - EF 2010-01-03 Added Pierre's qt4 formlayout editor and toolbar button - JDH diff --git a/lib/matplotlib/blocking_input.py b/lib/matplotlib/blocking_input.py index 09ed6d9afbfc..20fc20ca626d 100644 --- a/lib/matplotlib/blocking_input.py +++ b/lib/matplotlib/blocking_input.py @@ -193,7 +193,7 @@ def mouse_event_stop( self, event ): # consistent with matlab and sometimes quite useful, but will # require the user to test how many points were actually # returned before using data. - self.fig.canvas.stop_event_loop(event) + self.fig.canvas.stop_event_loop() def mouse_event_pop( self, event ): """ @@ -311,6 +311,12 @@ def __init__(self,cs): self.cs = cs BlockingMouseInput.__init__(self, fig=cs.ax.figure ) + def add_click(self, event): + self.button1(event) + + def pop_click(self, event, index=-1): + self.button3(event) + def button1(self,event): """ This will be called if an event involving a button other than From 1e5f5bc76fe58a7104443219a114962653439c90 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Mon, 11 Jan 2010 19:55:19 +0000 Subject: [PATCH 0475/1000] new 'bbox-forced' option for Axes.adjustable svn path=/trunk/matplotlib/; revision=8079 --- CHANGELOG | 3 +++ lib/matplotlib/axes.py | 25 +++++++++++++++---------- 2 files changed, 18 insertions(+), 10 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 15b05441fecb..7f3ff69905c0 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2009-01-11 adjustable of Axes can be "box-forced" which allow + sharing axes. -JJL + 2009-01-11 Add add_click and pop_click methods in BlockingContourLabeler. -JJL diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index 241470ff9ccf..9e9c8a2da8b5 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -349,7 +349,7 @@ def __init__(self, fig, rect, ================ ========================================= Keyword Description ================ ========================================= - *adjustable* [ 'box' | 'datalim' ] + *adjustable* [ 'box' | 'datalim' | 'box-forced'] *alpha* float: the alpha transparency *anchor* [ 'C', 'SW', 'S', 'SE', 'E', 'NE', 'N', 'NW', 'W' ] @@ -947,12 +947,17 @@ def set_aspect(self, aspect, adjustable=None, anchor=None): *adjustable* - ========= ============================ - value description - ========= ============================ - 'box' change physical size of axes - 'datalim' change xlim or ylim - ========= ============================ + ============ ===================================== + value description + ============ ===================================== + 'box' change physical size of axes + 'datalim' change xlim or ylim + 'box-forced' same as 'box', but axes can be shared + ============ ===================================== + + 'box' does not allow axes sharing, as this can cause + unintended side effect. For cases when sharing axes is + fine, use 'box-forced'. *anchor* @@ -984,9 +989,9 @@ def get_adjustable(self): def set_adjustable(self, adjustable): """ - ACCEPTS: [ 'box' | 'datalim' ] + ACCEPTS: [ 'box' | 'datalim' | 'box-forced'] """ - if adjustable in ('box', 'datalim'): + if adjustable in ('box', 'datalim', 'box-forced'): if self in self._shared_x_axes or self in self._shared_y_axes: if adjustable == 'box': raise ValueError( @@ -1098,7 +1103,7 @@ def apply_aspect(self, position=None): figW,figH = self.get_figure().get_size_inches() fig_aspect = figH/figW - if self._adjustable == 'box': + if self._adjustable in ['box', 'box-forced']: if aspect_scale_mode == "log": box_aspect = A * self.get_data_ratio_log() else: From a2f63e8ecaa495b12a63bcb35d9bba576908deab Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Mon, 11 Jan 2010 19:55:26 +0000 Subject: [PATCH 0476/1000] The color of legend patch follows the rc parameters axes.facecolor and axes.edgecolor svn path=/trunk/matplotlib/; revision=8080 --- CHANGELOG | 3 +++ lib/matplotlib/legend.py | 4 +++- 2 files changed, 6 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 7f3ff69905c0..130bf4d2590a 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2009-01-11 The color of legend patch follows the rc parameters + axes.facecolor and axes.edgecolor. -JJL + 2009-01-11 adjustable of Axes can be "box-forced" which allow sharing axes. -JJL diff --git a/lib/matplotlib/legend.py b/lib/matplotlib/legend.py index 1fcebd5ade59..ccccd621f7be 100644 --- a/lib/matplotlib/legend.py +++ b/lib/matplotlib/legend.py @@ -284,9 +284,11 @@ def __init__(self, parent, handles, labels, # We use FancyBboxPatch to draw a legend frame. The location # and size of the box will be updated during the drawing time. + self.legendPatch = FancyBboxPatch( xy=(0.0, 0.0), width=1., height=1., - facecolor='w', edgecolor='k', + facecolor=rcParams["axes.facecolor"], + edgecolor=rcParams["axes.edgecolor"], mutation_scale=self._fontsize, snap=True ) From e5bc430f286bf2e4fd8a0b4f19efc4af2b91e747 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Sat, 16 Jan 2010 17:45:32 +0000 Subject: [PATCH 0477/1000] Patch by Ian Thomas fixes 2 major cntr.c problems: Now line contours coincide with filled contour boundaries, and interior masked regions are handled correctly by contourf. svn path=/trunk/matplotlib/; revision=8081 --- CHANGELOG | 10 +- examples/pylab_examples/contourf_demo.py | 31 ++----- src/cntr.c | 113 ++++++++++++++--------- 3 files changed, 82 insertions(+), 72 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 130bf4d2590a..75cae559f398 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,10 +1,14 @@ -2009-01-11 The color of legend patch follows the rc parameters +2010-01-16 Applied patch by Ian Thomas to fix two contouring + problems: now contourf handles interior masked regions, + and the boundaries of line and filled contours coincide. - EF + +2009-01-11 The color of legend patch follows the rc parameters axes.facecolor and axes.edgecolor. -JJL -2009-01-11 adjustable of Axes can be "box-forced" which allow +2009-01-11 adjustable of Axes can be "box-forced" which allow sharing axes. -JJL -2009-01-11 Add add_click and pop_click methods in +2009-01-11 Add add_click and pop_click methods in BlockingContourLabeler. -JJL 2010-01-03 Added rcParams['axes.color_cycle'] - EF diff --git a/examples/pylab_examples/contourf_demo.py b/examples/pylab_examples/contourf_demo.py index 69fe60627f89..c3ed0dde9a87 100755 --- a/examples/pylab_examples/contourf_demo.py +++ b/examples/pylab_examples/contourf_demo.py @@ -3,15 +3,7 @@ origin = 'lower' #origin = 'upper' -# The following controls only interior masking. -test_masking = False # There is a bug in filled contour masking with - # interior masks. - -if test_masking: - # Use a coarse grid so only a few masked points are needed. - delta = 0.5 -else: - delta = 0.025 +delta = 0.025 x = y = arange(-3.0, 3.01, delta) X, Y = meshgrid(x, y) @@ -19,19 +11,6 @@ Z2 = bivariate_normal(X, Y, 1.5, 0.5, 1, 1) Z = 10 * (Z1 - Z2) -# interior badmask doesn't work yet for filled contours -if test_masking: - badmask = zeros(shape(Z)) - - badmask[5,5] = 1 - badmask[5,6] = 1 - Z[5,5] = 0 - Z[5,6] = 0 - - badmask[0,0] = 1 - Z[0,0] = 0 - Z = ma.array(Z, mask=badmask) - nr, nc = Z.shape # put NaNs in one corner: @@ -43,6 +22,10 @@ # mask another corner: Z[:nr//6, :nc//6] = ma.masked +# mask a circle in the middle: +interior = sqrt((X**2) + (Y**2)) < 0.5 +Z[interior] = ma.masked + # We are using automatic selection of contour levels; # this is usually not such a good idea, because they don't @@ -63,7 +46,7 @@ origin=origin, hold='on') -title('Nonsense (with 2 masked corners)') +title('Nonsense (3 masked regions)') xlabel('word length anomaly') ylabel('sentence length anomaly') @@ -87,7 +70,7 @@ colors = ('k',), linewidths = (3,), origin = origin) -title('Listed colors (with 2 masked corners)') +title('Listed colors (3 masked regions)') clabel(CS4, fmt = '%2.1f', colors = 'w', fontsize=14) colorbar(CS3) diff --git a/src/cntr.c b/src/cntr.c index 9ad52fc099d2..99cfe2913d47 100644 --- a/src/cntr.c +++ b/src/cntr.c @@ -50,12 +50,14 @@ * The problem is that two disjoint curves cut through a saddle zone * (I reject the alternative of connecting the opposite points to make * a single self-intersecting curve, since those make ugly contour plots - * -- I've tried it). The real problem with saddle zones is that you - * need to communicate the connectivity decision you make back to the - * calling routine, since for the next contour level, we need to tell - * the contour tracer to make the same decision as on the previous - * level. The input/output triangulation array is the solution to this - * nasty problem. + * -- I've tried it). The solution is to determine the z value of the + * centre of the zone, which is the mean of the z values of the four + * corner points. If the centre z is higher than the contour level of + * interest and you are moving along the line with higher values on the + * left, turn right to leave the saddle zone. If the centre z is lower + * than the contour level turn left. Whether the centre z is higher + * than the 1 or 2 contour levels is stored in the saddle array so that + * it does not need to be recalculated in subsequent passes. * * Another complicating factor is that there may be logical holes in * the mesh -- zones which do not exist. We want our contours to stop @@ -175,6 +177,11 @@ * or not, z value 0, 1, or 2 -- is kept in a mesh sized data array */ typedef short Cdata; +/* information to decide on correct contour direction in saddle zones + * is stored in a mesh sized array. Only those entries corresponding + * to saddle zones have nonzero values in this array. */ +typedef char Saddle; + /* here is the minimum structure required to tell where we are in the * mesh sized data array */ typedef struct Csite Csite; @@ -189,8 +196,8 @@ struct Csite long count; /* count of start markers visited */ double zlevel[2]; /* contour levels, zlevel[1]<=zlevel[0] * signals single level case */ - short *triangle; /* triangulation array for the mesh */ - char *reg; /* region array for the mesh (was int) */ + Saddle *saddle; /* saddle zone information for the mesh */ + char *reg; /* region array for the mesh (was int) */ Cdata *data; /* added by EF */ long edge0, left0; /* starting site on this curve for closure */ int level0; /* starting level for closure */ @@ -225,8 +232,6 @@ void print_Csite(Csite *Csite) printf("\n"); } -/* triangle only takes values of -1, 0, 1, so it could be a signed char. */ -/* most or all of the longs probably could be converted to ints with no loss */ /* the Cdata array consists of the following bits: * Z_VALUE (2 bits) 0, 1, or 2 function value at point @@ -243,6 +248,7 @@ void print_Csite(Csite *Csite) * OPEN_END marks an i-edge start point whose other endpoint is * on a boundary for the single level case * ALL_DONE marks final start point + * SLIT_DN_VISITED this slit downstroke hasn't/has been visited in pass 2 */ #define Z_VALUE 0x0003 #define ZONE_EX 0x0004 @@ -257,6 +263,7 @@ void print_Csite(Csite *Csite) #define SLIT_DN 0x0800 #define OPEN_END 0x1000 #define ALL_DONE 0x2000 +#define SLIT_DN_VISITED 0x4000 /* some helpful macros to find points relative to a given directed * edge -- points are designated 0, 1, 2, 3 CCW around zone with 0 and @@ -272,6 +279,15 @@ void print_Csite(Csite *Csite) enum {kind_zone, kind_edge1, kind_edge2, kind_slit_up, kind_slit_down, kind_start_slit=16} point_kinds; +/* Saddle zone array consists of the following bits: + * SADDLE_SET whether zone's saddle data has been set. + * SADDLE_GT0 whether z of centre of zone is higher than site->level[0]. + * SADDLE_GT1 whether z of centre of zone is higher than site->level[1]. + */ +#define SADDLE_SET 0x01 +#define SADDLE_GT0 0x02 +#define SADDLE_GT1 0x04 + /* ------------------------------------------------------------------------ */ /* these actually mark points */ @@ -313,18 +329,17 @@ zone_crosser (Csite * site, int level, int pass2) long left0 = site->left0; int level0 = site->level0 == level; int two_levels = site->zlevel[1] > site->zlevel[0]; - short *triangle = site->triangle; + Saddle* saddle = site->saddle; const double *x = pass2 ? site->x : 0; const double *y = pass2 ? site->y : 0; - const double *z = pass2 ? site->z : 0; - double zlevel = pass2 ? site->zlevel[level] : 0.0; + const double *z = site->z; + double zlevel = site->zlevel[level]; double *xcp = pass2 ? site->xcp : 0; double *ycp = pass2 ? site->ycp : 0; short *kcp = pass2 ? site->kcp : 0; int z0, z1, z2, z3; - int keep_left = 0; /* flag to try to minimize curvature in saddles */ int done = 0; int n_kind; @@ -402,29 +417,28 @@ zone_crosser (Csite * site, int level, int pass2) { if (z1 == z3) { - /* this is a saddle zone, need triangle to decide - * -- set triangle if not already decided for this zone */ + /* this is a saddle zone, determine whether to turn left or + * right depending on height of centre of zone relative to + * contour level. Set saddle[zone] if not already decided. */ long zone = edge + (left > 0 ? left : 0); - if (triangle) + if (!(saddle[zone] & SADDLE_SET)) { - if (!triangle[zone]) - { - if (keep_left) - triangle[zone] = jedge ? -1 : 1; - else - triangle[zone] = jedge ? 1 : -1; - } - if (triangle[zone] > 0 ? !jedge : jedge) - goto bkwd; - } - else - { - if (keep_left) - goto bkwd; + saddle[zone] = SADDLE_SET; + double zcentre = (z[p0] + z[p0+left] + z[p1] + z[p1+left])/4.0; + if (zcentre > site->zlevel[0]) + saddle[zone] |= + (two_levels && zcentre > site->zlevel[1]) + ? SADDLE_GT0 | SADDLE_GT1 : SADDLE_GT0; } + + int turnRight = level == 2 ? (saddle[zone] & SADDLE_GT1) + : (saddle[zone] & SADDLE_GT0); + if (z1 ^ (level == 2)) + turnRight = !turnRight; + if (!turnRight) + goto bkwd; } /* bend forward (right along curve) */ - keep_left = 1; jedge = !jedge; edge = p1 + (left > 0 ? left : 0); { @@ -437,7 +451,6 @@ zone_crosser (Csite * site, int level, int pass2) { bkwd: /* bend backward (left along curve) */ - keep_left = 0; jedge = !jedge; edge = p0 + (left > 0 ? left : 0); { @@ -590,17 +603,27 @@ edge_walker (Csite * site, int pass2) if (n_kind) kcp[n_kind] += kind_start_slit; return slit_cutter (site, 0, pass2); } + if (fwd < 0 && level0 && left < 0) + { + if (n_kind) kcp[n_kind] += kind_start_slit; + return slit_cutter (site, 0, pass2); + } return 3; } else if (pass2) { if (heads_up || (fwd < 0 && (data[edge] & SLIT_DN))) { - site->edge = edge; - site->left = left; - site->n = n + marked; - if (n_kind) kcp[n_kind] += kind_start_slit; - return slit_cutter (site, heads_up, pass2); + if (!heads_up && !(data[edge] & SLIT_DN_VISITED)) + data[edge] |= SLIT_DN_VISITED; + else + { + site->edge = edge; + site->left = left; + site->n = n + marked; + if (n_kind) kcp[n_kind] += kind_start_slit; + return slit_cutter (site, heads_up, pass2); + } } } else @@ -1181,6 +1204,8 @@ data_init (Csite * site, long nchunk) /* place immediate stop mark if nothing found */ if (!count) data[0] |= ALL_DONE; + else + for (i = 0; i < ijmax; ++i) site->saddle[i] = 0; /* initialize site */ site->edge0 = site->edge00 = site->edge = 0; @@ -1252,7 +1277,7 @@ cntr_new(void) if (site == NULL) return NULL; site->data = NULL; site->reg = NULL; - site->triangle = NULL; + site->saddle = NULL; site->xcp = NULL; site->ycp = NULL; site->kcp = NULL; @@ -1268,7 +1293,6 @@ cntr_init(Csite *site, long iMax, long jMax, double *x, double *y, { long ijmax = iMax * jMax; long nreg = iMax * jMax + iMax + 1; - long i; site->imax = iMax; site->jmax = jMax; @@ -1278,21 +1302,20 @@ cntr_init(Csite *site, long iMax, long jMax, double *x, double *y, PyMem_Free(site); return -1; } - site->triangle = (short *) PyMem_Malloc(sizeof(short) * ijmax); - if (site->triangle == NULL) + site->saddle = (Saddle*) PyMem_Malloc(sizeof(Saddle) * ijmax); + if (site->saddle == NULL) { PyMem_Free(site->data); PyMem_Free(site); return -1; } - for (i = 0; i < ijmax; i++) site->triangle[i] = 0; site->reg = NULL; if (mask != NULL) { site->reg = (char *) PyMem_Malloc(sizeof(char) * nreg); if (site->reg == NULL) { - PyMem_Free(site->triangle); + PyMem_Free(site->saddle); PyMem_Free(site->data); PyMem_Free(site); return -1; @@ -1311,7 +1334,7 @@ cntr_init(Csite *site, long iMax, long jMax, double *x, double *y, void cntr_del(Csite *site) { - PyMem_Free(site->triangle); + PyMem_Free(site->saddle); PyMem_Free(site->reg); PyMem_Free(site->data); PyMem_Free(site); From 2a41fbeeb6665b4ef9c359e0765cef09a7c6c4c0 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sat, 16 Jan 2010 19:19:14 +0000 Subject: [PATCH 0478/1000] Ensure three minor ticks always drawn (SF# 2924245). Patch by Neil Crighton. svn path=/trunk/matplotlib/; revision=8082 --- CHANGELOG | 3 +++ lib/matplotlib/ticker.py | 6 ++---- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 75cae559f398..31cd66ec85c8 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2009-01-16 Ensure three minor ticks always drawn (SF# 2924245). Patch + by Neil Crighton. -ADS + 2010-01-16 Applied patch by Ian Thomas to fix two contouring problems: now contourf handles interior masked regions, and the boundaries of line and filled contours coincide. - EF diff --git a/lib/matplotlib/ticker.py b/lib/matplotlib/ticker.py index 183d01bb9eb5..64792727c05e 100644 --- a/lib/matplotlib/ticker.py +++ b/lib/matplotlib/ticker.py @@ -1320,15 +1320,13 @@ def __call__(self): except IndexError: raise ValueError('Need at least two major ticks to find minor ' 'tick locations') - # see whether major step should be divided by 5, 4 or 2. This + # see whether major step should be divided by 5, 4. This # should cover most cases. temp = float(('%e' % majorstep).split('e')[0]) if temp % 5 < 1e-10: minorstep = majorstep / 5. - elif temp % 2 < 1e-10: - minorstep = majorstep / 4. else: - minorstep = majorstep / 2. + minorstep = majorstep / 4. tmin = majorlocs[0] - majorstep tmax = majorlocs[-1] + majorstep From 170ad232c3c226743e3ecb93656792ee643ee34e Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Sat, 16 Jan 2010 19:20:03 +0000 Subject: [PATCH 0479/1000] Don't create minor ticks on top of existing major ticks (Neil Crighton). svn path=/trunk/matplotlib/; revision=8083 --- CHANGELOG | 3 +++ lib/matplotlib/ticker.py | 7 ++++++- 2 files changed, 9 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 31cd66ec85c8..41d775c76947 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2009-01-16 Don't create minor ticks on top of existing major + ticks. Patch by Neil Crighton. -ADS + 2009-01-16 Ensure three minor ticks always drawn (SF# 2924245). Patch by Neil Crighton. -ADS diff --git a/lib/matplotlib/ticker.py b/lib/matplotlib/ticker.py index 64792727c05e..ee62fce8fabd 100644 --- a/lib/matplotlib/ticker.py +++ b/lib/matplotlib/ticker.py @@ -1334,8 +1334,13 @@ def __call__(self): vmin, vmax = self.axis.get_view_interval() if vmin > vmax: vmin,vmax = vmax,vmin + locs = locs[(vmin < locs) & (locs < vmax)] - return self.raise_if_exceeds(locs[(vmin < locs) & (locs < vmax)]) + # don't create minor ticks on top of existing major ticks + diff = 0.5 * abs(locs[1] - locs[0]) + locs = [l for l in locs if (np.abs(l - majorlocs) > diff).all()] + + return self.raise_if_exceeds(np.array(locs)) class OldAutoLocator(Locator): From 23aef0f33bbcfb71adf076d0bac004772257eaac Mon Sep 17 00:00:00 2001 From: John Hunter Date: Sat, 16 Jan 2010 22:07:53 +0000 Subject: [PATCH 0480/1000] upgraded CXX to 6.1.1 svn path=/trunk/matplotlib/; revision=8084 --- CHANGELOG | 4 + CXX/Config.hxx | 99 +- CXX/Exception.hxx | 214 +- CXX/Extensions.hxx | 891 +----- CXX/IndirectPythonInterface.cxx | 562 +--- CXX/IndirectPythonInterface.cxx~ | 43 + CXX/IndirectPythonInterface.hxx | 199 +- CXX/Objects.hxx | 3005 +------------------- CXX/Python2/Config.hxx | 118 + CXX/Python2/CxxDebug.hxx | 17 + CXX/Python2/Exception.hxx | 249 ++ CXX/Python2/ExtensionModule.hxx | 208 ++ CXX/Python2/ExtensionOldType.hxx | 392 +++ CXX/Python2/ExtensionType.hxx | 370 +++ CXX/Python2/ExtensionTypeBase.hxx | 145 + CXX/Python2/Extensions.hxx | 189 ++ CXX/Python2/IndirectPythonInterface.cxx | 597 ++++ CXX/Python2/IndirectPythonInterface.hxx | 198 ++ CXX/Python2/Objects.hxx | 3332 +++++++++++++++++++++++ CXX/Python2/PythonType.hxx | 117 + CXX/Python2/cxx_extensions.cxx | 1772 ++++++++++++ CXX/Python2/cxxextensions.c | 49 + CXX/Python2/cxxsupport.cxx | 174 ++ CXX/Python3/Config.hxx | 110 + CXX/Python3/CxxDebug.hxx | 17 + CXX/Python3/Exception.hxx | 250 ++ CXX/Python3/ExtensionModule.hxx | 206 ++ CXX/Python3/ExtensionOldType.hxx | 393 +++ CXX/Python3/ExtensionType.hxx | 370 +++ CXX/Python3/ExtensionTypeBase.hxx | 137 + CXX/Python3/Extensions.hxx | 189 ++ CXX/Python3/IndirectPythonInterface.cxx | 527 ++++ CXX/Python3/IndirectPythonInterface.hxx | 188 ++ CXX/Python3/Objects.hxx | 3279 ++++++++++++++++++++++ CXX/Python3/PythonType.hxx | 114 + CXX/Python3/cxx_extensions.cxx | 1873 +++++++++++++ CXX/Python3/cxxextensions.c | 54 + CXX/Python3/cxxsupport.cxx | 228 ++ CXX/Version.hxx | 6 +- CXX/WrapPython.h | 17 +- CXX/cxx_extensions.cxx | 1429 +--------- CXX/cxxextensions.c | 18 +- CXX/cxxextensions.c~ | 43 + CXX/cxxsupport.cxx | 141 +- CXX/cxxsupport.cxx~ | 43 + 45 files changed, 16050 insertions(+), 6526 deletions(-) create mode 100644 CXX/IndirectPythonInterface.cxx~ create mode 100644 CXX/Python2/Config.hxx create mode 100644 CXX/Python2/CxxDebug.hxx create mode 100644 CXX/Python2/Exception.hxx create mode 100644 CXX/Python2/ExtensionModule.hxx create mode 100644 CXX/Python2/ExtensionOldType.hxx create mode 100644 CXX/Python2/ExtensionType.hxx create mode 100644 CXX/Python2/ExtensionTypeBase.hxx create mode 100644 CXX/Python2/Extensions.hxx create mode 100644 CXX/Python2/IndirectPythonInterface.cxx create mode 100644 CXX/Python2/IndirectPythonInterface.hxx create mode 100644 CXX/Python2/Objects.hxx create mode 100644 CXX/Python2/PythonType.hxx create mode 100644 CXX/Python2/cxx_extensions.cxx create mode 100644 CXX/Python2/cxxextensions.c create mode 100644 CXX/Python2/cxxsupport.cxx create mode 100644 CXX/Python3/Config.hxx create mode 100644 CXX/Python3/CxxDebug.hxx create mode 100644 CXX/Python3/Exception.hxx create mode 100644 CXX/Python3/ExtensionModule.hxx create mode 100644 CXX/Python3/ExtensionOldType.hxx create mode 100644 CXX/Python3/ExtensionType.hxx create mode 100644 CXX/Python3/ExtensionTypeBase.hxx create mode 100644 CXX/Python3/Extensions.hxx create mode 100644 CXX/Python3/IndirectPythonInterface.cxx create mode 100644 CXX/Python3/IndirectPythonInterface.hxx create mode 100644 CXX/Python3/Objects.hxx create mode 100644 CXX/Python3/PythonType.hxx create mode 100644 CXX/Python3/cxx_extensions.cxx create mode 100644 CXX/Python3/cxxextensions.c create mode 100644 CXX/Python3/cxxsupport.cxx create mode 100644 CXX/cxxextensions.c~ create mode 100644 CXX/cxxsupport.cxx~ diff --git a/CHANGELOG b/CHANGELOG index 41d775c76947..f2f65ad84684 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ + +2010-01-16 Upgraded CXX to 6.1.1 - JDH + 2009-01-16 Don't create minor ticks on top of existing major ticks. Patch by Neil Crighton. -ADS @@ -17,6 +20,7 @@ 2009-01-11 Add add_click and pop_click methods in BlockingContourLabeler. -JJL + 2010-01-03 Added rcParams['axes.color_cycle'] - EF 2010-01-03 Added Pierre's qt4 formlayout editor and toolbar button - JDH diff --git a/CXX/Config.hxx b/CXX/Config.hxx index 2e3c70e23aa4..536e7c88201f 100644 --- a/CXX/Config.hxx +++ b/CXX/Config.hxx @@ -34,101 +34,10 @@ // DAMAGE. // //----------------------------------------------------------------------------- +#include "CXX/WrapPython.h" -#ifndef __PyCXX_config_hh__ -#define __PyCXX_config_hh__ - -// -// Microsoft VC++ 6.0 has no traits -// -#if defined( _MSC_VER ) - -# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 1 - -#elif defined( __GNUC__ ) -# if __GNUC__ >= 3 -# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 1 -# else -# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 0 -#endif - -// -// Assume all other compilers do -// -#else - -// Macros to deal with deficiencies in compilers -# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 1 -#endif - -#if STANDARD_LIBRARY_HAS_ITERATOR_TRAITS -# define random_access_iterator_parent(itemtype) std::iterator +#if PY_MAJOR_VERSION == 2 +#include "CXX/Python2/Config.hxx" #else -# define random_access_iterator_parent(itemtype) std::random_access_iterator +#include "CXX/Python3/Config.hxx" #endif - -// -// Which C++ standard is in use? -// -#if defined( _MSC_VER ) -# if _MSC_VER <= 1200 -// MSVC++ 6.0 -# define PYCXX_ISO_CPP_LIB 0 -# define STR_STREAM -# define TEMPLATE_TYPENAME class -# else -# define PYCXX_ISO_CPP_LIB 1 -# define STR_STREAM -# define TEMPLATE_TYPENAME typename -# endif -#elif defined( __GNUC__ ) -# if __GNUC__ >= 3 -# define PYCXX_ISO_CPP_LIB 1 -# define STR_STREAM -# define TEMPLATE_TYPENAME typename -# else -# define PYCXX_ISO_CPP_LIB 0 -# define STR_STREAM -# define TEMPLATE_TYPENAME class -# endif -#endif - -#if PYCXX_ISO_CPP_LIB -# define STR_STREAM -# define OSTRSTREAM ostringstream -# define EXPLICIT_TYPENAME typename -# define EXPLICIT_CLASS class -# define TEMPLATE_TYPENAME typename -#else -# define STR_STREAM -# define OSTRSTREAM ostrstream -# define EXPLICIT_TYPENAME -# define EXPLICIT_CLASS -# define TEMPLATE_TYPENAME class -#endif - -// before 2.5 Py_ssize_t was missing -#ifndef PY_MAJOR_VERSION -#error not defined PY_MAJOR_VERSION -#endif -#if PY_MAJOR_VERSION < 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 5) -typedef int Py_ssize_t; -#endif - -// hash_map container usage selection -// 1) if PYCXX_USING_STD_MAP is defined PyCXX will be using std::map<> container -// implementation only. -// 2) if compilers are used other than MS Visual Studio (7.1+) or GCC 3.x -// STANDARD_LIBRARY_HAS_HASH_MAP must be defined before compilation to -// make PyCXX using hash_map container. -#if !defined( PYCXX_USING_STD_MAP ) - #if defined( _MSC_VER ) || defined( __INTEL_COMPILER ) || defined ( __ICC ) || (defined( __GNUC__ ) && ( __GNUC__ > 3 )) - # define PYCXX_USING_HASH_MAP - #else - # if defined( STANDARD_LIBRARY_HAS_HASH_MAP ) && !defined( PYCXX_USING_HASH_MAP ) - # define PYCXX_USING_HASH_MAP - # endif - #endif -#endif - -#endif // __PyCXX_config_hh__ diff --git a/CXX/Exception.hxx b/CXX/Exception.hxx index 1ef087cac9fe..d4ab4ec76980 100644 --- a/CXX/Exception.hxx +++ b/CXX/Exception.hxx @@ -34,216 +34,10 @@ // DAMAGE. // //----------------------------------------------------------------------------- - -#ifndef __CXX_Exception_h -#define __CXX_Exception_h - #include "CXX/WrapPython.h" -#include "CXX/Version.hxx" -#include "CXX/Config.hxx" -#include "CXX/IndirectPythonInterface.hxx" - -#include -#include - -// This mimics the Python structure, in order to minimize confusion -namespace Py -{ - class ExtensionExceptionType; - - class Object; - - class Exception - { - public: - Exception( ExtensionExceptionType &exception, const std::string& reason ); - Exception( ExtensionExceptionType &exception, Object &reason ); - - explicit Exception () - {} - - Exception (const std::string& reason) - { - PyErr_SetString (Py::_Exc_RuntimeError(), reason.c_str()); - } - - Exception (PyObject* exception, const std::string& reason) - { - PyErr_SetString (exception, reason.c_str()); - } - - Exception (PyObject* exception, Object &reason); - - void clear() // clear the error - // technically but not philosophically const - { - PyErr_Clear(); - } - }; - - - // Abstract - class StandardError: public Exception - { - protected: - explicit StandardError() - {} - }; - - class LookupError: public StandardError - { - protected: - explicit LookupError() - {} - }; - - class ArithmeticError: public StandardError - { - protected: - explicit ArithmeticError() - {} - }; - - class EnvironmentError: public StandardError - { - protected: - explicit EnvironmentError() - {} - }; - - // Concrete - - class TypeError: public StandardError - { - public: - TypeError (const std::string& reason) - : StandardError() - { - PyErr_SetString (Py::_Exc_TypeError(),reason.c_str()); - } - }; - - class IndexError: public LookupError - { - public: - IndexError (const std::string& reason) - : LookupError() - { - PyErr_SetString (Py::_Exc_IndexError(), reason.c_str()); - } - }; - - class AttributeError: public StandardError - { - public: - AttributeError (const std::string& reason) - : StandardError() - { - PyErr_SetString (Py::_Exc_AttributeError(), reason.c_str()); - } - }; - - class NameError: public StandardError - { - public: - NameError (const std::string& reason) - : StandardError() - { - PyErr_SetString (Py::_Exc_NameError(), reason.c_str()); - } - }; - - class RuntimeError: public StandardError - { - public: - RuntimeError (const std::string& reason) - : StandardError() - { - PyErr_SetString (Py::_Exc_RuntimeError(), reason.c_str()); - } - }; - - class SystemError: public StandardError - { - public: - SystemError (const std::string& reason) - : StandardError() - { - PyErr_SetString (Py::_Exc_SystemError(),reason.c_str()); - } - }; - - class KeyError: public LookupError - { - public: - KeyError (const std::string& reason) - : LookupError() - { - PyErr_SetString (Py::_Exc_KeyError(),reason.c_str()); - } - }; - - - class ValueError: public StandardError - { - public: - ValueError (const std::string& reason) - : StandardError() - { - PyErr_SetString (Py::_Exc_ValueError(), reason.c_str()); - } - }; - - class OverflowError: public ArithmeticError - { - public: - OverflowError (const std::string& reason) - : ArithmeticError() - { - PyErr_SetString (Py::_Exc_OverflowError(), reason.c_str()); - } - }; - - class ZeroDivisionError: public ArithmeticError - { - public: - ZeroDivisionError (const std::string& reason) - : ArithmeticError() - { - PyErr_SetString (Py::_Exc_ZeroDivisionError(), reason.c_str()); - } - }; - - class FloatingPointError: public ArithmeticError - { - public: - FloatingPointError (const std::string& reason) - : ArithmeticError() - { - PyErr_SetString (Py::_Exc_FloatingPointError(), reason.c_str()); - } - }; - - class MemoryError: public StandardError - { - public: - MemoryError (const std::string& reason) - : StandardError() - { - PyErr_SetString (Py::_Exc_MemoryError(), reason.c_str()); - } - }; - - class SystemExit: public StandardError - { - public: - SystemExit (const std::string& reason) - : StandardError() - { - PyErr_SetString (Py::_Exc_SystemExit(),reason.c_str()); - } - }; - -}// Py +#if PY_MAJOR_VERSION == 2 +#include "CXX/Python2/Exception.hxx" +#else +#include "CXX/Python3/Exception.hxx" #endif diff --git a/CXX/Extensions.hxx b/CXX/Extensions.hxx index 815d17b1d1da..a4cd2669a2db 100644 --- a/CXX/Extensions.hxx +++ b/CXX/Extensions.hxx @@ -34,895 +34,10 @@ // DAMAGE. // //----------------------------------------------------------------------------- - -#ifndef __CXX_Extensions__h -#define __CXX_Extensions__h - - -#ifdef _MSC_VER -// disable warning C4786: symbol greater than 255 character, -// okay to ignore -#pragma warning(disable: 4786) -#endif - #include "CXX/WrapPython.h" -#include "CXX/Version.hxx" -#include "CXX/Config.hxx" -#include "CXX/Objects.hxx" - -extern "C" -{ - extern PyObject py_object_initializer; -} - -#include - -// std::map / hash_map selection and declarations ---------------------------- -#if !defined( PYCXX_USING_HASH_MAP ) - -#include +#if PY_MAJOR_VERSION == 2 +#include "CXX/Python2/Extensions.hxx" #else - -#if defined( __GNUC__) && !defined( _STLPORT_VERSION ) - #include -#else - #include -#endif -#if defined( _STLPORT_VERSION ) - #define __PYCXX_HASHMAP_NAMESPACE std - using namespace std; -#elif defined ( _MSC_VER ) && !defined( __INTEL_COMPILER ) && !defined( __ICC ) && !defined( __ICL ) && !defined( __ECC ) - #define __PYCXX_HASHMAP_NAMESPACE stdext - using namespace stdext; -#elif defined( __INTEL_COMPILER ) || defined( __ICC ) || defined( __ICL ) || defined( __ECC ) - #define __PYCXX_HASHMAP_NAMESPACE stdext - using namespace stdext; -#elif defined( __GNUC__ ) - #define __PYCXX_HASHMAP_NAMESPACE __gnu_cxx - using namespace __gnu_cxx; -#else - #define __PYCXX_HASHMAP_NAMESPACE std - using namespace std; -#endif - -class __pycxx_str_hash_func -{ -public: - enum - { - // parameters for hash table - bucket_size = 4, // 0 < bucket_size - min_buckets = 8 // min_buckets = 2 ^^ N, 0 < N - }; - - // http://www.azillionmonkeys.com/qed/hash.html - size_t operator()( const std::string &str ) const - { - const unsigned char * data = reinterpret_cast( str.c_str() ); - int len = (int)str.length(); - unsigned int hash = len; - unsigned int tmp; - int rem; - - if (len <= 0 || data == NULL) - return 0; - - rem = len & 3; - len >>= 2; - - /* Main loop */ - for (;len > 0; len--) - { - hash += (data[1] << 8) | data[0]; - tmp = (((data[3] << 8) | data[2]) << 11) ^ hash; - hash = (hash << 16) ^ tmp; - data += 2*sizeof (unsigned short); - hash += hash >> 11; - } - - /* Handle end cases */ - switch (rem) - { - case 3: hash += (data[1] << 8) | data[0]; - hash ^= hash << 16; - hash ^= data[sizeof (unsigned short)] << 18; - hash += hash >> 11; - break; - case 2: hash += (data[1] << 8) | data[0]; - hash ^= hash << 11; - hash += hash >> 17; - break; - case 1: hash += *data; - hash ^= hash << 10; - hash += hash >> 1; - } - - /* Force "avalanching" of final 127 bits */ - hash ^= hash << 3; - hash += hash >> 5; - hash ^= hash << 4; - hash += hash >> 17; - hash ^= hash << 25; - hash += hash >> 6; - - return hash; - } - - bool operator()(const std::string &str_1, const std::string &str_2) const - { - // test if str_1 ordered before str_2 - return str_1 < str_2; - } -}; -#endif // PYCXX_USING_HASH_MAP -// ---------------------------------------------------------------------- - -namespace Py -{ - class ExtensionModuleBase; - - // Make an Exception Type for use in raising custom exceptions - class ExtensionExceptionType : public Object - { - public: - ExtensionExceptionType(); - virtual ~ExtensionExceptionType(); - - // call init to create the type - void init( ExtensionModuleBase &module, const std::string& name, ExtensionExceptionType &parent ); - void init( ExtensionModuleBase &module, const std::string& name ); - }; - - - class MethodTable - { - public: - MethodTable(); - virtual ~MethodTable(); - - void add(const char* method_name, PyCFunction f, const char* doc="", int flag=1); - PyMethodDef* table(); - - protected: - std::vector t; // accumulator of PyMethodDef's - PyMethodDef *mt; // Actual method table produced when full - - static PyMethodDef method (const char* method_name, PyCFunction f, int flags = 1, const char* doc=""); - - private: - // - // prevent the compiler generating these unwanted functions - // - MethodTable(const MethodTable& m); //unimplemented - void operator=(const MethodTable& m); //unimplemented - - }; // end class MethodTable - - extern "C" - { - typedef PyObject *(*method_varargs_call_handler_t)( PyObject *_self, PyObject *_args ); - typedef PyObject *(*method_keyword_call_handler_t)( PyObject *_self, PyObject *_args, PyObject *_dict ); - } - - template - class MethodDefExt : public PyMethodDef - { - public: - typedef Object (T::*method_varargs_function_t)( const Tuple &args ); - typedef Object (T::*method_keyword_function_t)( const Tuple &args, const Dict &kws ); - - MethodDefExt - ( - const char *_name, - method_varargs_function_t _function, - method_varargs_call_handler_t _handler, - const char *_doc - ) - { - ext_meth_def.ml_name = const_cast(_name); - ext_meth_def.ml_meth = _handler; - ext_meth_def.ml_flags = METH_VARARGS; - ext_meth_def.ml_doc = const_cast(_doc); - - ext_varargs_function = _function; - ext_keyword_function = NULL; - } - - MethodDefExt - ( - const char *_name, - method_keyword_function_t _function, - method_keyword_call_handler_t _handler, - const char *_doc - ) - { - ext_meth_def.ml_name = const_cast(_name); - ext_meth_def.ml_meth = method_varargs_call_handler_t( _handler ); - ext_meth_def.ml_flags = METH_VARARGS|METH_KEYWORDS; - ext_meth_def.ml_doc = const_cast(_doc); - - ext_varargs_function = NULL; - ext_keyword_function = _function; - } - - ~MethodDefExt() - {} - - PyMethodDef ext_meth_def; - method_varargs_function_t ext_varargs_function; - method_keyword_function_t ext_keyword_function; - }; - - class ExtensionModuleBase - { - public: - ExtensionModuleBase( const char *name ); - virtual ~ExtensionModuleBase(); - - Module module(void) const; // only valid after initialize() has been called - Dict moduleDictionary(void) const; // only valid after initialize() has been called - - virtual Object invoke_method_keyword( const std::string &_name, const Tuple &_args, const Dict &_keywords ) = 0; - virtual Object invoke_method_varargs( const std::string &_name, const Tuple &_args ) = 0; - - const std::string &name() const; - const std::string &fullName() const; - - protected: - // Initialize the module - void initialize( const char *module_doc ); - - const std::string module_name; - const std::string full_module_name; - MethodTable method_table; - - private: - - // - // prevent the compiler generating these unwanted functions - // - ExtensionModuleBase( const ExtensionModuleBase & ); //unimplemented - void operator=( const ExtensionModuleBase & ); //unimplemented - - }; - - extern "C" PyObject *method_keyword_call_handler( PyObject *_self_and_name_tuple, PyObject *_args, PyObject *_keywords ); - extern "C" PyObject *method_varargs_call_handler( PyObject *_self_and_name_tuple, PyObject *_args ); - extern "C" void do_not_dealloc( void * ); - - - template - class ExtensionModule : public ExtensionModuleBase - { - public: - ExtensionModule( const char *name ) - : ExtensionModuleBase( name ) - {} - virtual ~ExtensionModule() - {} - - protected: - typedef Object (T::*method_varargs_function_t)( const Tuple &args ); - typedef Object (T::*method_keyword_function_t)( const Tuple &args, const Dict &kws ); - -#if defined( PYCXX_USING_HASH_MAP ) - typedef __PYCXX_HASHMAP_NAMESPACE::hash_map *, __pycxx_str_hash_func> method_map_t; -#else - typedef std::map *> method_map_t; -#endif - - static void add_varargs_method( const char *name, method_varargs_function_t function, const char *doc="" ) - { - method_map_t &mm = methods(); - - MethodDefExt *method_definition = new MethodDefExt - ( - name, - function, - method_varargs_call_handler, - doc - ); - - mm[std::string( name )] = method_definition; - } - - static void add_keyword_method( const char *name, method_keyword_function_t function, const char *doc="" ) - { - method_map_t &mm = methods(); - - MethodDefExt *method_definition = new MethodDefExt - ( - name, - function, - method_keyword_call_handler, - doc - ); - - mm[std::string( name )] = method_definition; - } - - void initialize( const char *module_doc="" ) - { - ExtensionModuleBase::initialize( module_doc ); - Dict dict( moduleDictionary() ); - - // - // put each of the methods into the modules dictionary - // so that we get called back at the function in T. - // - method_map_t &mm = methods(); - EXPLICIT_TYPENAME method_map_t::const_iterator i; - - for( i=mm.begin(); i != mm.end(); ++i ) - { - MethodDefExt *method_definition = (*i).second; - - static PyObject *self = PyCObject_FromVoidPtr( this, do_not_dealloc ); - - Tuple args( 2 ); - args[0] = Object( self ); - args[1] = String( (*i).first ); - - PyObject *func = PyCFunction_New - ( - &method_definition->ext_meth_def, - new_reference_to( args ) - ); - - dict[ (*i).first ] = Object( func ); - } - } - - protected: // Tom Malcolmson reports that derived classes need access to these - - static method_map_t &methods(void) - { - static method_map_t *map_of_methods = NULL; - if( map_of_methods == NULL ) - map_of_methods = new method_map_t; - - return *map_of_methods; - } - - - // this invoke function must be called from within a try catch block - virtual Object invoke_method_keyword( const std::string &name, const Tuple &args, const Dict &keywords ) - { - method_map_t &mm = methods(); - MethodDefExt *meth_def = mm[ name ]; - if( meth_def == NULL ) - { - std::string error_msg( "CXX - cannot invoke keyword method named " ); - error_msg += name; - throw RuntimeError( error_msg ); - } - - // cast up to the derived class - T *self = static_cast(this); - - return (self->*meth_def->ext_keyword_function)( args, keywords ); - } - - // this invoke function must be called from within a try catch block - virtual Object invoke_method_varargs( const std::string &name, const Tuple &args ) - { - method_map_t &mm = methods(); - MethodDefExt *meth_def = mm[ name ]; - if( meth_def == NULL ) - { - std::string error_msg( "CXX - cannot invoke varargs method named " ); - error_msg += name; - throw RuntimeError( error_msg ); - } - - // cast up to the derived class - T *self = static_cast(this); - - return (self->*meth_def->ext_varargs_function)( args ); - } - - private: - // - // prevent the compiler generating these unwanted functions - // - ExtensionModule( const ExtensionModule & ); //unimplemented - void operator=( const ExtensionModule & ); //unimplemented - }; - - - class PythonType - { - public: - // if you define one sequence method you must define - // all of them except the assigns - - PythonType (size_t base_size, int itemsize, const char *default_name ); - virtual ~PythonType (); - - const char *getName () const; - const char *getDoc () const; - - PyTypeObject* type_object () const; - PythonType & name (const char* nam); - PythonType & doc (const char* d); - PythonType & dealloc(void (*f)(PyObject*)); - - PythonType & supportPrint(void); - PythonType & supportGetattr(void); - PythonType & supportSetattr(void); - PythonType & supportGetattro(void); - PythonType & supportSetattro(void); - PythonType & supportCompare(void); -#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 1) - PythonType & supportRichCompare(void); -#endif - PythonType & supportRepr(void); - PythonType & supportStr(void); - PythonType & supportHash(void); - PythonType & supportCall(void); - PythonType & supportIter(void); - - PythonType & supportSequenceType(void); - PythonType & supportMappingType(void); - PythonType & supportNumberType(void); - PythonType & supportBufferType(void); - - protected: - PyTypeObject *table; - PySequenceMethods *sequence_table; - PyMappingMethods *mapping_table; - PyNumberMethods *number_table; - PyBufferProcs *buffer_table; - - void init_sequence(); - void init_mapping(); - void init_number(); - void init_buffer(); - - private: - // - // prevent the compiler generating these unwanted functions - // - PythonType (const PythonType& tb); // unimplemented - void operator=(const PythonType& t); // unimplemented - - }; // end of PythonType - - - - // Class PythonExtension is what you inherit from to create - // a new Python extension type. You give your class itself - // as the template paramter. - - // There are two ways that extension objects can get destroyed. - // 1. Their reference count goes to zero - // 2. Someone does an explicit delete on a pointer. - // In (1) the problem is to get the destructor called - // We register a special deallocator in the Python type object - // (see behaviors()) to do this. - // In (2) there is no problem, the dtor gets called. - - // PythonExtension does not use the usual Python heap allocator, - // instead using new/delete. We do the setting of the type object - // and reference count, usually done by PyObject_New, in the - // base class ctor. - - // This special deallocator does a delete on the pointer. - - - class PythonExtensionBase : public PyObject - { - public: - PythonExtensionBase(); - virtual ~PythonExtensionBase(); - - public: - virtual int print( FILE *, int ); - virtual Object getattr( const char * ) = 0; - virtual int setattr( const char *, const Object & ); - virtual Object getattro( const Object & ); - virtual int setattro( const Object &, const Object & ); - virtual int compare( const Object & ); - virtual Object rich_compare( const Object &, int op ); - virtual Object repr(); - virtual Object str(); - virtual long hash(); - virtual Object call( const Object &, const Object & ); - virtual Object iter(); - virtual PyObject* iternext(); - - // Sequence methods - virtual int sequence_length(); - virtual Object sequence_concat( const Object & ); - virtual Object sequence_repeat( Py_ssize_t ); - virtual Object sequence_item( Py_ssize_t ); - virtual Object sequence_slice( Py_ssize_t, Py_ssize_t ); - virtual int sequence_ass_item( Py_ssize_t, const Object & ); - virtual int sequence_ass_slice( Py_ssize_t, Py_ssize_t, const Object & ); - - // Mapping - virtual int mapping_length(); - virtual Object mapping_subscript( const Object & ); - virtual int mapping_ass_subscript( const Object &, const Object & ); - - // Number - virtual int number_nonzero(); - virtual Object number_negative(); - virtual Object number_positive(); - virtual Object number_absolute(); - virtual Object number_invert(); - virtual Object number_int(); - virtual Object number_float(); - virtual Object number_long(); - virtual Object number_oct(); - virtual Object number_hex(); - virtual Object number_add( const Object & ); - virtual Object number_subtract( const Object & ); - virtual Object number_multiply( const Object & ); - virtual Object number_divide( const Object & ); - virtual Object number_remainder( const Object & ); - virtual Object number_divmod( const Object & ); - virtual Object number_lshift( const Object & ); - virtual Object number_rshift( const Object & ); - virtual Object number_and( const Object & ); - virtual Object number_xor( const Object & ); - virtual Object number_or( const Object & ); - virtual Object number_power( const Object &, const Object & ); - - // Buffer - virtual Py_ssize_t buffer_getreadbuffer( Py_ssize_t, void** ); - virtual Py_ssize_t buffer_getwritebuffer( Py_ssize_t, void** ); - virtual Py_ssize_t buffer_getsegcount( Py_ssize_t* ); - - private: - void missing_method( void ); - static PyObject *method_call_handler( PyObject *self, PyObject *args ); - }; - - template - class PythonExtension: public PythonExtensionBase - { - public: - static PyTypeObject* type_object() - { - return behaviors().type_object(); - } - - static int check( PyObject *p ) - { - // is p like me? - return p->ob_type == type_object(); - } - - static int check( const Object& ob ) - { - return check( ob.ptr()); - } - - - // - // every object needs getattr implemented - // to support methods - // - virtual Object getattr( const char *name ) - { - return getattr_methods( name ); - } - - protected: - explicit PythonExtension() - : PythonExtensionBase() - { - #ifdef PyObject_INIT - (void)PyObject_INIT( this, type_object() ); - #else - ob_refcnt = 1; - ob_type = type_object(); - #endif - - // every object must support getattr - behaviors().supportGetattr(); - } - - virtual ~PythonExtension() - {} - - static PythonType &behaviors() - { - static PythonType* p; - if( p == NULL ) - { -#if defined( _CPPRTTI ) || defined(__GNUG__) - const char *default_name = (typeid ( T )).name(); -#else - const char *default_name = "unknown"; -#endif - p = new PythonType( sizeof( T ), 0, default_name ); - p->dealloc( extension_object_deallocator ); - } - - return *p; - } - - - typedef Object (T::*method_varargs_function_t)( const Tuple &args ); - typedef Object (T::*method_keyword_function_t)( const Tuple &args, const Dict &kws ); - -#if defined( PYCXX_USING_HASH_MAP ) - typedef __PYCXX_HASHMAP_NAMESPACE::hash_map *, __pycxx_str_hash_func> method_map_t; -#else - typedef std::map *> method_map_t; -#endif - - // support the default attributes, __name__, __doc__ and methods - virtual Object getattr_default( const char *_name ) - { - std::string name( _name ); - - if( name == "__name__" && type_object()->tp_name != NULL ) - { - return Py::String( type_object()->tp_name ); - } - if( name == "__doc__" && type_object()->tp_doc != NULL ) - { - return Py::String( type_object()->tp_doc ); - } - -// trying to fake out being a class for help() -// else if( name == "__bases__" ) -// { -// return Py::Tuple(0); -// } -// else if( name == "__module__" ) -// { -// return Py::Nothing(); -// } -// else if( name == "__dict__" ) -// { -// return Py::Dict(); -// } - - return getattr_methods( _name ); - } - - // turn a name into function object - virtual Object getattr_methods( const char *_name ) - { - std::string name( _name ); - - method_map_t &mm = methods(); - - EXPLICIT_TYPENAME method_map_t::const_iterator i; - - if( name == "__methods__" ) - { - List methods; - - for( i = mm.begin(); i != mm.end(); ++i ) - methods.append( String( (*i).first ) ); - - return methods; - } - - // see if name exists and get entry with method - i = mm.find( name ); - if( i == mm.end() ) - throw AttributeError( name ); - - Tuple self( 2 ); - - self[0] = Object( this ); - self[1] = String( name ); - - MethodDefExt *method_definition = i->second; - - PyObject *func = PyCFunction_New( &method_definition->ext_meth_def, self.ptr() ); - - return Object(func, true); - } - - static void add_varargs_method( const char *name, method_varargs_function_t function, const char *doc="" ) - { - method_map_t &mm = methods(); - - // check that all methods added are unique - EXPLICIT_TYPENAME method_map_t::const_iterator i; - i = mm.find( name ); - if( i != mm.end() ) - throw AttributeError( name ); - - MethodDefExt *method_definition = new MethodDefExt - ( - name, - function, - method_varargs_call_handler, - doc - ); - - mm[std::string( name )] = method_definition; - } - - static void add_keyword_method( const char *name, method_keyword_function_t function, const char *doc="" ) - { - method_map_t &mm = methods(); - - // check that all methods added are unique - EXPLICIT_TYPENAME method_map_t::const_iterator i; - i = mm.find( name ); - if( i != mm.end() ) - throw AttributeError( name ); - - MethodDefExt *method_definition = new MethodDefExt - ( - name, - function, - method_keyword_call_handler, - doc - ); - - mm[std::string( name )] = method_definition; - } - - private: - static method_map_t &methods(void) - { - static method_map_t *map_of_methods = NULL; - if( map_of_methods == NULL ) - map_of_methods = new method_map_t; - - return *map_of_methods; - } - - static PyObject *method_keyword_call_handler( PyObject *_self_and_name_tuple, PyObject *_args, PyObject *_keywords ) - { - try - { - Tuple self_and_name_tuple( _self_and_name_tuple ); - - PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); - T *self = static_cast( self_in_cobject ); - - String name( self_and_name_tuple[1] ); - - method_map_t &mm = methods(); - - EXPLICIT_TYPENAME method_map_t::const_iterator i; - i = mm.find( name ); - if( i == mm.end() ) - return 0; - - MethodDefExt *meth_def = i->second; - - Tuple args( _args ); - - // _keywords may be NULL so be careful about the way the dict is created - Dict keywords; - if( _keywords != NULL ) - keywords = Dict( _keywords ); - - Object result( (self->*meth_def->ext_keyword_function)( args, keywords ) ); - - return new_reference_to( result.ptr() ); - } - catch( Exception & ) - { - return 0; - } - } - - static PyObject *method_varargs_call_handler( PyObject *_self_and_name_tuple, PyObject *_args ) - { - try - { - Tuple self_and_name_tuple( _self_and_name_tuple ); - - PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); - T *self = static_cast( self_in_cobject ); - - String name( self_and_name_tuple[1] ); - - method_map_t &mm = methods(); - - EXPLICIT_TYPENAME method_map_t::const_iterator i; - i = mm.find( name ); - if( i == mm.end() ) - return 0; - - MethodDefExt *meth_def = i->second; - - Tuple args( _args ); - - Object result; - - // TMM: 7Jun'01 - Adding try & catch in case of STL debug-mode exceptions. - #ifdef _STLP_DEBUG - try - { - result = (self->*meth_def->ext_varargs_function)( args ); - } - catch (std::__stl_debug_exception) - { - // throw cxx::RuntimeError( sErrMsg ); - throw cxx::RuntimeError( "Error message not set yet." ); - } - #else - result = (self->*meth_def->ext_varargs_function)( args ); - #endif // _STLP_DEBUG - - return new_reference_to( result.ptr() ); - } - catch( Exception & ) - { - return 0; - } - } - - static void extension_object_deallocator ( PyObject* t ) - { - delete (T *)( t ); - } - - // - // prevent the compiler generating these unwanted functions - // - explicit PythonExtension( const PythonExtension& other ); - void operator=( const PythonExtension& rhs ); - }; - - // - // ExtensionObject is an Object that will accept only T's. - // - template - class ExtensionObject: public Object - { - public: - - explicit ExtensionObject ( PyObject *pyob ) - : Object( pyob ) - { - validate(); - } - - ExtensionObject( const ExtensionObject& other ) - : Object( *other ) - { - validate(); - } - - ExtensionObject( const Object& other ) - : Object( *other ) - { - validate(); - } - - ExtensionObject& operator= ( const Object& rhs ) - { - return (*this = *rhs ); - } - - ExtensionObject& operator= ( PyObject* rhsp ) - { - if( ptr() == rhsp ) - return *this; - set( rhsp ); - return *this; - } - - virtual bool accepts ( PyObject *pyob ) const - { - return ( pyob && T::check( pyob )); - } - - // - // Obtain a pointer to the PythonExtension object - // - T *extensionObject(void) - { - return static_cast( ptr() ); - } - }; - -} // Namespace Py -// End of CXX_Extensions.h +#include "CXX/Python3/Extensions.hxx" #endif diff --git a/CXX/IndirectPythonInterface.cxx b/CXX/IndirectPythonInterface.cxx index d36d1b52612d..7286cdf65737 100644 --- a/CXX/IndirectPythonInterface.cxx +++ b/CXX/IndirectPythonInterface.cxx @@ -34,564 +34,10 @@ // DAMAGE. // //----------------------------------------------------------------------------- +#include "CXX/WrapPython.h" -#include "CXX/IndirectPythonInterface.hxx" - -namespace Py -{ -bool _Buffer_Check( PyObject *op ) { return (op)->ob_type == _Buffer_Type(); } -bool _CFunction_Check( PyObject *op ) { return (op)->ob_type == _CFunction_Type(); } -bool _Class_Check( PyObject *op ) { return (op)->ob_type == _Class_Type(); } -bool _CObject_Check( PyObject *op ) { return (op)->ob_type == _CObject_Type(); } -bool _Complex_Check( PyObject *op ) { return (op)->ob_type == _Complex_Type(); } -bool _Dict_Check( PyObject *op ) { return (op)->ob_type == _Dict_Type(); } -bool _File_Check( PyObject *op ) { return (op)->ob_type == _File_Type(); } -bool _Float_Check( PyObject *op ) { return (op)->ob_type == _Float_Type(); } -bool _Function_Check( PyObject *op ) { return (op)->ob_type == _Function_Type(); } -bool _Instance_Check( PyObject *op ) { return (op)->ob_type == _Instance_Type(); } -bool _Boolean_Check( PyObject *op ) { return (op)->ob_type == _Bool_Type(); } -bool _Int_Check( PyObject *op ) { return (op)->ob_type == _Int_Type(); } -bool _List_Check( PyObject *o ) { return o->ob_type == _List_Type(); } -bool _Long_Check( PyObject *op ) { return (op)->ob_type == _Long_Type(); } -bool _Method_Check( PyObject *op ) { return (op)->ob_type == _Method_Type(); } -bool _Module_Check( PyObject *op ) { return (op)->ob_type == _Module_Type(); } -bool _Range_Check( PyObject *op ) { return (op)->ob_type == _Range_Type(); } -bool _Slice_Check( PyObject *op ) { return (op)->ob_type == _Slice_Type(); } -bool _String_Check( PyObject *o ) { return o->ob_type == _String_Type(); } -bool _TraceBack_Check( PyObject *v ) { return (v)->ob_type == _TraceBack_Type(); } -bool _Tuple_Check( PyObject *op ) { return (op)->ob_type == _Tuple_Type(); } -bool _Type_Check( PyObject *op ) { return (op)->ob_type == _Type_Type(); } - -#if PY_MAJOR_VERSION >= 2 -bool _Unicode_Check( PyObject *op ) { return (op)->ob_type == _Unicode_Type(); } -#endif - - - -#if defined(PY_WIN32_DELAYLOAD_PYTHON_DLL) - -#if defined(MS_WINDOWS) -#include - - -static HMODULE python_dll; - -static PyObject *ptr__Exc_ArithmeticError = NULL; -static PyObject *ptr__Exc_AssertionError = NULL; -static PyObject *ptr__Exc_AttributeError = NULL; -static PyObject *ptr__Exc_EnvironmentError = NULL; -static PyObject *ptr__Exc_EOFError = NULL; -static PyObject *ptr__Exc_Exception = NULL; -static PyObject *ptr__Exc_FloatingPointError = NULL; -static PyObject *ptr__Exc_ImportError = NULL; -static PyObject *ptr__Exc_IndexError = NULL; -static PyObject *ptr__Exc_IOError = NULL; -static PyObject *ptr__Exc_KeyboardInterrupt = NULL; -static PyObject *ptr__Exc_KeyError = NULL; -static PyObject *ptr__Exc_LookupError = NULL; -static PyObject *ptr__Exc_MemoryError = NULL; -static PyObject *ptr__Exc_MemoryErrorInst = NULL; -static PyObject *ptr__Exc_NameError = NULL; -static PyObject *ptr__Exc_NotImplementedError = NULL; -static PyObject *ptr__Exc_OSError = NULL; -static PyObject *ptr__Exc_OverflowError = NULL; -static PyObject *ptr__Exc_RuntimeError = NULL; -static PyObject *ptr__Exc_StandardError = NULL; -static PyObject *ptr__Exc_SyntaxError = NULL; -static PyObject *ptr__Exc_SystemError = NULL; -static PyObject *ptr__Exc_SystemExit = NULL; -static PyObject *ptr__Exc_TypeError = NULL; -static PyObject *ptr__Exc_ValueError = NULL; -static PyObject *ptr__Exc_ZeroDivisionError = NULL; - -#ifdef MS_WINDOWS -static PyObject *ptr__Exc_WindowsError = NULL; -#endif - -#if PY_MAJOR_VERSION >= 2 -static PyObject *ptr__Exc_IndentationError = NULL; -static PyObject *ptr__Exc_TabError = NULL; -static PyObject *ptr__Exc_UnboundLocalError = NULL; -static PyObject *ptr__Exc_UnicodeError = NULL; -#endif - -static PyObject *ptr__PyNone = NULL; - -static PyObject *ptr__PyFalse = NULL; -static PyObject *ptr__PyTrue = NULL; - -static PyTypeObject *ptr__Buffer_Type = NULL; -static PyTypeObject *ptr__CFunction_Type = NULL; -static PyTypeObject *ptr__Class_Type = NULL; -static PyTypeObject *ptr__CObject_Type = NULL; -static PyTypeObject *ptr__Complex_Type = NULL; -static PyTypeObject *ptr__Dict_Type = NULL; -static PyTypeObject *ptr__File_Type = NULL; -static PyTypeObject *ptr__Float_Type = NULL; -static PyTypeObject *ptr__Function_Type = NULL; -static PyTypeObject *ptr__Instance_Type = NULL; -static PyTypeObject *ptr__Int_Type = NULL; -static PyTypeObject *ptr__List_Type = NULL; -static PyTypeObject *ptr__Long_Type = NULL; -static PyTypeObject *ptr__Method_Type = NULL; -static PyTypeObject *ptr__Module_Type = NULL; -static PyTypeObject *ptr__Range_Type = NULL; -static PyTypeObject *ptr__Slice_Type = NULL; -static PyTypeObject *ptr__String_Type = NULL; -static PyTypeObject *ptr__TraceBack_Type = NULL; -static PyTypeObject *ptr__Tuple_Type = NULL; -static PyTypeObject *ptr__Type_Type = NULL; - -#if PY_MAJOR_VERSION >= 2 -static PyTypeObject *ptr__Unicode_Type = NULL; -#endif - -static int *ptr_Py_DebugFlag = NULL; -static int *ptr_Py_InteractiveFlag = NULL; -static int *ptr_Py_OptimizeFlag = NULL; -static int *ptr_Py_NoSiteFlag = NULL; -static int *ptr_Py_TabcheckFlag = NULL; -static int *ptr_Py_VerboseFlag = NULL; - -#if PY_MAJOR_VERSION >= 2 -static int *ptr_Py_UnicodeFlag = NULL; -#endif - -static char **ptr__Py_PackageContext = NULL; - -#ifdef Py_REF_DEBUG -int *ptr_Py_RefTotal; -#endif - - -//-------------------------------------------------------------------------------- -class GetAddressException -{ -public: - GetAddressException( const char *_name ) - : name( _name ) - {} - virtual ~GetAddressException() {} - const char *name; -}; - - -//-------------------------------------------------------------------------------- -static PyObject *GetPyObjectPointer_As_PyObjectPointer( const char *name ) -{ - FARPROC addr = GetProcAddress( python_dll, name ); - if( addr == NULL ) - throw GetAddressException( name ); - - return *(PyObject **)addr; -} - -static PyObject *GetPyObject_As_PyObjectPointer( const char *name ) -{ - FARPROC addr = GetProcAddress( python_dll, name ); - if( addr == NULL ) - throw GetAddressException( name ); - - return (PyObject *)addr; -} - -static PyTypeObject *GetPyTypeObjectPointer_As_PyTypeObjectPointer( const char *name ) -{ - FARPROC addr = GetProcAddress( python_dll, name ); - if( addr == NULL ) - throw GetAddressException( name ); - - return *(PyTypeObject **)addr; -} - -static PyTypeObject *GetPyTypeObject_As_PyTypeObjectPointer( const char *name ) -{ - FARPROC addr = GetProcAddress( python_dll, name ); - if( addr == NULL ) - throw GetAddressException( name ); - - return (PyTypeObject *)addr; -} - -static int *GetInt_as_IntPointer( const char *name ) -{ - FARPROC addr = GetProcAddress( python_dll, name ); - if( addr == NULL ) - throw GetAddressException( name ); - - return (int *)addr; -} - -static char **GetCharPointer_as_CharPointerPointer( const char *name ) -{ - FARPROC addr = GetProcAddress( python_dll, name ); - if( addr == NULL ) - throw GetAddressException( name ); - - return (char **)addr; -} - - -#ifdef _DEBUG -static const char python_dll_name_format[] = "PYTHON%1.1d%1.1d_D.DLL"; +#if PY_MAJOR_VERSION == 2 +#include "Python2/IndirectPythonInterface.cxx" #else -static const char python_dll_name_format[] = "PYTHON%1.1d%1.1d.DLL"; -#endif - -//-------------------------------------------------------------------------------- -bool InitialisePythonIndirectInterface() -{ - char python_dll_name[sizeof(python_dll_name_format)]; - - sprintf( python_dll_name, python_dll_name_format, PY_MAJOR_VERSION, PY_MINOR_VERSION ); - - python_dll = LoadLibrary( python_dll_name ); - if( python_dll == NULL ) - return false; - - try -{ -#ifdef Py_REF_DEBUG - ptr_Py_RefTotal = GetInt_as_IntPointer( "_Py_RefTotal" ); -#endif - ptr_Py_DebugFlag = GetInt_as_IntPointer( "Py_DebugFlag" ); - ptr_Py_InteractiveFlag = GetInt_as_IntPointer( "Py_InteractiveFlag" ); - ptr_Py_OptimizeFlag = GetInt_as_IntPointer( "Py_OptimizeFlag" ); - ptr_Py_NoSiteFlag = GetInt_as_IntPointer( "Py_NoSiteFlag" ); - ptr_Py_TabcheckFlag = GetInt_as_IntPointer( "Py_TabcheckFlag" ); - ptr_Py_VerboseFlag = GetInt_as_IntPointer( "Py_VerboseFlag" ); -#if PY_MAJOR_VERSION >= 2 - ptr_Py_UnicodeFlag = GetInt_as_IntPointer( "Py_UnicodeFlag" ); -#endif - ptr__Py_PackageContext = GetCharPointer_as_CharPointerPointer( "_Py_PackageContext" ); - - ptr__Exc_ArithmeticError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ArithmeticError" ); - ptr__Exc_AssertionError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_AssertionError" ); - ptr__Exc_AttributeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_AttributeError" ); - ptr__Exc_EnvironmentError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_EnvironmentError" ); - ptr__Exc_EOFError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_EOFError" ); - ptr__Exc_Exception = GetPyObjectPointer_As_PyObjectPointer( "PyExc_Exception" ); - ptr__Exc_FloatingPointError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_FloatingPointError" ); - ptr__Exc_ImportError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ImportError" ); - ptr__Exc_IndexError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_IndexError" ); - ptr__Exc_IOError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_IOError" ); - ptr__Exc_KeyboardInterrupt = GetPyObjectPointer_As_PyObjectPointer( "PyExc_KeyboardInterrupt" ); - ptr__Exc_KeyError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_KeyError" ); - ptr__Exc_LookupError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_LookupError" ); - ptr__Exc_MemoryError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_MemoryError" ); - ptr__Exc_MemoryErrorInst = GetPyObjectPointer_As_PyObjectPointer( "PyExc_MemoryErrorInst" ); - ptr__Exc_NameError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_NameError" ); - ptr__Exc_NotImplementedError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_NotImplementedError" ); - ptr__Exc_OSError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_OSError" ); - ptr__Exc_OverflowError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_OverflowError" ); - ptr__Exc_RuntimeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_RuntimeError" ); - ptr__Exc_StandardError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_StandardError" ); - ptr__Exc_SyntaxError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_SyntaxError" ); - ptr__Exc_SystemError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_SystemError" ); - ptr__Exc_SystemExit = GetPyObjectPointer_As_PyObjectPointer( "PyExc_SystemExit" ); - ptr__Exc_TypeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_TypeError" ); - ptr__Exc_ValueError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ValueError" ); -#ifdef MS_WINDOWS - ptr__Exc_WindowsError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_WindowsError" ); -#endif - ptr__Exc_ZeroDivisionError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ZeroDivisionError" ); - -#if PY_MAJOR_VERSION >= 2 - ptr__Exc_IndentationError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_IndentationError" ); - ptr__Exc_TabError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_TabError" ); - ptr__Exc_UnboundLocalError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_UnboundLocalError" ); - ptr__Exc_UnicodeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_UnicodeError" ); -#endif - ptr__PyNone = GetPyObject_As_PyObjectPointer( "_Py_NoneStruct" ); - - ptr__PyFalse = GetPyObject_As_PyObjectPointer( "_Py_ZeroStruct" ); - ptr__PyTrue = GetPyObject_As_PyObjectPointer( "_Py_TrueStruct" ); - - ptr__Buffer_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyBuffer_Type" ); - ptr__CFunction_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyCFunction_Type" ); - ptr__Class_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyClass_Type" ); - ptr__CObject_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyCObject_Type" ); - ptr__Complex_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyComplex_Type" ); - ptr__Dict_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyDict_Type" ); - ptr__File_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyFile_Type" ); - ptr__Float_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyFloat_Type" ); - ptr__Function_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyFunction_Type" ); - ptr__Instance_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyInstance_Type" ); - ptr__Int_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyInt_Type" ); - ptr__List_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyList_Type" ); - ptr__Long_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyLong_Type" ); - ptr__Method_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyMethod_Type" ); - ptr__Module_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyModule_Type" ); - ptr__Range_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyRange_Type" ); - ptr__Slice_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PySlice_Type" ); - ptr__String_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyString_Type" ); - ptr__TraceBack_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyTraceBack_Type" ); - ptr__Tuple_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyTuple_Type" ); - ptr__Type_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyType_Type" ); - -#if PY_MAJOR_VERSION >= 2 - ptr__Unicode_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyUnicode_Type" ); -#endif -} - catch( GetAddressException &e ) - { - OutputDebugString( python_dll_name ); - OutputDebugString( " does not contain symbol "); - OutputDebugString( e.name ); - OutputDebugString( "\n" ); - - return false; - } - - return true; -} - -// -// Wrap variables as function calls -// -PyObject * _Exc_ArithmeticError(){ return ptr__Exc_ArithmeticError; } -PyObject * _Exc_AssertionError(){ return ptr__Exc_AssertionError; } -PyObject * _Exc_AttributeError(){ return ptr__Exc_AttributeError; } -PyObject * _Exc_EnvironmentError(){ return ptr__Exc_EnvironmentError; } -PyObject * _Exc_EOFError() { return ptr__Exc_EOFError; } -PyObject * _Exc_Exception() { return ptr__Exc_Exception; } -PyObject * _Exc_FloatingPointError(){ return ptr__Exc_FloatingPointError; } -PyObject * _Exc_ImportError() { return ptr__Exc_ImportError; } -PyObject * _Exc_IndexError() { return ptr__Exc_IndexError; } -PyObject * _Exc_IOError() { return ptr__Exc_IOError; } -PyObject * _Exc_KeyboardInterrupt(){ return ptr__Exc_KeyboardInterrupt; } -PyObject * _Exc_KeyError() { return ptr__Exc_KeyError; } -PyObject * _Exc_LookupError() { return ptr__Exc_LookupError; } -PyObject * _Exc_MemoryError() { return ptr__Exc_MemoryError; } -PyObject * _Exc_MemoryErrorInst(){ return ptr__Exc_MemoryErrorInst; } -PyObject * _Exc_NameError() { return ptr__Exc_NameError; } -PyObject * _Exc_NotImplementedError(){ return ptr__Exc_NotImplementedError; } -PyObject * _Exc_OSError() { return ptr__Exc_OSError; } -PyObject * _Exc_OverflowError() { return ptr__Exc_OverflowError; } -PyObject * _Exc_RuntimeError() { return ptr__Exc_RuntimeError; } -PyObject * _Exc_StandardError() { return ptr__Exc_StandardError; } -PyObject * _Exc_SyntaxError() { return ptr__Exc_SyntaxError; } -PyObject * _Exc_SystemError() { return ptr__Exc_SystemError; } -PyObject * _Exc_SystemExit() { return ptr__Exc_SystemExit; } -PyObject * _Exc_TypeError() { return ptr__Exc_TypeError; } -PyObject * _Exc_ValueError() { return ptr__Exc_ValueError; } -#ifdef MS_WINDOWS -PyObject * _Exc_WindowsError() { return ptr__Exc_WindowsError; } -#endif -PyObject * _Exc_ZeroDivisionError(){ return ptr__Exc_ZeroDivisionError; } - -#if PY_MAJOR_VERSION >= 2 -PyObject * _Exc_IndentationError(){ return ptr__Exc_IndentationError; } -PyObject * _Exc_TabError() { return ptr__Exc_TabError; } -PyObject * _Exc_UnboundLocalError(){ return ptr__Exc_UnboundLocalError; } -PyObject * _Exc_UnicodeError() { return ptr__Exc_UnicodeError; } -#endif - -// -// wrap items in Object.h -// -PyObject * _None() { return ptr__PyNone; } - -PyObject * _False() { return ptr__PyFalse; } -PyObject * _True() { return ptr__PyTrue; } - -PyTypeObject * _Buffer_Type() { return ptr__Buffer_Type; } -PyTypeObject * _CFunction_Type(){ return ptr__CFunction_Type; } -PyTypeObject * _Class_Type() { return ptr__Class_Type; } -PyTypeObject * _CObject_Type() { return ptr__CObject_Type; } -PyTypeObject * _Complex_Type() { return ptr__Complex_Type; } -PyTypeObject * _Dict_Type() { return ptr__Dict_Type; } -PyTypeObject * _File_Type() { return ptr__File_Type; } -PyTypeObject * _Float_Type() { return ptr__Float_Type; } -PyTypeObject * _Function_Type() { return ptr__Function_Type; } -PyTypeObject * _Instance_Type() { return ptr__Instance_Type; } -PyTypeObject * _Bool_Type() { return ptr__Bool_Type; } -PyTypeObject * _Int_Type() { return ptr__Int_Type; } -PyTypeObject * _List_Type() { return ptr__List_Type; } -PyTypeObject * _Long_Type() { return ptr__Long_Type; } -PyTypeObject * _Method_Type() { return ptr__Method_Type; } -PyTypeObject * _Module_Type() { return ptr__Module_Type; } -PyTypeObject * _Range_Type() { return ptr__Range_Type; } -PyTypeObject * _Slice_Type() { return ptr__Slice_Type; } -PyTypeObject * _String_Type() { return ptr__String_Type; } -PyTypeObject * _TraceBack_Type(){ return ptr__TraceBack_Type; } -PyTypeObject * _Tuple_Type() { return ptr__Tuple_Type; } -PyTypeObject * _Type_Type() { return ptr__Type_Type; } - -#if PY_MAJOR_VERSION >= 2 -PyTypeObject * _Unicode_Type() { return ptr__Unicode_Type; } -#endif - -char *__Py_PackageContext() { return *ptr__Py_PackageContext; } - - -// -// wrap the Python Flag variables -// -int &_Py_DebugFlag() { return *ptr_Py_DebugFlag; } -int &_Py_InteractiveFlag() { return *ptr_Py_InteractiveFlag; } -int &_Py_OptimizeFlag() { return *ptr_Py_OptimizeFlag; } -int &_Py_NoSiteFlag() { return *ptr_Py_NoSiteFlag; } -int &_Py_TabcheckFlag() { return *ptr_Py_TabcheckFlag; } -int &_Py_VerboseFlag() { return *ptr_Py_VerboseFlag; } -#if PY_MAJOR_VERSION >= 2 -int &_Py_UnicodeFlag() { return *ptr_Py_UnicodeFlag; } -#endif - -void _XINCREF( PyObject *op ) -{ - // This function must match the contents of Py_XINCREF(op) - if( op == NULL ) - return; - -#ifdef Py_REF_DEBUG - (*ptr_Py_RefTotal)++; -#endif - (op)->ob_refcnt++; - -} - -void _XDECREF( PyObject *op ) -{ - // This function must match the contents of Py_XDECREF(op); - if( op == NULL ) - return; - -#ifdef Py_REF_DEBUG - (*ptr_Py_RefTotal)--; -#endif - - if (--(op)->ob_refcnt == 0) - _Py_Dealloc((PyObject *)(op)); -} - - -#else -#error "Can only delay load under Win32" -#endif - -#else - -// -// Duplicated these declarations from rangeobject.h which is missing the -// extern "C". This has been reported as a bug upto and include 2.1 -// -extern "C" DL_IMPORT(PyTypeObject) PyRange_Type; -extern "C" DL_IMPORT(PyObject *) PyRange_New(long, long, long, int); - - -//================================================================================ -// -// Map onto Macros -// -//================================================================================ - -// -// Wrap variables as function calls -// - -PyObject * _Exc_ArithmeticError() { return ::PyExc_ArithmeticError; } -PyObject * _Exc_AssertionError() { return ::PyExc_AssertionError; } -PyObject * _Exc_AttributeError() { return ::PyExc_AttributeError; } -PyObject * _Exc_EnvironmentError() { return ::PyExc_EnvironmentError; } -PyObject * _Exc_EOFError() { return ::PyExc_EOFError; } -PyObject * _Exc_Exception() { return ::PyExc_Exception; } -PyObject * _Exc_FloatingPointError() { return ::PyExc_FloatingPointError; } -PyObject * _Exc_ImportError() { return ::PyExc_ImportError; } -PyObject * _Exc_IndexError() { return ::PyExc_IndexError; } -PyObject * _Exc_IOError() { return ::PyExc_IOError; } -PyObject * _Exc_KeyboardInterrupt() { return ::PyExc_KeyboardInterrupt; } -PyObject * _Exc_KeyError() { return ::PyExc_KeyError; } -PyObject * _Exc_LookupError() { return ::PyExc_LookupError; } -PyObject * _Exc_MemoryError() { return ::PyExc_MemoryError; } -PyObject * _Exc_MemoryErrorInst() { return ::PyExc_MemoryErrorInst; } -PyObject * _Exc_NameError() { return ::PyExc_NameError; } -PyObject * _Exc_NotImplementedError() { return ::PyExc_NotImplementedError; } -PyObject * _Exc_OSError() { return ::PyExc_OSError; } -PyObject * _Exc_OverflowError() { return ::PyExc_OverflowError; } -PyObject * _Exc_RuntimeError() { return ::PyExc_RuntimeError; } -PyObject * _Exc_StandardError() { return ::PyExc_StandardError; } -PyObject * _Exc_SyntaxError() { return ::PyExc_SyntaxError; } -PyObject * _Exc_SystemError() { return ::PyExc_SystemError; } -PyObject * _Exc_SystemExit() { return ::PyExc_SystemExit; } -PyObject * _Exc_TypeError() { return ::PyExc_TypeError; } -PyObject * _Exc_ValueError() { return ::PyExc_ValueError; } -PyObject * _Exc_ZeroDivisionError() { return ::PyExc_ZeroDivisionError; } - -#ifdef MS_WINDOWS -PyObject * _Exc_WindowsError() { return ::PyExc_WindowsError; } -#endif - - -#if PY_MAJOR_VERSION >= 2 -PyObject * _Exc_IndentationError() { return ::PyExc_IndentationError; } -PyObject * _Exc_TabError() { return ::PyExc_TabError; } -PyObject * _Exc_UnboundLocalError() { return ::PyExc_UnboundLocalError; } -PyObject * _Exc_UnicodeError() { return ::PyExc_UnicodeError; } -#endif - - -// -// wrap items in Object.h -// -PyObject * _None() { return &::_Py_NoneStruct; } - -PyObject * _False() { return Py_False; } -PyObject * _True() { return Py_True; } - -PyTypeObject * _Buffer_Type() { return &PyBuffer_Type; } -PyTypeObject * _CFunction_Type() { return &PyCFunction_Type; } -PyTypeObject * _Class_Type() { return &PyClass_Type; } -PyTypeObject * _CObject_Type() { return &PyCObject_Type; } -PyTypeObject * _Complex_Type() { return &PyComplex_Type; } -PyTypeObject * _Dict_Type() { return &PyDict_Type; } -PyTypeObject * _File_Type() { return &PyFile_Type; } -PyTypeObject * _Float_Type() { return &PyFloat_Type; } -PyTypeObject * _Function_Type() { return &PyFunction_Type; } -PyTypeObject * _Instance_Type() { return &PyInstance_Type; } -PyTypeObject * _Bool_Type() { return &PyBool_Type; } -PyTypeObject * _Int_Type() { return &PyInt_Type; } -PyTypeObject * _List_Type() { return &PyList_Type; } -PyTypeObject * _Long_Type() { return &PyLong_Type; } -PyTypeObject * _Method_Type() { return &PyMethod_Type; } -PyTypeObject * _Module_Type() { return &PyModule_Type; } -PyTypeObject * _Range_Type() { return &PyRange_Type; } -PyTypeObject * _Slice_Type() { return &PySlice_Type; } -PyTypeObject * _String_Type() { return &PyString_Type; } -PyTypeObject * _TraceBack_Type() { return &PyTraceBack_Type; } -PyTypeObject * _Tuple_Type() { return &PyTuple_Type; } -PyTypeObject * _Type_Type() { return &PyType_Type; } - -#if PY_MAJOR_VERSION >= 2 -PyTypeObject * _Unicode_Type() { return &PyUnicode_Type; } -#endif - -// -// wrap flags -// -int &_Py_DebugFlag() { return Py_DebugFlag; } -int &_Py_InteractiveFlag(){ return Py_InteractiveFlag; } -int &_Py_OptimizeFlag() { return Py_OptimizeFlag; } -int &_Py_NoSiteFlag() { return Py_NoSiteFlag; } -int &_Py_TabcheckFlag() { return Py_TabcheckFlag; } -int &_Py_VerboseFlag() { return Py_VerboseFlag; } -#if PY_MAJOR_VERSION >= 2 -int &_Py_UnicodeFlag() { return Py_UnicodeFlag; } -#endif -char *__Py_PackageContext(){ return _Py_PackageContext; } - -// -// Needed to keep the abstactions for delayload interface -// -void _XINCREF( PyObject *op ) -{ - Py_XINCREF(op); -} - -void _XDECREF( PyObject *op ) -{ - Py_XDECREF(op); -} - +#include "Python3/IndirectPythonInterface.cxx" #endif -} diff --git a/CXX/IndirectPythonInterface.cxx~ b/CXX/IndirectPythonInterface.cxx~ new file mode 100644 index 000000000000..0ee480df5c48 --- /dev/null +++ b/CXX/IndirectPythonInterface.cxx~ @@ -0,0 +1,43 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- +#include "CXX/WrapPython.h" + +#if PY_MAJOR_VERSION == 2 +#include "Src/Python2/IndirectPythonInterface.cxx" +#else +#include "Src/Python3/IndirectPythonInterface.cxx" +#endif diff --git a/CXX/IndirectPythonInterface.hxx b/CXX/IndirectPythonInterface.hxx index a29a394c6c6a..26cd2d2989fd 100644 --- a/CXX/IndirectPythonInterface.hxx +++ b/CXX/IndirectPythonInterface.hxx @@ -1,198 +1,7 @@ -//----------------------------------------------------------------------------- -// -// Copyright (c) 1998 - 2007, The Regents of the University of California -// Produced at the Lawrence Livermore National Laboratory -// All rights reserved. -// -// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The -// full copyright notice is contained in the file COPYRIGHT located at the root -// of the PyCXX distribution. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, -// this list of conditions and the disclaimer below. -// - Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the disclaimer (as noted below) in the -// documentation and/or materials provided with the distribution. -// - Neither the name of the UC/LLNL nor the names of its contributors may be -// used to endorse or promote products derived from this software without -// specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF -// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -// DAMAGE. -// -//----------------------------------------------------------------------------- - -#ifndef __CXX_INDIRECT_PYTHON_INTERFACE__HXX__ -#define __CXX_INDIRECT_PYTHON_INTERFACE__HXX__ - #include "CXX/WrapPython.h" -namespace Py -{ -bool InitialisePythonIndirectInterface(); - -// -// Wrap Exception variables as function calls -// -PyObject * _Exc_Exception(); -PyObject * _Exc_StandardError(); -PyObject * _Exc_ArithmeticError(); -PyObject * _Exc_LookupError(); - -PyObject * _Exc_AssertionError(); -PyObject * _Exc_AttributeError(); -PyObject * _Exc_EOFError(); -PyObject * _Exc_FloatingPointError(); -PyObject * _Exc_EnvironmentError(); -PyObject * _Exc_IOError(); -PyObject * _Exc_OSError(); -PyObject * _Exc_ImportError(); -PyObject * _Exc_IndexError(); -PyObject * _Exc_KeyError(); -PyObject * _Exc_KeyboardInterrupt(); -PyObject * _Exc_MemoryError(); -PyObject * _Exc_NameError(); -PyObject * _Exc_OverflowError(); -PyObject * _Exc_RuntimeError(); -PyObject * _Exc_NotImplementedError(); -PyObject * _Exc_SyntaxError(); -PyObject * _Exc_SystemError(); -PyObject * _Exc_SystemExit(); -PyObject * _Exc_TypeError(); -PyObject * _Exc_ValueError(); -PyObject * _Exc_ZeroDivisionError(); -#ifdef MS_WINDOWS -PyObject * _Exc_WindowsError(); -#endif - -PyObject * _Exc_MemoryErrorInst(); - -#if PY_MAJOR_VERSION >= 2 -PyObject * _Exc_IndentationError(); -PyObject * _Exc_TabError(); -PyObject * _Exc_UnboundLocalError(); -PyObject * _Exc_UnicodeError(); -#endif - -// -// Wrap Object variables as function calls -// -PyObject * _None(); - -PyObject * _False(); -PyObject * _True(); - -// -// Wrap Type variables as function calls -// -PyTypeObject * _List_Type(); -bool _List_Check( PyObject *o ); - -PyTypeObject * _Buffer_Type(); -bool _Buffer_Check( PyObject *op ); - -PyTypeObject * _Class_Type(); -bool _Class_Check( PyObject *op ); - -PyTypeObject * _Instance_Type(); -bool _Instance_Check( PyObject *op ); - -PyTypeObject * _Method_Type(); -bool _Method_Check( PyObject *op ); - -PyTypeObject * _CObject_Type(); -bool _CObject_Check( PyObject *op ); - -PyTypeObject * _Complex_Type(); -bool _Complex_Check( PyObject *op ); - -PyTypeObject * _Dict_Type(); -bool _Dict_Check( PyObject *op ); - -PyTypeObject * _File_Type(); -bool _File_Check( PyObject *op ); - -PyTypeObject * _Float_Type(); -bool _Float_Check( PyObject *op ); - -PyTypeObject * _Frame_Type(); -bool _Frame_Check( PyObject *op ); - -PyTypeObject * _Function_Type(); -bool _Function_Check( PyObject *op ); - -PyTypeObject * _Bool_Type(); -bool _Boolean_Check( PyObject *op ); - -PyTypeObject * _Int_Type(); -bool _Int_Check( PyObject *op ); - -PyTypeObject * _List_Type(); -bool _List_Check( PyObject *op ); - -PyTypeObject * _Long_Type(); -bool _Long_Check( PyObject *op ); - -PyTypeObject * _CFunction_Type(); -bool _CFunction_Check( PyObject *op ); - -PyTypeObject * _Module_Type(); -bool _Module_Check( PyObject *op ); - -PyTypeObject * _Type_Type(); -bool _Type_Check( PyObject *op ); - -PyTypeObject * _Range_Type(); -bool _Range_Check( PyObject *op ); - -PyTypeObject * _Slice_Type(); -bool _Slice_Check( PyObject *op ); - -PyTypeObject * _String_Type(); -bool _String_Check( PyObject *op ); - -PyTypeObject * _Unicode_Type(); -bool _Unicode_Check( PyObject *op ); - -PyTypeObject * _TraceBack_Type(); -bool _TraceBack_Check( PyObject *v ); - -PyTypeObject * _Tuple_Type(); -bool _Tuple_Check( PyObject *op ); - -#if PY_MAJOR_VERSION >= 2 -PyTypeObject * _Unicode_Type(); -bool _Unicode_Check( PyObject *op ); -#endif - -int &_Py_DebugFlag(); -int &_Py_InteractiveFlag(); -int &_Py_OptimizeFlag(); -int &_Py_NoSiteFlag(); -int &_Py_TabcheckFlag(); -int &_Py_VerboseFlag(); - -#if PY_MAJOR_VERSION >= 2 -int &_Py_UnicodeFlag(); +#if PY_MAJOR_VERSION == 2 +#include "CXX/Python2/IndirectPythonInterface.hxx" +#else +#include "CXX/Python3/IndirectPythonInterface.hxx" #endif - -void _XINCREF( PyObject *op ); -void _XDECREF( PyObject *op ); - -char *__Py_PackageContext(); -} - -#endif // __CXX_INDIRECT_PYTHON_INTERFACE__HXX__ diff --git a/CXX/Objects.hxx b/CXX/Objects.hxx index e9d59a44e0b0..cb0294dec434 100644 --- a/CXX/Objects.hxx +++ b/CXX/Objects.hxx @@ -34,3007 +34,10 @@ // DAMAGE. // //----------------------------------------------------------------------------- - -#ifndef __CXX_Objects__h -#define __CXX_Objects__h - #include "CXX/WrapPython.h" -#include "CXX/Version.hxx" -#include "CXX/Config.hxx" -#include "CXX/Exception.hxx" - -#include -#include STR_STREAM -#include -#include -#include -#include - -namespace Py -{ - typedef int sequence_index_type; // type of an index into a sequence - - // Forward declarations - class Object; - class Type; - template class SeqBase; - class String; - class List; - template class MapBase; - - // new_reference_to also overloaded below on Object - inline PyObject* new_reference_to(PyObject* p) - { - Py::_XINCREF(p); - return p; - } - - // returning Null() from an extension method triggers a - // Python exception - inline PyObject* Null() - { - return (static_cast(0)); - } - - //===========================================================================// - // class Object - // The purpose of this class is to serve as the most general kind of - // Python object, for the purpose of writing C++ extensions in Python - // Objects hold a PyObject* which they own. This pointer is always a - // valid pointer to a Python object. In children we must maintain this behavior. - // - // Instructions on how to make your own class MyType descended from Object: - // (0) Pick a base class, either Object or perhaps SeqBase or MapBase. - // This example assumes Object. - - // (1) Write a routine int MyType_Check (PyObject *) modeled after PyInt_Check, - // PyFloat_Check, etc. - - // (2) Add method accepts: - // virtual bool accepts (PyObject *pyob) const { - // return pyob && MyType_Check (pyob); - // } - - // (3) Include the following constructor and copy constructor - // - /* - explicit MyType (PyObject *pyob): Object(pyob) { - validate(); -} - - MyType(const Object& other): Object(other.ptr()) { - validate(); -} - */ - - // Alernate version for the constructor to allow for construction from owned pointers: - /* - explicit MyType (PyObject *pyob): Object(pyob) { - validate(); -} - */ - - // You may wish to add other constructors; see the classes below for examples. - // Each constructor must use "set" to set the pointer - // and end by validating the pointer you have created. - - // (4) Each class needs at least these two assignment operators: - /* - MyType& operator= (const Object& rhs) { - return (*this = *rhs); -} - - Mytype& operator= (PyObject* rhsp) { - if(ptr() == rhsp) return *this; - set(rhsp); - return *this; -} - */ - // Note on accepts: constructors call the base class - // version of a virtual when calling the base class constructor, - // so the test has to be done explicitly in a descendent. - - // If you are inheriting from PythonExtension to define an object - // note that it contains PythonExtension::check - // which you can use in accepts when writing a wrapper class. - // See Demo/range.h and Demo/range.cxx for an example. - - class Object - { - private: - // the pointer to the Python object - // Only Object sets this directly. - // The default constructor for Object sets it to Py_None and - // child classes must use "set" to set it - // - PyObject* p; - - protected: - - void set (PyObject* pyob, bool owned = false) - { - release(); - p = pyob; - if (!owned) - { - Py::_XINCREF (p); - } - validate(); - } - - void release () - { - Py::_XDECREF (p); - p = 0; - } - - void validate(); - - public: - // Constructor acquires new ownership of pointer unless explicitly told not to. - explicit Object (PyObject* pyob=Py::_None(), bool owned = false): p (pyob) - { - if(!owned) - { - Py::_XINCREF (p); - } - validate(); - } - - // Copy constructor acquires new ownership of pointer - Object (const Object& ob): p(ob.p) - { - Py::_XINCREF (p); - validate(); - } - - // Assignment acquires new ownership of pointer - Object& operator= (const Object& rhs) - { - set(rhs.p); - return *this; - } - - Object& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (rhsp); - return *this; - } - - // Destructor - virtual ~Object () - { - release (); - } - - // Loaning the pointer to others, retain ownership - PyObject* operator* () const - { - return p; - } - - // Explicit reference_counting changes - void increment_reference_count() - { - Py::_XINCREF(p); - } - - void decrement_reference_count() - { - // not allowed to commit suicide, however - if(reference_count() == 1) - throw RuntimeError("Object::decrement_reference_count error."); - Py::_XDECREF(p); - } - // Would like to call this pointer() but messes up STL in SeqBase - PyObject* ptr () const - { - return p; - } - - // - // Queries - // - - // Can pyob be used in this object's constructor? - virtual bool accepts (PyObject *pyob) const - { - return (pyob != 0); - } - - Py_ssize_t reference_count () const - { // the reference count - return p ? p->ob_refcnt : 0; - } - - Type type () const; // the type object associated with this one - - String str () const; // the str() representation - - std::string as_string() const; - - String repr () const; // the repr () representation - - List dir () const; // the dir() list - - bool hasAttr (const std::string& s) const - { - return PyObject_HasAttrString (p, const_cast(s.c_str())) ? true: false; - } - - Object getAttr (const std::string& s) const - { - return Object (PyObject_GetAttrString (p, const_cast(s.c_str())), true); - } - - Object getItem (const Object& key) const - { - return Object (PyObject_GetItem(p, *key), true); - } - - long hashValue () const - { - return PyObject_Hash (p); - } - - // - // int print (FILE* fp, int flags=Py_Print_RAW) - //{ - // return PyObject_Print (p, fp, flags); - //} - // - bool is(PyObject *pother) const - { // identity test - return p == pother; - } - - bool is(const Object& other) const - { // identity test - return p == other.p; - } - - bool isNone() const - { - return p == _None(); - } - - bool isCallable () const - { - return PyCallable_Check (p) != 0; - } - - bool isInstance () const - { - return PyInstance_Check (p) != 0; - } - - bool isDict () const - { - return Py::_Dict_Check (p); - } - - bool isList () const - { - return Py::_List_Check (p); - } - - bool isMapping () const - { - return PyMapping_Check (p) != 0; - } - - bool isNumeric () const - { - return PyNumber_Check (p) != 0; - } - - bool isSequence () const - { - return PySequence_Check (p) != 0; - } - - bool isTrue () const - { - return PyObject_IsTrue (p) != 0; - } - - bool isType (const Type& t) const; - bool isTuple() const - { - return Py::_Tuple_Check(p); - } - - bool isString() const - { - return Py::_String_Check(p) || Py::_Unicode_Check(p); - } - - bool isUnicode() const - { - return Py::_Unicode_Check(p); - } - - // Commands - void setAttr (const std::string& s, const Object& value) - { - if(PyObject_SetAttrString (p, const_cast(s.c_str()), *value) == -1) - throw AttributeError ("getAttr failed."); - } - - void delAttr (const std::string& s) - { - if(PyObject_DelAttrString (p, const_cast(s.c_str())) == -1) - throw AttributeError ("delAttr failed."); - } - - // PyObject_SetItem is too weird to be using from C++ - // so it is intentionally omitted. - - void delItem (const Object& key) - { - //if(PyObject_DelItem(p, *key) == -1) - // failed to link on Windows? - throw KeyError("delItem failed."); - } - - // Equality and comparison use PyObject_RichCompareBool - - bool operator==(const Object& o2) const - { - int k = PyObject_RichCompareBool (p, *o2, Py_EQ); - if (PyErr_Occurred()) throw Exception(); - return k != 0; - } - - bool operator!=(const Object& o2) const - { - int k = PyObject_RichCompareBool (p, *o2, Py_NE); - if (PyErr_Occurred()) throw Exception(); - return k != 0; - - } - - bool operator>=(const Object& o2) const - { - int k = PyObject_RichCompareBool (p, *o2, Py_GE); - if (PyErr_Occurred()) throw Exception(); - return k != 0; - } - - bool operator<=(const Object& o2) const - { - int k = PyObject_RichCompareBool (p, *o2, Py_LE); - if (PyErr_Occurred()) throw Exception(); - return k != 0; - } - - bool operator<(const Object& o2) const - { - int k = PyObject_RichCompareBool (p, *o2, Py_LT); - if (PyErr_Occurred()) throw Exception(); - return k != 0; - } - - bool operator>(const Object& o2) const - { - int k = PyObject_RichCompareBool (p, *o2, Py_GT); - if (PyErr_Occurred()) throw Exception(); - return k != 0; - } - }; - // End of class Object - inline PyObject* new_reference_to(const Object& g) - { - PyObject* p = g.ptr(); - Py::_XINCREF(p); - return p; - } - - // Nothing() is what an extension method returns if - // there is no other return value. - inline Object Nothing() - { - return Object(Py::_None()); - } - - // Python special None value - inline Object None() - { - return Object(Py::_None()); - } - - // Python special Boolean values - inline Object False() - { - return Object(Py::_False()); - } - - inline Object True() - { - return Object(Py::_True()); - } - - // TMM: 31May'01 - Added the #ifndef so I can exlude iostreams. -#ifndef CXX_NO_IOSTREAMS - std::ostream& operator<< (std::ostream& os, const Object& ob); -#endif - - // Class Type - class Type: public Object - { - public: - explicit Type (PyObject* pyob, bool owned = false): Object(pyob, owned) - { - validate(); - } - - Type (const Object& ob): Object(*ob) - { - validate(); - } - - Type(const Type& t): Object(t) - { - validate(); - } - - Type& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - Type& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (rhsp); - return *this; - } - virtual bool accepts (PyObject *pyob) const - { - return pyob && Py::_Type_Check (pyob); - } - }; - - - // - // Convert an owned Python pointer into a CXX Object - // - inline Object asObject (PyObject *p) - { - return Object(p, true); - } - - // =============================================== - // class boolean - class Boolean: public Object - { - public: - // Constructor - Boolean (PyObject *pyob, bool owned = false): Object (pyob, owned) - { - validate(); - } - - Boolean (const Boolean& ob): Object(*ob) - { - validate(); - } - - // create from bool - Boolean (bool v=false) - { - set(PyBool_FromLong(v ? 1 : 0), true); - validate(); - } - - explicit Boolean (const Object& ob) - { - set(*ob, true); - validate(); - } - - // Assignment acquires new ownership of pointer - - Boolean& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - Boolean& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (rhsp, true); - return *this; - } - - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && Py::_Boolean_Check (pyob); - } - - // convert to long - operator bool() const - { - return PyObject_IsTrue (ptr()) != 0; - } - - Boolean& operator= (bool v) - { - set (PyBool_FromLong (v ? 1 : 0), true); - return *this; - } - }; - - // =============================================== - // class Int - class Int: public Object - { - public: - // Constructor - Int (PyObject *pyob, bool owned = false): Object (pyob, owned) - { - validate(); - } - - Int (const Int& ob): Object(*ob) - { - validate(); - } - - // create from long - Int (long v = 0L): Object(PyInt_FromLong(v), true) - { - validate(); - } - - // create from int - Int (int v) - { - long w = v; - set(PyInt_FromLong(w), true); - validate(); - } - - // create from bool - Int (bool v) - { - long w = v ? 1 : 0; - set(PyInt_FromLong(w), true); - validate(); - } - - explicit Int (const Object& ob) - { - set(PyNumber_Int(*ob), true); - validate(); - } - - // Assignment acquires new ownership of pointer - - Int& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - Int& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (PyNumber_Int(rhsp), true); - return *this; - } - - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && Py::_Int_Check (pyob); - } - - // convert to long - operator long() const - { - return PyInt_AsLong (ptr()); - } - -#ifdef HAVE_LONG_LONG - // convert to long long - PY_LONG_LONG asLongLong() const - { - return PyLong_AsLongLong (ptr()); - } - // convert to unsigned long long - unsigned PY_LONG_LONG asUnsignedLongLong() const - { - return PyLong_AsUnsignedLongLong (ptr()); - } -#endif - - // assign from an int - Int& operator= (int v) - { - set (PyInt_FromLong (long(v)), true); - return *this; - } - - // assign from long - Int& operator= (long v) - { - set (PyInt_FromLong (v), true); - return *this; - } - -#ifdef HAVE_LONG_LONG - // assign from long long - Int& operator= (PY_LONG_LONG v) - { - set (PyLong_FromLongLong (v), true); - return *this; - } - // assign from unsigned long long - Int& operator= (unsigned PY_LONG_LONG v) - { - set (PyLong_FromUnsignedLongLong (v), true); - return *this; - } +#if PY_MAJOR_VERSION == 2 +#include "CXX/Python2/Objects.hxx" +#else +#include "CXX/Python3/Objects.hxx" #endif - }; - - // =============================================== - // class Long - class Long: public Object - { - public: - // Constructor - explicit Long (PyObject *pyob, bool owned = false): Object (pyob, owned) - { - validate(); - } - - Long (const Long& ob): Object(ob.ptr()) - { - validate(); - } - - // create from long - explicit Long (long v = 0L) - : Object(PyLong_FromLong(v), true) - { - validate(); - } - // create from unsigned long - explicit Long (unsigned long v) - : Object(PyLong_FromUnsignedLong(v), true) - { - validate(); - } - // create from int - explicit Long (int v) - : Object(PyLong_FromLong(static_cast(v)), true) - { - validate(); - } - - // try to create from any object - Long (const Object& ob) - : Object(PyNumber_Long(*ob), true) - { - validate(); - } - - // Assignment acquires new ownership of pointer - - Long& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - Long& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (PyNumber_Long(rhsp), true); - return *this; - } - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && Py::_Long_Check (pyob); - } - // convert to long - operator long() const - { - return PyLong_AsLong (ptr()); - } - // convert to unsigned - operator unsigned long() const - { - return PyLong_AsUnsignedLong (ptr()); - } - operator double() const - { - return PyLong_AsDouble (ptr()); - } - // assign from an int - Long& operator= (int v) - { - set(PyLong_FromLong (long(v)), true); - return *this; - } - // assign from long - Long& operator= (long v) - { - set(PyLong_FromLong (v), true); - return *this; - } - // assign from unsigned long - Long& operator= (unsigned long v) - { - set(PyLong_FromUnsignedLong (v), true); - return *this; - } - }; - -#ifdef HAVE_LONG_LONG - // =============================================== - // class LongLong - class LongLong: public Object - { - public: - // Constructor - explicit LongLong (PyObject *pyob, bool owned = false): Object (pyob, owned) - { - validate(); - } - - LongLong (const LongLong& ob): Object(ob.ptr()) - { - validate(); - } - // create from long long - explicit LongLong (PY_LONG_LONG v = 0L) - : Object(PyLong_FromLongLong(v), true) - { - validate(); - } - // create from unsigned long long - explicit LongLong (unsigned PY_LONG_LONG v) - : Object(PyLong_FromUnsignedLongLong(v), true) - { - validate(); - } - // create from long - explicit LongLong (long v) - : Object(PyLong_FromLongLong(v), true) - { - validate(); - } - // create from unsigned long - explicit LongLong (unsigned long v) - : Object(PyLong_FromUnsignedLongLong(v), true) - { - validate(); - } - // create from int - explicit LongLong (int v) - : Object(PyLong_FromLongLong(static_cast(v)), true) - { - validate(); - } - - // try to create from any object - LongLong (const Object& ob) - : Object(PyNumber_Long(*ob), true) - { - validate(); - } - - // Assignment acquires new ownership of pointer - - LongLong& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - LongLong& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (PyNumber_Long(rhsp), true); - return *this; - } - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && Py::_Long_Check (pyob); - } - // convert to long long - operator PY_LONG_LONG() const - { - return PyLong_AsLongLong (ptr()); - } - // convert to unsigned long - operator unsigned PY_LONG_LONG() const - { - return PyLong_AsUnsignedLongLong (ptr()); - } - // convert to long - operator long() const - { - return PyLong_AsLong (ptr()); - } - // convert to unsigned - operator unsigned long() const - { - return PyLong_AsUnsignedLong (ptr()); - } - operator double() const - { - return PyLong_AsDouble (ptr()); - } - // assign from an int - LongLong& operator= (int v) - { - set(PyLong_FromLongLong (long(v)), true); - return *this; - } - // assign from long long - LongLong& operator= (PY_LONG_LONG v) - { - set(PyLong_FromLongLong (v), true); - return *this; - } - // assign from unsigned long long - LongLong& operator= (unsigned PY_LONG_LONG v) - { - set(PyLong_FromUnsignedLongLong (v), true); - return *this; - } - // assign from long - LongLong& operator= (long v) - { - set(PyLong_FromLongLong (v), true); - return *this; - } - // assign from unsigned long - LongLong& operator= (unsigned long v) - { - set(PyLong_FromUnsignedLongLong (v), true); - return *this; - } - }; -#endif - - // =============================================== - // class Float - // - class Float: public Object - { - public: - // Constructor - explicit Float (PyObject *pyob, bool owned = false): Object(pyob, owned) - { - validate(); - } - - Float (const Float& f): Object(f) - { - validate(); - } - - // make from double - explicit Float (double v=0.0) - : Object(PyFloat_FromDouble (v), true) - { - validate(); - } - - // try to make from any object - Float (const Object& ob) - : Object(PyNumber_Float(*ob), true) - { - validate(); - } - - Float& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - Float& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (PyNumber_Float(rhsp), true); - return *this; - } - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && Py::_Float_Check (pyob); - } - // convert to double - operator double () const - { - return PyFloat_AsDouble (ptr()); - } - // assign from a double - Float& operator= (double v) - { - set(PyFloat_FromDouble (v), true); - return *this; - } - // assign from an int - Float& operator= (int v) - { - set(PyFloat_FromDouble (double(v)), true); - return *this; - } - // assign from long - Float& operator= (long v) - { - set(PyFloat_FromDouble (double(v)), true); - return *this; - } - // assign from an Int - Float& operator= (const Int& iob) - { - set(PyFloat_FromDouble (double(long(iob))), true); - return *this; - } - }; - - // =============================================== - // class Complex - class Complex: public Object - { - public: - // Constructor - explicit Complex (PyObject *pyob, bool owned = false): Object(pyob, owned) - { - validate(); - } - - Complex (const Complex& f): Object(f) - { - validate(); - } - - // make from double - explicit Complex (double v=0.0, double w=0.0) - :Object(PyComplex_FromDoubles (v, w), true) - { - validate(); - } - - Complex& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - Complex& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (rhsp); - return *this; - } - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && Py::_Complex_Check (pyob); - } - // convert to Py_complex - operator Py_complex () const - { - return PyComplex_AsCComplex (ptr()); - } - // assign from a Py_complex - Complex& operator= (const Py_complex& v) - { - set(PyComplex_FromCComplex (v), true); - return *this; - } - // assign from a double - Complex& operator= (double v) - { - set(PyComplex_FromDoubles (v, 0.0), true); - return *this; - } - // assign from an int - Complex& operator= (int v) - { - set(PyComplex_FromDoubles (double(v), 0.0), true); - return *this; - } - // assign from long - Complex& operator= (long v) - { - set(PyComplex_FromDoubles (double(v), 0.0), true); - return *this; - } - // assign from an Int - Complex& operator= (const Int& iob) - { - set(PyComplex_FromDoubles (double(long(iob)), 0.0), true); - return *this; - } - - double real() const - { - return PyComplex_RealAsDouble(ptr()); - } - - double imag() const - { - return PyComplex_ImagAsDouble(ptr()); - } - }; - // Sequences - // Sequences are here represented as sequences of items of type T. - // The base class SeqBase represents that. - // In basic Python T is always "Object". - - // seqref is what you get if you get elements from a non-const SeqBase. - // Note: seqref could probably be a nested class in SeqBase but that might stress - // some compilers needlessly. Simlarly for mapref later. - - // While this class is not intended for enduser use, it needs some public - // constructors for the benefit of the STL. - - // See Scott Meyer's More Essential C++ for a description of proxies. - // This application is even more complicated. We are doing an unusual thing - // in having a double proxy. If we want the STL to work - // properly we have to compromise by storing the rvalue inside. The - // entire Object API is repeated so that things like s[i].isList() will - // work properly. - - // Still, once in a while a weird compiler message may occur using expressions like x[i] - // Changing them to Object(x[i]) helps the compiler to understand that the - // conversion of a seqref to an Object is wanted. - - template - class seqref - { - protected: - SeqBase& s; // the sequence - int offset; // item number - T the_item; // lvalue - public: - - seqref (SeqBase& seq, sequence_index_type j) - : s(seq), offset(j), the_item (s.getItem(j)) - {} - - seqref (const seqref& range) - : s(range.s), offset(range.offset), the_item(range.the_item) - {} - - // TMM: added this seqref ctor for use with STL algorithms - seqref (Object& obj) - : s(dynamic_cast< SeqBase&>(obj)) - , offset( NULL ) - , the_item(s.getItem(offset)) - {} - ~seqref() - {} - - operator T() const - { // rvalue - return the_item; - } - - seqref& operator=(const seqref& rhs) - { //used as lvalue - the_item = rhs.the_item; - s.setItem(offset, the_item); - return *this; - } - - seqref& operator=(const T& ob) - { // used as lvalue - the_item = ob; - s.setItem(offset, ob); - return *this; - } - - // forward everything else to the item - PyObject* ptr () const - { - return the_item.ptr(); - } - - int reference_count () const - { // the reference count - return the_item.reference_count(); - } - - Type type () const - { - return the_item.type(); - } - - String str () const; - - String repr () const; - - bool hasAttr (const std::string& attr_name) const - { - return the_item.hasAttr(attr_name); - } - - Object getAttr (const std::string& attr_name) const - { - return the_item.getAttr(attr_name); - } - - Object getItem (const Object& key) const - { - return the_item.getItem(key); - } - - long hashValue () const - { - return the_item.hashValue(); - } - - bool isCallable () const - { - return the_item.isCallable(); - } - - bool isInstance () const - { - return the_item.isInstance(); - } - - bool isDict () const - { - return the_item.isDict(); - } - - bool isList () const - { - return the_item.isList(); - } - - bool isMapping () const - { - return the_item.isMapping(); - } - - bool isNumeric () const - { - return the_item.isNumeric(); - } - - bool isSequence () const - { - return the_item.isSequence(); - } - - bool isTrue () const - { - return the_item.isTrue(); - } - - bool isType (const Type& t) const - { - return the_item.isType (t); - } - - bool isTuple() const - { - return the_item.isTuple(); - } - - bool isString() const - { - return the_item.isString(); - } - // Commands - void setAttr (const std::string& attr_name, const Object& value) - { - the_item.setAttr(attr_name, value); - } - - void delAttr (const std::string& attr_name) - { - the_item.delAttr(attr_name); - } - - void delItem (const Object& key) - { - the_item.delItem(key); - } - - bool operator==(const Object& o2) const - { - return the_item == o2; - } - - bool operator!=(const Object& o2) const - { - return the_item != o2; - } - - bool operator>=(const Object& o2) const - { - return the_item >= o2; - } - - bool operator<=(const Object& o2) const - { - return the_item <= o2; - } - - bool operator<(const Object& o2) const - { - return the_item < o2; - } - - bool operator>(const Object& o2) const - { - return the_item > o2; - } - }; // end of seqref - - - // class SeqBase - // ...the base class for all sequence types - - template - class SeqBase: public Object - { - public: - // STL definitions - typedef size_t size_type; - typedef seqref reference; - typedef T const_reference; - typedef seqref* pointer; - typedef int difference_type; - typedef T value_type; // TMM: 26Jun'01 - - virtual size_type max_size() const - { - return std::string::npos; // ? - } - - virtual size_type capacity() const - { - return size(); - } - - virtual void swap(SeqBase& c) - { - SeqBase temp = c; - c = ptr(); - set(temp.ptr()); - } - - virtual size_type size () const - { - return PySequence_Length (ptr()); - } - - explicit SeqBase () - :Object(PyTuple_New(0), true) - { - validate(); - } - - explicit SeqBase (PyObject* pyob, bool owned=false) - : Object(pyob, owned) - { - validate(); - } - - SeqBase (const Object& ob): Object(ob) - { - validate(); - } - - // Assignment acquires new ownership of pointer - - SeqBase& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - SeqBase& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (rhsp); - return *this; - } - - virtual bool accepts (PyObject *pyob) const - { - return pyob && PySequence_Check (pyob); - } - - size_type length () const - { - return PySequence_Length (ptr()); - } - - // Element access - const T operator[](sequence_index_type index) const - { - return getItem(index); - } - - seqref operator[](sequence_index_type index) - { - return seqref(*this, index); - } - - virtual T getItem (sequence_index_type i) const - { - return T(asObject(PySequence_GetItem (ptr(), i))); - } - - virtual void setItem (sequence_index_type i, const T& ob) - { - if (PySequence_SetItem (ptr(), i, *ob) == -1) - { - throw Exception(); - } - } - - SeqBase repeat (int count) const - { - return SeqBase (PySequence_Repeat (ptr(), count), true); - } - - SeqBase concat (const SeqBase& other) const - { - return SeqBase (PySequence_Concat(ptr(), *other), true); - } - - // more STL compatability - const T front () const - { - return getItem(0); - } - - seqref front() - { - return seqref(this, 0); - } - - const T back () const - { - return getItem(size()-1); - } - - seqref back() - { - return seqref(this, size()-1); - } - - void verify_length(size_type required_size) const - { - if (size() != required_size) - throw IndexError ("Unexpected SeqBase length."); - } - - void verify_length(size_type min_size, size_type max_size) const - { - size_type n = size(); - if (n < min_size || n > max_size) - throw IndexError ("Unexpected SeqBase length."); - } - - class iterator - : public random_access_iterator_parent(seqref) - { - protected: - friend class SeqBase; - SeqBase* seq; - int count; - - public: - ~iterator () - {} - - iterator () - : seq( 0 ) - , count( 0 ) - {} - - iterator (SeqBase* s, int where) - : seq( s ) - , count( where ) - {} - - iterator (const iterator& other) - : seq( other.seq ) - , count( other.count ) - {} - - bool eql (const iterator& other) const - { - return (seq->ptr() == other.seq->ptr()) && (count == other.count); - } - - bool neq (const iterator& other) const - { - return (seq->ptr() != other.seq->ptr()) || (count != other.count); - } - - bool lss (const iterator& other) const - { - return (count < other.count); - } - - bool gtr (const iterator& other) const - { - return (count > other.count); - } - - bool leq (const iterator& other) const - { - return (count <= other.count); - } - - bool geq (const iterator& other) const - { - return (count >= other.count); - } - - seqref operator*() - { - return seqref(*seq, count); - } - - seqref operator[] (sequence_index_type i) - { - return seqref(*seq, count + i); - } - - iterator& operator=(const iterator& other) - { - if (this == &other) return *this; - seq = other.seq; - count = other.count; - return *this; - } - - iterator operator+(int n) const - { - return iterator(seq, count + n); - } - - iterator operator-(int n) const - { - return iterator(seq, count - n); - } - - iterator& operator+=(int n) - { - count = count + n; - return *this; - } - - iterator& operator-=(int n) - { - count = count - n; - return *this; - } - - int operator-(const iterator& other) const - { - if (*seq != *other.seq) - throw RuntimeError ("SeqBase::iterator comparison error"); - return count - other.count; - } - - // prefix ++ - iterator& operator++ () - { count++; return *this;} - // postfix ++ - iterator operator++ (int) - { return iterator(seq, count++);} - // prefix -- - iterator& operator-- () - { count--; return *this;} - // postfix -- - iterator operator-- (int) - { return iterator(seq, count--);} - - std::string diagnose() const - { - std::OSTRSTREAM oss; - oss << "iterator diagnosis " << seq << ", " << count << std::ends; - return std::string(oss.str()); - } - }; // end of class SeqBase::iterator - - iterator begin () - { - return iterator(this, 0); - } - - iterator end () - { - return iterator(this, length()); - } - - class const_iterator - : public random_access_iterator_parent(const Object) - { - protected: - friend class SeqBase; - const SeqBase* seq; - sequence_index_type count; - - private: - const_iterator (const SeqBase* s, int where) - : seq( s ) - , count( where ) - {} - - public: - ~const_iterator () - {} - - const_iterator () - : seq( 0 ) - , count( 0 ) - {} - - const_iterator(const const_iterator& other) - : seq( other.seq ) - , count( other.count ) - {} - - const T operator*() const - { - return seq->getItem(count); - } - - const T operator[] (sequence_index_type i) const - { - return seq->getItem(count + i); - } - - const_iterator& operator=(const const_iterator& other) - { - if (this == &other) return *this; - seq = other.seq; - count = other.count; - return *this; - } - - const_iterator operator+(int n) const - { - return const_iterator(seq, count + n); - } - - bool eql (const const_iterator& other) const - { - return (seq->ptr() == other.seq->ptr()) && (count == other.count); - } - - bool neq (const const_iterator& other) const - { - return (seq->ptr() != other.seq->ptr()) || (count != other.count); - } - - bool lss (const const_iterator& other) const - { - return (count < other.count); - } - - bool gtr (const const_iterator& other) const - { - return (count > other.count); - } - - bool leq (const const_iterator& other) const - { - return (count <= other.count); - } - - bool geq (const const_iterator& other) const - { - return (count >= other.count); - } - - const_iterator operator-(int n) - { - return const_iterator(seq, count - n); - } - - const_iterator& operator+=(int n) - { - count = count + n; - return *this; - } - - const_iterator& operator-=(int n) - { - count = count - n; - return *this; - } - - int operator-(const const_iterator& other) const - { - if (*seq != *other.seq) - throw RuntimeError ("SeqBase::const_iterator::- error"); - return count - other.count; - } - // prefix ++ - const_iterator& operator++ () - { count++; return *this;} - // postfix ++ - const_iterator operator++ (int) - { return const_iterator(seq, count++);} - // prefix -- - const_iterator& operator-- () - { count--; return *this;} - // postfix -- - const_iterator operator-- (int) - { return const_iterator(seq, count--);} - }; // end of class SeqBase::const_iterator - - const_iterator begin () const - { - return const_iterator(this, 0); - } - - const_iterator end () const - { - return const_iterator(this, length()); - } - }; - - // Here's an important typedef you might miss if reading too fast... - typedef SeqBase Sequence; - - template bool operator==(const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); - template bool operator!=(const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); - template bool operator< (const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); - template bool operator> (const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); - template bool operator<=(const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); - template bool operator>=(const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); - - template bool operator==(const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); - template bool operator!=(const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); - template bool operator< (const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); - template bool operator> (const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); - template bool operator<=(const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); - template bool operator>=(const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); - - - extern bool operator==(const Sequence::iterator& left, const Sequence::iterator& right); - extern bool operator!=(const Sequence::iterator& left, const Sequence::iterator& right); - extern bool operator< (const Sequence::iterator& left, const Sequence::iterator& right); - extern bool operator> (const Sequence::iterator& left, const Sequence::iterator& right); - extern bool operator<=(const Sequence::iterator& left, const Sequence::iterator& right); - extern bool operator>=(const Sequence::iterator& left, const Sequence::iterator& right); - - extern bool operator==(const Sequence::const_iterator& left, const Sequence::const_iterator& right); - extern bool operator!=(const Sequence::const_iterator& left, const Sequence::const_iterator& right); - extern bool operator< (const Sequence::const_iterator& left, const Sequence::const_iterator& right); - extern bool operator> (const Sequence::const_iterator& left, const Sequence::const_iterator& right); - extern bool operator<=(const Sequence::const_iterator& left, const Sequence::const_iterator& right); - extern bool operator>=(const Sequence::const_iterator& left, const Sequence::const_iterator& right); - - // ================================================== - // class Char - // Python strings return strings as individual elements. - // I'll try having a class Char which is a String of length 1 - // - typedef std::basic_string unicodestring; - extern Py_UNICODE unicode_null_string[1]; - - class Char: public Object - { - public: - explicit Char (PyObject *pyob, bool owned = false): Object(pyob, owned) - { - validate(); - } - - Char (const Object& ob): Object(ob) - { - validate(); - } - - Char (const std::string& v = "") - :Object(PyString_FromStringAndSize (const_cast(v.c_str()),1), true) - { - validate(); - } - - Char (char v) - : Object(PyString_FromStringAndSize (&v, 1), true) - { - validate(); - } - - Char (Py_UNICODE v) - : Object(PyUnicode_FromUnicode (&v, 1), true) - { - validate(); - } - // Assignment acquires new ownership of pointer - Char& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - Char& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (rhsp); - return *this; - } - - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && (Py::_String_Check(pyob) || Py::_Unicode_Check(pyob)) && PySequence_Length (pyob) == 1; - } - - // Assignment from C string - Char& operator= (const std::string& v) - { - set(PyString_FromStringAndSize (const_cast(v.c_str()),1), true); - return *this; - } - - Char& operator= (char v) - { - set(PyString_FromStringAndSize (&v, 1), true); - return *this; - } - - Char& operator= (const unicodestring& v) - { - set(PyUnicode_FromUnicode (const_cast(v.data()),1), true); - return *this; - } - - Char& operator= (Py_UNICODE v) - { - set(PyUnicode_FromUnicode (&v, 1), true); - return *this; - } - - // Conversion - operator String() const; - - operator std::string () const - { - return std::string(PyString_AsString (ptr())); - } - }; - - class String: public SeqBase - { - public: - virtual size_type capacity() const - { - return max_size(); - } - - explicit String (PyObject *pyob, bool owned = false): SeqBase(pyob, owned) - { - validate(); - } - - String (const Object& ob): SeqBase(ob) - { - validate(); - } - - String() - : SeqBase( PyString_FromStringAndSize( "", 0 ), true ) - { - validate(); - } - - String( const std::string& v ) - : SeqBase( PyString_FromStringAndSize( const_cast(v.data()), - static_cast( v.length() ) ), true ) - { - validate(); - } - - String( const char *s, const char *encoding, const char *error="strict" ) - : SeqBase( PyUnicode_Decode( s, strlen( s ), encoding, error ), true ) - { - validate(); - } - - String( const char *s, int len, const char *encoding, const char *error="strict" ) - : SeqBase( PyUnicode_Decode( s, len, encoding, error ), true ) - { - validate(); - } - - String( const std::string &s, const char *encoding, const char *error="strict" ) - : SeqBase( PyUnicode_Decode( s.c_str(), s.length(), encoding, error ), true ) - { - validate(); - } - - String( const std::string& v, std::string::size_type vsize ) - : SeqBase(PyString_FromStringAndSize( const_cast(v.data()), - static_cast( vsize ) ), true) - { - validate(); - } - - String( const char *v, int vsize ) - : SeqBase(PyString_FromStringAndSize( const_cast(v), vsize ), true ) - { - validate(); - } - - String( const char* v ) - : SeqBase( PyString_FromString( v ), true ) - { - validate(); - } - - // Assignment acquires new ownership of pointer - String& operator= ( const Object& rhs ) - { - return *this = *rhs; - } - - String& operator= (PyObject* rhsp) - { - if( ptr() == rhsp ) - return *this; - set (rhsp); - return *this; - } - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && (Py::_String_Check(pyob) || Py::_Unicode_Check(pyob)); - } - - // Assignment from C string - String& operator= (const std::string& v) - { - set( PyString_FromStringAndSize( const_cast( v.data() ), - static_cast( v.length() ) ), true ); - return *this; - } - String& operator= (const unicodestring& v) - { - set( PyUnicode_FromUnicode( const_cast( v.data() ), - static_cast( v.length() ) ), true ); - return *this; - } - - - // Encode - String encode( const char *encoding, const char *error="strict" ) - { - if( isUnicode() ) - { - return String( PyUnicode_AsEncodedString( ptr(), encoding, error ) ); - } - else - { - return String( PyString_AsEncodedObject( ptr(), encoding, error ) ); - } - } - - String decode( const char *encoding, const char *error="strict" ) - { - return Object( PyString_AsDecodedObject( ptr(), encoding, error ) ); - } - - // Queries - virtual size_type size () const - { - if( isUnicode() ) - { - return static_cast( PyUnicode_GET_SIZE (ptr()) ); - } - else - { - return static_cast( PyString_Size (ptr()) ); - } - } - - operator std::string () const - { - return as_std_string(); - } - - std::string as_std_string() const - { - if( isUnicode() ) - { - throw TypeError("cannot return std::string from Unicode object"); - } - else - { - return std::string( PyString_AsString( ptr() ), static_cast( PyString_Size( ptr() ) ) ); - } - } - - unicodestring as_unicodestring() const - { - if( isUnicode() ) - { - return unicodestring( PyUnicode_AS_UNICODE( ptr() ), - static_cast( PyUnicode_GET_SIZE( ptr() ) ) ); - } - else - { - throw TypeError("can only return unicodestring from Unicode object"); - } - } - }; - - // ================================================== - // class Tuple - class Tuple: public Sequence - { - public: - virtual void setItem (sequence_index_type offset, const Object&ob) - { - // note PyTuple_SetItem is a thief... - if(PyTuple_SetItem (ptr(), offset, new_reference_to(ob)) == -1) - { - throw Exception(); - } - } - - // Constructor - explicit Tuple (PyObject *pyob, bool owned = false): Sequence (pyob, owned) - { - validate(); - } - - Tuple (const Object& ob): Sequence(ob) - { - validate(); - } - - // New tuple of a given size - explicit Tuple (int size = 0) - { - set(PyTuple_New (size), true); - validate (); - for (sequence_index_type i=0; i < size; i++) - { - if(PyTuple_SetItem (ptr(), i, new_reference_to(Py::_None())) == -1) - { - throw Exception(); - } - } - } - // Tuple from any sequence - explicit Tuple (const Sequence& s) - { - sequence_index_type limit( sequence_index_type( s.length() ) ); - - set(PyTuple_New (limit), true); - validate(); - - for(sequence_index_type i=0; i < limit; i++) - { - if(PyTuple_SetItem (ptr(), i, new_reference_to(s[i])) == -1) - { - throw Exception(); - } - } - } - // Assignment acquires new ownership of pointer - - Tuple& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - Tuple& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (rhsp); - return *this; - } - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && Py::_Tuple_Check (pyob); - } - - Tuple getSlice (int i, int j) const - { - return Tuple (PySequence_GetSlice (ptr(), i, j), true); - } - - }; - - // ================================================== - // class List - - class List: public Sequence - { - public: - // Constructor - explicit List (PyObject *pyob, bool owned = false): Sequence(pyob, owned) - { - validate(); - } - List (const Object& ob): Sequence(ob) - { - validate(); - } - // Creation at a fixed size - List (int size = 0) - { - set(PyList_New (size), true); - validate(); - for (sequence_index_type i=0; i < size; i++) - { - if(PyList_SetItem (ptr(), i, new_reference_to(Py::_None())) == -1) - { - throw Exception(); - } - } - } - - // List from a sequence - List (const Sequence& s): Sequence() - { - int n = (int)s.length(); - set(PyList_New (n), true); - validate(); - for (sequence_index_type i=0; i < n; i++) - { - if(PyList_SetItem (ptr(), i, new_reference_to(s[i])) == -1) - { - throw Exception(); - } - } - } - - virtual size_type capacity() const - { - return max_size(); - } - // Assignment acquires new ownership of pointer - - List& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - List& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (rhsp); - return *this; - } - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && Py::_List_Check (pyob); - } - - List getSlice (int i, int j) const - { - return List (PyList_GetSlice (ptr(), i, j), true); - } - - void setSlice (int i, int j, const Object& v) - { - if(PyList_SetSlice (ptr(), i, j, *v) == -1) - { - throw Exception(); - } - } - - void append (const Object& ob) - { - if(PyList_Append (ptr(), *ob) == -1) - { - throw Exception(); - } - } - - void insert (int i, const Object& ob) - { - if(PyList_Insert (ptr(), i, *ob) == -1) - { - throw Exception(); - } - } - - void sort () - { - if(PyList_Sort(ptr()) == -1) - { - throw Exception(); - } - } - - void reverse () - { - if(PyList_Reverse(ptr()) == -1) - { - throw Exception(); - } - } - }; - - - // Mappings - // ================================================== - template - class mapref - { - protected: - MapBase& s; // the map - Object key; // item key - T the_item; - - public: - mapref (MapBase& map, const std::string& k) - : s(map), the_item() - { - key = String(k); - if(map.hasKey(key)) the_item = map.getItem(key); - } - - mapref (MapBase& map, const Object& k) - : s(map), key(k), the_item() - { - if(map.hasKey(key)) the_item = map.getItem(key); - } - - virtual ~mapref() - {} - - // MapBase stuff - // lvalue - mapref& operator=(const mapref& other) - { - if(this == &other) return *this; - the_item = other.the_item; - s.setItem(key, other.the_item); - return *this; - } - - mapref& operator= (const T& ob) - { - the_item = ob; - s.setItem (key, ob); - return *this; - } - - // rvalue - operator T() const - { - return the_item; - } - - // forward everything else to the_item - PyObject* ptr () const - { - return the_item.ptr(); - } - - int reference_count () const - { // the mapref count - return the_item.reference_count(); - } - - Type type () const - { - return the_item.type(); - } - - String str () const - { - return the_item.str(); - } - - String repr () const - { - return the_item.repr(); - } - - bool hasAttr (const std::string& attr_name) const - { - return the_item.hasAttr(attr_name); - } - - Object getAttr (const std::string& attr_name) const - { - return the_item.getAttr(attr_name); - } - - Object getItem (const Object& k) const - { - return the_item.getItem(k); - } - - long hashValue () const - { - return the_item.hashValue(); - } - - bool isCallable () const - { - return the_item.isCallable(); - } - - bool isInstance () const - { - return the_item.isInstance(); - } - - bool isList () const - { - return the_item.isList(); - } - - bool isMapping () const - { - return the_item.isMapping(); - } - - bool isNumeric () const - { - return the_item.isNumeric(); - } - - bool isSequence () const - { - return the_item.isSequence(); - } - - bool isTrue () const - { - return the_item.isTrue(); - } - - bool isType (const Type& t) const - { - return the_item.isType (t); - } - - bool isTuple() const - { - return the_item.isTuple(); - } - - bool isString() const - { - return the_item.isString(); - } - - // Commands - void setAttr (const std::string& attr_name, const Object& value) - { - the_item.setAttr(attr_name, value); - } - - void delAttr (const std::string& attr_name) - { - the_item.delAttr(attr_name); - } - - void delItem (const Object& k) - { - the_item.delItem(k); - } - }; // end of mapref - - // TMM: now for mapref - template< class T > - bool operator==(const mapref& left, const mapref& right) - { - return true; // NOT completed. - } - - template< class T > - bool operator!=(const mapref& left, const mapref& right) - { - return true; // not completed. - } - - template - class MapBase: public Object - { - protected: - explicit MapBase() - {} - public: - // reference: proxy class for implementing [] - // TMM: 26Jun'01 - the types - // If you assume that Python mapping is a hash_map... - // hash_map::value_type is not assignable, but - // (*it).second = data must be a valid expression - typedef size_t size_type; - typedef Object key_type; - typedef mapref data_type; - typedef std::pair< const T, T > value_type; - typedef std::pair< const T, mapref > reference; - typedef const std::pair< const T, const T > const_reference; - typedef std::pair< const T, mapref > pointer; - - // Constructor - explicit MapBase (PyObject *pyob, bool owned = false): Object(pyob, owned) - { - validate(); - } - - // TMM: 02Jul'01 - changed MapBase to Object in next line - MapBase (const Object& ob): Object(ob) - { - validate(); - } - - // Assignment acquires new ownership of pointer - MapBase& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - MapBase& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (rhsp); - return *this; - } - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && PyMapping_Check(pyob); - } - - // Clear -- PyMapping Clear is missing - // - - void clear () - { - List k = keys(); - for(List::iterator i = k.begin(); i != k.end(); i++) - { - delItem(*i); - } - } - - virtual size_type size() const - { - return PyMapping_Length (ptr()); - } - - // Element Access - T operator[](const std::string& key) const - { - return getItem(key); - } - - T operator[](const Object& key) const - { - return getItem(key); - } - - mapref operator[](const std::string& key) - { - return mapref(*this, key); - } - - mapref operator[](const Object& key) - { - return mapref(*this, key); - } - - int length () const - { - return PyMapping_Length (ptr()); - } - - bool hasKey (const std::string& s) const - { - return PyMapping_HasKeyString (ptr(),const_cast(s.c_str())) != 0; - } - - bool hasKey (const Object& s) const - { - return PyMapping_HasKey (ptr(), s.ptr()) != 0; - } - - T getItem (const std::string& s) const - { - return T( - asObject(PyMapping_GetItemString (ptr(),const_cast(s.c_str()))) - ); - } - - T getItem (const Object& s) const - { - return T( - asObject(PyObject_GetItem (ptr(), s.ptr())) - ); - } - - virtual void setItem (const char *s, const Object& ob) - { - if (PyMapping_SetItemString (ptr(), const_cast(s), *ob) == -1) - { - throw Exception(); - } - } - - virtual void setItem (const std::string& s, const Object& ob) - { - if (PyMapping_SetItemString (ptr(), const_cast(s.c_str()), *ob) == -1) - { - throw Exception(); - } - } - - virtual void setItem (const Object& s, const Object& ob) - { - if (PyObject_SetItem (ptr(), s.ptr(), ob.ptr()) == -1) - { - throw Exception(); - } - } - - void delItem (const std::string& s) - { - if (PyMapping_DelItemString (ptr(), const_cast(s.c_str())) == -1) - { - throw Exception(); - } - } - - void delItem (const Object& s) - { - if (PyMapping_DelItem (ptr(), *s) == -1) - { - throw Exception(); - } - } - // Queries - List keys () const - { - return List(PyMapping_Keys(ptr()), true); - } - - List values () const - { // each returned item is a (key, value) pair - return List(PyMapping_Values(ptr()), true); - } - - List items () const - { - return List(PyMapping_Items(ptr()), true); - } - - class iterator - { - // : public forward_iterator_parent( std::pair ) { - protected: - typedef std::forward_iterator_tag iterator_category; - typedef std::pair< const T, T > value_type; - typedef int difference_type; - typedef std::pair< const T, mapref > pointer; - typedef std::pair< const T, mapref > reference; - - friend class MapBase; - // - MapBase* map; - List keys; // for iterating over the map - int pos; // index into the keys - - private: - iterator( MapBase* m, List k, int p ) - : map( m ) - , keys( k ) - , pos( p ) - {} - - public: - ~iterator () - {} - - iterator () - : map( 0 ) - , keys() - , pos() - {} - - iterator (MapBase* m, bool end = false ) - : map( m ) - , keys( m->keys() ) - , pos( end ? keys.length() : 0 ) - {} - - iterator (const iterator& other) - : map( other.map ) - , keys( other.keys ) - , pos( other.pos ) - {} - - reference operator*() - { - Object key = keys[ pos ]; - return std::make_pair(key, mapref(*map,key)); - } - - iterator& operator=(const iterator& other) - { - if (this == &other) - return *this; - map = other.map; - keys = other.keys; - pos = other.pos; - return *this; - } - - bool eql(const iterator& right) const - { - return map->ptr() == right.map->ptr() && pos == right.pos; - } - bool neq( const iterator& right ) const - { - return map->ptr() != right.map->ptr() || pos != right.pos; - } - - // pointer operator->() { - // return ; - // } - - // prefix ++ - iterator& operator++ () - { pos++; return *this;} - // postfix ++ - iterator operator++ (int) - { return iterator(map, keys, pos++);} - // prefix -- - iterator& operator-- () - { pos--; return *this;} - // postfix -- - iterator operator-- (int) - { return iterator(map, keys, pos--);} - - std::string diagnose() const - { - std::OSTRSTREAM oss; - oss << "iterator diagnosis " << map << ", " << pos << std::ends; - return std::string(oss.str()); - } - }; // end of class MapBase::iterator - - iterator begin () - { - return iterator(this); - } - - iterator end () - { - return iterator(this, true); - } - - class const_iterator - { - protected: - typedef std::forward_iterator_tag iterator_category; - typedef const std::pair< const T, T > value_type; - typedef int difference_type; - typedef const std::pair< const T, T > pointer; - typedef const std::pair< const T, T > reference; - - friend class MapBase; - const MapBase* map; - List keys; // for iterating over the map - int pos; // index into the keys - - private: - const_iterator( MapBase* m, List k, int p ) - : map( m ) - , keys( k ) - , pos( p ) - {} - - public: - ~const_iterator () - {} - - const_iterator () - : map( 0 ) - , keys() - , pos() - {} - - const_iterator (MapBase* m, bool end = false ) - : map( m ) - , keys( m->keys() ) - , pos( end ? keys.length() : 0 ) - {} - - const_iterator(const const_iterator& other) - : map( other.map ) - , keys( other.keys ) - , pos( other.pos ) - {} - - bool eql(const const_iterator& right) const - { - return map->ptr() == right.map->ptr() && pos == right.pos; - } - - bool neq( const const_iterator& right ) const - { - return map->ptr() != right.map->ptr() || pos != right.pos; - } - - const_reference operator*() - { - Object key = keys[ pos ]; - return std::make_pair( key, mapref( *map, key ) ); - } - - const_iterator& operator=(const const_iterator& other) - { - if (this == &other) return *this; - map = other.map; - keys = other.keys; - pos = other.pos; - return *this; - } - - // prefix ++ - const_iterator& operator++ () - { pos++; return *this;} - // postfix ++ - const_iterator operator++ (int) - { return const_iterator(map, keys, pos++);} - // prefix -- - const_iterator& operator-- () - { pos--; return *this;} - // postfix -- - const_iterator operator-- (int) - { return const_iterator(map, keys, pos--);} - }; // end of class MapBase::const_iterator - - const_iterator begin () const - { - return const_iterator(this); - } - - const_iterator end () const - { - return const_iterator(this, true); - } - - }; // end of MapBase - - typedef MapBase Mapping; - - template bool operator==(const EXPLICIT_TYPENAME MapBase::iterator& left, const EXPLICIT_TYPENAME MapBase::iterator& right); - template bool operator!=(const EXPLICIT_TYPENAME MapBase::iterator& left, const EXPLICIT_TYPENAME MapBase::iterator& right); - template bool operator==(const EXPLICIT_TYPENAME MapBase::const_iterator& left, const EXPLICIT_TYPENAME MapBase::const_iterator& right); - template bool operator!=(const EXPLICIT_TYPENAME MapBase::const_iterator& left, const EXPLICIT_TYPENAME MapBase::const_iterator& right); - - extern bool operator==(const Mapping::iterator& left, const Mapping::iterator& right); - extern bool operator!=(const Mapping::iterator& left, const Mapping::iterator& right); - extern bool operator==(const Mapping::const_iterator& left, const Mapping::const_iterator& right); - extern bool operator!=(const Mapping::const_iterator& left, const Mapping::const_iterator& right); - - - // ================================================== - // class Dict - class Dict: public Mapping - { - public: - // Constructor - explicit Dict (PyObject *pyob, bool owned=false): Mapping (pyob, owned) - { - validate(); - } - Dict (const Object& ob): Mapping(ob) - { - validate(); - } - // Creation - Dict () - { - set(PyDict_New (), true); - validate(); - } - // Assignment acquires new ownership of pointer - - Dict& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - Dict& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set(rhsp); - return *this; - } - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && Py::_Dict_Check (pyob); - } - }; - - class Callable: public Object - { - public: - // Constructor - explicit Callable (): Object() {} - explicit Callable (PyObject *pyob, bool owned = false): Object (pyob, owned) - { - validate(); - } - - Callable (const Object& ob): Object(ob) - { - validate(); - } - - // Assignment acquires new ownership of pointer - - Callable& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - Callable& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set (rhsp); - return *this; - } - - // Membership - virtual bool accepts (PyObject *pyob) const - { - return pyob && PyCallable_Check (pyob); - } - - // Call - Object apply(const Tuple& args) const - { - return asObject(PyObject_CallObject(ptr(), args.ptr())); - } - - // Call with keywords - Object apply(const Tuple& args, const Dict& kw) const - { - return asObject( PyEval_CallObjectWithKeywords( ptr(), args.ptr(), kw.ptr() ) ); - } - - Object apply(PyObject* pargs = 0) const - { - return apply (Tuple(pargs)); - } - }; - - class Module: public Object - { - public: - explicit Module (PyObject* pyob, bool owned = false): Object (pyob, owned) - { - validate(); - } - - // Construct from module name - explicit Module (const std::string&s): Object() - { - PyObject *m = PyImport_AddModule( const_cast(s.c_str()) ); - set( m, false ); - validate (); - } - - // Copy constructor acquires new ownership of pointer - Module (const Module& ob): Object(*ob) - { - validate(); - } - - Module& operator= (const Object& rhs) - { - return (*this = *rhs); - } - - Module& operator= (PyObject* rhsp) - { - if(ptr() == rhsp) return *this; - set(rhsp); - return *this; - } - - Dict getDict() - { - return Dict(PyModule_GetDict(ptr())); - // Caution -- PyModule_GetDict returns borrowed reference! - } - }; - - // Numeric interface - inline Object operator+ (const Object& a) - { - return asObject(PyNumber_Positive(*a)); - } - inline Object operator- (const Object& a) - { - return asObject(PyNumber_Negative(*a)); - } - - inline Object abs(const Object& a) - { - return asObject(PyNumber_Absolute(*a)); - } - - inline std::pair coerce(const Object& a, const Object& b) - { - PyObject *p1, *p2; - p1 = *a; - p2 = *b; - if(PyNumber_Coerce(&p1,&p2) == -1) - { - throw Exception(); - } - return std::pair(asObject(p1), asObject(p2)); - } - - inline Object operator+ (const Object& a, const Object& b) - { - return asObject(PyNumber_Add(*a, *b)); - } - inline Object operator+ (const Object& a, int j) - { - return asObject(PyNumber_Add(*a, *Int(j))); - } - inline Object operator+ (const Object& a, double v) - { - return asObject(PyNumber_Add(*a, *Float(v))); - } - inline Object operator+ (int j, const Object& b) - { - return asObject(PyNumber_Add(*Int(j), *b)); - } - inline Object operator+ (double v, const Object& b) - { - return asObject(PyNumber_Add(*Float(v), *b)); - } - - inline Object operator- (const Object& a, const Object& b) - { - return asObject(PyNumber_Subtract(*a, *b)); - } - inline Object operator- (const Object& a, int j) - { - return asObject(PyNumber_Subtract(*a, *Int(j))); - } - inline Object operator- (const Object& a, double v) - { - return asObject(PyNumber_Subtract(*a, *Float(v))); - } - inline Object operator- (int j, const Object& b) - { - return asObject(PyNumber_Subtract(*Int(j), *b)); - } - inline Object operator- (double v, const Object& b) - { - return asObject(PyNumber_Subtract(*Float(v), *b)); - } - - inline Object operator* (const Object& a, const Object& b) - { - return asObject(PyNumber_Multiply(*a, *b)); - } - inline Object operator* (const Object& a, int j) - { - return asObject(PyNumber_Multiply(*a, *Int(j))); - } - inline Object operator* (const Object& a, double v) - { - return asObject(PyNumber_Multiply(*a, *Float(v))); - } - inline Object operator* (int j, const Object& b) - { - return asObject(PyNumber_Multiply(*Int(j), *b)); - } - inline Object operator* (double v, const Object& b) - { - return asObject(PyNumber_Multiply(*Float(v), *b)); - } - - inline Object operator/ (const Object& a, const Object& b) - { - return asObject(PyNumber_Divide(*a, *b)); - } - inline Object operator/ (const Object& a, int j) - { - return asObject(PyNumber_Divide(*a, *Int(j))); - } - inline Object operator/ (const Object& a, double v) - { - return asObject(PyNumber_Divide(*a, *Float(v))); - } - inline Object operator/ (int j, const Object& b) - { - return asObject(PyNumber_Divide(*Int(j), *b)); - } - inline Object operator/ (double v, const Object& b) - { - return asObject(PyNumber_Divide(*Float(v), *b)); - } - - inline Object operator% (const Object& a, const Object& b) - { - return asObject(PyNumber_Remainder(*a, *b)); - } - inline Object operator% (const Object& a, int j) - { - return asObject(PyNumber_Remainder(*a, *Int(j))); - } - inline Object operator% (const Object& a, double v) - { - return asObject(PyNumber_Remainder(*a, *Float(v))); - } - inline Object operator% (int j, const Object& b) - { - return asObject(PyNumber_Remainder(*Int(j), *b)); - } - inline Object operator% (double v, const Object& b) - { - return asObject(PyNumber_Remainder(*Float(v), *b)); - } - - inline Object type(const Exception&) // return the type of the error - { - PyObject *ptype, *pvalue, *ptrace; - PyErr_Fetch(&ptype, &pvalue, &ptrace); - Object result; - if(ptype) result = ptype; - PyErr_Restore(ptype, pvalue, ptrace); - return result; - } - - inline Object value(const Exception&) // return the value of the error - { - PyObject *ptype, *pvalue, *ptrace; - PyErr_Fetch(&ptype, &pvalue, &ptrace); - Object result; - if(pvalue) result = pvalue; - PyErr_Restore(ptype, pvalue, ptrace); - return result; - } - - inline Object trace(const Exception&) // return the traceback of the error - { - PyObject *ptype, *pvalue, *ptrace; - PyErr_Fetch(&ptype, &pvalue, &ptrace); - Object result; - if(ptrace) result = ptrace; - PyErr_Restore(ptype, pvalue, ptrace); - return result; - } - -template -String seqref::str () const -{ - return the_item.str(); -} - -template -String seqref::repr () const -{ - return the_item.repr(); -} - -} // namespace Py -#endif // __CXX_Objects__h diff --git a/CXX/Python2/Config.hxx b/CXX/Python2/Config.hxx new file mode 100644 index 000000000000..b27f9ba28275 --- /dev/null +++ b/CXX/Python2/Config.hxx @@ -0,0 +1,118 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __PyCXX_config_hh__ +#define __PyCXX_config_hh__ + +// +// Microsoft VC++ 6.0 has no traits +// +#if defined( _MSC_VER ) + +# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 1 + +#elif defined( __GNUC__ ) +# if __GNUC__ >= 3 +# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 1 +# else +# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 0 +#endif + +// +// Assume all other compilers do +// +#else + +// Macros to deal with deficiencies in compilers +# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 1 +#endif + +#if STANDARD_LIBRARY_HAS_ITERATOR_TRAITS +# define random_access_iterator_parent(itemtype) std::iterator +#else +# define random_access_iterator_parent(itemtype) std::random_access_iterator +#endif + +// +// Which C++ standard is in use? +// +#if defined( _MSC_VER ) +# if _MSC_VER <= 1200 +// MSVC++ 6.0 +# define PYCXX_ISO_CPP_LIB 0 +# define STR_STREAM +# define TEMPLATE_TYPENAME class +# else +# define PYCXX_ISO_CPP_LIB 1 +# define STR_STREAM +# define TEMPLATE_TYPENAME typename +# endif +#elif defined( __GNUC__ ) +# if __GNUC__ >= 3 +# define PYCXX_ISO_CPP_LIB 1 +# define STR_STREAM +# define TEMPLATE_TYPENAME typename +# else +# define PYCXX_ISO_CPP_LIB 0 +# define STR_STREAM +# define TEMPLATE_TYPENAME class +# endif +#endif + +#if PYCXX_ISO_CPP_LIB +# define STR_STREAM +# define OSTRSTREAM ostringstream +# define EXPLICIT_TYPENAME typename +# define EXPLICIT_CLASS class +# define TEMPLATE_TYPENAME typename +#else +# define STR_STREAM +# define OSTRSTREAM ostrstream +# define EXPLICIT_TYPENAME +# define EXPLICIT_CLASS +# define TEMPLATE_TYPENAME class +#endif + +// before 2.5 Py_ssize_t was missing +#ifndef PY_MAJOR_VERSION +#error not defined PY_MAJOR_VERSION +#endif +#if PY_MAJOR_VERSION < 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 5) +typedef int Py_ssize_t; +#endif + +#endif // __PyCXX_config_hh__ diff --git a/CXX/Python2/CxxDebug.hxx b/CXX/Python2/CxxDebug.hxx new file mode 100644 index 000000000000..b646ffdd9afa --- /dev/null +++ b/CXX/Python2/CxxDebug.hxx @@ -0,0 +1,17 @@ +// +// CxxDebug.hxx +// +// Copyright (c) 2008 Barry A. Scott +// +#ifndef __CXX_Debug_hxx +#define __CXX_Debug_hxx + +// +// Functions useful when debugging PyCXX +// +#ifdef PYCXX_DEBUG +extern void bpt(); +extern void printRefCount( PyObject *obj ); +#endif + +#endif diff --git a/CXX/Python2/Exception.hxx b/CXX/Python2/Exception.hxx new file mode 100644 index 000000000000..1ef087cac9fe --- /dev/null +++ b/CXX/Python2/Exception.hxx @@ -0,0 +1,249 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_Exception_h +#define __CXX_Exception_h + +#include "CXX/WrapPython.h" +#include "CXX/Version.hxx" +#include "CXX/Config.hxx" +#include "CXX/IndirectPythonInterface.hxx" + +#include +#include + +// This mimics the Python structure, in order to minimize confusion +namespace Py +{ + class ExtensionExceptionType; + + class Object; + + class Exception + { + public: + Exception( ExtensionExceptionType &exception, const std::string& reason ); + Exception( ExtensionExceptionType &exception, Object &reason ); + + explicit Exception () + {} + + Exception (const std::string& reason) + { + PyErr_SetString (Py::_Exc_RuntimeError(), reason.c_str()); + } + + Exception (PyObject* exception, const std::string& reason) + { + PyErr_SetString (exception, reason.c_str()); + } + + Exception (PyObject* exception, Object &reason); + + void clear() // clear the error + // technically but not philosophically const + { + PyErr_Clear(); + } + }; + + + // Abstract + class StandardError: public Exception + { + protected: + explicit StandardError() + {} + }; + + class LookupError: public StandardError + { + protected: + explicit LookupError() + {} + }; + + class ArithmeticError: public StandardError + { + protected: + explicit ArithmeticError() + {} + }; + + class EnvironmentError: public StandardError + { + protected: + explicit EnvironmentError() + {} + }; + + // Concrete + + class TypeError: public StandardError + { + public: + TypeError (const std::string& reason) + : StandardError() + { + PyErr_SetString (Py::_Exc_TypeError(),reason.c_str()); + } + }; + + class IndexError: public LookupError + { + public: + IndexError (const std::string& reason) + : LookupError() + { + PyErr_SetString (Py::_Exc_IndexError(), reason.c_str()); + } + }; + + class AttributeError: public StandardError + { + public: + AttributeError (const std::string& reason) + : StandardError() + { + PyErr_SetString (Py::_Exc_AttributeError(), reason.c_str()); + } + }; + + class NameError: public StandardError + { + public: + NameError (const std::string& reason) + : StandardError() + { + PyErr_SetString (Py::_Exc_NameError(), reason.c_str()); + } + }; + + class RuntimeError: public StandardError + { + public: + RuntimeError (const std::string& reason) + : StandardError() + { + PyErr_SetString (Py::_Exc_RuntimeError(), reason.c_str()); + } + }; + + class SystemError: public StandardError + { + public: + SystemError (const std::string& reason) + : StandardError() + { + PyErr_SetString (Py::_Exc_SystemError(),reason.c_str()); + } + }; + + class KeyError: public LookupError + { + public: + KeyError (const std::string& reason) + : LookupError() + { + PyErr_SetString (Py::_Exc_KeyError(),reason.c_str()); + } + }; + + + class ValueError: public StandardError + { + public: + ValueError (const std::string& reason) + : StandardError() + { + PyErr_SetString (Py::_Exc_ValueError(), reason.c_str()); + } + }; + + class OverflowError: public ArithmeticError + { + public: + OverflowError (const std::string& reason) + : ArithmeticError() + { + PyErr_SetString (Py::_Exc_OverflowError(), reason.c_str()); + } + }; + + class ZeroDivisionError: public ArithmeticError + { + public: + ZeroDivisionError (const std::string& reason) + : ArithmeticError() + { + PyErr_SetString (Py::_Exc_ZeroDivisionError(), reason.c_str()); + } + }; + + class FloatingPointError: public ArithmeticError + { + public: + FloatingPointError (const std::string& reason) + : ArithmeticError() + { + PyErr_SetString (Py::_Exc_FloatingPointError(), reason.c_str()); + } + }; + + class MemoryError: public StandardError + { + public: + MemoryError (const std::string& reason) + : StandardError() + { + PyErr_SetString (Py::_Exc_MemoryError(), reason.c_str()); + } + }; + + class SystemExit: public StandardError + { + public: + SystemExit (const std::string& reason) + : StandardError() + { + PyErr_SetString (Py::_Exc_SystemExit(),reason.c_str()); + } + }; + +}// Py + +#endif diff --git a/CXX/Python2/ExtensionModule.hxx b/CXX/Python2/ExtensionModule.hxx new file mode 100644 index 000000000000..95413801f020 --- /dev/null +++ b/CXX/Python2/ExtensionModule.hxx @@ -0,0 +1,208 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_ExtensionModule__h +#define __CXX_ExtensionModule__h + +namespace Py +{ + class ExtensionModuleBase + { + public: + ExtensionModuleBase( const char *name ); + virtual ~ExtensionModuleBase(); + + Module module( void ) const; // only valid after initialize() has been called + Dict moduleDictionary( void ) const; // only valid after initialize() has been called + + virtual Object invoke_method_noargs( void *method_def ) = 0; + virtual Object invoke_method_keyword( void *method_def, const Tuple &_args, const Dict &_keywords ) = 0; + virtual Object invoke_method_varargs( void *method_def, const Tuple &_args ) = 0; + + const std::string &name() const; + const std::string &fullName() const; + + // what is returned from PyInit_ function + Object moduleObject( void ) const; + + protected: + // Initialize the module + void initialize( const char *module_doc ); + + const std::string m_module_name; + const std::string m_full_module_name; + MethodTable m_method_table; +#if PY3 + PyModuleDef m_module_def; +#endif + PyObject *m_module; + + private: + // + // prevent the compiler generating these unwanted functions + // + ExtensionModuleBase( const ExtensionModuleBase & ); //unimplemented + void operator=( const ExtensionModuleBase & ); //unimplemented + }; + + // Note: Python calls noargs as varargs buts args==NULL + extern "C" PyObject *method_noargs_call_handler( PyObject *_self_and_name_tuple, PyObject * ); + extern "C" PyObject *method_varargs_call_handler( PyObject *_self_and_name_tuple, PyObject *_args ); + extern "C" PyObject *method_keyword_call_handler( PyObject *_self_and_name_tuple, PyObject *_args, PyObject *_keywords ); + + extern "C" void do_not_dealloc( void * ); + + template + class ExtensionModule : public ExtensionModuleBase + { + public: + ExtensionModule( const char *name ) + : ExtensionModuleBase( name ) + {} + virtual ~ExtensionModule() + {} + + protected: + typedef Object (T::*method_noargs_function_t)(); + typedef Object (T::*method_varargs_function_t)( const Tuple &args ); + typedef Object (T::*method_keyword_function_t)( const Tuple &args, const Dict &kws ); + typedef std::map *> method_map_t; + + static void add_noargs_method( const char *name, method_noargs_function_t function, const char *doc="" ) + { + method_map_t &mm = methods(); + mm[ std::string( name ) ] = new MethodDefExt( name, function, method_noargs_call_handler, doc ); + } + + static void add_varargs_method( const char *name, method_varargs_function_t function, const char *doc="" ) + { + method_map_t &mm = methods(); + mm[ std::string( name ) ] = new MethodDefExt( name, function, method_varargs_call_handler, doc ); + } + + static void add_keyword_method( const char *name, method_keyword_function_t function, const char *doc="" ) + { + method_map_t &mm = methods(); + mm[ std::string( name ) ] = new MethodDefExt( name, function, method_keyword_call_handler, doc ); + } + + void initialize( const char *module_doc="" ) + { + ExtensionModuleBase::initialize( module_doc ); + Dict dict( moduleDictionary() ); + + // + // put each of the methods into the modules dictionary + // so that we get called back at the function in T. + // + method_map_t &mm = methods(); + EXPLICIT_TYPENAME method_map_t::const_iterator i = mm.begin(); + EXPLICIT_TYPENAME method_map_t::const_iterator i_end = mm.end(); + for ( ; i != i_end; ++i ) + { + MethodDefExt *method_def = (*i).second; + + static PyObject *self = PyCObject_FromVoidPtr( this, do_not_dealloc ); + + Tuple args( 2 ); + args[0] = Object( self ); + args[1] = Object( PyCObject_FromVoidPtr( method_def, do_not_dealloc ) ); + + PyObject *func = PyCFunction_New + ( + &method_def->ext_meth_def, + new_reference_to( args ) + ); + + method_def->py_method = Object( func, true ); + + dict[ (*i).first ] = method_def->py_method; + } + } + + protected: // Tom Malcolmson reports that derived classes need access to these + static method_map_t &methods( void ) + { + static method_map_t *map_of_methods = NULL; + if( map_of_methods == NULL ) + map_of_methods = new method_map_t; + + return *map_of_methods; + } + + // this invoke function must be called from within a try catch block + virtual Object invoke_method_noargs( void *method_def ) + { + // cast up to the derived class, method_def and call + T *self = static_cast( this ); + MethodDefExt *meth_def = reinterpret_cast *>( method_def ); + + return (self->*meth_def->ext_noargs_function)(); + } + + // this invoke function must be called from within a try catch block + virtual Object invoke_method_varargs( void *method_def, const Tuple &args ) + { + // cast up to the derived class, method_def and call + T *self = static_cast( this ); + MethodDefExt *meth_def = reinterpret_cast *>( method_def ); + + return (self->*meth_def->ext_varargs_function)( args ); + } + + // this invoke function must be called from within a try catch block + virtual Object invoke_method_keyword( void *method_def, const Tuple &args, const Dict &keywords ) + { + // cast up to the derived class, method_def and call + T *self = static_cast( this ); + MethodDefExt *meth_def = reinterpret_cast *>( method_def ); + + return (self->*meth_def->ext_keyword_function)( args, keywords ); + } + + private: + // + // prevent the compiler generating these unwanted functions + // + ExtensionModule( const ExtensionModule & ); //unimplemented + void operator=( const ExtensionModule & ); //unimplemented + }; +} // Namespace Py + + +// End of __CXX_ExtensionModule__h +#endif diff --git a/CXX/Python2/ExtensionOldType.hxx b/CXX/Python2/ExtensionOldType.hxx new file mode 100644 index 000000000000..a39f19afc958 --- /dev/null +++ b/CXX/Python2/ExtensionOldType.hxx @@ -0,0 +1,392 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_ExtensionOldType__h +#define __CXX_ExtensionOldType__h + +namespace Py +{ + template class PythonExtension + : public PythonExtensionBase + { + public: + static PyTypeObject *type_object() + { + return behaviors().type_object(); + } + + static bool check( PyObject *p ) + { + // is p like me? + return p->ob_type == type_object(); + } + + static bool check( const Object &ob ) + { + return check( ob.ptr() ); + } + + // + // every object needs getattr implemented + // to support methods + // + virtual Object getattr( const char *name ) + { + return getattr_methods( name ); + } + + PyObject *selfPtr() + { + return this; + } + + protected: + explicit PythonExtension() + : PythonExtensionBase() + { + PyObject_Init( this, type_object() ); + + // every object must support getattr + behaviors().supportGetattr(); + } + + virtual ~PythonExtension() + {} + + static PythonType &behaviors() + { + static PythonType* p; + if( p == NULL ) + { +#if defined( _CPPRTTI ) || defined( __GNUG__ ) + const char *default_name =( typeid( T ) ).name(); +#else + const char *default_name = "unknown"; +#endif + p = new PythonType( sizeof( T ), 0, default_name ); + p->set_tp_dealloc( extension_object_deallocator ); + } + + return *p; + } + + typedef Object (T::*method_noargs_function_t)(); + typedef Object (T::*method_varargs_function_t)( const Tuple &args ); + typedef Object (T::*method_keyword_function_t)( const Tuple &args, const Dict &kws ); + typedef std::map *> method_map_t; + + // support the default attributes, __name__, __doc__ and methods + virtual Object getattr_default( const char *_name ) + { + std::string name( _name ); + + if( name == "__name__" && type_object()->tp_name != NULL ) + { + return Py::String( type_object()->tp_name ); + } + + if( name == "__doc__" && type_object()->tp_doc != NULL ) + { + return Py::String( type_object()->tp_doc ); + } + +// trying to fake out being a class for help() +// else if( name == "__bases__" ) +// { +// return Py::Tuple( 0 ); +// } +// else if( name == "__module__" ) +// { +// return Py::Nothing(); +// } +// else if( name == "__dict__" ) +// { +// return Py::Dict(); +// } + + return getattr_methods( _name ); + } + + // turn a name into function object + virtual Object getattr_methods( const char *_name ) + { + std::string name( _name ); + + method_map_t &mm = methods(); + + // see if name exists and get entry with method + EXPLICIT_TYPENAME method_map_t::const_iterator i = mm.find( name ); + if( i == mm.end() ) + { + if( name == "__methods__" ) + { + List methods; + + i = mm.begin(); + EXPLICIT_TYPENAME method_map_t::const_iterator i_end = mm.end(); + + for( ; i != i_end; ++i ) + methods.append( String( (*i).first ) ); + + return methods; + } + + throw AttributeError( name ); + } + + MethodDefExt *method_def = i->second; + + Tuple self( 2 ); + + self[0] = Object( this ); + self[1] = Object( PyCObject_FromVoidPtr( method_def, do_not_dealloc ) ); + + PyObject *func = PyCFunction_New( &method_def->ext_meth_def, self.ptr() ); + + return Object(func, true); + } + + // check that all methods added are unique + static void check_unique_method_name( const char *name ) + { + method_map_t &mm = methods(); + EXPLICIT_TYPENAME method_map_t::const_iterator i; + i = mm.find( name ); + if( i != mm.end() ) + throw AttributeError( name ); + } + + static void add_noargs_method( const char *name, method_noargs_function_t function, const char *doc="" ) + { + check_unique_method_name( name ); + method_map_t &mm = methods(); + mm[ std::string( name ) ] = new MethodDefExt( name, function, method_noargs_call_handler, doc ); + } + + static void add_varargs_method( const char *name, method_varargs_function_t function, const char *doc="" ) + { + check_unique_method_name( name ); + method_map_t &mm = methods(); + mm[ std::string( name ) ] = new MethodDefExt( name, function, method_varargs_call_handler, doc ); + } + + static void add_keyword_method( const char *name, method_keyword_function_t function, const char *doc="" ) + { + check_unique_method_name( name ); + method_map_t &mm = methods(); + mm[ std::string( name ) ] = new MethodDefExt( name, function, method_keyword_call_handler, doc ); + } + + private: + static method_map_t &methods( void ) + { + static method_map_t *map_of_methods = NULL; + if( map_of_methods == NULL ) + map_of_methods = new method_map_t; + + return *map_of_methods; + } + + // Note: Python calls noargs as varargs buts args==NULL + static PyObject *method_noargs_call_handler( PyObject *_self_and_name_tuple, PyObject * ) + { + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + T *self = static_cast( self_in_cobject ); + MethodDefExt *meth_def = reinterpret_cast *>( + PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ) ); + Object result; + + // Adding try & catch in case of STL debug-mode exceptions. + #ifdef _STLP_DEBUG + try + { + result = (self->*meth_def->ext_noargs_function)(); + } + catch( std::__stl_debug_exception ) + { + // throw cxx::RuntimeError( sErrMsg ); + throw RuntimeError( "Error message not set yet." ); + } + #else + result = (self->*meth_def->ext_noargs_function)(); + #endif // _STLP_DEBUG + + return new_reference_to( result.ptr() ); + } + catch( Exception & ) + { + return 0; + } + } + + static PyObject *method_varargs_call_handler( PyObject *_self_and_name_tuple, PyObject *_args ) + { + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + T *self = static_cast( self_in_cobject ); + + MethodDefExt *meth_def = reinterpret_cast *>( + PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ) ); + Tuple args( _args ); + + Object result; + + // Adding try & catch in case of STL debug-mode exceptions. + #ifdef _STLP_DEBUG + try + { + result = (self->*meth_def->ext_varargs_function)( args ); + } + catch( std::__stl_debug_exception ) + { + throw RuntimeError( "Error message not set yet." ); + } + #else + result = (self->*meth_def->ext_varargs_function)( args ); + #endif // _STLP_DEBUG + + return new_reference_to( result.ptr() ); + } + catch( Exception & ) + { + return 0; + } + } + + static PyObject *method_keyword_call_handler( PyObject *_self_and_name_tuple, PyObject *_args, PyObject *_keywords ) + { + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + T *self = static_cast( self_in_cobject ); + + MethodDefExt *meth_def = reinterpret_cast *>( + PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ) ); + + Tuple args( _args ); + + // _keywords may be NULL so be careful about the way the dict is created + Dict keywords; + if( _keywords != NULL ) + keywords = Dict( _keywords ); + + Object result( ( self->*meth_def->ext_keyword_function )( args, keywords ) ); + + return new_reference_to( result.ptr() ); + } + catch( Exception & ) + { + return 0; + } + } + + static void extension_object_deallocator( PyObject* t ) + { + delete (T *)( t ); + } + + // + // prevent the compiler generating these unwanted functions + // + explicit PythonExtension( const PythonExtension &other ); + void operator=( const PythonExtension &rhs ); + }; + + // + // ExtensionObject is an Object that will accept only T's. + // + template + class ExtensionObject: public Object + { + public: + + explicit ExtensionObject( PyObject *pyob ) + : Object( pyob ) + { + validate(); + } + + ExtensionObject( const ExtensionObject &other ) + : Object( *other ) + { + validate(); + } + + ExtensionObject( const Object &other ) + : Object( *other ) + { + validate(); + } + + ExtensionObject &operator=( const Object &rhs ) + { + return( *this = *rhs ); + } + + ExtensionObject &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + virtual bool accepts( PyObject *pyob ) const + { + return( pyob && T::check( pyob ) ); + } + + // + // Obtain a pointer to the PythonExtension object + // + T *extensionObject( void ) + { + return static_cast( ptr() ); + } + }; +} // Namespace Py + +// End of __CXX_ExtensionOldType__h +#endif diff --git a/CXX/Python2/ExtensionType.hxx b/CXX/Python2/ExtensionType.hxx new file mode 100644 index 000000000000..2b41dbbf9701 --- /dev/null +++ b/CXX/Python2/ExtensionType.hxx @@ -0,0 +1,370 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_ExtensionClass__h +#define __CXX_ExtensionClass__h + +#define PYCXX_NOARGS_METHOD_NAME( NAME ) _callNoArgsMethod__##NAME +#define PYCXX_VARARGS_METHOD_NAME( NAME ) _callVarArgsMethod__##NAME +#define PYCXX_KEYWORDS_METHOD_NAME( NAME ) _callKeywordsMethod__##NAME + +#define PYCXX_NOARGS_METHOD_DECL( CLS, NAME ) \ + static PyObject *PYCXX_NOARGS_METHOD_NAME( NAME )( PyObject *_self, PyObject *, PyObject * ) \ + { \ + Py::PythonClassInstance *self_python = reinterpret_cast< Py::PythonClassInstance * >( _self ); \ + CLS *self = reinterpret_cast< CLS * >( self_python->m_pycxx_object ); \ + Py::Object r( (self->NAME)() ); \ + return Py::new_reference_to( r.ptr() ); \ + } +#define PYCXX_VARARGS_METHOD_DECL( CLS, NAME ) \ + static PyObject *PYCXX_VARARGS_METHOD_NAME( NAME )( PyObject *_self, PyObject *_a, PyObject * ) \ + { \ + Py::PythonClassInstance *self_python = reinterpret_cast< Py::PythonClassInstance * >( _self ); \ + CLS *self = reinterpret_cast< CLS * >( self_python->m_pycxx_object ); \ + Py::Tuple a( _a ); \ + Py::Object r( (self->NAME)( a ) ); \ + return Py::new_reference_to( r.ptr() ); \ + } +#define PYCXX_KEYWORDS_METHOD_DECL( CLS, NAME ) \ + static PyObject *PYCXX_KEYWORDS_METHOD_NAME( NAME )( PyObject *_self, PyObject *_a, PyObject *_k ) \ + { \ + Py::PythonClassInstance *self_python = reinterpret_cast< Py::PythonClassInstance * >( _self ); \ + CLS *self = reinterpret_cast< CLS * >( self_python->m_pycxx_object ); \ + Py::Tuple a( _a ); \ + Py::Dict k; \ + if( _k != NULL ) \ + k = _k; \ + Py::Object r( (self->NAME)( a, k ) ); \ + return Py::new_reference_to( r.ptr() ); \ + } + +// need to support METH_STATIC and METH_CLASS + +#define PYCXX_ADD_NOARGS_METHOD( NAME, docs ) \ + add_method( #NAME, (PyCFunction)PYCXX_NOARGS_METHOD_NAME( NAME ), METH_NOARGS, docs ) +#define PYCXX_ADD_VARARGS_METHOD( NAME, docs ) \ + add_method( #NAME, (PyCFunction)PYCXX_VARARGS_METHOD_NAME( NAME ), METH_VARARGS, docs ) +#define PYCXX_ADD_KEYWORDS_METHOD( NAME, docs ) \ + add_method( #NAME, (PyCFunction)PYCXX_KEYWORDS_METHOD_NAME( NAME ), METH_VARARGS | METH_KEYWORDS, docs ) + +namespace Py +{ + struct PythonClassInstance + { + PyObject_HEAD + PythonExtensionBase *m_pycxx_object; + }; + + + class ExtensionClassMethodsTable + { + public: + ExtensionClassMethodsTable() + : m_methods_table( new PyMethodDef[ METHOD_TABLE_SIZE_INCREMENT ] ) + , m_methods_used( 0 ) + , m_methods_size( METHOD_TABLE_SIZE_INCREMENT ) + { + } + + ~ExtensionClassMethodsTable() + { + delete m_methods_table; + } + + // check that all methods added are unique + void check_unique_method_name( const char *_name ) + { + std::string name( _name ); + for( int i=0; iml_name = const_cast( name ); + p->ml_meth = function; + p->ml_flags = flags; + p->ml_doc = const_cast( doc ); + + m_methods_used++; + p++; + + // add the sentinel marking the table end + p->ml_name = NULL; + p->ml_meth = NULL; + p->ml_flags = 0; + p->ml_doc = NULL; + + return m_methods_table; + } + + private: + enum {METHOD_TABLE_SIZE_INCREMENT = 1}; + PyMethodDef *m_methods_table; + int m_methods_used; + int m_methods_size; + }; + + template class PythonClass + : public PythonExtensionBase + { + protected: + explicit PythonClass( PythonClassInstance *self, Tuple &args, Dict &kwds ) + : PythonExtensionBase() + , m_self( self ) + { + // we are a class + behaviors().supportClass(); + } + + virtual ~PythonClass() + {} + + static ExtensionClassMethodsTable &methodTable() + { + static ExtensionClassMethodsTable *method_table; + if( method_table == NULL ) + method_table = new ExtensionClassMethodsTable; + return *method_table; + } + + static void add_method( const char *name, PyCFunction function, int flags, const char *doc=NULL ) + { + behaviors().set_methods( methodTable().add_method( name, function, flags, doc ) ); + } + + static PythonType &behaviors() + { + static PythonType *p; + if( p == NULL ) + { +#if defined( _CPPRTTI ) || defined( __GNUG__ ) + const char *default_name = (typeid( T )).name(); +#else + const char *default_name = "unknown"; +#endif + p = new PythonType( sizeof( T ), 0, default_name ); + p->set_tp_new( extension_object_new ); + p->set_tp_init( extension_object_init ); + p->set_tp_dealloc( extension_object_deallocator ); + } + + return *p; + } + + static PyObject *extension_object_new( PyTypeObject *subtype, PyObject *args, PyObject *kwds ) + { +#ifdef PYCXX_DEBUG + std::cout << "extension_object_new()" << std::endl; +#endif + PythonClassInstance *o = reinterpret_cast( subtype->tp_alloc( subtype, 0 ) ); + if( o == NULL ) + return NULL; + + o->m_pycxx_object = NULL; + + PyObject *self = reinterpret_cast( o ); +#ifdef PYCXX_DEBUG + std::cout << "extension_object_new() => self=0x" << std::hex << reinterpret_cast< unsigned int >( self ) << std::dec << std::endl; +#endif + return self; + } + + static int extension_object_init( PyObject *_self, PyObject *args_, PyObject *kwds_ ) + { + try + { + Py::Tuple args( args_ ); + Py::Dict kwds; + if( kwds_ != NULL ) + kwds = kwds_; + + PythonClassInstance *self = reinterpret_cast( _self ); +#ifdef PYCXX_DEBUG + std::cout << "extension_object_init( self=0x" << std::hex << reinterpret_cast< unsigned int >( self ) << std::dec << " )" << std::endl; + std::cout << " self->cxx_object=0x" << std::hex << reinterpret_cast< unsigned int >( self->cxx_object ) << std::dec << std::endl; +#endif + + if( self->m_pycxx_object == NULL ) + { + self->m_pycxx_object = new T( self, args, kwds ); +#ifdef PYCXX_DEBUG + std::cout << " self->m_pycxx_object=0x" << std::hex << reinterpret_cast< unsigned int >( self->m_pycxx_object ) << std::dec << std::endl; +#endif + } + else + { +#ifdef PYCXX_DEBUG + std::cout << " reinit - self->m_pycxx_object=0x" << std::hex << reinterpret_cast< unsigned int >( self->m_pycxx_object ) << std::dec << std::endl; +#endif + self->m_pycxx_object->reinit( args, kwds ); + } + } + catch( Exception & ) + { + return -1; + } + return 0; + } + + static void extension_object_deallocator( PyObject *_self ) + { + PythonClassInstance *self = reinterpret_cast< PythonClassInstance * >( _self ); +#ifdef PYCXX_DEBUG + std::cout << "extension_object_deallocator( self=0x" << std::hex << reinterpret_cast< unsigned int >( self ) << std::dec << " )" << std::endl; + std::cout << " self->cxx_object=0x" << std::hex << reinterpret_cast< unsigned int >( self->cxx_object ) << std::dec << std::endl; +#endif + delete self->m_pycxx_object; + } + + public: + static PyTypeObject *type_object() + { + return behaviors().type_object(); + } + + static Object type() + { + return Object( reinterpret_cast( behaviors().type_object() ) ); + } + + static bool check( PyObject *p ) + { + // is p like me? + return p->ob_type == type_object(); + } + + static bool check( const Object &ob ) + { + return check( ob.ptr() ); + } + + PyObject *selfPtr() + { + return reinterpret_cast( m_self ); + } + + protected: + private: + PythonClassInstance *m_self; + + private: + // + // prevent the compiler generating these unwanted functions + // + explicit PythonClass( const PythonClass &other ); + void operator=( const PythonClass &rhs ); + }; + + // + // ExtensionObject is an Object that will accept only T's. + // + template + class PythonClassObject: public Object + { + public: + + explicit PythonClassObject( PyObject *pyob ) + : Object( pyob ) + { + validate(); + } + + PythonClassObject( const PythonClassObject &other ) + : Object( *other ) + { + validate(); + } + + PythonClassObject( const Object &other ) + : Object( *other ) + { + validate(); + } + + PythonClassObject &operator=( const Object &rhs ) + { + *this = *rhs; + return *this; + } + + PythonClassObject &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + virtual bool accepts( PyObject *pyob ) const + { + return( pyob && T::check( pyob ) ); + } + + // + // Obtain a pointer to the PythonExtension object + // + T *getCxxObject( void ) + { + return static_cast( ptr() ); + } + }; +} // Namespace Py + +// End of __CXX_ExtensionClass__h +#endif diff --git a/CXX/Python2/ExtensionTypeBase.hxx b/CXX/Python2/ExtensionTypeBase.hxx new file mode 100644 index 000000000000..eaebe650b629 --- /dev/null +++ b/CXX/Python2/ExtensionTypeBase.hxx @@ -0,0 +1,145 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_ExtensionTypeBase__h +#define __CXX_ExtensionTypeBase__h + +namespace Py +{ + // Class PythonExtension is what you inherit from to create + // a new Python extension type. You give your class itself + // as the template paramter. + + // There are two ways that extension objects can get destroyed. + // 1. Their reference count goes to zero + // 2. Someone does an explicit delete on a pointer. + // In(1) the problem is to get the destructor called + // We register a special deallocator in the Python type object + // (see behaviors()) to do this. + // In(2) there is no problem, the dtor gets called. + + // PythonExtension does not use the usual Python heap allocator, + // instead using new/delete. We do the setting of the type object + // and reference count, usually done by PyObject_New, in the + // base class ctor. + + // This special deallocator does a delete on the pointer. + + class PythonExtensionBase : public PyObject + { + public: + PythonExtensionBase(); + virtual ~PythonExtensionBase(); + + public: + // object + virtual void reinit( Tuple &args, Dict &kwds ); + + // object basics +#if defined( PYCXX_PYTHON_2TO3 ) || !defined( PY3 ) + virtual int print( FILE *, int ); +#endif + virtual Object getattr( const char * ); + virtual int setattr( const char *, const Object & ); + virtual Object getattro( const String & ); + Object genericGetAttro( const String & ); + virtual int setattro( const String &, const Object & ); + int genericSetAttro( const String &, const Object & ); + virtual int compare( const Object & ); + virtual Object rich_compare( const Object &, int ); + virtual Object repr(); + virtual Object str(); + virtual long hash(); + virtual Object call( const Object &, const Object & ); + virtual Object iter(); + virtual PyObject *iternext(); + + // Sequence methods + virtual int sequence_length(); + virtual Object sequence_concat( const Object & ); + virtual Object sequence_repeat( Py_ssize_t ); + virtual Object sequence_item( Py_ssize_t ); + virtual Object sequence_slice( Py_ssize_t, Py_ssize_t ); + virtual int sequence_ass_item( Py_ssize_t, const Object & ); + virtual int sequence_ass_slice( Py_ssize_t, Py_ssize_t, const Object & ); + + // Mapping + virtual int mapping_length(); + virtual Object mapping_subscript( const Object & ); + virtual int mapping_ass_subscript( const Object &, const Object & ); + + // Number + virtual int number_nonzero(); + virtual Object number_negative(); + virtual Object number_positive(); + virtual Object number_absolute(); + virtual Object number_invert(); + virtual Object number_int(); + virtual Object number_float(); + virtual Object number_long(); + virtual Object number_oct(); + virtual Object number_hex(); + virtual Object number_add( const Object & ); + virtual Object number_subtract( const Object & ); + virtual Object number_multiply( const Object & ); + virtual Object number_divide( const Object & ); + virtual Object number_remainder( const Object & ); + virtual Object number_divmod( const Object & ); + virtual Object number_lshift( const Object & ); + virtual Object number_rshift( const Object & ); + virtual Object number_and( const Object & ); + virtual Object number_xor( const Object & ); + virtual Object number_or( const Object & ); + virtual Object number_power( const Object &, const Object & ); + + // Buffer + virtual Py_ssize_t buffer_getreadbuffer( Py_ssize_t, void** ); + virtual Py_ssize_t buffer_getwritebuffer( Py_ssize_t, void** ); + virtual Py_ssize_t buffer_getsegcount( Py_ssize_t* ); + + public: + virtual PyObject *selfPtr() = 0; + + private: + void missing_method( void ); + static PyObject *method_call_handler( PyObject *self, PyObject *args ); + }; + +} // Namespace Py + +// End of __CXX_ExtensionTypeBase__h +#endif diff --git a/CXX/Python2/Extensions.hxx b/CXX/Python2/Extensions.hxx new file mode 100644 index 000000000000..c4324b30a0d2 --- /dev/null +++ b/CXX/Python2/Extensions.hxx @@ -0,0 +1,189 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_Extensions__h +#define __CXX_Extensions__h + + +#ifdef _MSC_VER +// disable warning C4786: symbol greater than 255 character, +// okay to ignore +#pragma warning( disable: 4786 ) +#endif + +#include "CXX/WrapPython.h" +#include "CXX/Version.hxx" +#include "CXX/Python2/Config.hxx" +#include "CXX/Python2/CxxDebug.hxx" +#include "CXX/Python2/Objects.hxx" + +extern "C" { extern PyObject py_object_initializer; } + +#include +#include + +// ---------------------------------------------------------------------- + +namespace Py +{ + class ExtensionModuleBase; + + // Make an Exception Type for use in raising custom exceptions + class ExtensionExceptionType : public Object + { + public: + ExtensionExceptionType(); + virtual ~ExtensionExceptionType(); + + // call init to create the type + void init( ExtensionModuleBase &module, const std::string &name, ExtensionExceptionType &parent ); + void init( ExtensionModuleBase &module, const std::string &name ); + }; + + class MethodTable + { + public: + MethodTable(); + virtual ~MethodTable(); + + void add( const char *method_name, PyCFunction f, const char *doc="", int flag=1 ); + PyMethodDef *table(); + + protected: + std::vector t; // accumulator of PyMethodDef's + PyMethodDef *mt; // Actual method table produced when full + + static PyMethodDef method( const char* method_name, PyCFunction f, int flags=1, const char* doc="" ); + + private: + // + // prevent the compiler generating these unwanted functions + // + MethodTable( const MethodTable &m ); //unimplemented + void operator=( const MethodTable &m ); //unimplemented + + }; // end class MethodTable + + // Note: Python calls noargs as varargs buts args==NULL + extern "C" typedef PyObject *(*method_noargs_call_handler_t)( PyObject *_self, PyObject * ); + extern "C" typedef PyObject *(*method_varargs_call_handler_t)( PyObject *_self, PyObject *_args ); + extern "C" typedef PyObject *(*method_keyword_call_handler_t)( PyObject *_self, PyObject *_args, PyObject *_dict ); + + template + class MethodDefExt : public PyMethodDef + { + public: + typedef Object (T::*method_noargs_function_t)(); + typedef Object (T::*method_varargs_function_t)( const Tuple &args ); + typedef Object (T::*method_keyword_function_t)( const Tuple &args, const Dict &kws ); + + // NOARGS + MethodDefExt + ( + const char *_name, + method_noargs_function_t _function, + method_noargs_call_handler_t _handler, + const char *_doc + ) + { + ext_meth_def.ml_name = const_cast( _name ); + ext_meth_def.ml_meth = reinterpret_cast( _handler ); + ext_meth_def.ml_flags = METH_NOARGS; + ext_meth_def.ml_doc = const_cast( _doc ); + + ext_noargs_function = _function; + ext_varargs_function = NULL; + ext_keyword_function = NULL; + } + + // VARARGS + MethodDefExt + ( + const char *_name, + method_varargs_function_t _function, + method_varargs_call_handler_t _handler, + const char *_doc + ) + { + ext_meth_def.ml_name = const_cast( _name ); + ext_meth_def.ml_meth = reinterpret_cast( _handler ); + ext_meth_def.ml_flags = METH_VARARGS; + ext_meth_def.ml_doc = const_cast( _doc ); + + ext_noargs_function = NULL; + ext_varargs_function = _function; + ext_keyword_function = NULL; + } + + // VARARGS + KEYWORD + MethodDefExt + ( + const char *_name, + method_keyword_function_t _function, + method_keyword_call_handler_t _handler, + const char *_doc + ) + { + ext_meth_def.ml_name = const_cast( _name ); + ext_meth_def.ml_meth = reinterpret_cast( _handler ); + ext_meth_def.ml_flags = METH_VARARGS|METH_KEYWORDS; + ext_meth_def.ml_doc = const_cast( _doc ); + + ext_noargs_function = NULL; + ext_varargs_function = NULL; + ext_keyword_function = _function; + } + + ~MethodDefExt() + {} + + PyMethodDef ext_meth_def; + method_noargs_function_t ext_noargs_function; + method_varargs_function_t ext_varargs_function; + method_keyword_function_t ext_keyword_function; + Object py_method; + }; +} // Namespace Py + +#include "CXX/Python2/ExtensionModule.hxx" +#include "CXX/Python2/PythonType.hxx" +#include "CXX/Python2/ExtensionTypeBase.hxx" +#include "CXX/Python2/ExtensionOldType.hxx" +#include "CXX/Python2/ExtensionType.hxx" + +// End of CXX_Extensions.h +#endif diff --git a/CXX/Python2/IndirectPythonInterface.cxx b/CXX/Python2/IndirectPythonInterface.cxx new file mode 100644 index 000000000000..d36d1b52612d --- /dev/null +++ b/CXX/Python2/IndirectPythonInterface.cxx @@ -0,0 +1,597 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#include "CXX/IndirectPythonInterface.hxx" + +namespace Py +{ +bool _Buffer_Check( PyObject *op ) { return (op)->ob_type == _Buffer_Type(); } +bool _CFunction_Check( PyObject *op ) { return (op)->ob_type == _CFunction_Type(); } +bool _Class_Check( PyObject *op ) { return (op)->ob_type == _Class_Type(); } +bool _CObject_Check( PyObject *op ) { return (op)->ob_type == _CObject_Type(); } +bool _Complex_Check( PyObject *op ) { return (op)->ob_type == _Complex_Type(); } +bool _Dict_Check( PyObject *op ) { return (op)->ob_type == _Dict_Type(); } +bool _File_Check( PyObject *op ) { return (op)->ob_type == _File_Type(); } +bool _Float_Check( PyObject *op ) { return (op)->ob_type == _Float_Type(); } +bool _Function_Check( PyObject *op ) { return (op)->ob_type == _Function_Type(); } +bool _Instance_Check( PyObject *op ) { return (op)->ob_type == _Instance_Type(); } +bool _Boolean_Check( PyObject *op ) { return (op)->ob_type == _Bool_Type(); } +bool _Int_Check( PyObject *op ) { return (op)->ob_type == _Int_Type(); } +bool _List_Check( PyObject *o ) { return o->ob_type == _List_Type(); } +bool _Long_Check( PyObject *op ) { return (op)->ob_type == _Long_Type(); } +bool _Method_Check( PyObject *op ) { return (op)->ob_type == _Method_Type(); } +bool _Module_Check( PyObject *op ) { return (op)->ob_type == _Module_Type(); } +bool _Range_Check( PyObject *op ) { return (op)->ob_type == _Range_Type(); } +bool _Slice_Check( PyObject *op ) { return (op)->ob_type == _Slice_Type(); } +bool _String_Check( PyObject *o ) { return o->ob_type == _String_Type(); } +bool _TraceBack_Check( PyObject *v ) { return (v)->ob_type == _TraceBack_Type(); } +bool _Tuple_Check( PyObject *op ) { return (op)->ob_type == _Tuple_Type(); } +bool _Type_Check( PyObject *op ) { return (op)->ob_type == _Type_Type(); } + +#if PY_MAJOR_VERSION >= 2 +bool _Unicode_Check( PyObject *op ) { return (op)->ob_type == _Unicode_Type(); } +#endif + + + +#if defined(PY_WIN32_DELAYLOAD_PYTHON_DLL) + +#if defined(MS_WINDOWS) +#include + + +static HMODULE python_dll; + +static PyObject *ptr__Exc_ArithmeticError = NULL; +static PyObject *ptr__Exc_AssertionError = NULL; +static PyObject *ptr__Exc_AttributeError = NULL; +static PyObject *ptr__Exc_EnvironmentError = NULL; +static PyObject *ptr__Exc_EOFError = NULL; +static PyObject *ptr__Exc_Exception = NULL; +static PyObject *ptr__Exc_FloatingPointError = NULL; +static PyObject *ptr__Exc_ImportError = NULL; +static PyObject *ptr__Exc_IndexError = NULL; +static PyObject *ptr__Exc_IOError = NULL; +static PyObject *ptr__Exc_KeyboardInterrupt = NULL; +static PyObject *ptr__Exc_KeyError = NULL; +static PyObject *ptr__Exc_LookupError = NULL; +static PyObject *ptr__Exc_MemoryError = NULL; +static PyObject *ptr__Exc_MemoryErrorInst = NULL; +static PyObject *ptr__Exc_NameError = NULL; +static PyObject *ptr__Exc_NotImplementedError = NULL; +static PyObject *ptr__Exc_OSError = NULL; +static PyObject *ptr__Exc_OverflowError = NULL; +static PyObject *ptr__Exc_RuntimeError = NULL; +static PyObject *ptr__Exc_StandardError = NULL; +static PyObject *ptr__Exc_SyntaxError = NULL; +static PyObject *ptr__Exc_SystemError = NULL; +static PyObject *ptr__Exc_SystemExit = NULL; +static PyObject *ptr__Exc_TypeError = NULL; +static PyObject *ptr__Exc_ValueError = NULL; +static PyObject *ptr__Exc_ZeroDivisionError = NULL; + +#ifdef MS_WINDOWS +static PyObject *ptr__Exc_WindowsError = NULL; +#endif + +#if PY_MAJOR_VERSION >= 2 +static PyObject *ptr__Exc_IndentationError = NULL; +static PyObject *ptr__Exc_TabError = NULL; +static PyObject *ptr__Exc_UnboundLocalError = NULL; +static PyObject *ptr__Exc_UnicodeError = NULL; +#endif + +static PyObject *ptr__PyNone = NULL; + +static PyObject *ptr__PyFalse = NULL; +static PyObject *ptr__PyTrue = NULL; + +static PyTypeObject *ptr__Buffer_Type = NULL; +static PyTypeObject *ptr__CFunction_Type = NULL; +static PyTypeObject *ptr__Class_Type = NULL; +static PyTypeObject *ptr__CObject_Type = NULL; +static PyTypeObject *ptr__Complex_Type = NULL; +static PyTypeObject *ptr__Dict_Type = NULL; +static PyTypeObject *ptr__File_Type = NULL; +static PyTypeObject *ptr__Float_Type = NULL; +static PyTypeObject *ptr__Function_Type = NULL; +static PyTypeObject *ptr__Instance_Type = NULL; +static PyTypeObject *ptr__Int_Type = NULL; +static PyTypeObject *ptr__List_Type = NULL; +static PyTypeObject *ptr__Long_Type = NULL; +static PyTypeObject *ptr__Method_Type = NULL; +static PyTypeObject *ptr__Module_Type = NULL; +static PyTypeObject *ptr__Range_Type = NULL; +static PyTypeObject *ptr__Slice_Type = NULL; +static PyTypeObject *ptr__String_Type = NULL; +static PyTypeObject *ptr__TraceBack_Type = NULL; +static PyTypeObject *ptr__Tuple_Type = NULL; +static PyTypeObject *ptr__Type_Type = NULL; + +#if PY_MAJOR_VERSION >= 2 +static PyTypeObject *ptr__Unicode_Type = NULL; +#endif + +static int *ptr_Py_DebugFlag = NULL; +static int *ptr_Py_InteractiveFlag = NULL; +static int *ptr_Py_OptimizeFlag = NULL; +static int *ptr_Py_NoSiteFlag = NULL; +static int *ptr_Py_TabcheckFlag = NULL; +static int *ptr_Py_VerboseFlag = NULL; + +#if PY_MAJOR_VERSION >= 2 +static int *ptr_Py_UnicodeFlag = NULL; +#endif + +static char **ptr__Py_PackageContext = NULL; + +#ifdef Py_REF_DEBUG +int *ptr_Py_RefTotal; +#endif + + +//-------------------------------------------------------------------------------- +class GetAddressException +{ +public: + GetAddressException( const char *_name ) + : name( _name ) + {} + virtual ~GetAddressException() {} + const char *name; +}; + + +//-------------------------------------------------------------------------------- +static PyObject *GetPyObjectPointer_As_PyObjectPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return *(PyObject **)addr; +} + +static PyObject *GetPyObject_As_PyObjectPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return (PyObject *)addr; +} + +static PyTypeObject *GetPyTypeObjectPointer_As_PyTypeObjectPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return *(PyTypeObject **)addr; +} + +static PyTypeObject *GetPyTypeObject_As_PyTypeObjectPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return (PyTypeObject *)addr; +} + +static int *GetInt_as_IntPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return (int *)addr; +} + +static char **GetCharPointer_as_CharPointerPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return (char **)addr; +} + + +#ifdef _DEBUG +static const char python_dll_name_format[] = "PYTHON%1.1d%1.1d_D.DLL"; +#else +static const char python_dll_name_format[] = "PYTHON%1.1d%1.1d.DLL"; +#endif + +//-------------------------------------------------------------------------------- +bool InitialisePythonIndirectInterface() +{ + char python_dll_name[sizeof(python_dll_name_format)]; + + sprintf( python_dll_name, python_dll_name_format, PY_MAJOR_VERSION, PY_MINOR_VERSION ); + + python_dll = LoadLibrary( python_dll_name ); + if( python_dll == NULL ) + return false; + + try +{ +#ifdef Py_REF_DEBUG + ptr_Py_RefTotal = GetInt_as_IntPointer( "_Py_RefTotal" ); +#endif + ptr_Py_DebugFlag = GetInt_as_IntPointer( "Py_DebugFlag" ); + ptr_Py_InteractiveFlag = GetInt_as_IntPointer( "Py_InteractiveFlag" ); + ptr_Py_OptimizeFlag = GetInt_as_IntPointer( "Py_OptimizeFlag" ); + ptr_Py_NoSiteFlag = GetInt_as_IntPointer( "Py_NoSiteFlag" ); + ptr_Py_TabcheckFlag = GetInt_as_IntPointer( "Py_TabcheckFlag" ); + ptr_Py_VerboseFlag = GetInt_as_IntPointer( "Py_VerboseFlag" ); +#if PY_MAJOR_VERSION >= 2 + ptr_Py_UnicodeFlag = GetInt_as_IntPointer( "Py_UnicodeFlag" ); +#endif + ptr__Py_PackageContext = GetCharPointer_as_CharPointerPointer( "_Py_PackageContext" ); + + ptr__Exc_ArithmeticError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ArithmeticError" ); + ptr__Exc_AssertionError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_AssertionError" ); + ptr__Exc_AttributeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_AttributeError" ); + ptr__Exc_EnvironmentError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_EnvironmentError" ); + ptr__Exc_EOFError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_EOFError" ); + ptr__Exc_Exception = GetPyObjectPointer_As_PyObjectPointer( "PyExc_Exception" ); + ptr__Exc_FloatingPointError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_FloatingPointError" ); + ptr__Exc_ImportError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ImportError" ); + ptr__Exc_IndexError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_IndexError" ); + ptr__Exc_IOError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_IOError" ); + ptr__Exc_KeyboardInterrupt = GetPyObjectPointer_As_PyObjectPointer( "PyExc_KeyboardInterrupt" ); + ptr__Exc_KeyError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_KeyError" ); + ptr__Exc_LookupError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_LookupError" ); + ptr__Exc_MemoryError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_MemoryError" ); + ptr__Exc_MemoryErrorInst = GetPyObjectPointer_As_PyObjectPointer( "PyExc_MemoryErrorInst" ); + ptr__Exc_NameError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_NameError" ); + ptr__Exc_NotImplementedError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_NotImplementedError" ); + ptr__Exc_OSError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_OSError" ); + ptr__Exc_OverflowError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_OverflowError" ); + ptr__Exc_RuntimeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_RuntimeError" ); + ptr__Exc_StandardError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_StandardError" ); + ptr__Exc_SyntaxError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_SyntaxError" ); + ptr__Exc_SystemError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_SystemError" ); + ptr__Exc_SystemExit = GetPyObjectPointer_As_PyObjectPointer( "PyExc_SystemExit" ); + ptr__Exc_TypeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_TypeError" ); + ptr__Exc_ValueError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ValueError" ); +#ifdef MS_WINDOWS + ptr__Exc_WindowsError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_WindowsError" ); +#endif + ptr__Exc_ZeroDivisionError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ZeroDivisionError" ); + +#if PY_MAJOR_VERSION >= 2 + ptr__Exc_IndentationError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_IndentationError" ); + ptr__Exc_TabError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_TabError" ); + ptr__Exc_UnboundLocalError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_UnboundLocalError" ); + ptr__Exc_UnicodeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_UnicodeError" ); +#endif + ptr__PyNone = GetPyObject_As_PyObjectPointer( "_Py_NoneStruct" ); + + ptr__PyFalse = GetPyObject_As_PyObjectPointer( "_Py_ZeroStruct" ); + ptr__PyTrue = GetPyObject_As_PyObjectPointer( "_Py_TrueStruct" ); + + ptr__Buffer_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyBuffer_Type" ); + ptr__CFunction_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyCFunction_Type" ); + ptr__Class_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyClass_Type" ); + ptr__CObject_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyCObject_Type" ); + ptr__Complex_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyComplex_Type" ); + ptr__Dict_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyDict_Type" ); + ptr__File_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyFile_Type" ); + ptr__Float_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyFloat_Type" ); + ptr__Function_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyFunction_Type" ); + ptr__Instance_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyInstance_Type" ); + ptr__Int_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyInt_Type" ); + ptr__List_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyList_Type" ); + ptr__Long_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyLong_Type" ); + ptr__Method_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyMethod_Type" ); + ptr__Module_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyModule_Type" ); + ptr__Range_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyRange_Type" ); + ptr__Slice_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PySlice_Type" ); + ptr__String_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyString_Type" ); + ptr__TraceBack_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyTraceBack_Type" ); + ptr__Tuple_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyTuple_Type" ); + ptr__Type_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyType_Type" ); + +#if PY_MAJOR_VERSION >= 2 + ptr__Unicode_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyUnicode_Type" ); +#endif +} + catch( GetAddressException &e ) + { + OutputDebugString( python_dll_name ); + OutputDebugString( " does not contain symbol "); + OutputDebugString( e.name ); + OutputDebugString( "\n" ); + + return false; + } + + return true; +} + +// +// Wrap variables as function calls +// +PyObject * _Exc_ArithmeticError(){ return ptr__Exc_ArithmeticError; } +PyObject * _Exc_AssertionError(){ return ptr__Exc_AssertionError; } +PyObject * _Exc_AttributeError(){ return ptr__Exc_AttributeError; } +PyObject * _Exc_EnvironmentError(){ return ptr__Exc_EnvironmentError; } +PyObject * _Exc_EOFError() { return ptr__Exc_EOFError; } +PyObject * _Exc_Exception() { return ptr__Exc_Exception; } +PyObject * _Exc_FloatingPointError(){ return ptr__Exc_FloatingPointError; } +PyObject * _Exc_ImportError() { return ptr__Exc_ImportError; } +PyObject * _Exc_IndexError() { return ptr__Exc_IndexError; } +PyObject * _Exc_IOError() { return ptr__Exc_IOError; } +PyObject * _Exc_KeyboardInterrupt(){ return ptr__Exc_KeyboardInterrupt; } +PyObject * _Exc_KeyError() { return ptr__Exc_KeyError; } +PyObject * _Exc_LookupError() { return ptr__Exc_LookupError; } +PyObject * _Exc_MemoryError() { return ptr__Exc_MemoryError; } +PyObject * _Exc_MemoryErrorInst(){ return ptr__Exc_MemoryErrorInst; } +PyObject * _Exc_NameError() { return ptr__Exc_NameError; } +PyObject * _Exc_NotImplementedError(){ return ptr__Exc_NotImplementedError; } +PyObject * _Exc_OSError() { return ptr__Exc_OSError; } +PyObject * _Exc_OverflowError() { return ptr__Exc_OverflowError; } +PyObject * _Exc_RuntimeError() { return ptr__Exc_RuntimeError; } +PyObject * _Exc_StandardError() { return ptr__Exc_StandardError; } +PyObject * _Exc_SyntaxError() { return ptr__Exc_SyntaxError; } +PyObject * _Exc_SystemError() { return ptr__Exc_SystemError; } +PyObject * _Exc_SystemExit() { return ptr__Exc_SystemExit; } +PyObject * _Exc_TypeError() { return ptr__Exc_TypeError; } +PyObject * _Exc_ValueError() { return ptr__Exc_ValueError; } +#ifdef MS_WINDOWS +PyObject * _Exc_WindowsError() { return ptr__Exc_WindowsError; } +#endif +PyObject * _Exc_ZeroDivisionError(){ return ptr__Exc_ZeroDivisionError; } + +#if PY_MAJOR_VERSION >= 2 +PyObject * _Exc_IndentationError(){ return ptr__Exc_IndentationError; } +PyObject * _Exc_TabError() { return ptr__Exc_TabError; } +PyObject * _Exc_UnboundLocalError(){ return ptr__Exc_UnboundLocalError; } +PyObject * _Exc_UnicodeError() { return ptr__Exc_UnicodeError; } +#endif + +// +// wrap items in Object.h +// +PyObject * _None() { return ptr__PyNone; } + +PyObject * _False() { return ptr__PyFalse; } +PyObject * _True() { return ptr__PyTrue; } + +PyTypeObject * _Buffer_Type() { return ptr__Buffer_Type; } +PyTypeObject * _CFunction_Type(){ return ptr__CFunction_Type; } +PyTypeObject * _Class_Type() { return ptr__Class_Type; } +PyTypeObject * _CObject_Type() { return ptr__CObject_Type; } +PyTypeObject * _Complex_Type() { return ptr__Complex_Type; } +PyTypeObject * _Dict_Type() { return ptr__Dict_Type; } +PyTypeObject * _File_Type() { return ptr__File_Type; } +PyTypeObject * _Float_Type() { return ptr__Float_Type; } +PyTypeObject * _Function_Type() { return ptr__Function_Type; } +PyTypeObject * _Instance_Type() { return ptr__Instance_Type; } +PyTypeObject * _Bool_Type() { return ptr__Bool_Type; } +PyTypeObject * _Int_Type() { return ptr__Int_Type; } +PyTypeObject * _List_Type() { return ptr__List_Type; } +PyTypeObject * _Long_Type() { return ptr__Long_Type; } +PyTypeObject * _Method_Type() { return ptr__Method_Type; } +PyTypeObject * _Module_Type() { return ptr__Module_Type; } +PyTypeObject * _Range_Type() { return ptr__Range_Type; } +PyTypeObject * _Slice_Type() { return ptr__Slice_Type; } +PyTypeObject * _String_Type() { return ptr__String_Type; } +PyTypeObject * _TraceBack_Type(){ return ptr__TraceBack_Type; } +PyTypeObject * _Tuple_Type() { return ptr__Tuple_Type; } +PyTypeObject * _Type_Type() { return ptr__Type_Type; } + +#if PY_MAJOR_VERSION >= 2 +PyTypeObject * _Unicode_Type() { return ptr__Unicode_Type; } +#endif + +char *__Py_PackageContext() { return *ptr__Py_PackageContext; } + + +// +// wrap the Python Flag variables +// +int &_Py_DebugFlag() { return *ptr_Py_DebugFlag; } +int &_Py_InteractiveFlag() { return *ptr_Py_InteractiveFlag; } +int &_Py_OptimizeFlag() { return *ptr_Py_OptimizeFlag; } +int &_Py_NoSiteFlag() { return *ptr_Py_NoSiteFlag; } +int &_Py_TabcheckFlag() { return *ptr_Py_TabcheckFlag; } +int &_Py_VerboseFlag() { return *ptr_Py_VerboseFlag; } +#if PY_MAJOR_VERSION >= 2 +int &_Py_UnicodeFlag() { return *ptr_Py_UnicodeFlag; } +#endif + +void _XINCREF( PyObject *op ) +{ + // This function must match the contents of Py_XINCREF(op) + if( op == NULL ) + return; + +#ifdef Py_REF_DEBUG + (*ptr_Py_RefTotal)++; +#endif + (op)->ob_refcnt++; + +} + +void _XDECREF( PyObject *op ) +{ + // This function must match the contents of Py_XDECREF(op); + if( op == NULL ) + return; + +#ifdef Py_REF_DEBUG + (*ptr_Py_RefTotal)--; +#endif + + if (--(op)->ob_refcnt == 0) + _Py_Dealloc((PyObject *)(op)); +} + + +#else +#error "Can only delay load under Win32" +#endif + +#else + +// +// Duplicated these declarations from rangeobject.h which is missing the +// extern "C". This has been reported as a bug upto and include 2.1 +// +extern "C" DL_IMPORT(PyTypeObject) PyRange_Type; +extern "C" DL_IMPORT(PyObject *) PyRange_New(long, long, long, int); + + +//================================================================================ +// +// Map onto Macros +// +//================================================================================ + +// +// Wrap variables as function calls +// + +PyObject * _Exc_ArithmeticError() { return ::PyExc_ArithmeticError; } +PyObject * _Exc_AssertionError() { return ::PyExc_AssertionError; } +PyObject * _Exc_AttributeError() { return ::PyExc_AttributeError; } +PyObject * _Exc_EnvironmentError() { return ::PyExc_EnvironmentError; } +PyObject * _Exc_EOFError() { return ::PyExc_EOFError; } +PyObject * _Exc_Exception() { return ::PyExc_Exception; } +PyObject * _Exc_FloatingPointError() { return ::PyExc_FloatingPointError; } +PyObject * _Exc_ImportError() { return ::PyExc_ImportError; } +PyObject * _Exc_IndexError() { return ::PyExc_IndexError; } +PyObject * _Exc_IOError() { return ::PyExc_IOError; } +PyObject * _Exc_KeyboardInterrupt() { return ::PyExc_KeyboardInterrupt; } +PyObject * _Exc_KeyError() { return ::PyExc_KeyError; } +PyObject * _Exc_LookupError() { return ::PyExc_LookupError; } +PyObject * _Exc_MemoryError() { return ::PyExc_MemoryError; } +PyObject * _Exc_MemoryErrorInst() { return ::PyExc_MemoryErrorInst; } +PyObject * _Exc_NameError() { return ::PyExc_NameError; } +PyObject * _Exc_NotImplementedError() { return ::PyExc_NotImplementedError; } +PyObject * _Exc_OSError() { return ::PyExc_OSError; } +PyObject * _Exc_OverflowError() { return ::PyExc_OverflowError; } +PyObject * _Exc_RuntimeError() { return ::PyExc_RuntimeError; } +PyObject * _Exc_StandardError() { return ::PyExc_StandardError; } +PyObject * _Exc_SyntaxError() { return ::PyExc_SyntaxError; } +PyObject * _Exc_SystemError() { return ::PyExc_SystemError; } +PyObject * _Exc_SystemExit() { return ::PyExc_SystemExit; } +PyObject * _Exc_TypeError() { return ::PyExc_TypeError; } +PyObject * _Exc_ValueError() { return ::PyExc_ValueError; } +PyObject * _Exc_ZeroDivisionError() { return ::PyExc_ZeroDivisionError; } + +#ifdef MS_WINDOWS +PyObject * _Exc_WindowsError() { return ::PyExc_WindowsError; } +#endif + + +#if PY_MAJOR_VERSION >= 2 +PyObject * _Exc_IndentationError() { return ::PyExc_IndentationError; } +PyObject * _Exc_TabError() { return ::PyExc_TabError; } +PyObject * _Exc_UnboundLocalError() { return ::PyExc_UnboundLocalError; } +PyObject * _Exc_UnicodeError() { return ::PyExc_UnicodeError; } +#endif + + +// +// wrap items in Object.h +// +PyObject * _None() { return &::_Py_NoneStruct; } + +PyObject * _False() { return Py_False; } +PyObject * _True() { return Py_True; } + +PyTypeObject * _Buffer_Type() { return &PyBuffer_Type; } +PyTypeObject * _CFunction_Type() { return &PyCFunction_Type; } +PyTypeObject * _Class_Type() { return &PyClass_Type; } +PyTypeObject * _CObject_Type() { return &PyCObject_Type; } +PyTypeObject * _Complex_Type() { return &PyComplex_Type; } +PyTypeObject * _Dict_Type() { return &PyDict_Type; } +PyTypeObject * _File_Type() { return &PyFile_Type; } +PyTypeObject * _Float_Type() { return &PyFloat_Type; } +PyTypeObject * _Function_Type() { return &PyFunction_Type; } +PyTypeObject * _Instance_Type() { return &PyInstance_Type; } +PyTypeObject * _Bool_Type() { return &PyBool_Type; } +PyTypeObject * _Int_Type() { return &PyInt_Type; } +PyTypeObject * _List_Type() { return &PyList_Type; } +PyTypeObject * _Long_Type() { return &PyLong_Type; } +PyTypeObject * _Method_Type() { return &PyMethod_Type; } +PyTypeObject * _Module_Type() { return &PyModule_Type; } +PyTypeObject * _Range_Type() { return &PyRange_Type; } +PyTypeObject * _Slice_Type() { return &PySlice_Type; } +PyTypeObject * _String_Type() { return &PyString_Type; } +PyTypeObject * _TraceBack_Type() { return &PyTraceBack_Type; } +PyTypeObject * _Tuple_Type() { return &PyTuple_Type; } +PyTypeObject * _Type_Type() { return &PyType_Type; } + +#if PY_MAJOR_VERSION >= 2 +PyTypeObject * _Unicode_Type() { return &PyUnicode_Type; } +#endif + +// +// wrap flags +// +int &_Py_DebugFlag() { return Py_DebugFlag; } +int &_Py_InteractiveFlag(){ return Py_InteractiveFlag; } +int &_Py_OptimizeFlag() { return Py_OptimizeFlag; } +int &_Py_NoSiteFlag() { return Py_NoSiteFlag; } +int &_Py_TabcheckFlag() { return Py_TabcheckFlag; } +int &_Py_VerboseFlag() { return Py_VerboseFlag; } +#if PY_MAJOR_VERSION >= 2 +int &_Py_UnicodeFlag() { return Py_UnicodeFlag; } +#endif +char *__Py_PackageContext(){ return _Py_PackageContext; } + +// +// Needed to keep the abstactions for delayload interface +// +void _XINCREF( PyObject *op ) +{ + Py_XINCREF(op); +} + +void _XDECREF( PyObject *op ) +{ + Py_XDECREF(op); +} + +#endif +} diff --git a/CXX/Python2/IndirectPythonInterface.hxx b/CXX/Python2/IndirectPythonInterface.hxx new file mode 100644 index 000000000000..a29a394c6c6a --- /dev/null +++ b/CXX/Python2/IndirectPythonInterface.hxx @@ -0,0 +1,198 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_INDIRECT_PYTHON_INTERFACE__HXX__ +#define __CXX_INDIRECT_PYTHON_INTERFACE__HXX__ + +#include "CXX/WrapPython.h" + +namespace Py +{ +bool InitialisePythonIndirectInterface(); + +// +// Wrap Exception variables as function calls +// +PyObject * _Exc_Exception(); +PyObject * _Exc_StandardError(); +PyObject * _Exc_ArithmeticError(); +PyObject * _Exc_LookupError(); + +PyObject * _Exc_AssertionError(); +PyObject * _Exc_AttributeError(); +PyObject * _Exc_EOFError(); +PyObject * _Exc_FloatingPointError(); +PyObject * _Exc_EnvironmentError(); +PyObject * _Exc_IOError(); +PyObject * _Exc_OSError(); +PyObject * _Exc_ImportError(); +PyObject * _Exc_IndexError(); +PyObject * _Exc_KeyError(); +PyObject * _Exc_KeyboardInterrupt(); +PyObject * _Exc_MemoryError(); +PyObject * _Exc_NameError(); +PyObject * _Exc_OverflowError(); +PyObject * _Exc_RuntimeError(); +PyObject * _Exc_NotImplementedError(); +PyObject * _Exc_SyntaxError(); +PyObject * _Exc_SystemError(); +PyObject * _Exc_SystemExit(); +PyObject * _Exc_TypeError(); +PyObject * _Exc_ValueError(); +PyObject * _Exc_ZeroDivisionError(); +#ifdef MS_WINDOWS +PyObject * _Exc_WindowsError(); +#endif + +PyObject * _Exc_MemoryErrorInst(); + +#if PY_MAJOR_VERSION >= 2 +PyObject * _Exc_IndentationError(); +PyObject * _Exc_TabError(); +PyObject * _Exc_UnboundLocalError(); +PyObject * _Exc_UnicodeError(); +#endif + +// +// Wrap Object variables as function calls +// +PyObject * _None(); + +PyObject * _False(); +PyObject * _True(); + +// +// Wrap Type variables as function calls +// +PyTypeObject * _List_Type(); +bool _List_Check( PyObject *o ); + +PyTypeObject * _Buffer_Type(); +bool _Buffer_Check( PyObject *op ); + +PyTypeObject * _Class_Type(); +bool _Class_Check( PyObject *op ); + +PyTypeObject * _Instance_Type(); +bool _Instance_Check( PyObject *op ); + +PyTypeObject * _Method_Type(); +bool _Method_Check( PyObject *op ); + +PyTypeObject * _CObject_Type(); +bool _CObject_Check( PyObject *op ); + +PyTypeObject * _Complex_Type(); +bool _Complex_Check( PyObject *op ); + +PyTypeObject * _Dict_Type(); +bool _Dict_Check( PyObject *op ); + +PyTypeObject * _File_Type(); +bool _File_Check( PyObject *op ); + +PyTypeObject * _Float_Type(); +bool _Float_Check( PyObject *op ); + +PyTypeObject * _Frame_Type(); +bool _Frame_Check( PyObject *op ); + +PyTypeObject * _Function_Type(); +bool _Function_Check( PyObject *op ); + +PyTypeObject * _Bool_Type(); +bool _Boolean_Check( PyObject *op ); + +PyTypeObject * _Int_Type(); +bool _Int_Check( PyObject *op ); + +PyTypeObject * _List_Type(); +bool _List_Check( PyObject *op ); + +PyTypeObject * _Long_Type(); +bool _Long_Check( PyObject *op ); + +PyTypeObject * _CFunction_Type(); +bool _CFunction_Check( PyObject *op ); + +PyTypeObject * _Module_Type(); +bool _Module_Check( PyObject *op ); + +PyTypeObject * _Type_Type(); +bool _Type_Check( PyObject *op ); + +PyTypeObject * _Range_Type(); +bool _Range_Check( PyObject *op ); + +PyTypeObject * _Slice_Type(); +bool _Slice_Check( PyObject *op ); + +PyTypeObject * _String_Type(); +bool _String_Check( PyObject *op ); + +PyTypeObject * _Unicode_Type(); +bool _Unicode_Check( PyObject *op ); + +PyTypeObject * _TraceBack_Type(); +bool _TraceBack_Check( PyObject *v ); + +PyTypeObject * _Tuple_Type(); +bool _Tuple_Check( PyObject *op ); + +#if PY_MAJOR_VERSION >= 2 +PyTypeObject * _Unicode_Type(); +bool _Unicode_Check( PyObject *op ); +#endif + +int &_Py_DebugFlag(); +int &_Py_InteractiveFlag(); +int &_Py_OptimizeFlag(); +int &_Py_NoSiteFlag(); +int &_Py_TabcheckFlag(); +int &_Py_VerboseFlag(); + +#if PY_MAJOR_VERSION >= 2 +int &_Py_UnicodeFlag(); +#endif + +void _XINCREF( PyObject *op ); +void _XDECREF( PyObject *op ); + +char *__Py_PackageContext(); +} + +#endif // __CXX_INDIRECT_PYTHON_INTERFACE__HXX__ diff --git a/CXX/Python2/Objects.hxx b/CXX/Python2/Objects.hxx new file mode 100644 index 000000000000..ce1fa98f249a --- /dev/null +++ b/CXX/Python2/Objects.hxx @@ -0,0 +1,3332 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_Objects__h +#define __CXX_Objects__h + +#include "CXX/WrapPython.h" +#include "CXX/Version.hxx" +#include "CXX/Config.hxx" +#include "CXX/Exception.hxx" + +#include +#include STR_STREAM +#include +#include +#include +#include + +namespace Py +{ + typedef int sequence_index_type; // type of an index into a sequence + + // Forward declarations + class Object; + class Type; + template class SeqBase; + class String; + class List; + template class MapBase; + + // new_reference_to also overloaded below on Object + inline PyObject* new_reference_to(PyObject* p) + { + Py::_XINCREF(p); + return p; + } + + // returning Null() from an extension method triggers a + // Python exception + inline PyObject* Null() + { + return (static_cast(0)); + } + + //===========================================================================// + // class Object + // The purpose of this class is to serve as the most general kind of + // Python object, for the purpose of writing C++ extensions in Python + // Objects hold a PyObject* which they own. This pointer is always a + // valid pointer to a Python object. In children we must maintain this behavior. + // + // Instructions on how to make your own class MyType descended from Object: + // (0) Pick a base class, either Object or perhaps SeqBase or MapBase. + // This example assumes Object. + + // (1) Write a routine int MyType_Check (PyObject *) modeled after PyInt_Check, + // PyFloat_Check, etc. + + // (2) Add method accepts: + // virtual bool accepts (PyObject *pyob) const { + // return pyob && MyType_Check (pyob); + // } + + // (3) Include the following constructor and copy constructor + // + /* + explicit MyType (PyObject *pyob): Object(pyob) { + validate(); +} + + MyType(const Object& other): Object(other.ptr()) { + validate(); +} + */ + + // Alernate version for the constructor to allow for construction from owned pointers: + /* + explicit MyType (PyObject *pyob): Object(pyob) { + validate(); +} + */ + + // You may wish to add other constructors; see the classes below for examples. + // Each constructor must use "set" to set the pointer + // and end by validating the pointer you have created. + + // (4) Each class needs at least these two assignment operators: + /* + MyType& operator= (const Object& rhs) { + return (*this = *rhs); +} + + Mytype& operator= (PyObject* rhsp) { + if(ptr() == rhsp) return *this; + set(rhsp); + return *this; +} + */ + // Note on accepts: constructors call the base class + // version of a virtual when calling the base class constructor, + // so the test has to be done explicitly in a descendent. + + // If you are inheriting from PythonExtension to define an object + // note that it contains PythonExtension::check + // which you can use in accepts when writing a wrapper class. + // See Demo/range.h and Demo/range.cxx for an example. + + class Object + { + private: + // the pointer to the Python object + // Only Object sets this directly. + // The default constructor for Object sets it to Py_None and + // child classes must use "set" to set it + // + PyObject* p; + + protected: + + void set (PyObject* pyob, bool owned = false) + { + release(); + p = pyob; + if (!owned) + { + Py::_XINCREF (p); + } + validate(); + } + + void release () + { + Py::_XDECREF (p); + p = 0; + } + + void validate(); + + public: + // Constructor acquires new ownership of pointer unless explicitly told not to. + explicit Object (PyObject* pyob=Py::_None(), bool owned = false): p (pyob) + { + if(!owned) + { + Py::_XINCREF (p); + } + validate(); + } + + // Copy constructor acquires new ownership of pointer + Object (const Object& ob): p(ob.p) + { + Py::_XINCREF (p); + validate(); + } + + // Assignment acquires new ownership of pointer + Object& operator= (const Object& rhs) + { + set(rhs.p); + return *this; + } + + Object& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + + // Destructor + virtual ~Object () + { + release (); + } + + // Loaning the pointer to others, retain ownership + PyObject* operator* () const + { + return p; + } + + // Explicit reference_counting changes + void increment_reference_count() + { + Py::_XINCREF(p); + } + + void decrement_reference_count() + { + // not allowed to commit suicide, however + if(reference_count() == 1) + throw RuntimeError("Object::decrement_reference_count error."); + Py::_XDECREF(p); + } + // Would like to call this pointer() but messes up STL in SeqBase + PyObject* ptr () const + { + return p; + } + + // + // Queries + // + + // Can pyob be used in this object's constructor? + virtual bool accepts (PyObject *pyob) const + { + return (pyob != 0); + } + + Py_ssize_t reference_count () const + { // the reference count + return p ? p->ob_refcnt : 0; + } + + Type type () const; // the type object associated with this one + + String str () const; // the str() representation + + std::string as_string() const; + + String repr () const; // the repr () representation + + List dir () const; // the dir() list + + bool hasAttr (const std::string& s) const + { + return PyObject_HasAttrString (p, const_cast(s.c_str())) ? true: false; + } + + Object getAttr (const std::string& s) const + { + return Object (PyObject_GetAttrString (p, const_cast(s.c_str())), true); + } + + Object getItem (const Object& key) const + { + return Object (PyObject_GetItem(p, *key), true); + } + + long hashValue () const + { + return PyObject_Hash (p); + } + + // + // int print (FILE* fp, int flags=Py_Print_RAW) + //{ + // return PyObject_Print (p, fp, flags); + //} + // + bool is(PyObject *pother) const + { // identity test + return p == pother; + } + + bool is(const Object& other) const + { // identity test + return p == other.p; + } + + bool isNone() const + { + return p == _None(); + } + + bool isCallable () const + { + return PyCallable_Check (p) != 0; + } + + bool isInstance () const + { + return PyInstance_Check (p) != 0; + } + + bool isDict () const + { + return Py::_Dict_Check (p); + } + + bool isList () const + { + return Py::_List_Check (p); + } + + bool isMapping () const + { + return PyMapping_Check (p) != 0; + } + + bool isNumeric () const + { + return PyNumber_Check (p) != 0; + } + + bool isSequence () const + { + return PySequence_Check (p) != 0; + } + + bool isTrue () const + { + return PyObject_IsTrue (p) != 0; + } + + bool isType (const Type& t) const; + + bool isTuple() const + { + return Py::_Tuple_Check(p); + } + + bool isString() const + { + return Py::_String_Check(p) || Py::_Unicode_Check(p); + } + + bool isUnicode() const + { + return Py::_Unicode_Check( p ); + } + + bool isBoolean() const + { + return Py::_Boolean_Check( p ); + } + + // Commands + void setAttr (const std::string& s, const Object& value) + { + if(PyObject_SetAttrString (p, const_cast(s.c_str()), *value) == -1) + throw AttributeError ("getAttr failed."); + } + + void delAttr (const std::string& s) + { + if(PyObject_DelAttrString (p, const_cast(s.c_str())) == -1) + throw AttributeError ("delAttr failed."); + } + + // PyObject_SetItem is too weird to be using from C++ + // so it is intentionally omitted. + + void delItem (const Object& key) + { + //if(PyObject_DelItem(p, *key) == -1) + // failed to link on Windows? + throw KeyError("delItem failed."); + } + + // Equality and comparison use PyObject_RichCompareBool + + bool operator==(const Object& o2) const + { + int k = PyObject_RichCompareBool (p, *o2, Py_EQ); + if (PyErr_Occurred()) throw Exception(); + return k != 0; + } + + bool operator!=(const Object& o2) const + { + int k = PyObject_RichCompareBool (p, *o2, Py_NE); + if (PyErr_Occurred()) throw Exception(); + return k != 0; + + } + + bool operator>=(const Object& o2) const + { + int k = PyObject_RichCompareBool (p, *o2, Py_GE); + if (PyErr_Occurred()) throw Exception(); + return k != 0; + } + + bool operator<=(const Object& o2) const + { + int k = PyObject_RichCompareBool (p, *o2, Py_LE); + if (PyErr_Occurred()) throw Exception(); + return k != 0; + } + + bool operator<(const Object& o2) const + { + int k = PyObject_RichCompareBool (p, *o2, Py_LT); + if (PyErr_Occurred()) throw Exception(); + return k != 0; + } + + bool operator>(const Object& o2) const + { + int k = PyObject_RichCompareBool (p, *o2, Py_GT); + if (PyErr_Occurred()) throw Exception(); + return k != 0; + } + }; + // End of class Object + inline PyObject* new_reference_to(const Object& g) + { + PyObject* p = g.ptr(); + Py::_XINCREF(p); + return p; + } + + // Nothing() is what an extension method returns if + // there is no other return value. + inline Object Nothing() + { + return Object(Py::_None()); + } + + // Python special None value + inline Object None() + { + return Object(Py::_None()); + } + + // Python special Boolean values + inline Object False() + { + return Object(Py::_False()); + } + + inline Object True() + { + return Object(Py::_True()); + } + + // TMM: 31May'01 - Added the #ifndef so I can exlude iostreams. +#ifndef CXX_NO_IOSTREAMS + std::ostream& operator<< (std::ostream& os, const Object& ob); +#endif + + // Class Type + class Type: public Object + { + public: + explicit Type (PyObject* pyob, bool owned = false): Object(pyob, owned) + { + validate(); + } + + Type (const Object& ob): Object(*ob) + { + validate(); + } + + Type(const Type& t): Object(t) + { + validate(); + } + + Type& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Type& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_Type_Check (pyob); + } + }; + + + // + // Convert an owned Python pointer into a CXX Object + // + inline Object asObject (PyObject *p) + { + return Object(p, true); + } + + // =============================================== + // class boolean + class Boolean: public Object + { + public: + // Constructor + Boolean (PyObject *pyob, bool owned = false) + : Object (pyob, owned) + { + validate(); + } + + Boolean (const Boolean& ob): Object(*ob) + { + validate(); + } + + // create from bool + Boolean (bool v=false) + { + set(PyBool_FromLong(v ? 1 : 0), true); + validate(); + } + + explicit Boolean (const Object& ob) + : Object( *ob ) + { + validate(); + } + + // Assignment increases reference count on pointer + + Boolean& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Boolean& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && PyObject_IsTrue(pyob) != -1; + } + + // convert to long + operator bool() const + { + return PyObject_IsTrue (ptr()) != 0; + } + + Boolean& operator= (bool v) + { + set (PyBool_FromLong (v ? 1 : 0), true); + return *this; + } + }; + + // =============================================== + // class Int + class Int: public Object + { + public: + // Constructor + Int (PyObject *pyob, bool owned = false): Object (pyob, owned) + { + validate(); + } + + Int (const Int& ob): Object(*ob) + { + validate(); + } + + // create from long + Int (long v = 0L): Object(PyInt_FromLong(v), true) + { + validate(); + } + + // create from int + Int (int v) + { + long w = v; + set(PyInt_FromLong(w), true); + validate(); + } + + // create from bool + Int (bool v) + { + long w = v ? 1 : 0; + set(PyInt_FromLong(w), true); + validate(); + } + + explicit Int (const Object& ob) + { + set(PyNumber_Int(*ob), true); + validate(); + } + + // Assignment acquires new ownership of pointer + + Int& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Int& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (PyNumber_Int(rhsp), true); + return *this; + } + + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_Int_Check (pyob); + } + + // convert to long + operator long() const + { + return PyInt_AsLong (ptr()); + } + +#ifdef HAVE_LONG_LONG + // convert to long long + PY_LONG_LONG asLongLong() const + { + return PyLong_AsLongLong (ptr()); + } + // convert to unsigned long long + unsigned PY_LONG_LONG asUnsignedLongLong() const + { + return PyLong_AsUnsignedLongLong (ptr()); + } +#endif + + // assign from an int + Int& operator= (int v) + { + set (PyInt_FromLong (long(v)), true); + return *this; + } + + // assign from long + Int& operator= (long v) + { + set (PyInt_FromLong (v), true); + return *this; + } + +#ifdef HAVE_LONG_LONG + // assign from long long + Int& operator= (PY_LONG_LONG v) + { + set (PyLong_FromLongLong (v), true); + return *this; + } + // assign from unsigned long long + Int& operator= (unsigned PY_LONG_LONG v) + { + set (PyLong_FromUnsignedLongLong (v), true); + return *this; + } +#endif + }; + + // =============================================== + // class Long + class Long: public Object + { + public: + // Constructor + explicit Long (PyObject *pyob, bool owned = false): Object (pyob, owned) + { + validate(); + } + + Long (const Long& ob): Object(ob.ptr()) + { + validate(); + } + + // create from long + explicit Long (long v = 0L) + : Object(PyLong_FromLong(v), true) + { + validate(); + } + // create from unsigned long + explicit Long (unsigned long v) + : Object(PyLong_FromUnsignedLong(v), true) + { + validate(); + } + // create from int + explicit Long (int v) + : Object(PyLong_FromLong(static_cast(v)), true) + { + validate(); + } + + // try to create from any object + Long (const Object& ob) + : Object(PyNumber_Long(*ob), true) + { + validate(); + } + + // Assignment acquires new ownership of pointer + + Long& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Long& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (PyNumber_Long(rhsp), true); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_Long_Check (pyob); + } + + // convert to long + long as_long() const + { + return PyLong_AsLong( ptr() ); + } + + // convert to long + operator long() const + { + return as_long(); + } + + // convert to unsigned + operator unsigned long() const + { + return PyLong_AsUnsignedLong (ptr()); + } + operator double() const + { + return PyLong_AsDouble (ptr()); + } + // assign from an int + Long& operator= (int v) + { + set(PyLong_FromLong (long(v)), true); + return *this; + } + // assign from long + Long& operator= (long v) + { + set(PyLong_FromLong (v), true); + return *this; + } + // assign from unsigned long + Long& operator= (unsigned long v) + { + set(PyLong_FromUnsignedLong (v), true); + return *this; + } + }; + +#ifdef HAVE_LONG_LONG + // =============================================== + // class LongLong + class LongLong: public Object + { + public: + // Constructor + explicit LongLong (PyObject *pyob, bool owned = false): Object (pyob, owned) + { + validate(); + } + + LongLong (const LongLong& ob): Object(ob.ptr()) + { + validate(); + } + // create from long long + explicit LongLong (PY_LONG_LONG v = 0L) + : Object(PyLong_FromLongLong(v), true) + { + validate(); + } + // create from unsigned long long + explicit LongLong (unsigned PY_LONG_LONG v) + : Object(PyLong_FromUnsignedLongLong(v), true) + { + validate(); + } + // create from long + explicit LongLong (long v) + : Object(PyLong_FromLongLong(v), true) + { + validate(); + } + // create from unsigned long + explicit LongLong (unsigned long v) + : Object(PyLong_FromUnsignedLongLong(v), true) + { + validate(); + } + // create from int + explicit LongLong (int v) + : Object(PyLong_FromLongLong(static_cast(v)), true) + { + validate(); + } + + // try to create from any object + LongLong (const Object& ob) + : Object(PyNumber_Long(*ob), true) + { + validate(); + } + + // Assignment acquires new ownership of pointer + + LongLong& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + LongLong& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (PyNumber_Long(rhsp), true); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_Long_Check (pyob); + } + // convert to long long + operator PY_LONG_LONG() const + { + return PyLong_AsLongLong (ptr()); + } + // convert to unsigned long + operator unsigned PY_LONG_LONG() const + { + return PyLong_AsUnsignedLongLong (ptr()); + } + // convert to long + operator long() const + { + return PyLong_AsLong (ptr()); + } + // convert to unsigned + operator unsigned long() const + { + return PyLong_AsUnsignedLong (ptr()); + } + operator double() const + { + return PyLong_AsDouble (ptr()); + } + // assign from an int + LongLong& operator= (int v) + { + set(PyLong_FromLongLong (long(v)), true); + return *this; + } + // assign from long long + LongLong& operator= (PY_LONG_LONG v) + { + set(PyLong_FromLongLong (v), true); + return *this; + } + // assign from unsigned long long + LongLong& operator= (unsigned PY_LONG_LONG v) + { + set(PyLong_FromUnsignedLongLong (v), true); + return *this; + } + // assign from long + LongLong& operator= (long v) + { + set(PyLong_FromLongLong (v), true); + return *this; + } + // assign from unsigned long + LongLong& operator= (unsigned long v) + { + set(PyLong_FromUnsignedLongLong (v), true); + return *this; + } + }; +#endif + + // =============================================== + // class Float + // + class Float: public Object + { + public: + // Constructor + explicit Float (PyObject *pyob, bool owned = false): Object(pyob, owned) + { + validate(); + } + + Float (const Float& f): Object(f) + { + validate(); + } + + // make from double + explicit Float (double v=0.0) + : Object(PyFloat_FromDouble (v), true) + { + validate(); + } + + // try to make from any object + Float (const Object& ob) + : Object(PyNumber_Float(*ob), true) + { + validate(); + } + + Float& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Float& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (PyNumber_Float(rhsp), true); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_Float_Check (pyob); + } + // convert to double + operator double () const + { + return PyFloat_AsDouble (ptr()); + } + // assign from a double + Float& operator= (double v) + { + set(PyFloat_FromDouble (v), true); + return *this; + } + // assign from an int + Float& operator= (int v) + { + set(PyFloat_FromDouble (double(v)), true); + return *this; + } + // assign from long + Float& operator= (long v) + { + set(PyFloat_FromDouble (double(v)), true); + return *this; + } + // assign from an Int + Float& operator= (const Int& iob) + { + set(PyFloat_FromDouble (double(long(iob))), true); + return *this; + } + }; + + // =============================================== + // class Complex + class Complex: public Object + { + public: + // Constructor + explicit Complex (PyObject *pyob, bool owned = false): Object(pyob, owned) + { + validate(); + } + + Complex (const Complex& f): Object(f) + { + validate(); + } + + // make from double + explicit Complex (double v=0.0, double w=0.0) + :Object(PyComplex_FromDoubles (v, w), true) + { + validate(); + } + + Complex& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Complex& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_Complex_Check (pyob); + } + // convert to Py_complex + operator Py_complex () const + { + return PyComplex_AsCComplex (ptr()); + } + // assign from a Py_complex + Complex& operator= (const Py_complex& v) + { + set(PyComplex_FromCComplex (v), true); + return *this; + } + // assign from a double + Complex& operator= (double v) + { + set(PyComplex_FromDoubles (v, 0.0), true); + return *this; + } + // assign from an int + Complex& operator= (int v) + { + set(PyComplex_FromDoubles (double(v), 0.0), true); + return *this; + } + // assign from long + Complex& operator= (long v) + { + set(PyComplex_FromDoubles (double(v), 0.0), true); + return *this; + } + // assign from an Int + Complex& operator= (const Int& iob) + { + set(PyComplex_FromDoubles (double(long(iob)), 0.0), true); + return *this; + } + + double real() const + { + return PyComplex_RealAsDouble(ptr()); + } + + double imag() const + { + return PyComplex_ImagAsDouble(ptr()); + } + }; + // Sequences + // Sequences are here represented as sequences of items of type T. + // The base class SeqBase represents that. + // In basic Python T is always "Object". + + // seqref is what you get if you get elements from a non-const SeqBase. + // Note: seqref could probably be a nested class in SeqBase but that might stress + // some compilers needlessly. Simlarly for mapref later. + + // While this class is not intended for enduser use, it needs some public + // constructors for the benefit of the STL. + + // See Scott Meyer's More Essential C++ for a description of proxies. + // This application is even more complicated. We are doing an unusual thing + // in having a double proxy. If we want the STL to work + // properly we have to compromise by storing the rvalue inside. The + // entire Object API is repeated so that things like s[i].isList() will + // work properly. + + // Still, once in a while a weird compiler message may occur using expressions like x[i] + // Changing them to Object(x[i]) helps the compiler to understand that the + // conversion of a seqref to an Object is wanted. + + template + class seqref + { + protected: + SeqBase& s; // the sequence + int offset; // item number + T the_item; // lvalue + public: + + seqref (SeqBase& seq, sequence_index_type j) + : s(seq), offset(j), the_item (s.getItem(j)) + {} + + seqref (const seqref& range) + : s(range.s), offset(range.offset), the_item(range.the_item) + {} + + // TMM: added this seqref ctor for use with STL algorithms + seqref (Object& obj) + : s(dynamic_cast< SeqBase&>(obj)) + , offset( NULL ) + , the_item(s.getItem(offset)) + {} + ~seqref() + {} + + operator T() const + { // rvalue + return the_item; + } + + seqref& operator=(const seqref& rhs) + { //used as lvalue + the_item = rhs.the_item; + s.setItem(offset, the_item); + return *this; + } + + seqref& operator=(const T& ob) + { // used as lvalue + the_item = ob; + s.setItem(offset, ob); + return *this; + } + + // forward everything else to the item + PyObject* ptr () const + { + return the_item.ptr(); + } + + int reference_count () const + { // the reference count + return the_item.reference_count(); + } + + Type type () const + { + return the_item.type(); + } + + String str () const; + + String repr () const; + + bool hasAttr (const std::string& attr_name) const + { + return the_item.hasAttr(attr_name); + } + + Object getAttr (const std::string& attr_name) const + { + return the_item.getAttr(attr_name); + } + + Object getItem (const Object& key) const + { + return the_item.getItem(key); + } + + long hashValue () const + { + return the_item.hashValue(); + } + + bool isCallable () const + { + return the_item.isCallable(); + } + + bool isInstance () const + { + return the_item.isInstance(); + } + + bool isDict () const + { + return the_item.isDict(); + } + + bool isList () const + { + return the_item.isList(); + } + + bool isMapping () const + { + return the_item.isMapping(); + } + + bool isNumeric () const + { + return the_item.isNumeric(); + } + + bool isSequence () const + { + return the_item.isSequence(); + } + + bool isTrue () const + { + return the_item.isTrue(); + } + + bool isType (const Type& t) const + { + return the_item.isType (t); + } + + bool isTuple() const + { + return the_item.isTuple(); + } + + bool isString() const + { + return the_item.isString(); + } + // Commands + void setAttr (const std::string& attr_name, const Object& value) + { + the_item.setAttr(attr_name, value); + } + + void delAttr (const std::string& attr_name) + { + the_item.delAttr(attr_name); + } + + void delItem (const Object& key) + { + the_item.delItem(key); + } + + bool operator==(const Object& o2) const + { + return the_item == o2; + } + + bool operator!=(const Object& o2) const + { + return the_item != o2; + } + + bool operator>=(const Object& o2) const + { + return the_item >= o2; + } + + bool operator<=(const Object& o2) const + { + return the_item <= o2; + } + + bool operator<(const Object& o2) const + { + return the_item < o2; + } + + bool operator>(const Object& o2) const + { + return the_item > o2; + } + }; // end of seqref + + + // class SeqBase + // ...the base class for all sequence types + + template + class SeqBase: public Object + { + public: + // STL definitions + typedef size_t size_type; + typedef seqref reference; + typedef T const_reference; + typedef seqref* pointer; + typedef int difference_type; + typedef T value_type; // TMM: 26Jun'01 + + virtual size_type max_size() const + { + return std::string::npos; // ? + } + + virtual size_type capacity() const + { + return size(); + } + + virtual void swap(SeqBase& c) + { + SeqBase temp = c; + c = ptr(); + set(temp.ptr()); + } + + virtual size_type size () const + { + return PySequence_Length (ptr()); + } + + explicit SeqBase () + :Object(PyTuple_New(0), true) + { + validate(); + } + + explicit SeqBase (PyObject* pyob, bool owned=false) + : Object(pyob, owned) + { + validate(); + } + + SeqBase (const Object& ob): Object(ob) + { + validate(); + } + + // Assignment acquires new ownership of pointer + + SeqBase& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + SeqBase& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + + virtual bool accepts (PyObject *pyob) const + { + return pyob && PySequence_Check (pyob); + } + + size_type length () const + { + return PySequence_Length (ptr()); + } + + // Element access + const T operator[](sequence_index_type index) const + { + return getItem(index); + } + + seqref operator[](sequence_index_type index) + { + return seqref(*this, index); + } + + virtual T getItem (sequence_index_type i) const + { + return T(asObject(PySequence_GetItem (ptr(), i))); + } + + virtual void setItem (sequence_index_type i, const T& ob) + { + if (PySequence_SetItem (ptr(), i, *ob) == -1) + { + throw Exception(); + } + } + + SeqBase repeat (int count) const + { + return SeqBase (PySequence_Repeat (ptr(), count), true); + } + + SeqBase concat (const SeqBase& other) const + { + return SeqBase (PySequence_Concat(ptr(), *other), true); + } + + // more STL compatability + const T front () const + { + return getItem(0); + } + + seqref front() + { + return seqref(*this, 0); + } + + const T back() const + { + return getItem(size()-1); + } + + seqref back() + { + return seqref(*this, size()-1); + } + + void verify_length(size_type required_size) const + { + if (size() != required_size) + throw IndexError ("Unexpected SeqBase length."); + } + + void verify_length(size_type min_size, size_type max_size) const + { + size_type n = size(); + if (n < min_size || n > max_size) + throw IndexError ("Unexpected SeqBase length."); + } + + class iterator + : public random_access_iterator_parent(seqref) + { + protected: + friend class SeqBase; + SeqBase* seq; + int count; + + public: + ~iterator () + {} + + iterator () + : seq( 0 ) + , count( 0 ) + {} + + iterator (SeqBase* s, int where) + : seq( s ) + , count( where ) + {} + + iterator (const iterator& other) + : seq( other.seq ) + , count( other.count ) + {} + + bool eql (const iterator& other) const + { + return (seq->ptr() == other.seq->ptr()) && (count == other.count); + } + + bool neq (const iterator& other) const + { + return (seq->ptr() != other.seq->ptr()) || (count != other.count); + } + + bool lss (const iterator& other) const + { + return (count < other.count); + } + + bool gtr (const iterator& other) const + { + return (count > other.count); + } + + bool leq (const iterator& other) const + { + return (count <= other.count); + } + + bool geq (const iterator& other) const + { + return (count >= other.count); + } + + seqref operator*() + { + return seqref(*seq, count); + } + + seqref operator[] (sequence_index_type i) + { + return seqref(*seq, count + i); + } + + iterator& operator=(const iterator& other) + { + if (this == &other) return *this; + seq = other.seq; + count = other.count; + return *this; + } + + iterator operator+(int n) const + { + return iterator(seq, count + n); + } + + iterator operator-(int n) const + { + return iterator(seq, count - n); + } + + iterator& operator+=(int n) + { + count = count + n; + return *this; + } + + iterator& operator-=(int n) + { + count = count - n; + return *this; + } + + int operator-(const iterator& other) const + { + if (*seq != *other.seq) + throw RuntimeError ("SeqBase::iterator comparison error"); + return count - other.count; + } + + // prefix ++ + iterator& operator++ () + { count++; return *this;} + // postfix ++ + iterator operator++ (int) + { return iterator(seq, count++);} + // prefix -- + iterator& operator-- () + { count--; return *this;} + // postfix -- + iterator operator-- (int) + { return iterator(seq, count--);} + + std::string diagnose() const + { + std::OSTRSTREAM oss; + oss << "iterator diagnosis " << seq << ", " << count << std::ends; + return std::string(oss.str()); + } + }; // end of class SeqBase::iterator + + iterator begin () + { + return iterator(this, 0); + } + + iterator end () + { + return iterator(this, length()); + } + + class const_iterator + : public random_access_iterator_parent(const Object) + { + protected: + friend class SeqBase; + const SeqBase* seq; + sequence_index_type count; + + private: + const_iterator (const SeqBase* s, int where) + : seq( s ) + , count( where ) + {} + + public: + ~const_iterator () + {} + + const_iterator () + : seq( 0 ) + , count( 0 ) + {} + + const_iterator(const const_iterator& other) + : seq( other.seq ) + , count( other.count ) + {} + + const T operator*() const + { + return seq->getItem(count); + } + + const T operator[] (sequence_index_type i) const + { + return seq->getItem(count + i); + } + + const_iterator& operator=(const const_iterator& other) + { + if (this == &other) return *this; + seq = other.seq; + count = other.count; + return *this; + } + + const_iterator operator+(int n) const + { + return const_iterator(seq, count + n); + } + + bool eql (const const_iterator& other) const + { + return (seq->ptr() == other.seq->ptr()) && (count == other.count); + } + + bool neq (const const_iterator& other) const + { + return (seq->ptr() != other.seq->ptr()) || (count != other.count); + } + + bool lss (const const_iterator& other) const + { + return (count < other.count); + } + + bool gtr (const const_iterator& other) const + { + return (count > other.count); + } + + bool leq (const const_iterator& other) const + { + return (count <= other.count); + } + + bool geq (const const_iterator& other) const + { + return (count >= other.count); + } + + const_iterator operator-(int n) + { + return const_iterator(seq, count - n); + } + + const_iterator& operator+=(int n) + { + count = count + n; + return *this; + } + + const_iterator& operator-=(int n) + { + count = count - n; + return *this; + } + + int operator-(const const_iterator& other) const + { + if (*seq != *other.seq) + throw RuntimeError ("SeqBase::const_iterator::- error"); + return count - other.count; + } + // prefix ++ + const_iterator& operator++ () + { count++; return *this;} + // postfix ++ + const_iterator operator++ (int) + { return const_iterator(seq, count++);} + // prefix -- + const_iterator& operator-- () + { count--; return *this;} + // postfix -- + const_iterator operator-- (int) + { return const_iterator(seq, count--);} + }; // end of class SeqBase::const_iterator + + const_iterator begin () const + { + return const_iterator(this, 0); + } + + const_iterator end () const + { + return const_iterator(this, length()); + } + }; + + // Here's an important typedef you might miss if reading too fast... + typedef SeqBase Sequence; + + template bool operator==(const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); + template bool operator!=(const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); + template bool operator< (const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); + template bool operator> (const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); + template bool operator<=(const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); + template bool operator>=(const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); + + template bool operator==(const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); + template bool operator!=(const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); + template bool operator< (const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); + template bool operator> (const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); + template bool operator<=(const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); + template bool operator>=(const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); + + + extern bool operator==(const Sequence::iterator& left, const Sequence::iterator& right); + extern bool operator!=(const Sequence::iterator& left, const Sequence::iterator& right); + extern bool operator< (const Sequence::iterator& left, const Sequence::iterator& right); + extern bool operator> (const Sequence::iterator& left, const Sequence::iterator& right); + extern bool operator<=(const Sequence::iterator& left, const Sequence::iterator& right); + extern bool operator>=(const Sequence::iterator& left, const Sequence::iterator& right); + + extern bool operator==(const Sequence::const_iterator& left, const Sequence::const_iterator& right); + extern bool operator!=(const Sequence::const_iterator& left, const Sequence::const_iterator& right); + extern bool operator< (const Sequence::const_iterator& left, const Sequence::const_iterator& right); + extern bool operator> (const Sequence::const_iterator& left, const Sequence::const_iterator& right); + extern bool operator<=(const Sequence::const_iterator& left, const Sequence::const_iterator& right); + extern bool operator>=(const Sequence::const_iterator& left, const Sequence::const_iterator& right); + + // ================================================== + // class Char + // Python strings return strings as individual elements. + // I'll try having a class Char which is a String of length 1 + // + typedef std::basic_string unicodestring; + extern Py_UNICODE unicode_null_string[1]; + + class Char: public Object + { + public: + explicit Char (PyObject *pyob, bool owned = false): Object(pyob, owned) + { + validate(); + } + + Char (const Object& ob): Object(ob) + { + validate(); + } + + Char (const std::string& v = "") + :Object(PyString_FromStringAndSize (const_cast(v.c_str()),1), true) + { + validate(); + } + + Char (char v) + : Object(PyString_FromStringAndSize (&v, 1), true) + { + validate(); + } + + Char (Py_UNICODE v) + : Object(PyUnicode_FromUnicode (&v, 1), true) + { + validate(); + } + // Assignment acquires new ownership of pointer + Char& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Char& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && (Py::_String_Check(pyob) || Py::_Unicode_Check(pyob)) && PySequence_Length (pyob) == 1; + } + + // Assignment from C string + Char& operator= (const std::string& v) + { + set(PyString_FromStringAndSize (const_cast(v.c_str()),1), true); + return *this; + } + + Char& operator= (char v) + { + set(PyString_FromStringAndSize (&v, 1), true); + return *this; + } + + Char& operator= (const unicodestring& v) + { + set(PyUnicode_FromUnicode (const_cast(v.data()),1), true); + return *this; + } + + Char& operator= (Py_UNICODE v) + { + set(PyUnicode_FromUnicode (&v, 1), true); + return *this; + } + + // Conversion + operator String() const; + + operator std::string () const + { + return std::string(PyString_AsString (ptr())); + } + }; + +#ifdef PYCXX_PYTHON_2TO3 + // String and Bytes compatible with Python3 version in 6.0.0 PyCXX + class Bytes; + + class String: public SeqBase + { + public: + virtual size_type capacity() const + { + return max_size(); + } + + explicit String( PyObject *pyob, bool owned = false) + : SeqBase( pyob, owned ) + { + validate(); + } + + String( const Object& ob): SeqBase(ob) + { + validate(); + } + + String() + : SeqBase( PyString_FromStringAndSize( "", 0 ), true ) + { + validate(); + } + + String( const std::string& v ) + : SeqBase( PyString_FromStringAndSize( const_cast(v.data()), + static_cast( v.length() ) ), true ) + { + validate(); + } + + String( const char *s, const char *encoding, const char *error="strict" ) + : SeqBase( PyUnicode_Decode( s, strlen( s ), encoding, error ), true ) + { + validate(); + } + + String( const char *s, int len, const char *encoding, const char *error="strict" ) + : SeqBase( PyUnicode_Decode( s, len, encoding, error ), true ) + { + validate(); + } + + String( const std::string &s, const char *encoding, const char *error="strict" ) + : SeqBase( PyUnicode_Decode( s.c_str(), s.length(), encoding, error ), true ) + { + validate(); + } + + String( const std::string& v, std::string::size_type vsize ) + : SeqBase(PyString_FromStringAndSize( const_cast(v.data()), + static_cast( vsize ) ), true) + { + validate(); + } + + String( const char *v, int vsize ) + : SeqBase(PyString_FromStringAndSize( const_cast(v), vsize ), true ) + { + validate(); + } + + String( const char* v ) + : SeqBase( PyString_FromString( v ), true ) + { + validate(); + } + + // Assignment acquires new ownership of pointer + String& operator= ( const Object& rhs ) + { + return *this = *rhs; + } + + String& operator= (PyObject* rhsp) + { + if( ptr() == rhsp ) + return *this; + set (rhsp); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && (Py::_String_Check(pyob) || Py::_Unicode_Check(pyob)); + } + + // Assignment from C string + String& operator= (const std::string& v) + { + set( PyString_FromStringAndSize( const_cast( v.data() ), + static_cast( v.length() ) ), true ); + return *this; + } + String& operator= (const unicodestring& v) + { + set( PyUnicode_FromUnicode( const_cast( v.data() ), + static_cast( v.length() ) ), true ); + return *this; + } + + + // Encode + Bytes encode( const char *encoding, const char *error="strict" ) const; + + // Queries + virtual size_type size () const + { + if( isUnicode() ) + { + return static_cast( PyUnicode_GET_SIZE (ptr()) ); + } + else + { + return static_cast( PyString_Size (ptr()) ); + } + } + + operator std::string () const + { + return as_std_string( "utf-8" ); + } + + std::string as_std_string( const char *encoding, const char *error="strict" ) const; + + unicodestring as_unicodestring() const + { + if( isUnicode() ) + { + return unicodestring( PyUnicode_AS_UNICODE( ptr() ), + static_cast( PyUnicode_GET_SIZE( ptr() ) ) ); + } + else + { + throw TypeError("can only return unicodestring from Unicode object"); + } + } + }; + class Bytes: public SeqBase + { + public: + virtual size_type capacity() const + { + return max_size(); + } + + explicit Bytes (PyObject *pyob, bool owned = false): SeqBase(pyob, owned) + { + validate(); + } + + Bytes (const Object& ob): SeqBase(ob) + { + validate(); + } + + Bytes() + : SeqBase( PyString_FromStringAndSize( "", 0 ), true ) + { + validate(); + } + + Bytes( const std::string& v ) + : SeqBase( PyString_FromStringAndSize( const_cast(v.data()), static_cast( v.length() ) ), true ) + { + validate(); + } + + Bytes( const std::string& v, std::string::size_type vsize ) + : SeqBase(PyString_FromStringAndSize( const_cast(v.data()), static_cast( vsize ) ), true) + { + validate(); + } + + Bytes( const char *v, int vsize ) + : SeqBase(PyString_FromStringAndSize( const_cast(v), vsize ), true ) + { + validate(); + } + + Bytes( const char *v ) + : SeqBase( PyString_FromString( v ), true ) + { + validate(); + } + + // Assignment acquires new ownership of pointer + Bytes &operator= ( const Object& rhs ) + { + return *this = *rhs; + } + + Bytes &operator= (PyObject *rhsp) + { + if( ptr() == rhsp ) + return *this; + set (rhsp); + return *this; + } + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob && (Py::_String_Check( pyob ) || Py::_Unicode_Check( pyob )); + } + + // Assignment from C string + Bytes &operator= (const std::string& v) + { + set( PyString_FromStringAndSize( const_cast( v.data() ), + static_cast( v.length() ) ), true ); + return *this; + } + Bytes &operator= (const unicodestring& v) + { + set( PyUnicode_FromUnicode( const_cast( v.data() ), + static_cast( v.length() ) ), true ); + return *this; + } + + String decode( const char *encoding, const char *error="strict" ) + { + return Object( PyString_AsDecodedObject( ptr(), encoding, error ) ); + } + + // Queries + virtual size_type size () const + { + if( isUnicode() ) + { + return static_cast( PyUnicode_GET_SIZE (ptr()) ); + } + else + { + return static_cast( PyString_Size (ptr()) ); + } + } + + operator std::string () const + { + return as_std_string(); + } + + std::string as_std_string() const + { + if( isUnicode() ) + { + throw TypeError("cannot return std::string from Unicode object"); + } + else + { + return std::string( PyString_AsString( ptr() ), static_cast( PyString_Size( ptr() ) ) ); + } + } + + unicodestring as_unicodestring() const + { + if( isUnicode() ) + { + return unicodestring( PyUnicode_AS_UNICODE( ptr() ), + static_cast( PyUnicode_GET_SIZE( ptr() ) ) ); + } + else + { + throw TypeError("can only return unicodestring from Unicode object"); + } + } + }; + +#else + // original PyCXX 5.4.x version of String + class String: public SeqBase + { + public: + virtual size_type capacity() const + { + return max_size(); + } + + explicit String (PyObject *pyob, bool owned = false): SeqBase(pyob, owned) + { + validate(); + } + + String (const Object& ob): SeqBase(ob) + { + validate(); + } + + String() + : SeqBase( PyString_FromStringAndSize( "", 0 ), true ) + { + validate(); + } + + String( const std::string& v ) + : SeqBase( PyString_FromStringAndSize( const_cast(v.data()), + static_cast( v.length() ) ), true ) + { + validate(); + } + + String( const char *s, const char *encoding, const char *error="strict" ) + : SeqBase( PyUnicode_Decode( s, strlen( s ), encoding, error ), true ) + { + validate(); + } + + String( const char *s, int len, const char *encoding, const char *error="strict" ) + : SeqBase( PyUnicode_Decode( s, len, encoding, error ), true ) + { + validate(); + } + + String( const std::string &s, const char *encoding, const char *error="strict" ) + : SeqBase( PyUnicode_Decode( s.c_str(), s.length(), encoding, error ), true ) + { + validate(); + } + + String( const std::string& v, std::string::size_type vsize ) + : SeqBase(PyString_FromStringAndSize( const_cast(v.data()), + static_cast( vsize ) ), true) + { + validate(); + } + + String( const char *v, int vsize ) + : SeqBase(PyString_FromStringAndSize( const_cast(v), vsize ), true ) + { + validate(); + } + + String( const char* v ) + : SeqBase( PyString_FromString( v ), true ) + { + validate(); + } + + // Assignment acquires new ownership of pointer + String& operator= ( const Object& rhs ) + { + return *this = *rhs; + } + + String& operator= (PyObject* rhsp) + { + if( ptr() == rhsp ) + return *this; + set (rhsp); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && (Py::_String_Check(pyob) || Py::_Unicode_Check(pyob)); + } + + // Assignment from C string + String& operator= (const std::string& v) + { + set( PyString_FromStringAndSize( const_cast( v.data() ), + static_cast( v.length() ) ), true ); + return *this; + } + String& operator= (const unicodestring& v) + { + set( PyUnicode_FromUnicode( const_cast( v.data() ), + static_cast( v.length() ) ), true ); + return *this; + } + + + // Encode + String encode( const char *encoding, const char *error="strict" ) const + { + if( isUnicode() ) + { + return String( PyUnicode_AsEncodedString( ptr(), encoding, error ) ); + } + else + { + return String( PyString_AsEncodedObject( ptr(), encoding, error ) ); + } + } + + String decode( const char *encoding, const char *error="strict" ) + { + return Object( PyString_AsDecodedObject( ptr(), encoding, error ) ); + } + + // Queries + virtual size_type size () const + { + if( isUnicode() ) + { + return static_cast( PyUnicode_GET_SIZE (ptr()) ); + } + else + { + return static_cast( PyString_Size (ptr()) ); + } + } + + operator std::string () const + { + return as_std_string(); + } + + std::string as_std_string() const + { + if( isUnicode() ) + { + throw TypeError("cannot return std::string from Unicode object"); + } + else + { + return std::string( PyString_AsString( ptr() ), static_cast( PyString_Size( ptr() ) ) ); + } + } + + std::string as_std_string( const char *encoding, const char *error="strict" ) const; + + unicodestring as_unicodestring() const + { + if( isUnicode() ) + { + return unicodestring( PyUnicode_AS_UNICODE( ptr() ), + static_cast( PyUnicode_GET_SIZE( ptr() ) ) ); + } + else + { + throw TypeError("can only return unicodestring from Unicode object"); + } + } + }; +#endif + + // ================================================== + // class Tuple + class Tuple: public Sequence + { + public: + virtual void setItem (sequence_index_type offset, const Object&ob) + { + // note PyTuple_SetItem is a thief... + if(PyTuple_SetItem (ptr(), offset, new_reference_to(ob)) == -1) + { + throw Exception(); + } + } + + // Constructor + explicit Tuple (PyObject *pyob, bool owned = false): Sequence (pyob, owned) + { + validate(); + } + + Tuple (const Object& ob): Sequence(ob) + { + validate(); + } + + // New tuple of a given size + explicit Tuple (int size = 0) + { + set(PyTuple_New (size), true); + validate (); + for (sequence_index_type i=0; i < size; i++) + { + if(PyTuple_SetItem (ptr(), i, new_reference_to(Py::_None())) == -1) + { + throw Exception(); + } + } + } + // Tuple from any sequence + explicit Tuple (const Sequence& s) + { + sequence_index_type limit( sequence_index_type( s.length() ) ); + + set(PyTuple_New (limit), true); + validate(); + + for(sequence_index_type i=0; i < limit; i++) + { + if(PyTuple_SetItem (ptr(), i, new_reference_to(s[i])) == -1) + { + throw Exception(); + } + } + } + // Assignment acquires new ownership of pointer + + Tuple& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Tuple& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_Tuple_Check (pyob); + } + + Tuple getSlice (int i, int j) const + { + return Tuple (PySequence_GetSlice (ptr(), i, j), true); + } + + }; + + // ================================================== + // class List + + class List: public Sequence + { + public: + // Constructor + explicit List (PyObject *pyob, bool owned = false): Sequence(pyob, owned) + { + validate(); + } + List (const Object& ob): Sequence(ob) + { + validate(); + } + // Creation at a fixed size + List (int size = 0) + { + set(PyList_New (size), true); + validate(); + for (sequence_index_type i=0; i < size; i++) + { + if(PyList_SetItem (ptr(), i, new_reference_to(Py::_None())) == -1) + { + throw Exception(); + } + } + } + + // List from a sequence + List (const Sequence& s): Sequence() + { + int n = (int)s.length(); + set(PyList_New (n), true); + validate(); + for (sequence_index_type i=0; i < n; i++) + { + if(PyList_SetItem (ptr(), i, new_reference_to(s[i])) == -1) + { + throw Exception(); + } + } + } + + virtual size_type capacity() const + { + return max_size(); + } + // Assignment acquires new ownership of pointer + + List& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + List& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_List_Check (pyob); + } + + List getSlice (int i, int j) const + { + return List (PyList_GetSlice (ptr(), i, j), true); + } + + void setSlice (int i, int j, const Object& v) + { + if(PyList_SetSlice (ptr(), i, j, *v) == -1) + { + throw Exception(); + } + } + + void append (const Object& ob) + { + if(PyList_Append (ptr(), *ob) == -1) + { + throw Exception(); + } + } + + void insert (int i, const Object& ob) + { + if(PyList_Insert (ptr(), i, *ob) == -1) + { + throw Exception(); + } + } + + void sort () + { + if(PyList_Sort(ptr()) == -1) + { + throw Exception(); + } + } + + void reverse () + { + if(PyList_Reverse(ptr()) == -1) + { + throw Exception(); + } + } + }; + + + // Mappings + // ================================================== + template + class mapref + { + protected: + MapBase& s; // the map + Object key; // item key + T the_item; + + public: + mapref (MapBase& map, const std::string& k) + : s(map), the_item() + { + key = String(k); + if(map.hasKey(key)) the_item = map.getItem(key); + } + + mapref (MapBase& map, const Object& k) + : s(map), key(k), the_item() + { + if(map.hasKey(key)) the_item = map.getItem(key); + } + + virtual ~mapref() + {} + + // MapBase stuff + // lvalue + mapref& operator=(const mapref& other) + { + if(this == &other) return *this; + the_item = other.the_item; + s.setItem(key, other.the_item); + return *this; + } + + mapref& operator= (const T& ob) + { + the_item = ob; + s.setItem (key, ob); + return *this; + } + + // rvalue + operator T() const + { + return the_item; + } + + // forward everything else to the_item + PyObject* ptr () const + { + return the_item.ptr(); + } + + int reference_count () const + { // the mapref count + return the_item.reference_count(); + } + + Type type () const + { + return the_item.type(); + } + + String str () const + { + return the_item.str(); + } + + String repr () const + { + return the_item.repr(); + } + + bool hasAttr (const std::string& attr_name) const + { + return the_item.hasAttr(attr_name); + } + + Object getAttr (const std::string& attr_name) const + { + return the_item.getAttr(attr_name); + } + + Object getItem (const Object& k) const + { + return the_item.getItem(k); + } + + long hashValue () const + { + return the_item.hashValue(); + } + + bool isCallable () const + { + return the_item.isCallable(); + } + + bool isInstance () const + { + return the_item.isInstance(); + } + + bool isList () const + { + return the_item.isList(); + } + + bool isMapping () const + { + return the_item.isMapping(); + } + + bool isNumeric () const + { + return the_item.isNumeric(); + } + + bool isSequence () const + { + return the_item.isSequence(); + } + + bool isTrue () const + { + return the_item.isTrue(); + } + + bool isType (const Type& t) const + { + return the_item.isType (t); + } + + bool isTuple() const + { + return the_item.isTuple(); + } + + bool isString() const + { + return the_item.isString(); + } + + // Commands + void setAttr (const std::string& attr_name, const Object& value) + { + the_item.setAttr(attr_name, value); + } + + void delAttr (const std::string& attr_name) + { + the_item.delAttr(attr_name); + } + + void delItem (const Object& k) + { + the_item.delItem(k); + } + }; // end of mapref + + // TMM: now for mapref + template< class T > + bool operator==(const mapref& left, const mapref& right) + { + return true; // NOT completed. + } + + template< class T > + bool operator!=(const mapref& left, const mapref& right) + { + return true; // not completed. + } + + template + class MapBase: public Object + { + protected: + explicit MapBase() + {} + public: + // reference: proxy class for implementing [] + // TMM: 26Jun'01 - the types + // If you assume that Python mapping is a hash_map... + // hash_map::value_type is not assignable, but + // (*it).second = data must be a valid expression + typedef size_t size_type; + typedef Object key_type; + typedef mapref data_type; + typedef std::pair< const T, T > value_type; + typedef std::pair< const T, mapref > reference; + typedef const std::pair< const T, const T > const_reference; + typedef std::pair< const T, mapref > pointer; + + // Constructor + explicit MapBase (PyObject *pyob, bool owned = false): Object(pyob, owned) + { + validate(); + } + + // TMM: 02Jul'01 - changed MapBase to Object in next line + MapBase (const Object& ob): Object(ob) + { + validate(); + } + + // Assignment acquires new ownership of pointer + MapBase& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + MapBase& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && PyMapping_Check(pyob); + } + + // Clear -- PyMapping Clear is missing + // + + void clear () + { + List k = keys(); + for(List::iterator i = k.begin(); i != k.end(); i++) + { + delItem(*i); + } + } + + virtual size_type size() const + { + return PyMapping_Length (ptr()); + } + + // Element Access + T operator[](const std::string& key) const + { + return getItem(key); + } + + T operator[](const Object& key) const + { + return getItem(key); + } + + mapref operator[](const std::string& key) + { + return mapref(*this, key); + } + + mapref operator[](const Object& key) + { + return mapref(*this, key); + } + + int length () const + { + return PyMapping_Length (ptr()); + } + + bool hasKey (const std::string& s) const + { + return PyMapping_HasKeyString (ptr(),const_cast(s.c_str())) != 0; + } + + bool hasKey (const Object& s) const + { + return PyMapping_HasKey (ptr(), s.ptr()) != 0; + } + + T getItem (const std::string& s) const + { + return T( + asObject(PyMapping_GetItemString (ptr(),const_cast(s.c_str()))) + ); + } + + T getItem (const Object& s) const + { + return T( + asObject(PyObject_GetItem (ptr(), s.ptr())) + ); + } + + virtual void setItem (const char *s, const Object& ob) + { + if (PyMapping_SetItemString (ptr(), const_cast(s), *ob) == -1) + { + throw Exception(); + } + } + + virtual void setItem (const std::string& s, const Object& ob) + { + if (PyMapping_SetItemString (ptr(), const_cast(s.c_str()), *ob) == -1) + { + throw Exception(); + } + } + + virtual void setItem (const Object& s, const Object& ob) + { + if (PyObject_SetItem (ptr(), s.ptr(), ob.ptr()) == -1) + { + throw Exception(); + } + } + + void delItem (const std::string& s) + { + if (PyMapping_DelItemString (ptr(), const_cast(s.c_str())) == -1) + { + throw Exception(); + } + } + + void delItem (const Object& s) + { + if (PyMapping_DelItem (ptr(), *s) == -1) + { + throw Exception(); + } + } + // Queries + List keys () const + { + return List(PyMapping_Keys(ptr()), true); + } + + List values () const + { // each returned item is a (key, value) pair + return List(PyMapping_Values(ptr()), true); + } + + List items () const + { + return List(PyMapping_Items(ptr()), true); + } + + class iterator + { + // : public forward_iterator_parent( std::pair ) { + protected: + typedef std::forward_iterator_tag iterator_category; + typedef std::pair< const T, T > value_type; + typedef int difference_type; + typedef std::pair< const T, mapref > pointer; + typedef std::pair< const T, mapref > reference; + + friend class MapBase; + // + MapBase* map; + List keys; // for iterating over the map + int pos; // index into the keys + + private: + iterator( MapBase* m, List k, int p ) + : map( m ) + , keys( k ) + , pos( p ) + {} + + public: + ~iterator () + {} + + iterator () + : map( 0 ) + , keys() + , pos() + {} + + iterator (MapBase* m, bool end = false ) + : map( m ) + , keys( m->keys() ) + , pos( end ? keys.length() : 0 ) + {} + + iterator (const iterator& other) + : map( other.map ) + , keys( other.keys ) + , pos( other.pos ) + {} + + reference operator*() + { + Object key = keys[ pos ]; + return std::make_pair(key, mapref(*map,key)); + } + + iterator& operator=(const iterator& other) + { + if (this == &other) + return *this; + map = other.map; + keys = other.keys; + pos = other.pos; + return *this; + } + + bool eql(const iterator& right) const + { + return map->ptr() == right.map->ptr() && pos == right.pos; + } + bool neq( const iterator& right ) const + { + return map->ptr() != right.map->ptr() || pos != right.pos; + } + + // pointer operator->() { + // return ; + // } + + // prefix ++ + iterator& operator++ () + { pos++; return *this;} + // postfix ++ + iterator operator++ (int) + { return iterator(map, keys, pos++);} + // prefix -- + iterator& operator-- () + { pos--; return *this;} + // postfix -- + iterator operator-- (int) + { return iterator(map, keys, pos--);} + + std::string diagnose() const + { + std::OSTRSTREAM oss; + oss << "iterator diagnosis " << map << ", " << pos << std::ends; + return std::string(oss.str()); + } + }; // end of class MapBase::iterator + + iterator begin () + { + return iterator(this); + } + + iterator end () + { + return iterator(this, true); + } + + class const_iterator + { + protected: + typedef std::forward_iterator_tag iterator_category; + typedef const std::pair< const T, T > value_type; + typedef int difference_type; + typedef const std::pair< const T, T > pointer; + typedef const std::pair< const T, T > reference; + + friend class MapBase; + const MapBase* map; + List keys; // for iterating over the map + int pos; // index into the keys + + private: + const_iterator( const MapBase* m, List k, int p ) + : map( m ) + , keys( k ) + , pos( p ) + {} + + public: + ~const_iterator () + {} + + const_iterator () + : map( 0 ) + , keys() + , pos() + {} + + const_iterator (const MapBase* m, bool end = false ) + : map( m ) + , keys( m->keys() ) + , pos( end ? keys.length() : 0 ) + {} + + const_iterator(const const_iterator& other) + : map( other.map ) + , keys( other.keys ) + , pos( other.pos ) + {} + + bool eql(const const_iterator& right) const + { + return map->ptr() == right.map->ptr() && pos == right.pos; + } + + bool neq( const const_iterator& right ) const + { + return map->ptr() != right.map->ptr() || pos != right.pos; + } + + const_reference operator*() + { + Object key = keys[ pos ]; + return std::make_pair( key, mapref( *map, key ) ); + } + + const_iterator& operator=(const const_iterator& other) + { + if (this == &other) return *this; + map = other.map; + keys = other.keys; + pos = other.pos; + return *this; + } + + // prefix ++ + const_iterator& operator++ () + { pos++; return *this;} + // postfix ++ + const_iterator operator++ (int) + { return const_iterator(map, keys, pos++);} + // prefix -- + const_iterator& operator-- () + { pos--; return *this;} + // postfix -- + const_iterator operator-- (int) + { return const_iterator(map, keys, pos--);} + }; // end of class MapBase::const_iterator + + const_iterator begin () const + { + return const_iterator(this); + } + + const_iterator end () const + { + return const_iterator(this, true); + } + + }; // end of MapBase + + typedef MapBase Mapping; + + template bool operator==(const EXPLICIT_TYPENAME MapBase::iterator& left, const EXPLICIT_TYPENAME MapBase::iterator& right); + template bool operator!=(const EXPLICIT_TYPENAME MapBase::iterator& left, const EXPLICIT_TYPENAME MapBase::iterator& right); + template bool operator==(const EXPLICIT_TYPENAME MapBase::const_iterator& left, const EXPLICIT_TYPENAME MapBase::const_iterator& right); + template bool operator!=(const EXPLICIT_TYPENAME MapBase::const_iterator& left, const EXPLICIT_TYPENAME MapBase::const_iterator& right); + + extern bool operator==(const Mapping::iterator& left, const Mapping::iterator& right); + extern bool operator!=(const Mapping::iterator& left, const Mapping::iterator& right); + extern bool operator==(const Mapping::const_iterator& left, const Mapping::const_iterator& right); + extern bool operator!=(const Mapping::const_iterator& left, const Mapping::const_iterator& right); + + + // ================================================== + // class Dict + class Dict: public Mapping + { + public: + // Constructor + explicit Dict (PyObject *pyob, bool owned=false): Mapping (pyob, owned) + { + validate(); + } + Dict (const Object& ob): Mapping(ob) + { + validate(); + } + // Creation + Dict () + { + set(PyDict_New (), true); + validate(); + } + // Assignment acquires new ownership of pointer + + Dict& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Dict& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set(rhsp); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_Dict_Check (pyob); + } + }; + + class Callable: public Object + { + public: + // Constructor + explicit Callable (): Object() {} + explicit Callable (PyObject *pyob, bool owned = false): Object (pyob, owned) + { + validate(); + } + + Callable (const Object& ob): Object(ob) + { + validate(); + } + + // Assignment acquires new ownership of pointer + + Callable& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Callable& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && PyCallable_Check (pyob); + } + + // Call + Object apply(const Tuple& args) const + { + return asObject(PyObject_CallObject(ptr(), args.ptr())); + } + + // Call with keywords + Object apply(const Tuple& args, const Dict& kw) const + { + return asObject( PyEval_CallObjectWithKeywords( ptr(), args.ptr(), kw.ptr() ) ); + } + + Object apply(PyObject* pargs = 0) const + { + return apply (Tuple(pargs)); + } + }; + + class Module: public Object + { + public: + explicit Module (PyObject* pyob, bool owned = false): Object (pyob, owned) + { + validate(); + } + + // Construct from module name + explicit Module (const std::string&s): Object() + { + PyObject *m = PyImport_AddModule( const_cast(s.c_str()) ); + set( m, false ); + validate (); + } + + // Copy constructor acquires new ownership of pointer + Module (const Module& ob): Object(*ob) + { + validate(); + } + + Module& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Module& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set(rhsp); + return *this; + } + + Dict getDict() + { + return Dict(PyModule_GetDict(ptr())); + // Caution -- PyModule_GetDict returns borrowed reference! + } + }; + + // Numeric interface + inline Object operator+ (const Object& a) + { + return asObject(PyNumber_Positive(*a)); + } + inline Object operator- (const Object& a) + { + return asObject(PyNumber_Negative(*a)); + } + + inline Object abs(const Object& a) + { + return asObject(PyNumber_Absolute(*a)); + } + + inline std::pair coerce(const Object& a, const Object& b) + { + PyObject *p1, *p2; + p1 = *a; + p2 = *b; + if(PyNumber_Coerce(&p1,&p2) == -1) + { + throw Exception(); + } + return std::pair(asObject(p1), asObject(p2)); + } + + inline Object operator+ (const Object& a, const Object& b) + { + return asObject(PyNumber_Add(*a, *b)); + } + inline Object operator+ (const Object& a, int j) + { + return asObject(PyNumber_Add(*a, *Int(j))); + } + inline Object operator+ (const Object& a, double v) + { + return asObject(PyNumber_Add(*a, *Float(v))); + } + inline Object operator+ (int j, const Object& b) + { + return asObject(PyNumber_Add(*Int(j), *b)); + } + inline Object operator+ (double v, const Object& b) + { + return asObject(PyNumber_Add(*Float(v), *b)); + } + + inline Object operator- (const Object& a, const Object& b) + { + return asObject(PyNumber_Subtract(*a, *b)); + } + inline Object operator- (const Object& a, int j) + { + return asObject(PyNumber_Subtract(*a, *Int(j))); + } + inline Object operator- (const Object& a, double v) + { + return asObject(PyNumber_Subtract(*a, *Float(v))); + } + inline Object operator- (int j, const Object& b) + { + return asObject(PyNumber_Subtract(*Int(j), *b)); + } + inline Object operator- (double v, const Object& b) + { + return asObject(PyNumber_Subtract(*Float(v), *b)); + } + + inline Object operator* (const Object& a, const Object& b) + { + return asObject(PyNumber_Multiply(*a, *b)); + } + inline Object operator* (const Object& a, int j) + { + return asObject(PyNumber_Multiply(*a, *Int(j))); + } + inline Object operator* (const Object& a, double v) + { + return asObject(PyNumber_Multiply(*a, *Float(v))); + } + inline Object operator* (int j, const Object& b) + { + return asObject(PyNumber_Multiply(*Int(j), *b)); + } + inline Object operator* (double v, const Object& b) + { + return asObject(PyNumber_Multiply(*Float(v), *b)); + } + + inline Object operator/ (const Object& a, const Object& b) + { + return asObject(PyNumber_Divide(*a, *b)); + } + inline Object operator/ (const Object& a, int j) + { + return asObject(PyNumber_Divide(*a, *Int(j))); + } + inline Object operator/ (const Object& a, double v) + { + return asObject(PyNumber_Divide(*a, *Float(v))); + } + inline Object operator/ (int j, const Object& b) + { + return asObject(PyNumber_Divide(*Int(j), *b)); + } + inline Object operator/ (double v, const Object& b) + { + return asObject(PyNumber_Divide(*Float(v), *b)); + } + + inline Object operator% (const Object& a, const Object& b) + { + return asObject(PyNumber_Remainder(*a, *b)); + } + inline Object operator% (const Object& a, int j) + { + return asObject(PyNumber_Remainder(*a, *Int(j))); + } + inline Object operator% (const Object& a, double v) + { + return asObject(PyNumber_Remainder(*a, *Float(v))); + } + inline Object operator% (int j, const Object& b) + { + return asObject(PyNumber_Remainder(*Int(j), *b)); + } + inline Object operator% (double v, const Object& b) + { + return asObject(PyNumber_Remainder(*Float(v), *b)); + } + + inline Object type(const Exception&) // return the type of the error + { + PyObject *ptype, *pvalue, *ptrace; + PyErr_Fetch(&ptype, &pvalue, &ptrace); + Object result; + if(ptype) result = ptype; + PyErr_Restore(ptype, pvalue, ptrace); + return result; + } + + inline Object value(const Exception&) // return the value of the error + { + PyObject *ptype, *pvalue, *ptrace; + PyErr_Fetch(&ptype, &pvalue, &ptrace); + Object result; + if(pvalue) result = pvalue; + PyErr_Restore(ptype, pvalue, ptrace); + return result; + } + + inline Object trace(const Exception&) // return the traceback of the error + { + PyObject *ptype, *pvalue, *ptrace; + PyErr_Fetch(&ptype, &pvalue, &ptrace); + Object result; + if(ptrace) result = ptrace; + PyErr_Restore(ptype, pvalue, ptrace); + return result; + } + +template +String seqref::str () const +{ + return the_item.str(); +} + +template +String seqref::repr () const +{ + return the_item.repr(); +} + +} // namespace Py +#endif // __CXX_Objects__h diff --git a/CXX/Python2/PythonType.hxx b/CXX/Python2/PythonType.hxx new file mode 100644 index 000000000000..a89a6c90481e --- /dev/null +++ b/CXX/Python2/PythonType.hxx @@ -0,0 +1,117 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_PythonType__h +#define __CXX_PythonType__h + +namespace Py +{ + class PythonType + { + public: + // if you define one sequence method you must define + // all of them except the assigns + + PythonType( size_t base_size, int itemsize, const char *default_name ); + virtual ~PythonType(); + + const char *getName() const; + const char *getDoc() const; + + PyTypeObject *type_object() const; + PythonType &name( const char *nam ); + PythonType &doc( const char *d ); + + PythonType &supportClass( void ); +#if !defined( PY3 ) + PythonType &dealloc( void (*f)( PyObject* ) ); +#endif +#if defined( PYCXX_PYTHON_2TO3 ) || !defined( PY3 ) + PythonType &supportPrint( void ); +#endif + PythonType &supportGetattr( void ); + PythonType &supportSetattr( void ); + PythonType &supportGetattro( void ); + PythonType &supportSetattro( void ); +#if defined( PYCXX_PYTHON_2TO3 ) || !defined( PY3 ) + PythonType &supportCompare( void ); +#endif + PythonType &supportRichCompare( void ); + PythonType &supportRepr( void ); + PythonType &supportStr( void ); + PythonType &supportHash( void ); + PythonType &supportCall( void ); + PythonType &supportIter( void ); + + PythonType &supportSequenceType( void ); + PythonType &supportMappingType( void ); + PythonType &supportNumberType( void ); + PythonType &supportBufferType( void ); + + PythonType &set_tp_dealloc( void (*tp_dealloc)( PyObject * ) ); + PythonType &set_tp_init( int (*tp_init)( PyObject *self, PyObject *args, PyObject *kwds ) ); + PythonType &set_tp_new( PyObject *(*tp_new)( PyTypeObject *subtype, PyObject *args, PyObject *kwds ) ); + PythonType &set_methods( PyMethodDef *methods ); + + // call once all support functions have been called to ready the type + bool readyType(); + + protected: + void init_sequence(); + void init_mapping(); + void init_number(); + void init_buffer(); + + PyTypeObject *table; + PySequenceMethods *sequence_table; + PyMappingMethods *mapping_table; + PyNumberMethods *number_table; + PyBufferProcs *buffer_table; + + private: + // + // prevent the compiler generating these unwanted functions + // + PythonType( const PythonType &tb ); // unimplemented + void operator=( const PythonType &t ); // unimplemented + + }; + +} // Namespace Py + +// End of __CXX_PythonType__h +#endif diff --git a/CXX/Python2/cxx_extensions.cxx b/CXX/Python2/cxx_extensions.cxx new file mode 100644 index 000000000000..2c39dfd064de --- /dev/null +++ b/CXX/Python2/cxx_extensions.cxx @@ -0,0 +1,1772 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- +#include "CXX/Extensions.hxx" +#include "CXX/Exception.hxx" +#include + +#ifdef PYCXX_DEBUG +// +// Functions useful when debugging PyCXX +// +void bpt( void ) +{ +} + +void printRefCount( PyObject *obj ) +{ + std::cout << "RefCount of 0x" << std::hex << reinterpret_cast< unsigned int >( obj ) << std::dec << " is " << Py_REFCNT( obj ) << std::endl; +} +#endif + +namespace Py +{ +#ifdef PYCXX_PYTHON_2TO3 +std::string String::as_std_string( const char *encoding, const char *error ) const +{ + if( isUnicode() ) + { + Bytes encoded( encode( encoding, error ) ); + return encoded.as_std_string(); + } + else + { + return std::string( PyString_AsString( ptr() ), static_cast( PyString_Size( ptr() ) ) ); + } +} + +Bytes String::encode( const char *encoding, const char *error ) const +{ + if( isUnicode() ) + { + return Bytes( PyUnicode_AsEncodedString( ptr(), encoding, error ) ); + } + else + { + return Bytes( PyString_AsEncodedObject( ptr(), encoding, error ) ); + } +} + +#else +std::string String::as_std_string( const char *encoding, const char *error ) const +{ + if( isUnicode() ) + { + String encoded( encode( encoding, error ) ); + return encoded.as_std_string(); + } + else + { + return std::string( PyString_AsString( ptr() ), static_cast( PyString_Size( ptr() ) ) ); + } +} +#endif + +void Object::validate() +{ + // release pointer if not the right type + if( !accepts( p ) ) + { +#if defined( _CPPRTTI ) || defined( __GNUG__ ) + std::string s( "PyCXX: Error creating object of type " ); + s += (typeid( *this )).name(); + + if( p != NULL ) + { + String from_repr = repr(); + s += " from "; + s += from_repr.as_std_string( "utf-8" ); + } + else + { + s += " from (nil)"; + } +#endif + release(); + if( PyErr_Occurred() ) + { // Error message already set + throw Exception(); + } + // Better error message if RTTI available +#if defined( _CPPRTTI ) || defined( __GNUG__ ) + throw TypeError( s ); +#else + throw TypeError( "PyCXX: type error." ); +#endif + } +} + +//================================================================================ +// +// Implementation of MethodTable +// +//================================================================================ +PyMethodDef MethodTable::method( const char *method_name, PyCFunction f, int flags, const char *doc ) +{ + PyMethodDef m; + m.ml_name = const_cast( method_name ); + m.ml_meth = f; + m.ml_flags = flags; + m.ml_doc = const_cast( doc ); + return m; +} + +MethodTable::MethodTable() +{ + t.push_back( method( 0, 0, 0, 0 ) ); + mt = NULL; +} + +MethodTable::~MethodTable() +{ + delete [] mt; +} + +void MethodTable::add( const char *method_name, PyCFunction f, const char *doc, int flag ) +{ + if( !mt ) + { + t.insert( t.end()-1, method( method_name, f, flag, doc ) ); + } + else + { + throw RuntimeError( "Too late to add a module method!" ); + } +} + +PyMethodDef *MethodTable::table() +{ + if( !mt ) + { + Py_ssize_t t1size = t.size(); + mt = new PyMethodDef[ t1size ]; + int j = 0; + for( std::vector::iterator i = t.begin(); i != t.end(); i++ ) + { + mt[ j++ ] = *i; + } + } + return mt; +} + +//================================================================================ +// +// Implementation of ExtensionModule +// +//================================================================================ +ExtensionModuleBase::ExtensionModuleBase( const char *name ) +: m_module_name( name ) +, m_full_module_name( __Py_PackageContext() != NULL ? std::string( __Py_PackageContext() ) : m_module_name ) +, m_method_table() +{} + +ExtensionModuleBase::~ExtensionModuleBase() +{} + +const std::string &ExtensionModuleBase::name() const +{ + return m_module_name; +} + +const std::string &ExtensionModuleBase::fullName() const +{ + return m_full_module_name; +} + +class ExtensionModuleBasePtr : public PythonExtension +{ +public: + ExtensionModuleBasePtr( ExtensionModuleBase *_module ) + : module( _module ) + {} + + virtual ~ExtensionModuleBasePtr() + {} + + ExtensionModuleBase *module; +}; + +void ExtensionModuleBase::initialize( const char *module_doc ) +{ + PyObject *module_ptr = new ExtensionModuleBasePtr( this ); + Py_InitModule4 + ( + const_cast( m_module_name.c_str() ), // name + m_method_table.table(), // methods + const_cast( module_doc ), // docs + module_ptr, // pass to functions as "self" + PYTHON_API_VERSION // API version + ); +} + +Py::Module ExtensionModuleBase::module( void ) const +{ + return Module( m_full_module_name ); +} + +Py::Dict ExtensionModuleBase::moduleDictionary( void ) const +{ + return module().getDict(); +} + +//================================================================================ +// +// Implementation of PythonType +// +//================================================================================ +extern "C" +{ + static void standard_dealloc( PyObject *p ); + // + // All the following functions redirect the call from Python + // onto the matching virtual function in PythonExtensionBase + // + static int print_handler( PyObject *, FILE *, int ); + static PyObject *getattr_handler( PyObject *, char * ); + static int setattr_handler( PyObject *, char *, PyObject * ); + static PyObject *getattro_handler( PyObject *, PyObject * ); + static int setattro_handler( PyObject *, PyObject *, PyObject * ); + static int compare_handler( PyObject *, PyObject * ); + static PyObject *rich_compare_handler( PyObject *, PyObject *, int ); + static PyObject *repr_handler( PyObject * ); + static PyObject *str_handler( PyObject * ); + static long hash_handler( PyObject * ); + static PyObject *call_handler( PyObject *, PyObject *, PyObject * ); + static PyObject *iter_handler( PyObject * ); + static PyObject *iternext_handler( PyObject * ); + + // Sequence methods + static Py_ssize_t sequence_length_handler( PyObject * ); + static PyObject *sequence_concat_handler( PyObject *,PyObject * ); + static PyObject *sequence_repeat_handler( PyObject *, Py_ssize_t ); + static PyObject *sequence_item_handler( PyObject *, Py_ssize_t ); + static PyObject *sequence_slice_handler( PyObject *, Py_ssize_t, Py_ssize_t ); + static int sequence_ass_item_handler( PyObject *, Py_ssize_t, PyObject * ); + static int sequence_ass_slice_handler( PyObject *, Py_ssize_t, Py_ssize_t, PyObject * ); + + // Mapping + static Py_ssize_t mapping_length_handler( PyObject * ); + static PyObject *mapping_subscript_handler( PyObject *, PyObject * ); + static int mapping_ass_subscript_handler( PyObject *, PyObject *, PyObject * ); + + // Numeric methods + static int number_nonzero_handler( PyObject * ); + static PyObject *number_negative_handler( PyObject * ); + static PyObject *number_positive_handler( PyObject * ); + static PyObject *number_absolute_handler( PyObject * ); + static PyObject *number_invert_handler( PyObject * ); + static PyObject *number_int_handler( PyObject * ); + static PyObject *number_float_handler( PyObject * ); +#if !defined( PY3 ) + static PyObject *number_long_handler( PyObject * ); +#endif + static PyObject *number_oct_handler( PyObject * ); + static PyObject *number_hex_handler( PyObject * ); + static PyObject *number_add_handler( PyObject *, PyObject * ); + static PyObject *number_subtract_handler( PyObject *, PyObject * ); + static PyObject *number_multiply_handler( PyObject *, PyObject * ); + static PyObject *number_divide_handler( PyObject *, PyObject * ); + static PyObject *number_remainder_handler( PyObject *, PyObject * ); + static PyObject *number_divmod_handler( PyObject *, PyObject * ); + static PyObject *number_lshift_handler( PyObject *, PyObject * ); + static PyObject *number_rshift_handler( PyObject *, PyObject * ); + static PyObject *number_and_handler( PyObject *, PyObject * ); + static PyObject *number_xor_handler( PyObject *, PyObject * ); + static PyObject *number_or_handler( PyObject *, PyObject * ); + static PyObject *number_power_handler( PyObject *, PyObject *, PyObject * ); + + // Buffer + static Py_ssize_t buffer_getreadbuffer_handler( PyObject *, Py_ssize_t, void ** ); + static Py_ssize_t buffer_getwritebuffer_handler( PyObject *, Py_ssize_t, void ** ); + static Py_ssize_t buffer_getsegcount_handler( PyObject *, Py_ssize_t * ); +} + +extern "C" void standard_dealloc( PyObject *p ) +{ + PyMem_DEL( p ); +} + +bool PythonType::readyType() +{ + return PyType_Ready( table ) >= 0; +} + +PythonType &PythonType::supportSequenceType() +{ + if( !sequence_table ) + { + sequence_table = new PySequenceMethods; + memset( sequence_table, 0, sizeof( PySequenceMethods ) ); // ensure new fields are 0 + table->tp_as_sequence = sequence_table; + sequence_table->sq_length = sequence_length_handler; + sequence_table->sq_concat = sequence_concat_handler; + sequence_table->sq_repeat = sequence_repeat_handler; + sequence_table->sq_item = sequence_item_handler; +#if !defined( PY3 ) + sequence_table->sq_slice = sequence_slice_handler; +#endif + sequence_table->sq_ass_item = sequence_ass_item_handler; // BAS setup seperately? +#if !defined( PY3 ) + sequence_table->sq_ass_slice = sequence_ass_slice_handler; // BAS setup seperately? +#endif + } + return *this; +} + +PythonType &PythonType::supportMappingType() +{ + if( !mapping_table ) + { + mapping_table = new PyMappingMethods; + memset( mapping_table, 0, sizeof( PyMappingMethods ) ); // ensure new fields are 0 + table->tp_as_mapping = mapping_table; + mapping_table->mp_length = mapping_length_handler; + mapping_table->mp_subscript = mapping_subscript_handler; + mapping_table->mp_ass_subscript = mapping_ass_subscript_handler; // BAS setup seperately? + } + return *this; +} + +PythonType &PythonType::supportNumberType() +{ + if( !number_table ) + { + number_table = new PyNumberMethods; + memset( number_table, 0, sizeof( PyNumberMethods ) ); // ensure new fields are 0 + table->tp_as_number = number_table; + number_table->nb_add = number_add_handler; + number_table->nb_subtract = number_subtract_handler; + number_table->nb_multiply = number_multiply_handler; +#if !defined( PY3 ) + number_table->nb_divide = number_divide_handler; +#endif + number_table->nb_remainder = number_remainder_handler; + number_table->nb_divmod = number_divmod_handler; + number_table->nb_power = number_power_handler; + number_table->nb_negative = number_negative_handler; + number_table->nb_positive = number_positive_handler; + number_table->nb_absolute = number_absolute_handler; +#if !defined( PY3 ) + number_table->nb_nonzero = number_nonzero_handler; +#endif + number_table->nb_invert = number_invert_handler; + number_table->nb_lshift = number_lshift_handler; + number_table->nb_rshift = number_rshift_handler; + number_table->nb_and = number_and_handler; + number_table->nb_xor = number_xor_handler; + number_table->nb_or = number_or_handler; +#if !defined( PY3 ) + number_table->nb_coerce = 0; +#endif + number_table->nb_int = number_int_handler; +#if !defined( PY3 ) + number_table->nb_long = number_long_handler; +#endif + number_table->nb_float = number_float_handler; +#if !defined( PY3 ) + number_table->nb_oct = number_oct_handler; + number_table->nb_hex = number_hex_handler; +#endif + } + return *this; +} + +PythonType &PythonType::supportBufferType() +{ + if( !buffer_table ) + { + buffer_table = new PyBufferProcs; + memset( buffer_table, 0, sizeof( PyBufferProcs ) ); // ensure new fields are 0 + table->tp_as_buffer = buffer_table; +#if !defined( PY3 ) + buffer_table->bf_getreadbuffer = buffer_getreadbuffer_handler; + buffer_table->bf_getwritebuffer = buffer_getwritebuffer_handler; + buffer_table->bf_getsegcount = buffer_getsegcount_handler; +#endif + } + return *this; +} + +// if you define one sequence method you must define +// all of them except the assigns + +PythonType::PythonType( size_t basic_size, int itemsize, const char *default_name ) +: table( new PyTypeObject ) +, sequence_table( NULL ) +, mapping_table( NULL ) +, number_table( NULL ) +, buffer_table( NULL ) +{ + // PyTypeObject is defined in /Include/object.h + + memset( table, 0, sizeof( PyTypeObject ) ); // ensure new fields are 0 + *reinterpret_cast( table ) = py_object_initializer; +#if !defined( PY3 ) + table->ob_type = _Type_Type(); + table->ob_size = 0; +#endif + table->tp_name = const_cast( default_name ); + table->tp_basicsize = basic_size; + table->tp_itemsize = itemsize; + + // Methods to implement standard operations + table->tp_dealloc = (destructor)standard_dealloc; + table->tp_print = 0; + table->tp_getattr = 0; + table->tp_setattr = 0; + table->tp_compare = 0; + table->tp_repr = 0; + + // Method suites for standard classes + table->tp_as_number = 0; + table->tp_as_sequence = 0; + table->tp_as_mapping = 0; + + // More standard operations (here for binary compatibility) + table->tp_hash = 0; + table->tp_call = 0; + table->tp_str = 0; + table->tp_getattro = 0; + table->tp_setattro = 0; + + // Functions to access object as input/output buffer + table->tp_as_buffer = 0; + + // Flags to define presence of optional/expanded features + table->tp_flags = Py_TPFLAGS_DEFAULT; + + // Documentation string + table->tp_doc = 0; + +#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 0) + table->tp_traverse = 0L; + + // delete references to contained objects + table->tp_clear = 0L; +#else + table->tp_xxx5 = 0L; + table->tp_xxx6 = 0L; +#endif +#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 1) + // first defined in 2.1 + table->tp_richcompare = 0L; + // weak reference enabler + table->tp_weaklistoffset = 0L; +#else + table->tp_xxx7 = 0L; + table->tp_xxx8 = 0L; +#endif +#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 2) + // first defined in 2.3 + // Iterators + table->tp_iter = 0L; + table->tp_iternext = 0L; +#endif +#ifdef COUNT_ALLOCS + table->tp_alloc = 0; + table->tp_free = 0; + table->tp_maxalloc = 0; + table->tp_next = 0; +#endif +} + +PythonType::~PythonType() +{ + delete table; + delete sequence_table; + delete mapping_table; + delete number_table; + delete buffer_table; +} + +PyTypeObject *PythonType::type_object() const +{ + return table; +} + +PythonType &PythonType::name( const char *nam ) +{ + table->tp_name = const_cast( nam ); + return *this; +} + +const char *PythonType::getName() const +{ + return table->tp_name; +} + +PythonType &PythonType::doc( const char *d ) +{ + table->tp_doc = const_cast( d ); + return *this; +} + +const char *PythonType::getDoc() const +{ + return table->tp_doc; +} + +PythonType &PythonType::set_tp_dealloc( void (*tp_dealloc)( PyObject *self ) ) +{ + table->tp_dealloc = tp_dealloc; + return *this; +} + +PythonType &PythonType::set_tp_init( int (*tp_init)( PyObject *self, PyObject *args, PyObject *kwds ) ) +{ + table->tp_init = tp_init; + return *this; +} + +PythonType &PythonType::set_tp_new( PyObject *(*tp_new)( PyTypeObject *subtype, PyObject *args, PyObject *kwds ) ) +{ + table->tp_new = tp_new; + return *this; +} + +PythonType &PythonType::set_methods( PyMethodDef *methods ) +{ + table->tp_methods = methods; + return *this; +} + +PythonType &PythonType::supportClass() +{ + table->tp_flags |= Py_TPFLAGS_BASETYPE; + return *this; +} + +PythonType &PythonType::dealloc( void( *f )( PyObject * )) +{ + table->tp_dealloc = f; + return *this; +} + +PythonType &PythonType::supportPrint() +{ + table->tp_print = print_handler; + return *this; +} + +PythonType &PythonType::supportGetattr() +{ + table->tp_getattr = getattr_handler; + return *this; +} + +PythonType &PythonType::supportSetattr() +{ + table->tp_setattr = setattr_handler; + return *this; +} + +PythonType &PythonType::supportGetattro() +{ + table->tp_getattro = getattro_handler; + return *this; +} + +PythonType &PythonType::supportSetattro() +{ + table->tp_setattro = setattro_handler; + return *this; +} + +PythonType &PythonType::supportCompare() +{ + table->tp_compare = compare_handler; + return *this; +} + +#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 1) +PythonType &PythonType::supportRichCompare() +{ + table->tp_richcompare = rich_compare_handler; + return *this; +} +#endif + +PythonType &PythonType::supportRepr() +{ + table->tp_repr = repr_handler; + return *this; +} + +PythonType &PythonType::supportStr() +{ + table->tp_str = str_handler; + return *this; +} + +PythonType &PythonType::supportHash() +{ + table->tp_hash = hash_handler; + return *this; +} + +PythonType &PythonType::supportCall() +{ + table->tp_call = call_handler; + return *this; +} + +PythonType &PythonType::supportIter() +{ + table->tp_iter = iter_handler; + table->tp_iternext = iternext_handler; + return *this; +} + +//-------------------------------------------------------------------------------- +// +// Handlers +// +//-------------------------------------------------------------------------------- +PythonExtensionBase *getPythonExtensionBase( PyObject *self ) +{ + if( self->ob_type->tp_flags&Py_TPFLAGS_BASETYPE ) + { + PythonClassInstance *instance = reinterpret_cast( self ); + return instance->m_pycxx_object; + } + else + { + return static_cast( self ); + } +} + + +extern "C" int print_handler( PyObject *self, FILE *fp, int flags ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->print( fp, flags ); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +extern "C" PyObject *getattr_handler( PyObject *self, char *name ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->getattr( name ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" int setattr_handler( PyObject *self, char *name, PyObject *value ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->setattr( name, Py::Object( value ) ); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +extern "C" PyObject *getattro_handler( PyObject *self, PyObject *name ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->getattro( Py::String( name ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" int setattro_handler( PyObject *self, PyObject *name, PyObject *value ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->setattro( Py::String( name ), Py::Object( value ) ); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +extern "C" int compare_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->compare( Py::Object( other ) ); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 1) +extern "C" PyObject *rich_compare_handler( PyObject *self, PyObject *other, int op ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->rich_compare( Py::Object( other ), op ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} +#endif + +extern "C" PyObject *repr_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->repr() ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *str_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->str() ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" long hash_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->hash(); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +extern "C" PyObject *call_handler( PyObject *self, PyObject *args, PyObject *kw ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + if( kw != NULL ) + return new_reference_to( p->call( Py::Object( args ), Py::Object( kw ) ) ); + else + return new_reference_to( p->call( Py::Object( args ), Py::Object() ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *iter_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->iter() ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *iternext_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->iternext(); // might be a NULL ptr on end of iteration + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +// Sequence methods +extern "C" Py_ssize_t sequence_length_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->sequence_length(); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +extern "C" PyObject *sequence_concat_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->sequence_concat( Py::Object( other ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *sequence_repeat_handler( PyObject *self, Py_ssize_t count ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->sequence_repeat( count ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *sequence_item_handler( PyObject *self, Py_ssize_t index ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->sequence_item( index ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *sequence_slice_handler( PyObject *self, Py_ssize_t first, Py_ssize_t last ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->sequence_slice( first, last ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" int sequence_ass_item_handler( PyObject *self, Py_ssize_t index, PyObject *value ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->sequence_ass_item( index, Py::Object( value ) ); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +extern "C" int sequence_ass_slice_handler( PyObject *self, Py_ssize_t first, Py_ssize_t last, PyObject *value ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->sequence_ass_slice( first, last, Py::Object( value ) ); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +// Mapping +extern "C" Py_ssize_t mapping_length_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->mapping_length(); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +extern "C" PyObject *mapping_subscript_handler( PyObject *self, PyObject *key ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->mapping_subscript( Py::Object( key ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" int mapping_ass_subscript_handler( PyObject *self, PyObject *key, PyObject *value ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->mapping_ass_subscript( Py::Object( key ), Py::Object( value ) ); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +// Number +extern "C" int number_nonzero_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->number_nonzero(); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +extern "C" PyObject *number_negative_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_negative() ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_positive_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_positive() ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_absolute_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_absolute() ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_invert_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_invert() ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_int_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_int() ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_float_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_float() ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_long_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_long() ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_oct_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_oct() ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_hex_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_hex() ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_add_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_add( Py::Object( other ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_subtract_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_subtract( Py::Object( other ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_multiply_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_multiply( Py::Object( other ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_divide_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_divide( Py::Object( other ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_remainder_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_remainder( Py::Object( other ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_divmod_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_divmod( Py::Object( other ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_lshift_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_lshift( Py::Object( other ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_rshift_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_rshift( Py::Object( other ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_and_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_and( Py::Object( other ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_xor_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_xor( Py::Object( other ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_or_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_or( Py::Object( other ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_power_handler( PyObject *self, PyObject *x1, PyObject *x2 ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_power( Py::Object( x1 ), Py::Object( x2 ) ) ); + } + catch( Py::Exception &) + { + return NULL; // indicate error + } +} + +// Buffer +extern "C" Py_ssize_t buffer_getreadbuffer_handler( PyObject *self, Py_ssize_t index, void **pp ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->buffer_getreadbuffer( index, pp ); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +extern "C" Py_ssize_t buffer_getwritebuffer_handler( PyObject *self, Py_ssize_t index, void **pp ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->buffer_getwritebuffer( index, pp ); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +extern "C" Py_ssize_t buffer_getsegcount_handler( PyObject *self, Py_ssize_t *count ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->buffer_getsegcount( count ); + } + catch( Py::Exception &) + { + return -1; // indicate error + } +} + +//================================================================================ +// +// Implementation of PythonExtensionBase +// +//================================================================================ +#define missing_method( method ) \ + throw RuntimeError( "Extension object missing implement of " #method ); + +PythonExtensionBase::PythonExtensionBase() +{ + ob_refcnt = 0; +} + +PythonExtensionBase::~PythonExtensionBase() +{ + assert( ob_refcnt == 0 ); +} + +void PythonExtensionBase::reinit( Tuple &args, Dict &kwds ) +{ + throw RuntimeError( "Must not call __init__ twice on this class" ); +} + +Py::Object PythonExtensionBase::genericGetAttro( const Py::String &name ) +{ + return asObject( PyObject_GenericGetAttr( selfPtr(), name.ptr() ) ); +} + +int PythonExtensionBase::genericSetAttro( const Py::String &name, const Py::Object &value ) +{ + return PyObject_GenericSetAttr( selfPtr(), name.ptr(), value.ptr() ); +} + +int PythonExtensionBase::print( FILE *, int ) +{ + missing_method( print ); + return -1; +} + +Py::Object PythonExtensionBase::getattr( const char * ) +{ + missing_method( getattr ); + return Py::None(); +} + +int PythonExtensionBase::setattr( const char *, const Py::Object &) +{ + missing_method( setattr ); + return -1; +} + +Py::Object PythonExtensionBase::getattro( const Py::String &) +{ + missing_method( getattro ); + return Py::None(); +} + +int PythonExtensionBase::setattro( const Py::String &, const Py::Object &) +{ + missing_method( setattro ); + return -1; +} + +int PythonExtensionBase::compare( const Py::Object &) +{ + missing_method( compare ); + return -1; +} + +#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 1) +Py::Object PythonExtensionBase::rich_compare( const Py::Object &, int op ) +{ + missing_method( rich_compare ); + return Py::None(); +} + +#endif +Py::Object PythonExtensionBase::repr() +{ + missing_method( repr ); + return Py::None(); +} + +Py::Object PythonExtensionBase::str() +{ + missing_method( str ); + return Py::None(); +} + +long PythonExtensionBase::hash() +{ + missing_method( hash ); + return -1; +} + +Py::Object PythonExtensionBase::call( const Py::Object &, const Py::Object &) +{ + missing_method( call ); + return Py::None(); +} + +Py::Object PythonExtensionBase::iter() +{ + missing_method( iter ); + return Py::None(); +} + +PyObject *PythonExtensionBase::iternext() +{ + missing_method( iternext ); + return NULL; +} + +// Sequence methods +int PythonExtensionBase::sequence_length() +{ + missing_method( sequence_length ); + return -1; +} + +Py::Object PythonExtensionBase::sequence_concat( const Py::Object &) +{ + missing_method( sequence_concat ); + return Py::None(); +} + +Py::Object PythonExtensionBase::sequence_repeat( Py_ssize_t ) +{ + missing_method( sequence_repeat ); + return Py::None(); +} + +Py::Object PythonExtensionBase::sequence_item( Py_ssize_t ) +{ + missing_method( sequence_item ); + return Py::None(); +} + +Py::Object PythonExtensionBase::sequence_slice( Py_ssize_t, Py_ssize_t ) +{ + missing_method( sequence_slice ); + return Py::None(); +} + +int PythonExtensionBase::sequence_ass_item( Py_ssize_t, const Py::Object &) +{ + missing_method( sequence_ass_item ); + return -1; +} + +int PythonExtensionBase::sequence_ass_slice( Py_ssize_t, Py_ssize_t, const Py::Object &) +{ + missing_method( sequence_ass_slice ); + return -1; +} + +// Mapping +int PythonExtensionBase::mapping_length() +{ + missing_method( mapping_length ); + return -1; +} + +Py::Object PythonExtensionBase::mapping_subscript( const Py::Object &) +{ + missing_method( mapping_subscript ); + return Py::None(); +} + +int PythonExtensionBase::mapping_ass_subscript( const Py::Object &, const Py::Object &) +{ + missing_method( mapping_ass_subscript ); + return -1; +} + +// Number +int PythonExtensionBase::number_nonzero() +{ + missing_method( number_nonzero ); + return -1; +} + +Py::Object PythonExtensionBase::number_negative() +{ + missing_method( number_negative ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_positive() +{ + missing_method( number_positive ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_absolute() +{ + missing_method( number_absolute ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_invert() +{ + missing_method( number_invert ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_int() +{ + missing_method( number_int ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_float() +{ + missing_method( number_float ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_long() +{ + missing_method( number_long ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_oct() +{ + missing_method( number_oct ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_hex() +{ + missing_method( number_hex ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_add( const Py::Object &) +{ + missing_method( number_add ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_subtract( const Py::Object &) +{ + missing_method( number_subtract ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_multiply( const Py::Object &) +{ + missing_method( number_multiply ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_divide( const Py::Object &) +{ + missing_method( number_divide ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_remainder( const Py::Object &) +{ + missing_method( number_remainder ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_divmod( const Py::Object &) +{ + missing_method( number_divmod ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_lshift( const Py::Object &) +{ + missing_method( number_lshift ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_rshift( const Py::Object &) +{ + missing_method( number_rshift ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_and( const Py::Object &) +{ + missing_method( number_and ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_xor( const Py::Object &) +{ + missing_method( number_xor ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_or( const Py::Object &) +{ + missing_method( number_or ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_power( const Py::Object &, const Py::Object &) +{ + missing_method( number_power ); + return Py::None(); +} + +// Buffer +Py_ssize_t PythonExtensionBase::buffer_getreadbuffer( Py_ssize_t, void** ) +{ + missing_method( buffer_getreadbuffer ); + return -1; +} + +Py_ssize_t PythonExtensionBase::buffer_getwritebuffer( Py_ssize_t, void** ) +{ + missing_method( buffer_getwritebuffer ); + return -1; +} + +Py_ssize_t PythonExtensionBase::buffer_getsegcount( Py_ssize_t* ) +{ + missing_method( buffer_getsegcount ); + return -1; +} + +//-------------------------------------------------------------------------------- +// +// Method call handlers for +// PythonExtensionBase +// ExtensionModuleBase +// +//-------------------------------------------------------------------------------- +extern "C" PyObject *method_keyword_call_handler( PyObject *_self_and_name_tuple, PyObject *_args, PyObject *_keywords ) +{ + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + void *self_as_void = PyCObject_AsVoidPtr( self_in_cobject ); + if( self_as_void == NULL ) + return NULL; + + ExtensionModuleBase *self = static_cast( self_as_void ); + + Tuple args( _args ); + + if( _keywords == NULL ) + { + Dict keywords; // pass an empty dict + + Object result + ( + self->invoke_method_keyword + ( + PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ), + args, + keywords + ) + ); + + return new_reference_to( result.ptr() ); + } + else + { + Dict keywords( _keywords ); // make dict + + Object result + ( + self->invoke_method_keyword + ( + PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ), + args, + keywords + ) + ); + + return new_reference_to( result.ptr() ); + } + } + catch( Exception & ) + { + return 0; + } +} + +extern "C" PyObject *method_varargs_call_handler( PyObject *_self_and_name_tuple, PyObject *_args ) +{ + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + void *self_as_void = PyCObject_AsVoidPtr( self_in_cobject ); + if( self_as_void == NULL ) + return NULL; + + ExtensionModuleBase *self = static_cast( self_as_void ); + Tuple args( _args ); + + Object result + ( + self->invoke_method_varargs + ( + PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ), + args + ) + ); + + return new_reference_to( result.ptr() ); + } + catch( Exception & ) + { + return 0; + } +} + +extern "C" void do_not_dealloc( void * ) +{} + +//-------------------------------------------------------------------------------- +// +// ExtensionExceptionType +// +//-------------------------------------------------------------------------------- +ExtensionExceptionType::ExtensionExceptionType() +: Py::Object() +{ +} + +void ExtensionExceptionType::init( ExtensionModuleBase &module, const std::string& name ) +{ + std::string module_name( module.fullName() ); + module_name += "."; + module_name += name; + set( PyErr_NewException( const_cast( module_name.c_str() ), NULL, NULL ), true ); +} + +void ExtensionExceptionType::init( ExtensionModuleBase &module, const std::string& name, ExtensionExceptionType &parent) +{ + std::string module_name( module.fullName() ); + module_name += "."; + module_name += name; + set( PyErr_NewException( const_cast( module_name.c_str() ), parent.ptr(), NULL ), true ); +} + +ExtensionExceptionType::~ExtensionExceptionType() +{ +} + +Exception::Exception( ExtensionExceptionType &exception, const std::string& reason ) +{ + PyErr_SetString( exception.ptr(), reason.c_str() ); +} + +Exception::Exception( ExtensionExceptionType &exception, Object &reason ) +{ + PyErr_SetObject( exception.ptr(), reason.ptr() ); +} + +Exception::Exception( PyObject *exception, Object &reason ) +{ + PyErr_SetObject( exception, reason.ptr() ); +} + +} // end of namespace Py diff --git a/CXX/Python2/cxxextensions.c b/CXX/Python2/cxxextensions.c new file mode 100644 index 000000000000..edae3be6bce9 --- /dev/null +++ b/CXX/Python2/cxxextensions.c @@ -0,0 +1,49 @@ +/*---------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//---------------------------------------------------------------------------*/ + +#include "CXX/WrapPython.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +PyObject py_object_initializer = {PyObject_HEAD_INIT(0)}; + +#ifdef __cplusplus +} +#endif diff --git a/CXX/Python2/cxxsupport.cxx b/CXX/Python2/cxxsupport.cxx new file mode 100644 index 000000000000..1dfba5a1908b --- /dev/null +++ b/CXX/Python2/cxxsupport.cxx @@ -0,0 +1,174 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#include "CXX/Objects.hxx" +namespace Py { + +Py_UNICODE unicode_null_string[1] = { 0 }; + +Type Object::type () const +{ + return Type (PyObject_Type (p), true); +} + +String Object::str () const +{ + return String (PyObject_Str (p), true); +} + +String Object::repr () const +{ + return String (PyObject_Repr (p), true); +} + +std::string Object::as_string() const +{ + return static_cast(str()); +} + +List Object::dir () const + { + return List (PyObject_Dir (p), true); + } + +bool Object::isType (const Type& t) const +{ + return type ().ptr() == t.ptr(); +} + +Char::operator String() const +{ + return String(ptr()); +} + +// TMM: non-member operaters for iterators - see above +// I've also made a bug fix in respect to the cxx code +// (dereffed the left.seq and right.seq comparison) +bool operator==(const Sequence::iterator& left, const Sequence::iterator& right) +{ + return left.eql( right ); +} + +bool operator!=(const Sequence::iterator& left, const Sequence::iterator& right) +{ + return left.neq( right ); +} + +bool operator< (const Sequence::iterator& left, const Sequence::iterator& right) +{ + return left.lss( right ); +} + +bool operator> (const Sequence::iterator& left, const Sequence::iterator& right) +{ + return left.gtr( right ); +} + +bool operator<=(const Sequence::iterator& left, const Sequence::iterator& right) +{ + return left.leq( right ); +} + +bool operator>=(const Sequence::iterator& left, const Sequence::iterator& right) +{ + return left.geq( right ); +} + +// now for const_iterator +bool operator==(const Sequence::const_iterator& left, const Sequence::const_iterator& right) +{ + return left.eql( right ); +} + +bool operator!=(const Sequence::const_iterator& left, const Sequence::const_iterator& right) +{ + return left.neq( right ); +} + +bool operator< (const Sequence::const_iterator& left, const Sequence::const_iterator& right) +{ + return left.lss( right ); +} + +bool operator> (const Sequence::const_iterator& left, const Sequence::const_iterator& right) +{ + return left.gtr( right ); +} + +bool operator<=(const Sequence::const_iterator& left, const Sequence::const_iterator& right) +{ + return left.leq( right ); +} + +bool operator>=(const Sequence::const_iterator& left, const Sequence::const_iterator& right) +{ + return left.geq( right ); +} + +// For mappings: +bool operator==(const Mapping::iterator& left, const Mapping::iterator& right) +{ + return left.eql( right ); +} + +bool operator!=(const Mapping::iterator& left, const Mapping::iterator& right) +{ + return left.neq( right ); +} + +// now for const_iterator +bool operator==(const Mapping::const_iterator& left, const Mapping::const_iterator& right) +{ + return left.eql( right ); +} + +bool operator!=(const Mapping::const_iterator& left, const Mapping::const_iterator& right) +{ + return left.neq( right ); +} + +// TMM: 31May'01 - Added the #ifndef so I can exclude iostreams. +#ifndef CXX_NO_IOSTREAMS +// output + +std::ostream& operator<< (std::ostream& os, const Object& ob) +{ + return (os << static_cast(ob.str())); +} +#endif + +} // Py diff --git a/CXX/Python3/Config.hxx b/CXX/Python3/Config.hxx new file mode 100644 index 000000000000..27e507e22afa --- /dev/null +++ b/CXX/Python3/Config.hxx @@ -0,0 +1,110 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __PyCXX_config_hh__ +#define __PyCXX_config_hh__ + +// +// Microsoft VC++ 6.0 has no traits +// +#if defined( _MSC_VER ) + +# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 1 + +#elif defined( __GNUC__ ) +# if __GNUC__ >= 3 +# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 1 +# else +# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 0 +#endif + +// +// Assume all other compilers do +// +#else + +// Macros to deal with deficiencies in compilers +# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 1 +#endif + +#if STANDARD_LIBRARY_HAS_ITERATOR_TRAITS +# define random_access_iterator_parent(itemtype) std::iterator +#else +# define random_access_iterator_parent(itemtype) std::random_access_iterator +#endif + +// +// Which C++ standard is in use? +// +#if defined( _MSC_VER ) +# if _MSC_VER <= 1200 +// MSVC++ 6.0 +# define PYCXX_ISO_CPP_LIB 0 +# define STR_STREAM +# define TEMPLATE_TYPENAME class +# else +# define PYCXX_ISO_CPP_LIB 1 +# define STR_STREAM +# define TEMPLATE_TYPENAME typename +# endif +#elif defined( __GNUC__ ) +# if __GNUC__ >= 3 +# define PYCXX_ISO_CPP_LIB 1 +# define STR_STREAM +# define TEMPLATE_TYPENAME typename +# else +# define PYCXX_ISO_CPP_LIB 0 +# define STR_STREAM +# define TEMPLATE_TYPENAME class +# endif +#endif + +#if PYCXX_ISO_CPP_LIB +# define STR_STREAM +# define OSTRSTREAM ostringstream +# define EXPLICIT_TYPENAME typename +# define EXPLICIT_CLASS class +# define TEMPLATE_TYPENAME typename +#else +# define STR_STREAM +# define OSTRSTREAM ostrstream +# define EXPLICIT_TYPENAME +# define EXPLICIT_CLASS +# define TEMPLATE_TYPENAME class +#endif + +#endif // __PyCXX_config_hh__ diff --git a/CXX/Python3/CxxDebug.hxx b/CXX/Python3/CxxDebug.hxx new file mode 100644 index 000000000000..b646ffdd9afa --- /dev/null +++ b/CXX/Python3/CxxDebug.hxx @@ -0,0 +1,17 @@ +// +// CxxDebug.hxx +// +// Copyright (c) 2008 Barry A. Scott +// +#ifndef __CXX_Debug_hxx +#define __CXX_Debug_hxx + +// +// Functions useful when debugging PyCXX +// +#ifdef PYCXX_DEBUG +extern void bpt(); +extern void printRefCount( PyObject *obj ); +#endif + +#endif diff --git a/CXX/Python3/Exception.hxx b/CXX/Python3/Exception.hxx new file mode 100644 index 000000000000..07908d1ef4b2 --- /dev/null +++ b/CXX/Python3/Exception.hxx @@ -0,0 +1,250 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_Exception_h +#define __CXX_Exception_h + +#include "CXX/WrapPython.h" +#include "CXX/Version.hxx" +#include "CXX/Python3/Config.hxx" +#include "CXX/Python3/CxxDebug.hxx" +#include "CXX/Python3/IndirectPythonInterface.hxx" + +#include +#include + +// This mimics the Python structure, in order to minimize confusion +namespace Py +{ + class ExtensionExceptionType; + + class Object; + + class Exception + { + public: + Exception( ExtensionExceptionType &exception, const std::string &reason ); + Exception( ExtensionExceptionType &exception, Object &reason ); + + explicit Exception () + {} + + Exception (const std::string &reason) + { + PyErr_SetString( Py::_Exc_RuntimeError(), reason.c_str() ); + } + + Exception( PyObject *exception, const std::string &reason ) + { + PyErr_SetString( exception, reason.c_str() ); + } + + Exception( PyObject *exception, Object &reason ); + + void clear() // clear the error + // technically but not philosophically const + { + PyErr_Clear(); + } + }; + + + // Abstract + class StandardError: public Exception + { + protected: + explicit StandardError() + {} + }; + + class LookupError: public StandardError + { + protected: + explicit LookupError() + {} + }; + + class ArithmeticError: public StandardError + { + protected: + explicit ArithmeticError() + {} + }; + + class EnvironmentError: public StandardError + { + protected: + explicit EnvironmentError() + {} + }; + + // Concrete + + class TypeError: public StandardError + { + public: + TypeError (const std::string& reason) + : StandardError() + { + PyErr_SetString( Py::_Exc_TypeError(),reason.c_str() ); + } + }; + + class IndexError: public LookupError + { + public: + IndexError (const std::string& reason) + : LookupError() + { + PyErr_SetString( Py::_Exc_IndexError(), reason.c_str() ); + } + }; + + class AttributeError: public StandardError + { + public: + AttributeError (const std::string& reason) + : StandardError() + { + PyErr_SetString( Py::_Exc_AttributeError(), reason.c_str() ); + } + }; + + class NameError: public StandardError + { + public: + NameError (const std::string& reason) + : StandardError() + { + PyErr_SetString( Py::_Exc_NameError(), reason.c_str() ); + } + }; + + class RuntimeError: public StandardError + { + public: + RuntimeError (const std::string& reason) + : StandardError() + { + PyErr_SetString( Py::_Exc_RuntimeError(), reason.c_str() ); + } + }; + + class SystemError: public StandardError + { + public: + SystemError (const std::string& reason) + : StandardError() + { + PyErr_SetString( Py::_Exc_SystemError(),reason.c_str() ); + } + }; + + class KeyError: public LookupError + { + public: + KeyError (const std::string& reason) + : LookupError() + { + PyErr_SetString( Py::_Exc_KeyError(),reason.c_str() ); + } + }; + + + class ValueError: public StandardError + { + public: + ValueError (const std::string& reason) + : StandardError() + { + PyErr_SetString( Py::_Exc_ValueError(), reason.c_str() ); + } + }; + + class OverflowError: public ArithmeticError + { + public: + OverflowError (const std::string& reason) + : ArithmeticError() + { + PyErr_SetString( Py::_Exc_OverflowError(), reason.c_str() ); + } + }; + + class ZeroDivisionError: public ArithmeticError + { + public: + ZeroDivisionError (const std::string& reason) + : ArithmeticError() + { + PyErr_SetString( Py::_Exc_ZeroDivisionError(), reason.c_str() ); + } + }; + + class FloatingPointError: public ArithmeticError + { + public: + FloatingPointError (const std::string& reason) + : ArithmeticError() + { + PyErr_SetString( Py::_Exc_FloatingPointError(), reason.c_str() ); + } + }; + + class MemoryError: public StandardError + { + public: + MemoryError (const std::string& reason) + : StandardError() + { + PyErr_SetString( Py::_Exc_MemoryError(), reason.c_str() ); + } + }; + + class SystemExit: public StandardError + { + public: + SystemExit (const std::string& reason) + : StandardError() + { + PyErr_SetString( Py::_Exc_SystemExit(),reason.c_str() ); + } + }; + +}// Py + +#endif diff --git a/CXX/Python3/ExtensionModule.hxx b/CXX/Python3/ExtensionModule.hxx new file mode 100644 index 000000000000..b41decc821c5 --- /dev/null +++ b/CXX/Python3/ExtensionModule.hxx @@ -0,0 +1,206 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_ExtensionModule__h +#define __CXX_ExtensionModule__h + +namespace Py +{ + class ExtensionModuleBase + { + public: + ExtensionModuleBase( const char *name ); + virtual ~ExtensionModuleBase(); + + Module module( void ) const; // only valid after initialize() has been called + Dict moduleDictionary( void ) const; // only valid after initialize() has been called + + virtual Object invoke_method_noargs( void *method_def ) = 0; + virtual Object invoke_method_keyword( void *method_def, const Tuple &_args, const Dict &_keywords ) = 0; + virtual Object invoke_method_varargs( void *method_def, const Tuple &_args ) = 0; + + const std::string &name() const; + const std::string &fullName() const; + + // what is returned from PyInit_ function + Object moduleObject( void ) const; + + protected: + // Initialize the module + void initialize( const char *module_doc ); + + const std::string m_module_name; + const std::string m_full_module_name; + MethodTable m_method_table; + PyModuleDef m_module_def; + PyObject *m_module; + + private: + // + // prevent the compiler generating these unwanted functions + // + ExtensionModuleBase( const ExtensionModuleBase & ); //unimplemented + void operator=( const ExtensionModuleBase & ); //unimplemented + }; + + // Note: Python calls noargs as varargs buts args==NULL + extern "C" PyObject *method_noargs_call_handler( PyObject *_self_and_name_tuple, PyObject * ); + extern "C" PyObject *method_varargs_call_handler( PyObject *_self_and_name_tuple, PyObject *_args ); + extern "C" PyObject *method_keyword_call_handler( PyObject *_self_and_name_tuple, PyObject *_args, PyObject *_keywords ); + + extern "C" void do_not_dealloc( void * ); + + template + class ExtensionModule : public ExtensionModuleBase + { + public: + ExtensionModule( const char *name ) + : ExtensionModuleBase( name ) + {} + virtual ~ExtensionModule() + {} + + protected: + typedef Object (T::*method_noargs_function_t)(); + typedef Object (T::*method_varargs_function_t)( const Tuple &args ); + typedef Object (T::*method_keyword_function_t)( const Tuple &args, const Dict &kws ); + typedef std::map *> method_map_t; + + static void add_noargs_method( const char *name, method_noargs_function_t function, const char *doc="" ) + { + method_map_t &mm = methods(); + mm[ std::string( name ) ] = new MethodDefExt( name, function, method_noargs_call_handler, doc ); + } + + static void add_varargs_method( const char *name, method_varargs_function_t function, const char *doc="" ) + { + method_map_t &mm = methods(); + mm[ std::string( name ) ] = new MethodDefExt( name, function, method_varargs_call_handler, doc ); + } + + static void add_keyword_method( const char *name, method_keyword_function_t function, const char *doc="" ) + { + method_map_t &mm = methods(); + mm[ std::string( name ) ] = new MethodDefExt( name, function, method_keyword_call_handler, doc ); + } + + void initialize( const char *module_doc="" ) + { + ExtensionModuleBase::initialize( module_doc ); + Dict dict( moduleDictionary() ); + + // + // put each of the methods into the modules dictionary + // so that we get called back at the function in T. + // + method_map_t &mm = methods(); + EXPLICIT_TYPENAME method_map_t::const_iterator i = mm.begin(); + EXPLICIT_TYPENAME method_map_t::const_iterator i_end = mm.end(); + for ( ; i != i_end; ++i ) + { + MethodDefExt *method_def = (*i).second; + + static PyObject *self = PyCObject_FromVoidPtr( this, do_not_dealloc ); + + Tuple args( 2 ); + args[0] = Object( self ); + args[1] = Object( PyCObject_FromVoidPtr( method_def, do_not_dealloc ) ); + + PyObject *func = PyCFunction_New + ( + &method_def->ext_meth_def, + new_reference_to( args ) + ); + + method_def->py_method = Object( func, true ); + + dict[ (*i).first ] = method_def->py_method; + } + } + + protected: // Tom Malcolmson reports that derived classes need access to these + static method_map_t &methods( void ) + { + static method_map_t *map_of_methods = NULL; + if( map_of_methods == NULL ) + map_of_methods = new method_map_t; + + return *map_of_methods; + } + + // this invoke function must be called from within a try catch block + virtual Object invoke_method_noargs( void *method_def ) + { + // cast up to the derived class, method_def and call + T *self = static_cast( this ); + MethodDefExt *meth_def = reinterpret_cast *>( method_def ); + + return (self->*meth_def->ext_noargs_function)(); + } + + // this invoke function must be called from within a try catch block + virtual Object invoke_method_varargs( void *method_def, const Tuple &args ) + { + // cast up to the derived class, method_def and call + T *self = static_cast( this ); + MethodDefExt *meth_def = reinterpret_cast *>( method_def ); + + return (self->*meth_def->ext_varargs_function)( args ); + } + + // this invoke function must be called from within a try catch block + virtual Object invoke_method_keyword( void *method_def, const Tuple &args, const Dict &keywords ) + { + // cast up to the derived class, method_def and call + T *self = static_cast( this ); + MethodDefExt *meth_def = reinterpret_cast *>( method_def ); + + return (self->*meth_def->ext_keyword_function)( args, keywords ); + } + + private: + // + // prevent the compiler generating these unwanted functions + // + ExtensionModule( const ExtensionModule & ); //unimplemented + void operator=( const ExtensionModule & ); //unimplemented + }; +} // Namespace Py + + +// End of __CXX_ExtensionModule__h +#endif diff --git a/CXX/Python3/ExtensionOldType.hxx b/CXX/Python3/ExtensionOldType.hxx new file mode 100644 index 000000000000..56e6af2ecbfd --- /dev/null +++ b/CXX/Python3/ExtensionOldType.hxx @@ -0,0 +1,393 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_ExtensionOldType__h +#define __CXX_ExtensionOldType__h + +namespace Py +{ + template class PythonExtension + : public PythonExtensionBase + { + public: + static PyTypeObject *type_object() + { + return behaviors().type_object(); + } + + static bool check( PyObject *p ) + { + // is p like me? + return p->ob_type == type_object(); + } + + static bool check( const Object &ob ) + { + return check( ob.ptr() ); + } + + // + // every object needs getattr implemented + // to support methods + // + virtual Object getattr( const char *name ) + { + return getattr_methods( name ); + } + + PyObject *selfPtr() + { + return this; + } + + protected: + explicit PythonExtension() + : PythonExtensionBase() + { + PyObject_Init( this, type_object() ); + + // every object must support getattr + behaviors().supportGetattr(); + } + + virtual ~PythonExtension() + {} + + static PythonType &behaviors() + { + static PythonType* p; + if( p == NULL ) + { +#if defined( _CPPRTTI ) || defined( __GNUG__ ) + const char *default_name =( typeid( T ) ).name(); +#else + const char *default_name = "unknown"; +#endif + p = new PythonType( sizeof( T ), 0, default_name ); + p->set_tp_dealloc( extension_object_deallocator ); + } + + return *p; + } + + typedef Object (T::*method_noargs_function_t)(); + typedef Object (T::*method_varargs_function_t)( const Tuple &args ); + typedef Object (T::*method_keyword_function_t)( const Tuple &args, const Dict &kws ); + typedef std::map *> method_map_t; + + // support the default attributes, __name__, __doc__ and methods + virtual Object getattr_default( const char *_name ) + { + std::string name( _name ); + + if( name == "__name__" && type_object()->tp_name != NULL ) + { + return Py::String( type_object()->tp_name ); + } + + if( name == "__doc__" && type_object()->tp_doc != NULL ) + { + return Py::String( type_object()->tp_doc ); + } + +// trying to fake out being a class for help() +// else if( name == "__bases__" ) +// { +// return Py::Tuple( 0 ); +// } +// else if( name == "__module__" ) +// { +// return Py::Nothing(); +// } +// else if( name == "__dict__" ) +// { +// return Py::Dict(); +// } + + return getattr_methods( _name ); + } + + // turn a name into function object + virtual Object getattr_methods( const char *_name ) + { + std::string name( _name ); + + method_map_t &mm = methods(); + + // see if name exists and get entry with method + EXPLICIT_TYPENAME method_map_t::const_iterator i = mm.find( name ); + if( i == mm.end() ) + { + if( name == "__methods__" ) + { + List methods; + + i = mm.begin(); + EXPLICIT_TYPENAME method_map_t::const_iterator i_end = mm.end(); + + for( ; i != i_end; ++i ) + methods.append( String( (*i).first ) ); + + return methods; + } + + throw AttributeError( name ); + } + + MethodDefExt *method_def = i->second; + + Tuple self( 2 ); + + self[0] = Object( this ); + self[1] = Object( PyCObject_FromVoidPtr( method_def, do_not_dealloc ) ); + + PyObject *func = PyCFunction_New( &method_def->ext_meth_def, self.ptr() ); + + return Object(func, true); + } + + // check that all methods added are unique + static void check_unique_method_name( const char *name ) + { + method_map_t &mm = methods(); + EXPLICIT_TYPENAME method_map_t::const_iterator i; + i = mm.find( name ); + if( i != mm.end() ) + throw AttributeError( name ); + } + + static void add_noargs_method( const char *name, method_noargs_function_t function, const char *doc="" ) + { + check_unique_method_name( name ); + method_map_t &mm = methods(); + mm[ std::string( name ) ] = new MethodDefExt( name, function, method_noargs_call_handler, doc ); + } + + static void add_varargs_method( const char *name, method_varargs_function_t function, const char *doc="" ) + { + check_unique_method_name( name ); + method_map_t &mm = methods(); + mm[ std::string( name ) ] = new MethodDefExt( name, function, method_varargs_call_handler, doc ); + } + + static void add_keyword_method( const char *name, method_keyword_function_t function, const char *doc="" ) + { + check_unique_method_name( name ); + method_map_t &mm = methods(); + mm[ std::string( name ) ] = new MethodDefExt( name, function, method_keyword_call_handler, doc ); + } + + private: + static method_map_t &methods( void ) + { + static method_map_t *map_of_methods = NULL; + if( map_of_methods == NULL ) + map_of_methods = new method_map_t; + + return *map_of_methods; + } + + // Note: Python calls noargs as varargs buts args==NULL + static PyObject *method_noargs_call_handler( PyObject *_self_and_name_tuple, PyObject * ) + { + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + T *self = static_cast( self_in_cobject ); + + MethodDefExt *meth_def = reinterpret_cast *>( + PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ) ); + + Object result; + + // Adding try & catch in case of STL debug-mode exceptions. + #ifdef _STLP_DEBUG + try + { + result = (self->*meth_def->ext_noargs_function)(); + } + catch( std::__stl_debug_exception ) + { + // throw cxx::RuntimeError( sErrMsg ); + throw RuntimeError( "Error message not set yet." ); + } + #else + result = (self->*meth_def->ext_noargs_function)(); + #endif // _STLP_DEBUG + + return new_reference_to( result.ptr() ); + } + catch( Exception & ) + { + return 0; + } + } + + static PyObject *method_varargs_call_handler( PyObject *_self_and_name_tuple, PyObject *_args ) + { + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + T *self = static_cast( self_in_cobject ); + MethodDefExt *meth_def = reinterpret_cast *>( + PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ) ); + + Tuple args( _args ); + + Object result; + + // Adding try & catch in case of STL debug-mode exceptions. + #ifdef _STLP_DEBUG + try + { + result = (self->*meth_def->ext_varargs_function)( args ); + } + catch( std::__stl_debug_exception ) + { + throw RuntimeError( "Error message not set yet." ); + } + #else + result = (self->*meth_def->ext_varargs_function)( args ); + #endif // _STLP_DEBUG + + return new_reference_to( result.ptr() ); + } + catch( Exception & ) + { + return 0; + } + } + + static PyObject *method_keyword_call_handler( PyObject *_self_and_name_tuple, PyObject *_args, PyObject *_keywords ) + { + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + T *self = static_cast( self_in_cobject ); + MethodDefExt *meth_def = reinterpret_cast *>( + PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ) ); + + Tuple args( _args ); + + // _keywords may be NULL so be careful about the way the dict is created + Dict keywords; + if( _keywords != NULL ) + keywords = Dict( _keywords ); + + Object result( ( self->*meth_def->ext_keyword_function )( args, keywords ) ); + + return new_reference_to( result.ptr() ); + } + catch( Exception & ) + { + return 0; + } + } + + static void extension_object_deallocator( PyObject* t ) + { + delete (T *)( t ); + } + + // + // prevent the compiler generating these unwanted functions + // + explicit PythonExtension( const PythonExtension &other ); + void operator=( const PythonExtension &rhs ); + }; + + // + // ExtensionObject is an Object that will accept only T's. + // + template + class ExtensionObject: public Object + { + public: + + explicit ExtensionObject( PyObject *pyob ) + : Object( pyob ) + { + validate(); + } + + ExtensionObject( const ExtensionObject &other ) + : Object( *other ) + { + validate(); + } + + ExtensionObject( const Object &other ) + : Object( *other ) + { + validate(); + } + + ExtensionObject &operator=( const Object &rhs ) + { + return( *this = *rhs ); + } + + ExtensionObject &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + virtual bool accepts( PyObject *pyob ) const + { + return( pyob && T::check( pyob ) ); + } + + // + // Obtain a pointer to the PythonExtension object + // + T *extensionObject( void ) + { + return static_cast( ptr() ); + } + }; +} // Namespace Py + +// End of __CXX_ExtensionOldType__h +#endif diff --git a/CXX/Python3/ExtensionType.hxx b/CXX/Python3/ExtensionType.hxx new file mode 100644 index 000000000000..c1b8721e4357 --- /dev/null +++ b/CXX/Python3/ExtensionType.hxx @@ -0,0 +1,370 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_ExtensionClass__h +#define __CXX_ExtensionClass__h + +#define PYCXX_NOARGS_METHOD_NAME( NAME ) _callNoArgsMethod__##NAME +#define PYCXX_VARARGS_METHOD_NAME( NAME ) _callVarArgsMethod__##NAME +#define PYCXX_KEYWORDS_METHOD_NAME( NAME ) _callKeywordsMethod__##NAME + +#define PYCXX_NOARGS_METHOD_DECL( CLS, NAME ) \ + static PyObject *PYCXX_NOARGS_METHOD_NAME( NAME )( PyObject *_self, PyObject *, PyObject * ) \ + { \ + Py::PythonClassInstance *self_python = reinterpret_cast< Py::PythonClassInstance * >( _self ); \ + CLS *self = reinterpret_cast< CLS * >( self_python->m_pycxx_object ); \ + Py::Object r( (self->NAME)() ); \ + return Py::new_reference_to( r.ptr() ); \ + } +#define PYCXX_VARARGS_METHOD_DECL( CLS, NAME ) \ + static PyObject *PYCXX_VARARGS_METHOD_NAME( NAME )( PyObject *_self, PyObject *_a, PyObject * ) \ + { \ + Py::PythonClassInstance *self_python = reinterpret_cast< Py::PythonClassInstance * >( _self ); \ + CLS *self = reinterpret_cast< CLS * >( self_python->m_pycxx_object ); \ + Py::Tuple a( _a ); \ + Py::Object r( (self->NAME)( a ) ); \ + return Py::new_reference_to( r.ptr() ); \ + } +#define PYCXX_KEYWORDS_METHOD_DECL( CLS, NAME ) \ + static PyObject *PYCXX_KEYWORDS_METHOD_NAME( NAME )( PyObject *_self, PyObject *_a, PyObject *_k ) \ + { \ + Py::PythonClassInstance *self_python = reinterpret_cast< Py::PythonClassInstance * >( _self ); \ + CLS *self = reinterpret_cast< CLS * >( self_python->m_pycxx_object ); \ + Py::Tuple a( _a ); \ + Py::Dict k; \ + if( _k != NULL ) \ + k = _k; \ + Py::Object r( (self->NAME)( a, k ) ); \ + return Py::new_reference_to( r.ptr() ); \ + } + +// need to support METH_STATIC and METH_CLASS + +#define PYCXX_ADD_NOARGS_METHOD( NAME, docs ) \ + add_method( #NAME, (PyCFunction)PYCXX_NOARGS_METHOD_NAME( NAME ), METH_NOARGS, docs ) +#define PYCXX_ADD_VARARGS_METHOD( NAME, docs ) \ + add_method( #NAME, (PyCFunction)PYCXX_VARARGS_METHOD_NAME( NAME ), METH_VARARGS, docs ) +#define PYCXX_ADD_KEYWORDS_METHOD( NAME, docs ) \ + add_method( #NAME, (PyCFunction)PYCXX_KEYWORDS_METHOD_NAME( NAME ), METH_VARARGS | METH_KEYWORDS, docs ) + +namespace Py +{ + struct PythonClassInstance + { + PyObject_HEAD + PythonExtensionBase *m_pycxx_object; + }; + + + class ExtensionClassMethodsTable + { + public: + ExtensionClassMethodsTable() + : m_methods_table( new PyMethodDef[ METHOD_TABLE_SIZE_INCREMENT ] ) + , m_methods_used( 0 ) + , m_methods_size( METHOD_TABLE_SIZE_INCREMENT ) + { + } + + ~ExtensionClassMethodsTable() + { + delete m_methods_table; + } + + // check that all methods added are unique + void check_unique_method_name( const char *_name ) + { + std::string name( _name ); + for( int i=0; iml_name = name; + p->ml_meth = function; + p->ml_flags = flags; + p->ml_doc = doc; + + m_methods_used++; + p++; + + // add the sentinel marking the table end + p->ml_name = NULL; + p->ml_meth = NULL; + p->ml_flags = 0; + p->ml_doc = NULL; + + return m_methods_table; + } + + private: + enum {METHOD_TABLE_SIZE_INCREMENT = 1}; + PyMethodDef *m_methods_table; + int m_methods_used; + int m_methods_size; + }; + + template class PythonClass + : public PythonExtensionBase + { + protected: + explicit PythonClass( PythonClassInstance *self, Tuple &args, Dict &kwds ) + : PythonExtensionBase() + , m_self( self ) + { + // we are a class + behaviors().supportClass(); + } + + virtual ~PythonClass() + {} + + static ExtensionClassMethodsTable &methodTable() + { + static ExtensionClassMethodsTable *method_table; + if( method_table == NULL ) + method_table = new ExtensionClassMethodsTable; + return *method_table; + } + + static void add_method( const char *name, PyCFunction function, int flags, const char *doc=NULL ) + { + behaviors().set_methods( methodTable().add_method( name, function, flags, doc ) ); + } + + static PythonType &behaviors() + { + static PythonType *p; + if( p == NULL ) + { +#if defined( _CPPRTTI ) || defined( __GNUG__ ) + const char *default_name = (typeid( T )).name(); +#else + const char *default_name = "unknown"; +#endif + p = new PythonType( sizeof( T ), 0, default_name ); + p->set_tp_new( extension_object_new ); + p->set_tp_init( extension_object_init ); + p->set_tp_dealloc( extension_object_deallocator ); + } + + return *p; + } + + static PyObject *extension_object_new( PyTypeObject *subtype, PyObject *args, PyObject *kwds ) + { +#ifdef PYCXX_DEBUG + std::cout << "extension_object_new()" << std::endl; +#endif + PythonClassInstance *o = reinterpret_cast( subtype->tp_alloc( subtype, 0 ) ); + if( o == NULL ) + return NULL; + + o->m_pycxx_object = NULL; + + PyObject *self = reinterpret_cast( o ); +#ifdef PYCXX_DEBUG + std::cout << "extension_object_new() => self=0x" << std::hex << reinterpret_cast< unsigned int >( self ) << std::dec << std::endl; +#endif + return self; + } + + static int extension_object_init( PyObject *_self, PyObject *args_, PyObject *kwds_ ) + { + try + { + Py::Tuple args( args_ ); + Py::Dict kwds; + if( kwds_ != NULL ) + kwds = kwds_; + + PythonClassInstance *self = reinterpret_cast( _self ); +#ifdef PYCXX_DEBUG + std::cout << "extension_object_init( self=0x" << std::hex << reinterpret_cast< unsigned int >( self ) << std::dec << " )" << std::endl; + std::cout << " self->cxx_object=0x" << std::hex << reinterpret_cast< unsigned int >( self->cxx_object ) << std::dec << std::endl; +#endif + + if( self->m_pycxx_object == NULL ) + { + self->m_pycxx_object = new T( self, args, kwds ); +#ifdef PYCXX_DEBUG + std::cout << " self->m_pycxx_object=0x" << std::hex << reinterpret_cast< unsigned int >( self->m_pycxx_object ) << std::dec << std::endl; +#endif + } + else + { +#ifdef PYCXX_DEBUG + std::cout << " reinit - self->m_pycxx_object=0x" << std::hex << reinterpret_cast< unsigned int >( self->m_pycxx_object ) << std::dec << std::endl; +#endif + self->m_pycxx_object->reinit( args, kwds ); + } + } + catch( Exception & ) + { + return -1; + } + return 0; + } + + static void extension_object_deallocator( PyObject *_self ) + { + PythonClassInstance *self = reinterpret_cast< PythonClassInstance * >( _self ); +#ifdef PYCXX_DEBUG + std::cout << "extension_object_deallocator( self=0x" << std::hex << reinterpret_cast< unsigned int >( self ) << std::dec << " )" << std::endl; + std::cout << " self->cxx_object=0x" << std::hex << reinterpret_cast< unsigned int >( self->cxx_object ) << std::dec << std::endl; +#endif + delete self->m_pycxx_object; + } + + public: + static PyTypeObject *type_object() + { + return behaviors().type_object(); + } + + static Object type() + { + return Object( reinterpret_cast( behaviors().type_object() ) ); + } + + static bool check( PyObject *p ) + { + // is p like me? + return p->ob_type == type_object(); + } + + static bool check( const Object &ob ) + { + return check( ob.ptr() ); + } + + PyObject *selfPtr() + { + return reinterpret_cast( m_self ); + } + + protected: + private: + PythonClassInstance *m_self; + + private: + // + // prevent the compiler generating these unwanted functions + // + explicit PythonClass( const PythonClass &other ); + void operator=( const PythonClass &rhs ); + }; + + // + // ExtensionObject is an Object that will accept only T's. + // + template + class PythonClassObject: public Object + { + public: + + explicit PythonClassObject( PyObject *pyob ) + : Object( pyob ) + { + validate(); + } + + PythonClassObject( const PythonClassObject &other ) + : Object( *other ) + { + validate(); + } + + PythonClassObject( const Object &other ) + : Object( *other ) + { + validate(); + } + + PythonClassObject &operator=( const Object &rhs ) + { + *this = *rhs; + return *this; + } + + PythonClassObject &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + virtual bool accepts( PyObject *pyob ) const + { + return( pyob && T::check( pyob ) ); + } + + // + // Obtain a pointer to the PythonExtension object + // + T *getCxxObject( void ) + { + return static_cast( ptr() ); + } + }; +} // Namespace Py + +// End of __CXX_ExtensionClass__h +#endif diff --git a/CXX/Python3/ExtensionTypeBase.hxx b/CXX/Python3/ExtensionTypeBase.hxx new file mode 100644 index 000000000000..258d61f53355 --- /dev/null +++ b/CXX/Python3/ExtensionTypeBase.hxx @@ -0,0 +1,137 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_ExtensionTypeBase__h +#define __CXX_ExtensionTypeBase__h + +namespace Py +{ + // Class PythonExtension is what you inherit from to create + // a new Python extension type. You give your class itself + // as the template paramter. + + // There are two ways that extension objects can get destroyed. + // 1. Their reference count goes to zero + // 2. Someone does an explicit delete on a pointer. + // In(1) the problem is to get the destructor called + // We register a special deallocator in the Python type object + // (see behaviors()) to do this. + // In(2) there is no problem, the dtor gets called. + + // PythonExtension does not use the usual Python heap allocator, + // instead using new/delete. We do the setting of the type object + // and reference count, usually done by PyObject_New, in the + // base class ctor. + + // This special deallocator does a delete on the pointer. + + class PythonExtensionBase : public PyObject + { + public: + PythonExtensionBase(); + virtual ~PythonExtensionBase(); + + public: + // object + virtual void reinit( Tuple &args, Dict &kwds ); + + // object basics +#ifdef PYCXX_PYTHON_2TO3 + virtual int print( FILE *, int ); +#endif + virtual Object getattr( const char * ); + virtual int setattr( const char *, const Object & ); + virtual Object getattro( const String & ); + Object genericGetAttro( const String & ); + virtual int setattro( const String &, const Object & ); + int genericSetAttro( const String &, const Object & ); + virtual int compare( const Object & ); + virtual Object rich_compare( const Object &, int ); + virtual Object repr(); + virtual Object str(); + virtual long hash(); + virtual Object call( const Object &, const Object & ); + virtual Object iter(); + virtual PyObject *iternext(); + + // Sequence methods + virtual int sequence_length(); + virtual Object sequence_concat( const Object & ); + virtual Object sequence_repeat( Py_ssize_t ); + virtual Object sequence_item( Py_ssize_t ); + virtual int sequence_ass_item( Py_ssize_t, const Object & ); + + // Mapping + virtual int mapping_length(); + virtual Object mapping_subscript( const Object & ); + virtual int mapping_ass_subscript( const Object &, const Object & ); + + // Number + virtual Object number_negative(); + virtual Object number_positive(); + virtual Object number_absolute(); + virtual Object number_invert(); + virtual Object number_int(); + virtual Object number_float(); + virtual Object number_long(); + virtual Object number_add( const Object & ); + virtual Object number_subtract( const Object & ); + virtual Object number_multiply( const Object & ); + virtual Object number_remainder( const Object & ); + virtual Object number_divmod( const Object & ); + virtual Object number_lshift( const Object & ); + virtual Object number_rshift( const Object & ); + virtual Object number_and( const Object & ); + virtual Object number_xor( const Object & ); + virtual Object number_or( const Object & ); + virtual Object number_power( const Object &, const Object & ); + + // Buffer + // QQQ need to add py3 interface + + public: + virtual PyObject *selfPtr() = 0; + + private: + void missing_method( void ); + static PyObject *method_call_handler( PyObject *self, PyObject *args ); + }; + +} // Namespace Py + +// End of __CXX_ExtensionTypeBase__h +#endif diff --git a/CXX/Python3/Extensions.hxx b/CXX/Python3/Extensions.hxx new file mode 100644 index 000000000000..7533d97c7690 --- /dev/null +++ b/CXX/Python3/Extensions.hxx @@ -0,0 +1,189 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_Extensions__h +#define __CXX_Extensions__h + + +#ifdef _MSC_VER +// disable warning C4786: symbol greater than 255 character, +// okay to ignore +#pragma warning( disable: 4786 ) +#endif + +#include "CXX/WrapPython.h" +#include "CXX/Version.hxx" +#include "CXX/Python3/Config.hxx" +#include "CXX/Python3/CxxDebug.hxx" +#include "CXX/Python3/Objects.hxx" + +extern "C" { extern PyObject py_object_initializer; } + +#include +#include + +// ---------------------------------------------------------------------- + +namespace Py +{ + class ExtensionModuleBase; + + // Make an Exception Type for use in raising custom exceptions + class ExtensionExceptionType : public Object + { + public: + ExtensionExceptionType(); + virtual ~ExtensionExceptionType(); + + // call init to create the type + void init( ExtensionModuleBase &module, const std::string &name, ExtensionExceptionType &parent ); + void init( ExtensionModuleBase &module, const std::string &name ); + }; + + class MethodTable + { + public: + MethodTable(); + virtual ~MethodTable(); + + void add( const char *method_name, PyCFunction f, const char *doc="", int flag=1 ); + PyMethodDef *table(); + + protected: + std::vector t; // accumulator of PyMethodDef's + PyMethodDef *mt; // Actual method table produced when full + + static PyMethodDef method( const char* method_name, PyCFunction f, int flags=1, const char* doc="" ); + + private: + // + // prevent the compiler generating these unwanted functions + // + MethodTable( const MethodTable &m ); //unimplemented + void operator=( const MethodTable &m ); //unimplemented + + }; // end class MethodTable + + // Note: Python calls noargs as varargs buts args==NULL + extern "C" typedef PyObject *(*method_noargs_call_handler_t)( PyObject *_self, PyObject * ); + extern "C" typedef PyObject *(*method_varargs_call_handler_t)( PyObject *_self, PyObject *_args ); + extern "C" typedef PyObject *(*method_keyword_call_handler_t)( PyObject *_self, PyObject *_args, PyObject *_dict ); + + template + class MethodDefExt : public PyMethodDef + { + public: + typedef Object (T::*method_noargs_function_t)(); + typedef Object (T::*method_varargs_function_t)( const Tuple &args ); + typedef Object (T::*method_keyword_function_t)( const Tuple &args, const Dict &kws ); + + // NOARGS + MethodDefExt + ( + const char *_name, + method_noargs_function_t _function, + method_noargs_call_handler_t _handler, + const char *_doc + ) + { + ext_meth_def.ml_name = const_cast( _name ); + ext_meth_def.ml_meth = reinterpret_cast( _handler ); + ext_meth_def.ml_flags = METH_NOARGS; + ext_meth_def.ml_doc = const_cast( _doc ); + + ext_noargs_function = _function; + ext_varargs_function = NULL; + ext_keyword_function = NULL; + } + + // VARARGS + MethodDefExt + ( + const char *_name, + method_varargs_function_t _function, + method_varargs_call_handler_t _handler, + const char *_doc + ) + { + ext_meth_def.ml_name = const_cast( _name ); + ext_meth_def.ml_meth = reinterpret_cast( _handler ); + ext_meth_def.ml_flags = METH_VARARGS; + ext_meth_def.ml_doc = const_cast( _doc ); + + ext_noargs_function = NULL; + ext_varargs_function = _function; + ext_keyword_function = NULL; + } + + // VARARGS + KEYWORD + MethodDefExt + ( + const char *_name, + method_keyword_function_t _function, + method_keyword_call_handler_t _handler, + const char *_doc + ) + { + ext_meth_def.ml_name = const_cast( _name ); + ext_meth_def.ml_meth = reinterpret_cast( _handler ); + ext_meth_def.ml_flags = METH_VARARGS|METH_KEYWORDS; + ext_meth_def.ml_doc = const_cast( _doc ); + + ext_noargs_function = NULL; + ext_varargs_function = NULL; + ext_keyword_function = _function; + } + + ~MethodDefExt() + {} + + PyMethodDef ext_meth_def; + method_noargs_function_t ext_noargs_function; + method_varargs_function_t ext_varargs_function; + method_keyword_function_t ext_keyword_function; + Object py_method; + }; +} // Namespace Py + +#include "CXX/Python3/ExtensionModule.hxx" +#include "CXX/Python3/PythonType.hxx" +#include "CXX/Python3/ExtensionTypeBase.hxx" +#include "CXX/Python3/ExtensionOldType.hxx" +#include "CXX/Python3/ExtensionType.hxx" + +// End of CXX_Extensions.h +#endif diff --git a/CXX/Python3/IndirectPythonInterface.cxx b/CXX/Python3/IndirectPythonInterface.cxx new file mode 100644 index 000000000000..28784fd532c0 --- /dev/null +++ b/CXX/Python3/IndirectPythonInterface.cxx @@ -0,0 +1,527 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#include "CXX/IndirectPythonInterface.hxx" + +namespace Py +{ +bool _CFunction_Check( PyObject *op ) { return op->ob_type == _CFunction_Type(); } +bool _CObject_Check( PyObject *op ) { return op->ob_type == _CObject_Type(); } +bool _Complex_Check( PyObject *op ) { return op->ob_type == _Complex_Type(); } +bool _Dict_Check( PyObject *op ) { return op->ob_type == _Dict_Type(); } +bool _Float_Check( PyObject *op ) { return op->ob_type == _Float_Type(); } +bool _Function_Check( PyObject *op ) { return op->ob_type == _Function_Type(); } +bool _Boolean_Check( PyObject *op ) { return op->ob_type == _Bool_Type(); } +bool _List_Check( PyObject *op ) { return op->ob_type == _List_Type(); } +bool _Long_Check( PyObject *op ) { return op->ob_type == _Long_Type(); } +bool _Method_Check( PyObject *op ) { return op->ob_type == _Method_Type(); } +bool _Module_Check( PyObject *op ) { return op->ob_type == _Module_Type(); } +bool _Range_Check( PyObject *op ) { return op->ob_type == _Range_Type(); } +bool _Slice_Check( PyObject *op ) { return op->ob_type == _Slice_Type(); } +bool _TraceBack_Check( PyObject *op ) { return op->ob_type == _TraceBack_Type(); } +bool _Tuple_Check( PyObject *op ) { return op->ob_type == _Tuple_Type(); } +bool _Type_Check( PyObject *op ) { return op->ob_type == _Type_Type(); } +bool _Unicode_Check( PyObject *op ) { return op->ob_type == _Unicode_Type(); } +bool _Bytes_Check( PyObject *op ) { return op->ob_type == _Bytes_Type(); } + +#if defined(PY_WIN32_DELAYLOAD_PYTHON_DLL) + +#if defined(MS_WINDOWS) +#include + + +static HMODULE python_dll; + +static PyObject *ptr__Exc_ArithmeticError = NULL; +static PyObject *ptr__Exc_AssertionError = NULL; +static PyObject *ptr__Exc_AttributeError = NULL; +static PyObject *ptr__Exc_EnvironmentError = NULL; +static PyObject *ptr__Exc_EOFError = NULL; +static PyObject *ptr__Exc_Exception = NULL; +static PyObject *ptr__Exc_FloatingPointError = NULL; +static PyObject *ptr__Exc_ImportError = NULL; +static PyObject *ptr__Exc_IndexError = NULL; +static PyObject *ptr__Exc_IOError = NULL; +static PyObject *ptr__Exc_KeyboardInterrupt = NULL; +static PyObject *ptr__Exc_KeyError = NULL; +static PyObject *ptr__Exc_LookupError = NULL; +static PyObject *ptr__Exc_MemoryError = NULL; +static PyObject *ptr__Exc_MemoryErrorInst = NULL; +static PyObject *ptr__Exc_NameError = NULL; +static PyObject *ptr__Exc_NotImplementedError = NULL; +static PyObject *ptr__Exc_OSError = NULL; +static PyObject *ptr__Exc_OverflowError = NULL; +static PyObject *ptr__Exc_RuntimeError = NULL; +static PyObject *ptr__Exc_StandardError = NULL; +static PyObject *ptr__Exc_SyntaxError = NULL; +static PyObject *ptr__Exc_SystemError = NULL; +static PyObject *ptr__Exc_SystemExit = NULL; +static PyObject *ptr__Exc_TypeError = NULL; +static PyObject *ptr__Exc_ValueError = NULL; +static PyObject *ptr__Exc_ZeroDivisionError = NULL; + +#ifdef MS_WINDOWS +static PyObject *ptr__Exc_WindowsError = NULL; +#endif + +static PyObject *ptr__Exc_IndentationError = NULL; +static PyObject *ptr__Exc_TabError = NULL; +static PyObject *ptr__Exc_UnboundLocalError = NULL; +static PyObject *ptr__Exc_UnicodeError = NULL; +static PyObject *ptr__PyNone = NULL; +static PyObject *ptr__PyFalse = NULL; +static PyObject *ptr__PyTrue = NULL; +static PyTypeObject *ptr__CFunction_Type = NULL; +static PyTypeObject *ptr__CObject_Type = NULL; +static PyTypeObject *ptr__Complex_Type = NULL; +static PyTypeObject *ptr__Dict_Type = NULL; +static PyTypeObject *ptr__Float_Type = NULL; +static PyTypeObject *ptr__Function_Type = NULL; +static PyTypeObject *ptr__List_Type = NULL; +static PyTypeObject *ptr__Long_Type = NULL; +static PyTypeObject *ptr__Method_Type = NULL; +static PyTypeObject *ptr__Module_Type = NULL; +static PyTypeObject *ptr__Range_Type = NULL; +static PyTypeObject *ptr__Slice_Type = NULL; +static PyTypeObject *ptr__TraceBack_Type = NULL; +static PyTypeObject *ptr__Tuple_Type = NULL; +static PyTypeObject *ptr__Type_Type = NULL; + +static int *ptr_Py_DebugFlag = NULL; +static int *ptr_Py_InteractiveFlag = NULL; +static int *ptr_Py_OptimizeFlag = NULL; +static int *ptr_Py_NoSiteFlag = NULL; +static int *ptr_Py_VerboseFlag = NULL; + +static char **ptr__Py_PackageContext = NULL; + +#ifdef Py_REF_DEBUG +int *ptr_Py_RefTotal; +#endif + + +//-------------------------------------------------------------------------------- +class GetAddressException +{ +public: + GetAddressException( const char *_name ) + : name( _name ) + {} + virtual ~GetAddressException() {} + const char *name; +}; + + +//-------------------------------------------------------------------------------- +static PyObject *GetPyObjectPointer_As_PyObjectPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return *(PyObject **)addr; +} + +static PyObject *GetPyObject_As_PyObjectPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return (PyObject *)addr; +} + +static PyTypeObject *GetPyTypeObjectPointer_As_PyTypeObjectPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return *(PyTypeObject **)addr; +} + +static PyTypeObject *GetPyTypeObject_As_PyTypeObjectPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return (PyTypeObject *)addr; +} + +static int *GetInt_as_IntPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return (int *)addr; +} + +static char **GetCharPointer_as_CharPointerPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return (char **)addr; +} + + +#ifdef _DEBUG +static const char python_dll_name_format[] = "PYTHON%1.1d%1.1d_D.DLL"; +#else +static const char python_dll_name_format[] = "PYTHON%1.1d%1.1d.DLL"; +#endif + +//-------------------------------------------------------------------------------- +bool InitialisePythonIndirectInterface() +{ + char python_dll_name[sizeof(python_dll_name_format)]; + + sprintf( python_dll_name, python_dll_name_format, PY_MAJOR_VERSION, PY_MINOR_VERSION ); + + python_dll = LoadLibrary( python_dll_name ); + if( python_dll == NULL ) + return false; + + try + { +#ifdef Py_REF_DEBUG + ptr_Py_RefTotal = GetInt_as_IntPointer( "_Py_RefTotal" ); +#endif + ptr_Py_DebugFlag = GetInt_as_IntPointer( "Py_DebugFlag" ); + ptr_Py_InteractiveFlag = GetInt_as_IntPointer( "Py_InteractiveFlag" ); + ptr_Py_OptimizeFlag = GetInt_as_IntPointer( "Py_OptimizeFlag" ); + ptr_Py_NoSiteFlag = GetInt_as_IntPointer( "Py_NoSiteFlag" ); + ptr_Py_VerboseFlag = GetInt_as_IntPointer( "Py_VerboseFlag" ); + ptr__Py_PackageContext = GetCharPointer_as_CharPointerPointer( "_Py_PackageContext" ); + + ptr__Exc_ArithmeticError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ArithmeticError" ); + ptr__Exc_AssertionError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_AssertionError" ); + ptr__Exc_AttributeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_AttributeError" ); + ptr__Exc_EnvironmentError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_EnvironmentError" ); + ptr__Exc_EOFError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_EOFError" ); + ptr__Exc_Exception = GetPyObjectPointer_As_PyObjectPointer( "PyExc_Exception" ); + ptr__Exc_FloatingPointError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_FloatingPointError" ); + ptr__Exc_ImportError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ImportError" ); + ptr__Exc_IndexError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_IndexError" ); + ptr__Exc_IOError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_IOError" ); + ptr__Exc_KeyboardInterrupt = GetPyObjectPointer_As_PyObjectPointer( "PyExc_KeyboardInterrupt" ); + ptr__Exc_KeyError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_KeyError" ); + ptr__Exc_LookupError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_LookupError" ); + ptr__Exc_MemoryError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_MemoryError" ); + ptr__Exc_MemoryErrorInst = GetPyObjectPointer_As_PyObjectPointer( "PyExc_MemoryErrorInst" ); + ptr__Exc_NameError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_NameError" ); + ptr__Exc_NotImplementedError= GetPyObjectPointer_As_PyObjectPointer( "PyExc_NotImplementedError" ); + ptr__Exc_OSError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_OSError" ); + ptr__Exc_OverflowError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_OverflowError" ); + ptr__Exc_RuntimeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_RuntimeError" ); + ptr__Exc_StandardError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_StandardError" ); + ptr__Exc_SyntaxError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_SyntaxError" ); + ptr__Exc_SystemError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_SystemError" ); + ptr__Exc_SystemExit = GetPyObjectPointer_As_PyObjectPointer( "PyExc_SystemExit" ); + ptr__Exc_TypeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_TypeError" ); + ptr__Exc_ValueError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ValueError" ); +#ifdef MS_WINDOWS + ptr__Exc_WindowsError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_WindowsError" ); +#endif + ptr__Exc_ZeroDivisionError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ZeroDivisionError" ); + ptr__Exc_IndentationError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_IndentationError" ); + ptr__Exc_TabError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_TabError" ); + ptr__Exc_UnboundLocalError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_UnboundLocalError" ); + ptr__Exc_UnicodeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_UnicodeError" ); + ptr__PyNone = GetPyObject_As_PyObjectPointer( "_Py_NoneStruct" ); + + ptr__PyFalse = GetPyObject_As_PyObjectPointer( "_Py_ZeroStruct" ); + ptr__PyTrue = GetPyObject_As_PyObjectPointer( "_Py_TrueStruct" ); + + ptr__CFunction_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyCFunction_Type" ); + ptr__CObject_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyCObject_Type" ); + ptr__Complex_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyComplex_Type" ); + ptr__Dict_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyDict_Type" ); + ptr__Float_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyFloat_Type" ); + ptr__Function_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyFunction_Type" ); + ptr__List_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyList_Type" ); + ptr__Long_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyLong_Type" ); + ptr__Method_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyMethod_Type" ); + ptr__Module_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyModule_Type" ); + ptr__Range_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyRange_Type" ); + ptr__Slice_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PySlice_Type" ); + ptr__TraceBack_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyTraceBack_Type" ); + ptr__Tuple_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyTuple_Type" ); + ptr__Type_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyType_Type" ); + ptr__Unicode_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyUnicode_Type" ); + ptr__Bytes_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyBytes_Type" ); + } + catch( GetAddressException &e ) + { + OutputDebugString( python_dll_name ); + OutputDebugString( " does not contain symbol "); + OutputDebugString( e.name ); + OutputDebugString( "\n" ); + + return false; + } + + return true; +} + +// +// Wrap variables as function calls +// +PyObject *_Exc_ArithmeticError() { return ptr__Exc_ArithmeticError; } +PyObject *_Exc_AssertionError() { return ptr__Exc_AssertionError; } +PyObject *_Exc_AttributeError() { return ptr__Exc_AttributeError; } +PyObject *_Exc_EnvironmentError() { return ptr__Exc_EnvironmentError; } +PyObject *_Exc_EOFError() { return ptr__Exc_EOFError; } +PyObject *_Exc_Exception() { return ptr__Exc_Exception; } +PyObject *_Exc_FloatingPointError() { return ptr__Exc_FloatingPointError; } +PyObject *_Exc_ImportError() { return ptr__Exc_ImportError; } +PyObject *_Exc_IndexError() { return ptr__Exc_IndexError; } +PyObject *_Exc_IOError() { return ptr__Exc_IOError; } +PyObject *_Exc_KeyboardInterrupt() { return ptr__Exc_KeyboardInterrupt; } +PyObject *_Exc_KeyError() { return ptr__Exc_KeyError; } +PyObject *_Exc_LookupError() { return ptr__Exc_LookupError; } +PyObject *_Exc_MemoryError() { return ptr__Exc_MemoryError; } +PyObject *_Exc_MemoryErrorInst() { return ptr__Exc_MemoryErrorInst; } +PyObject *_Exc_NameError() { return ptr__Exc_NameError; } +PyObject *_Exc_NotImplementedError() { return ptr__Exc_NotImplementedError; } +PyObject *_Exc_OSError() { return ptr__Exc_OSError; } +PyObject *_Exc_OverflowError() { return ptr__Exc_OverflowError; } +PyObject *_Exc_RuntimeError() { return ptr__Exc_RuntimeError; } +PyObject *_Exc_StandardError() { return ptr__Exc_StandardError; } +PyObject *_Exc_SyntaxError() { return ptr__Exc_SyntaxError; } +PyObject *_Exc_SystemError() { return ptr__Exc_SystemError; } +PyObject *_Exc_SystemExit() { return ptr__Exc_SystemExit; } +PyObject *_Exc_TypeError() { return ptr__Exc_TypeError; } +PyObject *_Exc_ValueError() { return ptr__Exc_ValueError; } +#ifdef MS_WINDOWS +PyObject *_Exc_WindowsError() { return ptr__Exc_WindowsError; } +#endif +PyObject *_Exc_ZeroDivisionError() { return ptr__Exc_ZeroDivisionError; } +PyObject *_Exc_IndentationError() { return ptr__Exc_IndentationError; } +PyObject *_Exc_TabError() { return ptr__Exc_TabError; } +PyObject *_Exc_UnboundLocalError() { return ptr__Exc_UnboundLocalError; } +PyObject *_Exc_UnicodeError() { return ptr__Exc_UnicodeError; } + +// +// wrap items in Object.h +// +PyObject *_None() { return ptr__PyNone; } + +PyObject *_False() { return ptr__PyFalse; } +PyObject *_True() { return ptr__PyTrue; } + +PyTypeObject *_CFunction_Type() { return ptr__CFunction_Type; } +PyTypeObject *_CObject_Type() { return ptr__CObject_Type; } +PyTypeObject *_Complex_Type() { return ptr__Complex_Type; } +PyTypeObject *_Dict_Type() { return ptr__Dict_Type; } +PyTypeObject *_Float_Type() { return ptr__Float_Type; } +PyTypeObject *_Function_Type() { return ptr__Function_Type; } +PyTypeObject *_Bool_Type() { return ptr__Bool_Type; } +PyTypeObject *_List_Type() { return ptr__List_Type; } +PyTypeObject *_Long_Type() { return ptr__Long_Type; } +PyTypeObject *_Method_Type() { return ptr__Method_Type; } +PyTypeObject *_Module_Type() { return ptr__Module_Type; } +PyTypeObject *_Range_Type() { return ptr__Range_Type; } +PyTypeObject *_Slice_Type() { return ptr__Slice_Type; } +PyTypeObject *_TraceBack_Type() { return ptr__TraceBack_Type; } +PyTypeObject *_Tuple_Type() { return ptr__Tuple_Type; } +PyTypeObject *_Type_Type() { return ptr__Type_Type; } +PyTypeObject *_Unicode_Type() { return ptr__Unicode_Type; } +PyTypeObject *_Bytes_Type() { return ptr__Bytes_Type; } + +char *__Py_PackageContext() { return *ptr__Py_PackageContext; } + + +// +// wrap the Python Flag variables +// +int &_Py_DebugFlag() { return *ptr_Py_DebugFlag; } +int &_Py_InteractiveFlag() { return *ptr_Py_InteractiveFlag; } +int &_Py_OptimizeFlag() { return *ptr_Py_OptimizeFlag; } +int &_Py_NoSiteFlag() { return *ptr_Py_NoSiteFlag; } +int &_Py_VerboseFlag() { return *ptr_Py_VerboseFlag; } + +#if 0 +#define Py_INCREF(op) ( \ + _Py_INC_REFTOTAL _Py_REF_DEBUG_COMMA \ + ((PyObject*)(op))->ob_refcnt++) + +#define Py_DECREF(op) \ + if (_Py_DEC_REFTOTAL _Py_REF_DEBUG_COMMA \ + --((PyObject*)(op))->ob_refcnt != 0) \ + _Py_CHECK_REFCNT(op) \ + else \ + _Py_Dealloc((PyObject *)(op)) +#endif + +void _XINCREF( PyObject *op ) +{ + // This function must match the contents of Py_XINCREF(op) + if( op == NULL ) + return; + +#ifdef Py_REF_DEBUG + (*ptr_Py_RefTotal)++; +#endif + (op)->ob_refcnt++; + +} + +void _XDECREF( PyObject *op ) +{ + // This function must match the contents of Py_XDECREF(op); + if( op == NULL ) + return; + +#ifdef Py_REF_DEBUG + (*ptr_Py_RefTotal)--; +#endif + + if (--(op)->ob_refcnt == 0) + _Py_Dealloc((PyObject *)(op)); +} + + +#else +#error "Can only delay load under Win32" +#endif + +#else + +//================================================================================ +// +// Map onto Macros +// +//================================================================================ + +// +// Wrap variables as function calls +// + +PyObject *_Exc_ArithmeticError() { return ::PyExc_ArithmeticError; } +PyObject *_Exc_AssertionError() { return ::PyExc_AssertionError; } +PyObject *_Exc_AttributeError() { return ::PyExc_AttributeError; } +PyObject *_Exc_EnvironmentError() { return ::PyExc_EnvironmentError; } +PyObject *_Exc_EOFError() { return ::PyExc_EOFError; } +PyObject *_Exc_Exception() { return ::PyExc_Exception; } +PyObject *_Exc_FloatingPointError() { return ::PyExc_FloatingPointError; } +PyObject *_Exc_ImportError() { return ::PyExc_ImportError; } +PyObject *_Exc_IndexError() { return ::PyExc_IndexError; } +PyObject *_Exc_IOError() { return ::PyExc_IOError; } +PyObject *_Exc_KeyboardInterrupt() { return ::PyExc_KeyboardInterrupt; } +PyObject *_Exc_KeyError() { return ::PyExc_KeyError; } +PyObject *_Exc_LookupError() { return ::PyExc_LookupError; } +PyObject *_Exc_MemoryError() { return ::PyExc_MemoryError; } +PyObject *_Exc_MemoryErrorInst() { return ::PyExc_MemoryErrorInst; } +PyObject *_Exc_NameError() { return ::PyExc_NameError; } +PyObject *_Exc_NotImplementedError() { return ::PyExc_NotImplementedError; } +PyObject *_Exc_OSError() { return ::PyExc_OSError; } +PyObject *_Exc_OverflowError() { return ::PyExc_OverflowError; } +PyObject *_Exc_RuntimeError() { return ::PyExc_RuntimeError; } +PyObject *_Exc_SyntaxError() { return ::PyExc_SyntaxError; } +PyObject *_Exc_SystemError() { return ::PyExc_SystemError; } +PyObject *_Exc_SystemExit() { return ::PyExc_SystemExit; } +PyObject *_Exc_TypeError() { return ::PyExc_TypeError; } +PyObject *_Exc_ValueError() { return ::PyExc_ValueError; } +PyObject *_Exc_ZeroDivisionError() { return ::PyExc_ZeroDivisionError; } +PyObject *_Exc_IndentationError() { return ::PyExc_IndentationError; } +PyObject *_Exc_TabError() { return ::PyExc_TabError; } +PyObject *_Exc_UnboundLocalError() { return ::PyExc_UnboundLocalError; } +PyObject *_Exc_UnicodeError() { return ::PyExc_UnicodeError; } + +#ifdef MS_WINDOWS +PyObject *_Exc_WindowsError() { return ::PyExc_WindowsError; } +#endif + + + + +// +// wrap items in Object.h +// +PyObject *_None() { return &::_Py_NoneStruct; } + +PyObject *_False() { return Py_False; } +PyObject *_True() { return Py_True; } + +PyTypeObject *_CFunction_Type() { return &PyCFunction_Type; } +PyTypeObject *_CObject_Type() { return &PyCObject_Type; } +PyTypeObject *_Complex_Type() { return &PyComplex_Type; } +PyTypeObject *_Dict_Type() { return &PyDict_Type; } +PyTypeObject *_Float_Type() { return &PyFloat_Type; } +PyTypeObject *_Function_Type() { return &PyFunction_Type; } +PyTypeObject *_Bool_Type() { return &PyBool_Type; } +PyTypeObject *_List_Type() { return &PyList_Type; } +PyTypeObject *_Long_Type() { return &PyLong_Type; } +PyTypeObject *_Method_Type() { return &PyMethod_Type; } +PyTypeObject *_Module_Type() { return &PyModule_Type; } +PyTypeObject *_Range_Type() { return &PyRange_Type; } +PyTypeObject *_Slice_Type() { return &PySlice_Type; } +PyTypeObject *_TraceBack_Type() { return &PyTraceBack_Type; } +PyTypeObject *_Tuple_Type() { return &PyTuple_Type; } +PyTypeObject *_Type_Type() { return &PyType_Type; } +PyTypeObject *_Unicode_Type() { return &PyUnicode_Type; } +PyTypeObject *_Bytes_Type() { return &PyBytes_Type; } + +// +// wrap flags +// +int &_Py_DebugFlag() { return Py_DebugFlag; } +int &_Py_InteractiveFlag() { return Py_InteractiveFlag; } +int &_Py_OptimizeFlag() { return Py_OptimizeFlag; } +int &_Py_NoSiteFlag() { return Py_NoSiteFlag; } +int &_Py_VerboseFlag() { return Py_VerboseFlag; } +char *__Py_PackageContext() { return _Py_PackageContext; } + +// +// Needed to keep the abstactions for delayload interface +// +void _XINCREF( PyObject *op ) +{ + Py_XINCREF( op ); +} + +void _XDECREF( PyObject *op ) +{ + Py_XDECREF( op ); +} + +#endif +} diff --git a/CXX/Python3/IndirectPythonInterface.hxx b/CXX/Python3/IndirectPythonInterface.hxx new file mode 100644 index 000000000000..fed8e3c2a18f --- /dev/null +++ b/CXX/Python3/IndirectPythonInterface.hxx @@ -0,0 +1,188 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_INDIRECT_PYTHON_INTERFACE__HXX__ +#define __CXX_INDIRECT_PYTHON_INTERFACE__HXX__ + +#include "CXX/WrapPython.h" + +namespace Py +{ +bool InitialisePythonIndirectInterface(); + +// +// Wrap Exception variables as function calls +// +PyObject * _Exc_Exception(); +PyObject * _Exc_StandardError(); +PyObject * _Exc_ArithmeticError(); +PyObject * _Exc_LookupError(); + +PyObject * _Exc_AssertionError(); +PyObject * _Exc_AttributeError(); +PyObject * _Exc_EOFError(); +PyObject * _Exc_FloatingPointError(); +PyObject * _Exc_EnvironmentError(); +PyObject * _Exc_IOError(); +PyObject * _Exc_OSError(); +PyObject * _Exc_ImportError(); +PyObject * _Exc_IndexError(); +PyObject * _Exc_KeyError(); +PyObject * _Exc_KeyboardInterrupt(); +PyObject * _Exc_MemoryError(); +PyObject * _Exc_NameError(); +PyObject * _Exc_OverflowError(); +PyObject * _Exc_RuntimeError(); +PyObject * _Exc_NotImplementedError(); +PyObject * _Exc_SyntaxError(); +PyObject * _Exc_SystemError(); +PyObject * _Exc_SystemExit(); +PyObject * _Exc_TypeError(); +PyObject * _Exc_ValueError(); +PyObject * _Exc_ZeroDivisionError(); +#ifdef MS_WINDOWS +PyObject * _Exc_WindowsError(); +#endif + +PyObject * _Exc_MemoryErrorInst(); + +PyObject * _Exc_IndentationError(); +PyObject * _Exc_TabError(); +PyObject * _Exc_UnboundLocalError(); +PyObject * _Exc_UnicodeError(); + +// +// Wrap Object variables as function calls +// +PyObject * _None(); + +PyObject * _False(); +PyObject * _True(); + +// +// Wrap Type variables as function calls +// +PyTypeObject * _List_Type(); +bool _List_Check( PyObject *o ); + +PyTypeObject * _Buffer_Type(); +bool _Buffer_Check( PyObject *op ); + +PyTypeObject * _Class_Type(); +bool _Class_Check( PyObject *op ); + +PyTypeObject * _Instance_Type(); +bool _Instance_Check( PyObject *op ); + +PyTypeObject * _Method_Type(); +bool _Method_Check( PyObject *op ); + +PyTypeObject * _CObject_Type(); +bool _CObject_Check( PyObject *op ); + +PyTypeObject * _Complex_Type(); +bool _Complex_Check( PyObject *op ); + +PyTypeObject * _Dict_Type(); +bool _Dict_Check( PyObject *op ); + +PyTypeObject * _File_Type(); +bool _File_Check( PyObject *op ); + +PyTypeObject * _Float_Type(); +bool _Float_Check( PyObject *op ); + +PyTypeObject * _Frame_Type(); +bool _Frame_Check( PyObject *op ); + +PyTypeObject * _Function_Type(); +bool _Function_Check( PyObject *op ); + +PyTypeObject * _Bool_Type(); +bool _Boolean_Check( PyObject *op ); + +PyTypeObject * _Int_Type(); +bool _Int_Check( PyObject *op ); + +PyTypeObject * _List_Type(); +bool _List_Check( PyObject *op ); + +PyTypeObject * _Long_Type(); +bool _Long_Check( PyObject *op ); + +PyTypeObject * _CFunction_Type(); +bool _CFunction_Check( PyObject *op ); + +PyTypeObject * _Module_Type(); +bool _Module_Check( PyObject *op ); + +PyTypeObject * _Type_Type(); +bool _Type_Check( PyObject *op ); + +PyTypeObject * _Range_Type(); +bool _Range_Check( PyObject *op ); + +PyTypeObject * _Slice_Type(); +bool _Slice_Check( PyObject *op ); + +PyTypeObject * _Unicode_Type(); +bool _Unicode_Check( PyObject *op ); + +PyTypeObject * _Bytes_Type(); +bool _Bytes_Check( PyObject *op ); + +PyTypeObject * _TraceBack_Type(); +bool _TraceBack_Check( PyObject *v ); + +PyTypeObject * _Tuple_Type(); +bool _Tuple_Check( PyObject *op ); + +int &_Py_DebugFlag(); +int &_Py_InteractiveFlag(); +int &_Py_OptimizeFlag(); +int &_Py_NoSiteFlag(); +int &_Py_TabcheckFlag(); +int &_Py_VerboseFlag(); +int &_Py_UnicodeFlag(); + +void _XINCREF( PyObject *op ); +void _XDECREF( PyObject *op ); + +char *__Py_PackageContext(); +}; + +#endif // __CXX_INDIRECT_PYTHON_INTERFACE__HXX__ diff --git a/CXX/Python3/Objects.hxx b/CXX/Python3/Objects.hxx new file mode 100644 index 000000000000..a991bb8e1664 --- /dev/null +++ b/CXX/Python3/Objects.hxx @@ -0,0 +1,3279 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_Objects__h +#define __CXX_Objects__h + +#include "CXX/WrapPython.h" +#include "CXX/Version.hxx" +#include "CXX/Python3/Config.hxx" +#include "CXX/Python3/CxxDebug.hxx" +#include "CXX/Python3/Exception.hxx" + +#include +#include STR_STREAM +#include +#include +#include +#include + +namespace Py +{ + typedef int sequence_index_type; // type of an index into a sequence + + // Forward declarations + class Object; + class Type; + template class SeqBase; + class Bytes; + class String; + class List; + template class MapBase; + + //===========================================================================// + // class Object + // The purpose of this class is to serve as the most general kind of + // Python object, for the purpose of writing C++ extensions in Python + // Objects hold a PyObject* which they own. This pointer is always a + // valid pointer to a Python object. In children we must maintain this behavior. + // + // Instructions on how to make your own class MyType descended from Object: + // (0) Pick a base class, either Object or perhaps SeqBase or MapBase. + // This example assumes Object. + + // (1) Write a routine int MyType_Check( PyObject * ) modeled after PyInt_Check, + // PyFloat_Check, etc. + + // (2) Add method accepts: + // virtual bool accepts( PyObject *pyob ) const { + // return pyob && MyType_Check( pyob ); + // } + + // (3) Include the following constructor and copy constructor + // + /* + explicit MyType( PyObject *pyob ): Object( pyob ) + { + validate(); + } + + MyType( const Object &other ): Object( other.ptr() ) + { + validate(); + } + */ + + // Alernate version for the constructor to allow for construction from owned pointers: + /* + explicit MyType( PyObject *pyob ): Object( pyob ) + { + validate(); + } + */ + + // You may wish to add other constructors; see the classes below for examples. + // Each constructor must use "set" to set the pointer + // and end by validating the pointer you have created. + + //( 4 ) Each class needs at least these two assignment operators: + /* + MyType &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Mytype &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + */ + // Note on accepts: constructors call the base class + // version of a virtual when calling the base class constructor, + // so the test has to be done explicitly in a descendent. + + // If you are inheriting from PythonExtension to define an object + // note that it contains PythonExtension::check + // which you can use in accepts when writing a wrapper class. + // See Demo/range.h and Demo/range.cxx for an example. + + class Object + { + private: + // the pointer to the Python object + // Only Object sets this directly. + // The default constructor for Object sets it to Py_None and + // child classes must use "set" to set it + // + PyObject *p; + + protected: + void set( PyObject *pyob, bool owned = false ) + { + release(); + p = pyob; + if( !owned ) + { + Py::_XINCREF( p ); + } + validate(); + } + + void release() + { + Py::_XDECREF( p ); + p = NULL; + } + + void validate(); + + public: + // Constructor acquires new ownership of pointer unless explicitly told not to. + explicit Object( PyObject *pyob=Py::_None(), bool owned = false ) + : p( pyob ) + { + if( !owned ) + { + Py::_XINCREF( p ); + } + validate(); + } + + // Copy constructor acquires new ownership of pointer + Object( const Object &ob ) + : p( ob.p ) + { + Py::_XINCREF( p ); + validate(); + } + + // Assignment acquires new ownership of pointer + Object &operator=( const Object &rhs ) + { + set( rhs.p ); + return *this; + } + + Object &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + + return *this; + } + + // Destructor + virtual ~Object() + { + release(); + } + + // Loaning the pointer to others, retain ownership + PyObject *operator*() const + { + return p; + } + + // Explicit reference_counting changes + void increment_reference_count() + { + Py::_XINCREF( p ); + } + + void decrement_reference_count() + { + // not allowed to commit suicide, however + if( reference_count() == 1 ) + throw RuntimeError( "Object::decrement_reference_count error." ); + Py::_XDECREF( p ); + } + + // Would like to call this pointer() but messes up STL in SeqBase + PyObject *ptr() const + { + return p; + } + + // + // Queries + // + + // Can pyob be used in this object's constructor? + virtual bool accepts( PyObject *pyob ) const + { + // allow any object or NULL + return true; + } + + Py_ssize_t reference_count() const + { // the reference count + return p ? p->ob_refcnt : 0; + } + + Type type() const; // the type object associated with this one + + String str() const; // the str() representation + + std::string as_string() const; + + String repr() const; // the repr() representation + + List dir() const; // the dir() list + + bool hasAttr( const std::string &s ) const + { + return PyObject_HasAttrString( p, const_cast( s.c_str() ) ) ? true: false; + } + + Object getAttr( const std::string &s ) const + { + return Object( PyObject_GetAttrString( p, const_cast( s.c_str() ) ), true ); + } + + Object getItem( const Object &key ) const + { + return Object( PyObject_GetItem( p, *key ), true ); + } + + long hashValue() const + { + return PyObject_Hash( p ); + } + + // convert to bool + bool as_bool() const + { + return PyObject_IsTrue( ptr() ) != 0; + } + + //operator bool() const + //{ + // return as_bool(); + //} + + // int print( FILE *fp, int flags=Py_Print_RAW ) + //{ + // return PyObject_Print( p, fp, flags ); + //} + + bool is( PyObject *pother ) const + { // identity test + return p == pother; + } + + bool is( const Object &other ) const + { // identity test + return p == other.p; + } + + bool isNull() const + { + return p == NULL; + } + + bool isNone() const + { + return p == _None(); + } + + bool isCallable() const + { + return PyCallable_Check( p ) != 0; + } + + bool isDict() const + { + return Py::_Dict_Check( p ); + } + + bool isList() const + { + return Py::_List_Check( p ); + } + + bool isMapping() const + { + return PyMapping_Check( p ) != 0; + } + + bool isNumeric() const + { + return PyNumber_Check( p ) != 0; + } + + bool isSequence() const + { + return PySequence_Check( p ) != 0; + } + + bool isTrue() const + { + return PyObject_IsTrue( p ) != 0; + } + + bool isType( const Type &t ) const; + + bool isTuple() const + { + return Py::_Tuple_Check( p ); + } + + bool isString() const + { + return Py::_Unicode_Check( p ); + } + + bool isBytes() const + { + return Py::_Bytes_Check( p ); + } + + bool isBoolean() const + { + return Py::_Boolean_Check( p ); + } + + // Commands + void setAttr( const std::string &s, const Object &value ) + { + if( PyObject_SetAttrString( p, const_cast( s.c_str() ), *value ) == -1 ) + throw AttributeError( "getAttr failed." ); + } + + void delAttr( const std::string &s ) + { + if( PyObject_DelAttrString( p, const_cast( s.c_str() ) ) == -1 ) + throw AttributeError( "delAttr failed." ); + } + + // PyObject_SetItem is too weird to be using from C++ + // so it is intentionally omitted. + + void delItem( const Object &key ) + { + //if( PyObject_DelItem( p, *key ) == -1 ) + // failed to link on Windows? + throw KeyError( "delItem failed." ); + } + // Equality and comparison use PyObject_Compare + + }; + // End of class Object + + // Null can be return from when it is require to return NULL to Python from a method + class Null: public Object + { + public: + Null() + : Object( NULL ) + { + } + virtual ~Null() + { + } + + bool accepts( PyObject *pyob ) + { + return pyob == NULL; + } + }; + + //------------------------------------------------------------ + bool operator==( const Object &o1, const Object &o2 ); + bool operator!=( const Object &o1, const Object &o2 ); + bool operator>=( const Object &o1, const Object &o2 ); + bool operator<=( const Object &o1, const Object &o2 ); + bool operator<( const Object &o1, const Object &o2 ); + bool operator>( const Object &o1, const Object &o2 ); + + //------------------------------------------------------------ + + + // + // Convert an owned Python pointer into a PyCXX Object + // + inline Object asObject( PyObject *p ) + { + return Object( p, true ); + } + + // new_reference_to also overloaded below on Object + inline PyObject *new_reference_to( PyObject *p ) + { + Py::_XINCREF( p ); + return p; + } + + inline PyObject *new_reference_to( const Object &g ) + { + PyObject *p = g.ptr(); + Py::_XINCREF( p ); + return p; + } + + // Python special None value + inline Object None() + { + return Object( Py::_None() ); + } + + // Python special Boolean values + inline Object False() + { + return Object( Py::_False() ); + } + + inline Object True() + { + return Object( Py::_True() ); + } + + // TMM: 31May'01 - Added the #ifndef so I can exlude iostreams. +#ifndef CXX_NO_IOSTREAMS + std::ostream &operator<<( std::ostream &os, const Object &ob ); +#endif + + // Class Type + class Type: public Object + { + public: + explicit Type( PyObject *pyob, bool owned = false ) + : Object( pyob, owned ) + { + validate(); + } + + Type( const Object &ob ) + : Object( *ob ) + { + validate(); + } + + Type( const Type &t ) + : Object( t ) + { + validate(); + } + + Type &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Type &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + virtual bool accepts( PyObject *pyob ) const + { + return pyob && Py::_Type_Check( pyob ); + } + }; + + // =============================================== + // class boolean + class Boolean: public Object + { + public: + // Constructor + Boolean( PyObject *pyob, bool owned = false ) + : Object( pyob, owned ) + { + validate(); + } + + Boolean( const Boolean &ob ) + : Object( *ob ) + { + validate(); + } + + // create from bool + Boolean( bool v=false ) + { + set( PyBool_FromLong( v ? 1 : 0 ), true ); + validate(); + } + + explicit Boolean( const Object &ob ) + : Object( *ob ) + { + validate(); + } + + // Assignment acquires new ownership of pointer + Boolean &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Boolean &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + // Membership + virtual bool accepts( PyObject *pyob ) const + { + // accepts any object that can be converted to a boolean + return pyob && PyObject_IsTrue( pyob ) != -1; + } + + Boolean &operator=( bool v ) + { + set( PyBool_FromLong( v ? 1 : 0 ), true ); + return *this; + } + + operator bool() const + { + return as_bool(); + } + }; + + // =============================================== + // class Long + class Long: public Object + { + public: + // Constructor + explicit Long( PyObject *pyob, bool owned = false ) + : Object( pyob, owned ) + { + validate(); + } + + Long( const Long &ob ) + : Object( ob.ptr() ) + { + validate(); + } + + // try to create from any object + explicit Long( const Object &ob ) + : Object( PyNumber_Long( *ob ), true ) + { + validate(); + } + + // create from long + explicit Long( long v = 0L ) + : Object( PyLong_FromLong( v ), true ) + { + validate(); + } + + // create from unsigned long + explicit Long( unsigned long v ) + : Object( PyLong_FromUnsignedLong( v ), true ) + { + validate(); + } + + // create from int + explicit Long( int v ) + : Object( PyLong_FromLong( static_cast( v ) ), true ) + { + validate(); + } + +#ifdef HAVE_LONG_LONG + // create from long long + explicit Long( PY_LONG_LONG v ) + : Object( PyLong_FromLongLong( v ), true ) + { + validate(); + } + + // create from unsigned long long + explicit Long( unsigned PY_LONG_LONG v ) + : Object( PyLong_FromUnsignedLongLong( v ), true ) + { + validate(); + } +#endif + + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob && Py::_Long_Check( pyob ); + } + + // Assignment acquires new ownership of pointer + Long &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Long &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( PyNumber_Long( rhsp ), true ); + return *this; + } + + // assign from an int + Long &operator=( int v ) + { + set( PyLong_FromLong( long( v ) ), true ); + return *this; + } + + // assign from long + Long &operator=( long v ) + { + set( PyLong_FromLong( v ), true ); + return *this; + } + + // assign from unsigned long + Long &operator=( unsigned long v ) + { + set( PyLong_FromUnsignedLong( v ), true ); + return *this; + } + +#ifdef HAVE_LONG_LONG + Long &operator=( PY_LONG_LONG v ) + { + set( PyLong_FromLongLong( v ), true ); + return *this; + } + + Long &operator=( unsigned PY_LONG_LONG v ) + { + set( PyLong_FromUnsignedLongLong( v ), true ); + return *this; + } +#endif + + //operator bool() const + //{ + // return as_bool(); + //} + + // convert to long + long as_long() const + { + return PyLong_AsLong( ptr() ); + } + + operator long() const + { + return as_long(); + } + + operator int() const + { + return static_cast( as_long() ); + } + + // convert to unsigned + long as_unsigned_long() const + { + return PyLong_AsUnsignedLong( ptr() ); + } + + operator unsigned long() const + { + return as_unsigned_long(); + } + + double as_double() const + { + return PyLong_AsDouble( ptr() ); + } + + operator double() const + { + return as_double(); + } + +#ifdef HAVE_LONG_LONG + PY_LONG_LONG as_long_long() const + { + return PyLong_AsLongLong( ptr() ); + } + + operator PY_LONG_LONG() const + { + return as_long_long(); + } + + unsigned PY_LONG_LONG as_unsigned_long_long() const + { + return PyLong_AsUnsignedLongLong( ptr() ); + } + + operator unsigned PY_LONG_LONG() const + { + return as_unsigned_long_long(); + } +#endif + + // prefix ++ + Long operator++() + { + set( PyNumber_Add( ptr(), *Long( 1 ) ) ); + return *this; + } + + // postfix ++ + Long operator++( int ) + { + Long a = *this; + set( PyNumber_Add( ptr(), *Long( 1 ) ) ); + return a; + } + + // prefix -- + Long operator--() + { + set( PyNumber_Subtract( ptr(), *Long( 1 ) ) ); + return *this; + } + + // postfix -- + Long operator--( int ) + { + Long a = *this; + set( PyNumber_Subtract( ptr(), *Long( 1 ) ) ); + return a; + } + }; + +#ifdef PYCXX_PYTHON_2TO3 + // PyCXX for Python2 had an Int and LongLong classes + typedef Long Int; +#ifdef HAVE_LONG_LONG + typedef Long LongLong; +#endif +#endif + +#if 1 + //------------------------------------------------------------ + // compare operators + bool operator!=( const Long &a, const Long &b ); + bool operator!=( const Long &a, int b ); + bool operator!=( const Long &a, long b ); + bool operator!=( int a, const Long &b ); + bool operator!=( long a, const Long &b ); + //------------------------------ + bool operator==( const Long &a, const Long &b ); + bool operator==( const Long &a, int b ); + bool operator==( const Long &a, long b ); + bool operator==( int a, const Long &b ); + bool operator==( long a, const Long &b ); + //------------------------------ + bool operator>( const Long &a, const Long &b ); + bool operator>( const Long &a, int b ); + bool operator>( const Long &a, long b ); + bool operator>( int a, const Long &b ); + bool operator>( long a, const Long &b ); + //------------------------------ + bool operator>=( const Long &a, const Long &b ); + bool operator>=( const Long &a, int b ); + bool operator>=( const Long &a, long b ); + bool operator>=( int a, const Long &b ); + bool operator>=( long a, const Long &b ); + //------------------------------ + bool operator<( const Long &a, const Long &b ); + bool operator<( const Long &a, int b ); + bool operator<( const Long &a, long b ); + bool operator<( int a, const Long &b ); + bool operator<( long a, const Long &b ); + //------------------------------ + bool operator<=( const Long &a, const Long &b ); + bool operator<=( int a, const Long &b ); + bool operator<=( long a, const Long &b ); + bool operator<=( const Long &a, int b ); + bool operator<=( const Long &a, long b ); + +#ifdef HAVE_LONG_LONG + //------------------------------ + bool operator!=( const Long &a, PY_LONG_LONG b ); + bool operator!=( PY_LONG_LONG a, const Long &b ); + //------------------------------ + bool operator==( const Long &a, PY_LONG_LONG b ); + bool operator==( PY_LONG_LONG a, const Long &b ); + //------------------------------ + bool operator>( const Long &a, PY_LONG_LONG b ); + bool operator>( PY_LONG_LONG a, const Long &b ); + //------------------------------ + bool operator>=( const Long &a, PY_LONG_LONG b ); + bool operator>=( PY_LONG_LONG a, const Long &b ); + //------------------------------ + bool operator<( const Long &a, PY_LONG_LONG b ); + bool operator<( PY_LONG_LONG a, const Long &b ); + //------------------------------ + bool operator<=( const Long &a, PY_LONG_LONG b ); + bool operator<=( PY_LONG_LONG a, const Long &b ); +#endif +#endif + + // =============================================== + // class Float + // + class Float: public Object + { + public: + // Constructor + explicit Float( PyObject *pyob, bool owned = false ) + : Object( pyob, owned ) + { + validate(); + } + + Float( const Float &f ) + : Object( f ) + { + validate(); + } + + // make from double + explicit Float( double v=0.0 ) + : Object( PyFloat_FromDouble( v ), true ) + { + validate(); + } + + // try to make from any object + Float( const Object &ob ) + : Object( PyNumber_Float( *ob ), true ) + { + validate(); + } + + Float &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Float &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( PyNumber_Float( rhsp ), true ); + return *this; + } + + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob && Py::_Float_Check( pyob ); + } + + double as_double() const + { + return PyFloat_AsDouble( ptr() ); + } + + // convert to double + operator double() const + { + return as_double(); + } + + // assign from a double + Float &operator=( double v ) + { + set( PyFloat_FromDouble( v ), true ); + return *this; + } + // assign from an int + Float &operator=( int v ) + { + set( PyFloat_FromDouble( double( v ) ), true ); + return *this; + } + // assign from long + Float &operator=( long v ) + { + set( PyFloat_FromDouble( double( v ) ), true ); + return *this; + } + // assign from an Long + Float &operator=( const Long &iob ) + { + set( PyFloat_FromDouble( double( iob.as_long() ) ), true ); + return *this; + } + }; + + //------------------------------------------------------------ + // compare operators + bool operator!=( const Float &a, const Float &b ); + bool operator!=( const Float &a, double b ); + bool operator!=( double a, const Float &b ); + //------------------------------ + bool operator==( const Float &a, const Float &b ); + bool operator==( const Float &a, double b ); + bool operator==( double a, const Float &b ); + //------------------------------ + bool operator>( const Float &a, const Float &b ); + bool operator>( const Float &a, double b ); + bool operator>( double a, const Float &b ); + //------------------------------ + bool operator>=( const Float &a, const Float &b ); + bool operator>=( const Float &a, double b ); + bool operator>=( double a, const Float &b ); + //------------------------------ + bool operator<( const Float &a, const Float &b ); + bool operator<( const Float &a, double b ); + bool operator<( double a, const Float &b ); + //------------------------------ + bool operator<=( const Float &a, const Float &b ); + bool operator<=( double a, const Float &b ); + bool operator<=( const Float &a, double b ); + + // =============================================== + // class Complex + class Complex: public Object + { + public: + // Constructor + explicit Complex( PyObject *pyob, bool owned = false ) + : Object( pyob, owned ) + { + validate(); + } + + Complex( const Complex &f ) + : Object( f ) + { + validate(); + } + + // make from double + explicit Complex( double v=0.0, double w=0.0 ) + :Object( PyComplex_FromDoubles( v, w ), true ) + { + validate(); + } + + Complex &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Complex &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob && Py::_Complex_Check( pyob ); + } + // convert to Py_complex + operator Py_complex() const + { + return PyComplex_AsCComplex( ptr() ); + } + // assign from a Py_complex + Complex &operator=( const Py_complex &v ) + { + set( PyComplex_FromCComplex( v ), true ); + return *this; + } + // assign from a double + Complex &operator=( double v ) + { + set( PyComplex_FromDoubles( v, 0.0 ), true ); + return *this; + } + // assign from an int + Complex &operator=( int v ) + { + set( PyComplex_FromDoubles( double( v ), 0.0 ), true ); + return *this; + } + // assign from long + Complex &operator=( long v ) + { + set( PyComplex_FromDoubles( double( v ), 0.0 ), true ); + return *this; + } + // assign from an Long + Complex &operator=( const Long &iob ) + { + set( PyComplex_FromDoubles( double( iob.as_long() ), 0.0 ), true ); + return *this; + } + + double real() const + { + return PyComplex_RealAsDouble( ptr() ); + } + + double imag() const + { + return PyComplex_ImagAsDouble( ptr() ); + } + }; + // Sequences + // Sequences are here represented as sequences of items of type T. + // The base class SeqBase represents that. + // In basic Python T is always "Object". + + // seqref is what you get if you get elements from a non-const SeqBase. + // Note: seqref could probably be a nested class in SeqBase but that might stress + // some compilers needlessly. Simlarly for mapref later. + + // While this class is not intended for enduser use, it needs some public + // constructors for the benefit of the STL. + + // See Scott Meyer's More Essential C++ for a description of proxies. + // This application is even more complicated. We are doing an unusual thing + // in having a double proxy. If we want the STL to work + // properly we have to compromise by storing the rvalue inside. The + // entire Object API is repeated so that things like s[i].isList() will + // work properly. + + // Still, once in a while a weird compiler message may occur using expressions like x[i] + // Changing them to Object( x[i] ) helps the compiler to understand that the + // conversion of a seqref to an Object is wanted. + + template + class seqref + { + protected: + SeqBase &s; // the sequence + int offset; // item number + T the_item; // lvalue + + public: + seqref( SeqBase &seq, sequence_index_type j ) + : s( seq ) + , offset( j ) + , the_item( s.getItem( j ) ) + {} + + seqref( const seqref &range ) + : s( range.s ) + , offset( range.offset ) + , the_item( range.the_item ) + {} + + // TMM: added this seqref ctor for use with STL algorithms + seqref( Object &obj ) + : s( dynamic_cast< SeqBase&>( obj ) ) + , offset( NULL ) + , the_item( s.getItem( offset ) ) + {} + + ~seqref() + {} + + operator T() const + { // rvalue + return the_item; + } + + seqref &operator=( const seqref &rhs ) + { //used as lvalue + the_item = rhs.the_item; + s.setItem( offset, the_item ); + return *this; + } + + seqref &operator=( const T &ob ) + { // used as lvalue + the_item = ob; + s.setItem( offset, ob ); + return *this; + } + + // forward everything else to the item + PyObject *ptr() const + { + return the_item.ptr(); + } + + int reference_count() const + { // the reference count + return the_item.reference_count(); + } + + Type type() const + { + return the_item.type(); + } + + String str() const; + String repr() const; + + bool hasAttr( const std::string &attr_name ) const + { + return the_item.hasAttr( attr_name ); + } + + Object getAttr( const std::string &attr_name ) const + { + return the_item.getAttr( attr_name ); + } + + Object getItem( const Object &key ) const + { + return the_item.getItem( key ); + } + + long hashValue() const + { + return the_item.hashValue(); + } + + bool isCallable() const + { + return the_item.isCallable(); + } + + bool isInstance() const + { + return the_item.isInstance(); + } + + bool isDict() const + { + return the_item.isDict(); + } + + bool isList() const + { + return the_item.isList(); + } + + bool isMapping() const + { + return the_item.isMapping(); + } + + bool isNumeric() const + { + return the_item.isNumeric(); + } + + bool isSequence() const + { + return the_item.isSequence(); + } + + bool isTrue() const + { + return the_item.isTrue(); + } + + bool isType( const Type &t ) const + { + return the_item.isType( t ); + } + + bool isTuple() const + { + return the_item.isTuple(); + } + + bool isString() const + { + return the_item.isString(); + } + // Commands + void setAttr( const std::string &attr_name, const Object &value ) + { + the_item.setAttr( attr_name, value ); + } + + void delAttr( const std::string &attr_name ) + { + the_item.delAttr( attr_name ); + } + + void delItem( const Object &key ) + { + the_item.delItem( key ); + } + + bool operator==( const Object &o2 ) const + { + return the_item == o2; + } + + bool operator!=( const Object &o2 ) const + { + return the_item != o2; + } + + bool operator>=( const Object &o2 ) const + { + return the_item >= o2; + } + + bool operator<=( const Object &o2 ) const + { + return the_item <= o2; + } + + bool operator<( const Object &o2 ) const + { + return the_item < o2; + } + + bool operator>( const Object &o2 ) const + { + return the_item > o2; + } + }; // end of seqref + + + // class SeqBase + // ...the base class for all sequence types + + template + class SeqBase: public Object + { + public: + // STL definitions + typedef size_t size_type; + typedef seqref reference; + typedef T const_reference; + typedef seqref *pointer; + typedef int difference_type; + typedef T value_type; // TMM: 26Jun'01 + + virtual size_type max_size() const + { + return std::string::npos; // ? + } + + virtual size_type capacity() const + { + return size(); + } + + virtual void swap( SeqBase &c ) + { + SeqBase temp = c; + c = ptr(); + set( temp.ptr() ); + } + + virtual size_type size() const + { + return PySequence_Length( ptr() ); + } + + explicit SeqBase() + :Object( PyTuple_New( 0 ), true ) + { + validate(); + } + + explicit SeqBase( PyObject *pyob, bool owned=false ) + : Object( pyob, owned ) + { + validate(); + } + + SeqBase( const Object &ob ) + : Object( ob ) + { + validate(); + } + + // Assignment acquires new ownership of pointer + + SeqBase &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + SeqBase &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + virtual bool accepts( PyObject *pyob ) const + { + return pyob && PySequence_Check( pyob ); + } + + size_type length() const + { + return PySequence_Length( ptr() ); + } + + // Element access + const T operator[]( sequence_index_type index ) const + { + return getItem( index ); + } + + seqref operator[]( sequence_index_type index ) + { + return seqref( *this, index ); + } + + virtual T getItem( sequence_index_type i ) const + { + return T( asObject( PySequence_GetItem( ptr(), i ) ) ); + } + + virtual void setItem( sequence_index_type i, const T &ob ) + { + if( PySequence_SetItem( ptr(), i, *ob ) == -1 ) + { + throw Exception(); + } + } + + SeqBase repeat( int count ) const + { + return SeqBase( PySequence_Repeat( ptr(), count ), true ); + } + + SeqBase concat( const SeqBase &other ) const + { + return SeqBase( PySequence_Concat( ptr(), *other ), true ); + } + + // more STL compatability + const T front() const + { + return getItem( 0 ); + } + + seqref front() + { + return seqref( *this, 0 ); + } + + const T back() const + { + return getItem( size()-1 ); + } + + seqref back() + { + return seqref( *this, size()-1 ); + } + + void verify_length( size_type required_size ) const + { + if( size() != required_size ) + throw IndexError( "Unexpected SeqBase length." ); + } + + void verify_length( size_type min_size, size_type max_size ) const + { + size_type n = size(); + if( n < min_size || n > max_size ) + throw IndexError( "Unexpected SeqBase length." ); + } + + class iterator + : public random_access_iterator_parent( seqref ) + { + protected: + friend class SeqBase; + SeqBase *seq; + int count; + + public: + ~iterator() + {} + + iterator() + : seq( 0 ) + , count( 0 ) + {} + + iterator( SeqBase *s, int where ) + : seq( s ) + , count( where ) + {} + + iterator( const iterator &other ) + : seq( other.seq ) + , count( other.count ) + {} + + bool eql( const iterator &other ) const + { + return seq->ptr() == other.seq->ptr() && count == other.count; + } + + bool neq( const iterator &other ) const + { + return seq->ptr() != other.seq->ptr() || count != other.count; + } + + bool lss( const iterator &other ) const + { + return count < other.count; + } + + bool gtr( const iterator &other ) const + { + return count > other.count; + } + + bool leq( const iterator &other ) const + { + return count <= other.count; + } + + bool geq( const iterator &other ) const + { + return count >= other.count; + } + + seqref operator*() + { + return seqref( *seq, count ); + } + + seqref operator[]( sequence_index_type i ) + { + return seqref( *seq, count + i ); + } + + iterator &operator=( const iterator &other ) + { + if( this != &other ) + { + seq = other.seq; + count = other.count; + } + return *this; + } + + iterator operator+( int n ) const + { + return iterator( seq, count + n ); + } + + iterator operator-( int n ) const + { + return iterator( seq, count - n ); + } + + iterator &operator+=( int n ) + { + count = count + n; + return *this; + } + + iterator &operator-=( int n ) + { + count = count - n; + return *this; + } + + int operator-( const iterator &other ) const + { + if( seq.ptr() != other.seq.ptr() ) + throw RuntimeError( "SeqBase::iterator comparison error" ); + + return count - other.count; + } + + // prefix ++ + iterator &operator++() + { + count++; + return *this; + } + + // postfix ++ + iterator operator++( int ) + { + return iterator( seq, count++ ); + } + + // prefix -- + iterator &operator--() + { + count--; + return *this; + } + + // postfix -- + iterator operator--( int ) + { + return iterator( seq, count-- ); + } + + std::string diagnose() const + { + std::OSTRSTREAM oss; + oss << "iterator diagnosis " << seq << ", " << count << std::ends; + return std::string( oss.str() ); + } + + }; // end of class SeqBase::iterator + + iterator begin() + { + return iterator( this, 0 ); + } + + iterator end() + { + return iterator( this, length() ); + } + + class const_iterator + : public random_access_iterator_parent( const Object ) + { + protected: + friend class SeqBase; + const SeqBase *seq; + sequence_index_type count; + + public: + ~const_iterator() + {} + + const_iterator() + : seq( 0 ) + , count( 0 ) + {} + + const_iterator( const SeqBase *s, int where ) + : seq( s ) + , count( where ) + {} + + const_iterator( const const_iterator &other ) + : seq( other.seq ) + , count( other.count ) + {} + + const T operator*() const + { + return seq->getItem( count ); + } + + const T operator[]( sequence_index_type i ) const + { + return seq->getItem( count + i ); + } + + const_iterator &operator=( const const_iterator &other ) + { + if( this != &other ) + { + seq = other.seq; + count = other.count; + } + return *this; + } + + const_iterator operator+( int n ) const + { + return const_iterator( seq, count + n ); + } + + bool eql( const const_iterator &other ) const + { + return seq->ptr() == other.seq->ptr() && count == other.count; + } + + bool neq( const const_iterator &other ) const + { + return seq->ptr() != other.seq->ptr() || count != other.count; + } + + bool lss( const const_iterator &other ) const + { + return count < other.count; + } + + bool gtr( const const_iterator &other ) const + { + return count > other.count; + } + + bool leq( const const_iterator &other ) const + { + return count <= other.count; + } + + bool geq( const const_iterator &other ) const + { + return count >= other.count; + } + + const_iterator operator-( int n ) + { + return const_iterator( seq, count - n ); + } + + const_iterator &operator+=( int n ) + { + count = count + n; + return *this; + } + + const_iterator &operator-=( int n ) + { + count = count - n; + return *this; + } + + int operator-( const const_iterator &other ) const + { + if( *seq != *other.seq ) + throw RuntimeError( "SeqBase::const_iterator::- error" ); + return count - other.count; + } + + // prefix ++ + const_iterator &operator++() + { + count++; + return *this; + } + + // postfix ++ + const_iterator operator++( int ) + { + return const_iterator( seq, count++ ); + } + + // prefix -- + const_iterator &operator--() + { + count--; + return *this; + } + + // postfix -- + const_iterator operator--( int ) + { + return const_iterator( seq, count-- ); + } + + }; // end of class SeqBase::const_iterator + + const_iterator begin() const + { + return const_iterator( this, 0 ); + } + + const_iterator end() const + { + return const_iterator( this, length() ); + } + }; + + // Here's an important typedef you might miss if reading too fast... + typedef SeqBase Sequence; + + template bool operator==( const EXPLICIT_TYPENAME SeqBase::iterator &left, const EXPLICIT_TYPENAME SeqBase::iterator &right ); + template bool operator!=( const EXPLICIT_TYPENAME SeqBase::iterator &left, const EXPLICIT_TYPENAME SeqBase::iterator &right ); + template bool operator< ( const EXPLICIT_TYPENAME SeqBase::iterator &left, const EXPLICIT_TYPENAME SeqBase::iterator &right ); + template bool operator> ( const EXPLICIT_TYPENAME SeqBase::iterator &left, const EXPLICIT_TYPENAME SeqBase::iterator &right ); + template bool operator<=( const EXPLICIT_TYPENAME SeqBase::iterator &left, const EXPLICIT_TYPENAME SeqBase::iterator &right ); + template bool operator>=( const EXPLICIT_TYPENAME SeqBase::iterator &left, const EXPLICIT_TYPENAME SeqBase::iterator &right ); + + template bool operator==( const EXPLICIT_TYPENAME SeqBase::const_iterator &left, const EXPLICIT_TYPENAME SeqBase::const_iterator &right ); + template bool operator!=( const EXPLICIT_TYPENAME SeqBase::const_iterator &left, const EXPLICIT_TYPENAME SeqBase::const_iterator &right ); + template bool operator< ( const EXPLICIT_TYPENAME SeqBase::const_iterator &left, const EXPLICIT_TYPENAME SeqBase::const_iterator &right ); + template bool operator> ( const EXPLICIT_TYPENAME SeqBase::const_iterator &left, const EXPLICIT_TYPENAME SeqBase::const_iterator &right ); + template bool operator<=( const EXPLICIT_TYPENAME SeqBase::const_iterator &left, const EXPLICIT_TYPENAME SeqBase::const_iterator &right ); + template bool operator>=( const EXPLICIT_TYPENAME SeqBase::const_iterator &left, const EXPLICIT_TYPENAME SeqBase::const_iterator &right ); + + + extern bool operator==( const Sequence::iterator &left, const Sequence::iterator &right ); + extern bool operator!=( const Sequence::iterator &left, const Sequence::iterator &right ); + extern bool operator< ( const Sequence::iterator &left, const Sequence::iterator &right ); + extern bool operator> ( const Sequence::iterator &left, const Sequence::iterator &right ); + extern bool operator<=( const Sequence::iterator &left, const Sequence::iterator &right ); + extern bool operator>=( const Sequence::iterator &left, const Sequence::iterator &right ); + + extern bool operator==( const Sequence::const_iterator &left, const Sequence::const_iterator &right ); + extern bool operator!=( const Sequence::const_iterator &left, const Sequence::const_iterator &right ); + extern bool operator< ( const Sequence::const_iterator &left, const Sequence::const_iterator &right ); + extern bool operator> ( const Sequence::const_iterator &left, const Sequence::const_iterator &right ); + extern bool operator<=( const Sequence::const_iterator &left, const Sequence::const_iterator &right ); + extern bool operator>=( const Sequence::const_iterator &left, const Sequence::const_iterator &right ); + + // ================================================== + // class Char + // Python strings return strings as individual elements. + // I'll try having a class Char which is a String of length 1 + // + typedef std::basic_string unicodestring; + extern Py_UNICODE unicode_null_string[1]; + + class Byte: public Object + { + public: + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob != NULL + && Py::_Unicode_Check( pyob ) + && PySequence_Length( pyob ) == 1; + } + + explicit Byte( PyObject *pyob, bool owned = false ) + : Object( pyob, owned ) + { + validate(); + } + + Byte( const Object &ob ) + : Object( ob ) + { + validate(); + } + + Byte( const std::string &v = "" ) + : Object( PyBytes_FromStringAndSize( const_cast( v.c_str() ), 1 ), true ) + { + validate(); + } + + Byte( char v ) + : Object( PyBytes_FromStringAndSize( &v, 1 ), true ) + { + validate(); + } + + // Assignment acquires new ownership of pointer + Byte &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Byte &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + // Assignment from C string + Byte &operator=( const std::string &v ) + { + set( PyBytes_FromStringAndSize( const_cast( v.c_str() ),1 ), true ); + return *this; + } + + Byte &operator=( char v ) + { + set( PyUnicode_FromStringAndSize( &v, 1 ), true ); + return *this; + } + + // Conversion + operator Bytes() const; + }; + + class Bytes: public SeqBase + { + public: + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob != NULL && Py::_Bytes_Check( pyob ); + } + + virtual size_type capacity() const + { + return max_size(); + } + + explicit Bytes( PyObject *pyob, bool owned = false ) + : SeqBase( pyob, owned ) + { + validate(); + } + + Bytes( const Object &ob ) + : SeqBase( ob ) + { + validate(); + } + + Bytes() + : SeqBase( PyBytes_FromStringAndSize( "", 0 ), true ) + { + validate(); + } + + Bytes( const std::string &v ) + : SeqBase( PyBytes_FromStringAndSize( const_cast( v.data() ), static_cast( v.length() ) ), true ) + { + validate(); + } + + Bytes( const std::string &v, Py_ssize_t vsize ) + : SeqBase( PyBytes_FromStringAndSize( const_cast( v.data() ), static_cast( vsize ) ), true ) + { + validate(); + } + + Bytes( const char *v ) + : SeqBase( PyBytes_FromString( v ), true ) + { + validate(); + } + + Bytes( const char *v, Py_ssize_t vsize ) + : SeqBase( PyBytes_FromStringAndSize( const_cast( v ), vsize ), true ) + { + validate(); + } + + // Assignment acquires new ownership of pointer + Bytes &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Bytes &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + // Assignment from C string + Bytes &operator=( const std::string &v ) + { + set( PyBytes_FromStringAndSize( const_cast( v.data() ), static_cast( v.length() ) ), true ); + return *this; + } + + String decode( const char *encoding, const char *error="strict" ); + + // Queries + virtual size_type size() const + { + return static_cast( PyBytes_Size( ptr() ) ); + } + + operator std::string() const + { + return as_std_string(); + } + + std::string as_std_string() const + { + return std::string( PyBytes_AsString( ptr() ), static_cast( PyBytes_Size( ptr() ) ) ); + } + }; + + class Char: public Object + { + public: + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob != 0 &&( Py::_Unicode_Check( pyob ) ) && PySequence_Length( pyob ) == 1; + } + + explicit Char( PyObject *pyob, bool owned = false ) + : Object( pyob, owned ) + { + validate(); + } + + Char( const Object &ob ) + : Object( ob ) + { + validate(); + } + + Char( int v ) + : Object( PyUnicode_FromOrdinal( v ), true ) + { + validate(); + } + + Char( Py_UNICODE v ) + : Object( PyUnicode_FromOrdinal( v ), true ) + { + validate(); + } + + Char( const unicodestring &v ) + : Object( PyUnicode_FromUnicode( const_cast( v.data() ),1 ), true ) + { + validate(); + } + + // Assignment acquires new ownership of pointer + Char &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Char &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + Char &operator=( const unicodestring &v ) + { + set( PyUnicode_FromUnicode( const_cast( v.data() ), 1 ), true ); + return *this; + } + + Char &operator=( int v_ ) + { + Py_UNICODE v( v_ ); + set( PyUnicode_FromUnicode( &v, 1 ), true ); + return *this; + } + + Char &operator=( Py_UNICODE v ) + { + set( PyUnicode_FromUnicode( &v, 1 ), true ); + return *this; + } + + // Conversion + operator String() const; + }; + + class String: public SeqBase + { + public: + virtual size_type capacity() const + { + return max_size(); + } + + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob != NULL && Py::_Unicode_Check( pyob ); + } + + explicit String( PyObject *pyob, bool owned = false ) + : SeqBase( pyob, owned ) + { + validate(); + } + + String( const Object &ob ) + : SeqBase( ob ) + { + validate(); + } + + String() + : SeqBase( PyUnicode_FromString( "" ), true ) + { + validate(); + } + + String( const char *latin1 ) + : SeqBase( PyUnicode_FromString( latin1 ) ) + { + validate(); + } + + String( const std::string &latin1 ) + : SeqBase( PyUnicode_FromStringAndSize( latin1.c_str(), latin1.size() ) ) + { + validate(); + } + + String( const char *latin1, Py_ssize_t size ) + : SeqBase( PyUnicode_FromStringAndSize( latin1, size ) ) + { + validate(); + } + + /* [Taken from Pythons's unicode.h] + + Many of these APIs take two arguments encoding and errors. These + parameters encoding and errors have the same semantics as the ones + of the builtin unicode() API. + + Setting encoding to NULL causes the default encoding to be used. + + Error handling is set by errors which may also be set to NULL + meaning to use the default handling defined for the codec. Default + error handling for all builtin codecs is "strict" (ValueErrors are + raised). + + The codecs all use a similar interface. Only deviation from the + generic ones are documented. + + */ + String( const std::string &s, const char *encoding, const char *errors=NULL ) + : SeqBase( PyUnicode_Decode( s.c_str(), s.size(), encoding, errors ) ) + { + validate(); + } + + String( const char *s, const char *encoding, const char *errors=NULL ) + : SeqBase( PyUnicode_Decode( s, strlen(s), encoding, errors ) ) + { + validate(); + } + + String( const char *s, Py_ssize_t size, const char *encoding, const char *errors=NULL ) + : SeqBase( PyUnicode_Decode( s, size, encoding, errors ) ) + { + validate(); + } + + // Assignment acquires new ownership of pointer + String &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + String &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + String &operator=( const unicodestring &v ) + { + set( PyUnicode_FromUnicode( const_cast( v.data() ), static_cast( v.length() ) ), true ); + return *this; + } + + // Encode + Bytes encode( const char *encoding, const char *error="strict" ) const + { + return Bytes( PyUnicode_AsEncodedString( ptr(), encoding, error ) ); + } + + // Queries + virtual size_type size() const + { + return static_cast( PyUnicode_GET_SIZE( ptr() ) ); + } + + unicodestring as_unicodestring() const + { + return unicodestring( PyUnicode_AS_UNICODE( ptr() ), static_cast( PyUnicode_GET_SIZE( ptr() ) ) ); + } + + operator std::string() const + { + // use the default encoding + return as_std_string( NULL ); + } + + std::string as_std_string( const char *encoding=NULL, const char *error="strict" ) const + { + Bytes b( encode( encoding, error ) ); + return b.as_std_string(); + } + }; + + // ================================================== + // class Tuple + class Tuple: public Sequence + { + public: + virtual void setItem( sequence_index_type offset, const Object&ob ) + { + // note PyTuple_SetItem is a thief... + if( PyTuple_SetItem( ptr(), offset, new_reference_to( ob ) ) == -1 ) + { + throw Exception(); + } + } + + // Constructor + explicit Tuple( PyObject *pyob, bool owned = false ) + : Sequence( pyob, owned ) + { + validate(); + } + + Tuple( const Object &ob ) + : Sequence( ob ) + { + validate(); + } + + // New tuple of a given size + explicit Tuple( int size = 0 ) + { + set( PyTuple_New( size ), true ); + validate(); + for( sequence_index_type i=0; i < size; i++ ) + { + if( PyTuple_SetItem( ptr(), i, new_reference_to( Py::_None() ) ) == -1 ) + { + throw Exception(); + } + } + } + // Tuple from any sequence + explicit Tuple( const Sequence &s ) + { + sequence_index_type limit( sequence_index_type( s.length() ) ); + + set( PyTuple_New( limit ), true ); + validate(); + + for( sequence_index_type i=0; i < limit; i++ ) + { + if( PyTuple_SetItem( ptr(), i, new_reference_to( s[i] ) ) == -1 ) + { + throw Exception(); + } + } + } + // Assignment acquires new ownership of pointer + + Tuple &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Tuple &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob && Py::_Tuple_Check( pyob ); + } + + Tuple getSlice( int i, int j ) const + { + return Tuple( PySequence_GetSlice( ptr(), i, j ), true ); + } + + }; + + // ================================================== + // class List + + class List: public Sequence + { + public: + // Constructor + explicit List( PyObject *pyob, bool owned = false ) + : Sequence( pyob, owned ) + { + validate(); + } + List( const Object &ob ) + : Sequence( ob ) + { + validate(); + } + // Creation at a fixed size + List( int size = 0 ) + { + set( PyList_New( size ), true ); + validate(); + for( sequence_index_type i=0; i < size; i++ ) + { + if( PyList_SetItem( ptr(), i, new_reference_to( Py::_None() ) ) == -1 ) + { + throw Exception(); + } + } + } + + // List from a sequence + List( const Sequence &s ) + : Sequence() + { + int n =( int )s.length(); + set( PyList_New( n ), true ); + validate(); + for( sequence_index_type i=0; i < n; i++ ) + { + if( PyList_SetItem( ptr(), i, new_reference_to( s[i] ) ) == -1 ) + { + throw Exception(); + } + } + } + + virtual size_type capacity() const + { + return max_size(); + } + // Assignment acquires new ownership of pointer + + List &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + List &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob && Py::_List_Check( pyob ); + } + + List getSlice( int i, int j ) const + { + return List( PyList_GetSlice( ptr(), i, j ), true ); + } + + void setSlice( int i, int j, const Object &v ) + { + if( PyList_SetSlice( ptr(), i, j, *v ) == -1 ) + { + throw Exception(); + } + } + + void append( const Object &ob ) + { + if( PyList_Append( ptr(), *ob ) == -1 ) + { + throw Exception(); + } + } + + void extend( const Object &ob ) + { + setSlice( size(), size(), ob ); + } + + void insert( int i, const Object &ob ) + { + if( PyList_Insert( ptr(), i, *ob ) == -1 ) + { + throw Exception(); + } + } + + void sort() + { + if( PyList_Sort( ptr() ) == -1 ) + { + throw Exception(); + } + } + + void reverse() + { + if( PyList_Reverse( ptr() ) == -1 ) + { + throw Exception(); + } + } + }; + + + // Mappings + // ================================================== + template + class mapref + { + protected: + MapBase &s; // the map + Object key; // item key + T the_item; + + public: + mapref( MapBase &map, const std::string &k ) + : s( map ), the_item() + { + key = String( k ); + if( map.hasKey( key ) ) the_item = map.getItem( key ); + } + + mapref( MapBase &map, const Object &k ) + : s( map ), key( k ), the_item() + { + if( map.hasKey( key ) ) the_item = map.getItem( key ); + } + + virtual ~mapref() + {} + + // MapBase stuff + // lvalue + mapref &operator=( const mapref &other ) + { + if( this != &other ) + { + the_item = other.the_item; + s.setItem( key, other.the_item ); + } + return *this; + } + + mapref &operator=( const T &ob ) + { + the_item = ob; + s.setItem( key, ob ); + return *this; + } + + // rvalue + operator T() const + { + return the_item; + } + + // forward everything else to the_item + PyObject *ptr() const + { + return the_item.ptr(); + } + + int reference_count() const + { // the mapref count + return the_item.reference_count(); + } + + Type type() const + { + return the_item.type(); + } + + String str() const + { + return the_item.str(); + } + + String repr() const + { + return the_item.repr(); + } + + bool hasAttr( const std::string &attr_name ) const + { + return the_item.hasAttr( attr_name ); + } + + Object getAttr( const std::string &attr_name ) const + { + return the_item.getAttr( attr_name ); + } + + Object getItem( const Object &k ) const + { + return the_item.getItem( k ); + } + + long hashValue() const + { + return the_item.hashValue(); + } + + bool isCallable() const + { + return the_item.isCallable(); + } + + bool isInstance() const + { + return the_item.isInstance(); + } + + bool isList() const + { + return the_item.isList(); + } + + bool isMapping() const + { + return the_item.isMapping(); + } + + bool isNumeric() const + { + return the_item.isNumeric(); + } + + bool isSequence() const + { + return the_item.isSequence(); + } + + bool isTrue() const + { + return the_item.isTrue(); + } + + bool isType( const Type &t ) const + { + return the_item.isType( t ); + } + + bool isTuple() const + { + return the_item.isTuple(); + } + + bool isString() const + { + return the_item.isString(); + } + + // Commands + void setAttr( const std::string &attr_name, const Object &value ) + { + the_item.setAttr( attr_name, value ); + } + + void delAttr( const std::string &attr_name ) + { + the_item.delAttr( attr_name ); + } + + void delItem( const Object &k ) + { + the_item.delItem( k ); + } + }; // end of mapref + +#if 0 + // TMM: now for mapref + template< class T > + bool operator==( const mapref &left, const mapref &right ) + { + return true; // NOT completed. + } + + template< class T > + bool operator!=( const mapref &left, const mapref &right ) + { + return true; // not completed. + } +#endif + + template + class MapBase: public Object + { + protected: + explicit MapBase() + {} + public: + // reference: proxy class for implementing [] + // TMM: 26Jun'01 - the types + // If you assume that Python mapping is a hash_map... + // hash_map::value_type is not assignable, but + //( *it ).second = data must be a valid expression + typedef size_t size_type; + typedef Object key_type; + typedef mapref data_type; + typedef std::pair< const T, T > value_type; + typedef std::pair< const T, mapref > reference; + typedef const std::pair< const T, const T > const_reference; + typedef std::pair< const T, mapref > pointer; + + // Constructor + explicit MapBase( PyObject *pyob, bool owned = false ) + : Object( pyob, owned ) + { + validate(); + } + + // TMM: 02Jul'01 - changed MapBase to Object in next line + MapBase( const Object &ob ) + : Object( ob ) + { + validate(); + } + + // Assignment acquires new ownership of pointer + MapBase &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + MapBase &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob && PyMapping_Check( pyob ); + } + + // Clear -- PyMapping Clear is missing + // + + void clear() + { + List k = keys(); + for( List::iterator i = k.begin(); i != k.end(); i++ ) + { + delItem( *i ); + } + } + + virtual size_type size() const + { + return PyMapping_Length( ptr() ); + } + + // Element Access + T operator[]( const std::string &key ) const + { + return getItem( key ); + } + + T operator[]( const Object &key ) const + { + return getItem( key ); + } + + mapref operator[]( const char *key ) + { + return mapref( *this, key ); + } + + mapref operator[]( const std::string &key ) + { + return mapref( *this, key ); + } + + mapref operator[]( const Object &key ) + { + return mapref( *this, key ); + } + + int length() const + { + return PyMapping_Length( ptr() ); + } + + bool hasKey( const std::string &s ) const + { + return PyMapping_HasKeyString( ptr(),const_cast( s.c_str() ) ) != 0; + } + + bool hasKey( const Object &s ) const + { + return PyMapping_HasKey( ptr(), s.ptr() ) != 0; + } + + T getItem( const std::string &s ) const + { + return T( asObject( PyMapping_GetItemString( ptr(),const_cast( s.c_str() ) ) ) ); + } + + T getItem( const Object &s ) const + { + return T( asObject( PyObject_GetItem( ptr(), s.ptr() ) ) ); + } + + virtual void setItem( const char *s, const Object &ob ) + { + if( PyMapping_SetItemString( ptr(), const_cast( s ), *ob ) == -1 ) + { + throw Exception(); + } + } + + virtual void setItem( const std::string &s, const Object &ob ) + { + if( PyMapping_SetItemString( ptr(), const_cast( s.c_str() ), *ob ) == -1 ) + { + throw Exception(); + } + } + + virtual void setItem( const Object &s, const Object &ob ) + { + if( PyObject_SetItem( ptr(), s.ptr(), ob.ptr() ) == -1 ) + { + throw Exception(); + } + } + + void delItem( const std::string &s ) + { + if( PyMapping_DelItemString( ptr(), const_cast( s.c_str() ) ) == -1 ) + { + throw Exception(); + } + } + + void delItem( const Object &s ) + { + if( PyMapping_DelItem( ptr(), *s ) == -1 ) + { + throw Exception(); + } + } + + // Queries + List keys() const + { + return List( PyMapping_Keys( ptr() ), true ); + } + + List values() const + { + // each returned item is a (key, value) pair + return List( PyMapping_Values( ptr() ), true ); + } + + List items() const + { + return List( PyMapping_Items( ptr() ), true ); + } + + class iterator + { + // : public forward_iterator_parent( std::pair ) { + protected: + typedef std::forward_iterator_tag iterator_category; + typedef std::pair< const T, T > value_type; + typedef int difference_type; + typedef std::pair< const T, mapref > pointer; + typedef std::pair< const T, mapref > reference; + + friend class MapBase; + // + MapBase *map; + List keys; // for iterating over the map + int pos; // index into the keys + + public: + ~iterator() + {} + + iterator() + : map( 0 ) + , keys() + , pos( 0 ) + {} + + iterator( MapBase *m, bool end = false ) + : map( m ) + , keys( m->keys() ) + , pos( end ? keys.length() : 0 ) + {} + + iterator( const iterator &other ) + : map( other.map ) + , keys( other.keys ) + , pos( other.pos ) + {} + + iterator( MapBase *map_, List keys_, int pos_ ) + : map( map_ ) + , keys( keys_ ) + , pos( pos_ ) + {} + + reference operator*() + { + Object key = keys[ pos ]; + return std::make_pair( key, mapref( *map, key ) ); + } + + iterator &operator=( const iterator &other ) + { + if( this != &other ) + { + map = other.map; + keys = other.keys; + pos = other.pos; + } + return *this; + } + + bool eql( const iterator &other ) const + { + return map->ptr() == other.map->ptr() && pos == other.pos; + } + + bool neq( const iterator &other ) const + { + return map->ptr() != other.map->ptr() || pos != other.pos; + } + + // pointer operator->() { + // return ; + // } + + // prefix ++ + iterator &operator++() + { + pos++; + return *this; + } + + // postfix ++ + iterator operator++( int ) + { + return iterator( map, keys, pos++ ); + } + + // prefix -- + iterator &operator--() + { + pos--; + return *this; + } + + // postfix -- + iterator operator--( int ) + { + return iterator( map, keys, pos-- ); + } + + std::string diagnose() const + { + std::OSTRSTREAM oss; + oss << "iterator diagnosis " << map << ", " << pos << std::ends; + return std::string( oss.str() ); + } + }; // end of class MapBase::iterator + + iterator begin() + { + return iterator( this, false ); + } + + iterator end() + { + return iterator( this, true ); + } + + class const_iterator + { + protected: + typedef std::forward_iterator_tag iterator_category; + typedef const std::pair< const T, T > value_type; + typedef int difference_type; + typedef const std::pair< const T, T > pointer; + typedef const std::pair< const T, T > reference; + + friend class MapBase; + const MapBase *map; + List keys; // for iterating over the map + int pos; // index into the keys + + public: + ~const_iterator() + {} + + const_iterator() + : map( 0 ) + , keys() + , pos() + {} + + const_iterator( const MapBase *m, List k, int p ) + : map( m ) + , keys( k ) + , pos( p ) + {} + + const_iterator( const const_iterator &other ) + : map( other.map ) + , keys( other.keys ) + , pos( other.pos ) + {} + + bool eql( const const_iterator &other ) const + { + return map->ptr() == other.map->ptr() && pos == other.pos; + } + + bool neq( const const_iterator &other ) const + { + return map->ptr() != other.map->ptr() || pos != other.pos; + } + + + // const_reference operator*() { + // Object key = *pos; + // return std::make_pair( key, map->[key] ); + // GCC < 3 barfes on this line at the '['. + // } + + const_reference operator*() + { + Object key = keys[ pos ]; + return std::make_pair( key, mapref( *map, key ) ); + } + + const_iterator &operator=( const const_iterator &other ) + { + if( this != &other ) + { + map = other.map; + keys = other.keys; + pos = other.pos; + } + return *this; + } + + // prefix ++ + const_iterator &operator++() + { + pos++; + return *this; + } + + // postfix ++ + const_iterator operator++( int ) + { + return const_iterator( map, keys, pos++ ); + } + + // prefix -- + const_iterator &operator--() + { + pos--; + return *this; + } + + // postfix -- + const_iterator operator--( int ) + { + return const_iterator( map, keys, pos-- ); + } + }; // end of class MapBase::const_iterator + + const_iterator begin() const + { + return const_iterator( this, keys(), 0 ); + } + + const_iterator end() const + { + return const_iterator( this, keys(), length() ); + } + + }; // end of MapBase + + typedef MapBase Mapping; + + template bool operator==( const EXPLICIT_TYPENAME MapBase::iterator &left, const EXPLICIT_TYPENAME MapBase::iterator &right ); + template bool operator!=( const EXPLICIT_TYPENAME MapBase::iterator &left, const EXPLICIT_TYPENAME MapBase::iterator &right ); + template bool operator==( const EXPLICIT_TYPENAME MapBase::const_iterator &left, const EXPLICIT_TYPENAME MapBase::const_iterator &right ); + template bool operator!=( const EXPLICIT_TYPENAME MapBase::const_iterator &left, const EXPLICIT_TYPENAME MapBase::const_iterator &right ); + + extern bool operator==( const Mapping::iterator &left, const Mapping::iterator &right ); + extern bool operator!=( const Mapping::iterator &left, const Mapping::iterator &right ); + extern bool operator==( const Mapping::const_iterator &left, const Mapping::const_iterator &right ); + extern bool operator!=( const Mapping::const_iterator &left, const Mapping::const_iterator &right ); + + + // ================================================== + // class Dict + class Dict: public Mapping + { + public: + // Constructor + explicit Dict( PyObject *pyob, bool owned=false ) + : Mapping( pyob, owned ) + { + validate(); + } + + Dict( const Object &ob ) + : Mapping( ob ) + { + validate(); + } + + // Creation + Dict() + { + set( PyDict_New(), true ); + validate(); + } + // Assignment acquires new ownership of pointer + + Dict &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Dict &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob && Py::_Dict_Check( pyob ); + } + }; + + class Callable: public Object + { + public: + // Constructor + explicit Callable() + : Object() + {} + + explicit Callable( PyObject *pyob, bool owned = false ) + : Object( pyob, owned ) + { + validate(); + } + + Callable( const Object &ob ) + : Object( ob ) + { + validate(); + } + + // Assignment acquires new ownership of pointer + Callable &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Callable &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + // Membership + virtual bool accepts( PyObject *pyob ) const + { + return pyob && PyCallable_Check( pyob ); + } + + // Call + Object apply( const Tuple &args ) const + { + return asObject( PyObject_CallObject( ptr(), args.ptr() ) ); + } + + // Call with keywords + Object apply( const Tuple &args, const Dict &kw ) const + { + return asObject( PyEval_CallObjectWithKeywords( ptr(), args.ptr(), kw.ptr() ) ); + } + + Object apply( PyObject *pargs = 0 ) const + { + return apply( Tuple( pargs ) ); + } + }; + + class Module: public Object + { + public: + explicit Module( PyObject *pyob, bool owned = false ) + : Object( pyob, owned ) + { + validate(); + } + + // Construct from module name + explicit Module( const std::string &s ) + : Object() + { + PyObject *m = PyImport_AddModule( const_cast( s.c_str() ) ); + set( m, false ); + validate(); + } + + // Copy constructor acquires new ownership of pointer + Module( const Module &ob ) + : Object( *ob ) + { + validate(); + } + + Module &operator=( const Object &rhs ) + { + return *this = *rhs; + } + + Module &operator=( PyObject *rhsp ) + { + if( ptr() != rhsp ) + set( rhsp ); + return *this; + } + + Dict getDict() const + { + return Dict( PyModule_GetDict( ptr() ) ); + // Caution -- PyModule_GetDict returns borrowed reference! + } + }; + + // Numeric interface + inline Object operator+( const Object &a ) + { + return asObject( PyNumber_Positive( *a ) ); + } + + inline Object operator-( const Object &a ) + { + return asObject( PyNumber_Negative( *a ) ); + } + + inline Object abs( const Object &a ) + { + return asObject( PyNumber_Absolute( *a ) ); + } + + //------------------------------------------------------------ + // operator + + inline Object operator+( const Object &a, const Object &b ) + { + return asObject( PyNumber_Add( *a, *b ) ); + } + + inline Object operator+( const Object &a, int j ) + { + return asObject( PyNumber_Add( *a, *Long( j ) ) ); + } + + inline Object operator+( const Object &a, long j ) + { + return asObject( PyNumber_Add( *a, *Long( j ) ) ); + } + + inline Object operator+( const Object &a, double v ) + { + return asObject( PyNumber_Add( *a, *Float( v ) ) ); + } + + inline Object operator+( int j, const Object &b ) + { + return asObject( PyNumber_Add( *Long( j ), *b ) ); + } + + inline Object operator+( long j, const Object &b ) + { + return asObject( PyNumber_Add( *Long( j ), *b ) ); + } + + inline Object operator+( double v, const Object &b ) + { + return asObject( PyNumber_Add( *Float( v ), *b ) ); + } + + //------------------------------------------------------------ + // operator - + inline Object operator-( const Object &a, const Object &b ) + { + return asObject( PyNumber_Subtract( *a, *b ) ); + } + + inline Object operator-( const Object &a, int j ) + { + return asObject( PyNumber_Subtract( *a, *Long( j ) ) ); + } + + inline Object operator-( const Object &a, double v ) + { + return asObject( PyNumber_Subtract( *a, *Float( v ) ) ); + } + + inline Object operator-( int j, const Object &b ) + { + return asObject( PyNumber_Subtract( *Long( j ), *b ) ); + } + + inline Object operator-( double v, const Object &b ) + { + return asObject( PyNumber_Subtract( *Float( v ), *b ) ); + } + + //------------------------------------------------------------ + // operator * + inline Object operator*( const Object &a, const Object &b ) + { + return asObject( PyNumber_Multiply( *a, *b ) ); + } + + inline Object operator*( const Object &a, int j ) + { + return asObject( PyNumber_Multiply( *a, *Long( j ) ) ); + } + + inline Object operator*( const Object &a, double v ) + { + return asObject( PyNumber_Multiply( *a, *Float( v ) ) ); + } + + inline Object operator*( int j, const Object &b ) + { + return asObject( PyNumber_Multiply( *Long( j ), *b ) ); + } + + inline Object operator*( double v, const Object &b ) + { + return asObject( PyNumber_Multiply( *Float( v ), *b ) ); + } + + //------------------------------------------------------------ + // operator / + inline Object operator/( const Object &a, const Object &b ) + { + return asObject( PyNumber_TrueDivide( *a, *b ) ); + } + + inline Object operator/( const Object &a, int j ) + { + return asObject( PyNumber_TrueDivide( *a, *Long( j ) ) ); + } + + inline Object operator/( const Object &a, double v ) + { + return asObject( PyNumber_TrueDivide( *a, *Float( v ) ) ); + } + + inline Object operator/( int j, const Object &b ) + { + return asObject( PyNumber_TrueDivide( *Long( j ), *b ) ); + } + + inline Object operator/( double v, const Object &b ) + { + return asObject( PyNumber_TrueDivide( *Float( v ), *b ) ); + } + + //------------------------------------------------------------ + // operator % + inline Object operator%( const Object &a, const Object &b ) + { + return asObject( PyNumber_Remainder( *a, *b ) ); + } + + inline Object operator%( const Object &a, int j ) + { + return asObject( PyNumber_Remainder( *a, *Long( j ) ) ); + } + + inline Object operator%( const Object &a, double v ) + { + return asObject( PyNumber_Remainder( *a, *Float( v ) ) ); + } + + inline Object operator%( int j, const Object &b ) + { + return asObject( PyNumber_Remainder( *Long( j ), *b ) ); + } + + inline Object operator%( double v, const Object &b ) + { + return asObject( PyNumber_Remainder( *Float( v ), *b ) ); + } + + //------------------------------------------------------------ + // type + inline Object type( const Exception &) // return the type of the error + { + PyObject *ptype, *pvalue, *ptrace; + PyErr_Fetch( &ptype, &pvalue, &ptrace ); + Object result; + if( ptype ) + result = ptype; + PyErr_Restore( ptype, pvalue, ptrace ); + return result; + } + + inline Object value( const Exception &) // return the value of the error + { + PyObject *ptype, *pvalue, *ptrace; + PyErr_Fetch( &ptype, &pvalue, &ptrace ); + Object result; + if( pvalue ) + result = pvalue; + PyErr_Restore( ptype, pvalue, ptrace ); + return result; + } + + inline Object trace( const Exception &) // return the traceback of the error + { + PyObject *ptype, *pvalue, *ptrace; + PyErr_Fetch( &ptype, &pvalue, &ptrace ); + Object result; + if( ptrace ) + result = ptrace; + PyErr_Restore( ptype, pvalue, ptrace ); + return result; + } + + template + String seqref::str() const + { + return the_item.str(); + } + + template + String seqref::repr() const + { + return the_item.repr(); + } + +} // namespace Py +#endif // __CXX_Objects__h diff --git a/CXX/Python3/PythonType.hxx b/CXX/Python3/PythonType.hxx new file mode 100644 index 000000000000..bb77bb16ee93 --- /dev/null +++ b/CXX/Python3/PythonType.hxx @@ -0,0 +1,114 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_PythonType__h +#define __CXX_PythonType__h + +namespace Py +{ + class PythonType + { + public: + // if you define one sequence method you must define + // all of them except the assigns + + PythonType( size_t base_size, int itemsize, const char *default_name ); + virtual ~PythonType(); + + const char *getName() const; + const char *getDoc() const; + + PyTypeObject *type_object() const; + PythonType &name( const char *nam ); + PythonType &doc( const char *d ); + + PythonType &supportClass( void ); +#ifdef PYCXX_PYTHON_2TO3 + PythonType &supportPrint( void ); +#endif + PythonType &supportGetattr( void ); + PythonType &supportSetattr( void ); + PythonType &supportGetattro( void ); + PythonType &supportSetattro( void ); +#ifdef PYCXX_PYTHON_2TO3 + PythonType &supportCompare( void ); +#endif + PythonType &supportRichCompare( void ); + PythonType &supportRepr( void ); + PythonType &supportStr( void ); + PythonType &supportHash( void ); + PythonType &supportCall( void ); + PythonType &supportIter( void ); + + PythonType &supportSequenceType( void ); + PythonType &supportMappingType( void ); + PythonType &supportNumberType( void ); + PythonType &supportBufferType( void ); + + PythonType &set_tp_dealloc( void (*tp_dealloc)( PyObject * ) ); + PythonType &set_tp_init( int (*tp_init)( PyObject *self, PyObject *args, PyObject *kwds ) ); + PythonType &set_tp_new( PyObject *(*tp_new)( PyTypeObject *subtype, PyObject *args, PyObject *kwds ) ); + PythonType &set_methods( PyMethodDef *methods ); + + // call once all support functions have been called to ready the type + bool readyType(); + + protected: + void init_sequence(); + void init_mapping(); + void init_number(); + void init_buffer(); + + PyTypeObject *table; + PySequenceMethods *sequence_table; + PyMappingMethods *mapping_table; + PyNumberMethods *number_table; + PyBufferProcs *buffer_table; + + private: + // + // prevent the compiler generating these unwanted functions + // + PythonType( const PythonType &tb ); // unimplemented + void operator=( const PythonType &t ); // unimplemented + + }; + +} // Namespace Py + +// End of __CXX_PythonType__h +#endif diff --git a/CXX/Python3/cxx_extensions.cxx b/CXX/Python3/cxx_extensions.cxx new file mode 100644 index 000000000000..0e0721699684 --- /dev/null +++ b/CXX/Python3/cxx_extensions.cxx @@ -0,0 +1,1873 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- +#include "CXX/Extensions.hxx" +#include "CXX/Exception.hxx" + +#include + +#ifdef PYCXX_DEBUG +// +// Functions useful when debugging PyCXX +// +void bpt( void ) +{ +} + +void printRefCount( PyObject *obj ) +{ + std::cout << "RefCount of 0x" << std::hex << reinterpret_cast< unsigned int >( obj ) << std::dec << " is " << Py_REFCNT( obj ) << std::endl; +} +#endif + +namespace Py +{ + +void Object::validate() +{ + // release pointer if not the right type + if( !accepts( p ) ) + { +#if defined( _CPPRTTI ) || defined( __GNUG__ ) + std::string s( "PyCXX: Error creating object of type " ); + s += (typeid( *this )).name(); + + if( p != NULL ) + { + String from_repr = repr(); + s += " from "; + s += from_repr.as_std_string(); + } + else + { + s += " from (nil)"; + } +#endif + release(); + if( PyErr_Occurred() ) + { // Error message already set + throw Exception(); + } + // Better error message if RTTI available +#if defined( _CPPRTTI ) || defined( __GNUG__ ) + throw TypeError( s ); +#else + throw TypeError( "PyCXX: type error." ); +#endif + } +} + +//================================================================================ +// +// Implementation of MethodTable +// +//================================================================================ + +PyMethodDef MethodTable::method( const char *method_name, PyCFunction f, int flags, const char *doc ) +{ + PyMethodDef m; + m.ml_name = const_cast( method_name ); + m.ml_meth = f; + m.ml_flags = flags; + m.ml_doc = const_cast( doc ); + return m; +} + +MethodTable::MethodTable() +{ + t.push_back( method( 0, 0, 0, 0 ) ); + mt = NULL; +} + +MethodTable::~MethodTable() +{ + delete [] mt; +} + +void MethodTable::add( const char *method_name, PyCFunction f, const char *doc, int flag ) +{ + if( !mt ) + { + t.insert( t.end()-1, method( method_name, f, flag, doc ) ); + } + else + { + throw RuntimeError( "Too late to add a module method!" ); + } +} + +PyMethodDef *MethodTable::table() +{ + if( !mt ) + { + Py_ssize_t t1size = t.size(); + mt = new PyMethodDef[ t1size ]; + int j = 0; + for( std::vector::iterator i = t.begin(); i != t.end(); i++ ) + { + mt[ j++ ] = *i; + } + } + return mt; +} + +//================================================================================ +// +// Implementation of ExtensionModule +// +//================================================================================ +ExtensionModuleBase::ExtensionModuleBase( const char *name ) +: m_module_name( name ) +, m_full_module_name( __Py_PackageContext() != NULL ? std::string( __Py_PackageContext() ) : m_module_name ) +, m_method_table() +//m_module_def +, m_module( NULL ) +{} + +ExtensionModuleBase::~ExtensionModuleBase() +{} + +const std::string &ExtensionModuleBase::name() const +{ + return m_module_name; +} + +const std::string &ExtensionModuleBase::fullName() const +{ + return m_full_module_name; +} + +class ExtensionModuleBasePtr : public PythonExtension +{ +public: + ExtensionModuleBasePtr( ExtensionModuleBase *_module ) + : module( _module ) + {} + + virtual ~ExtensionModuleBasePtr() + {} + + ExtensionModuleBase *module; +}; + +void ExtensionModuleBase::initialize( const char *module_doc ) +{ + memset( &m_module_def, 0, sizeof( m_module_def ) ); + + m_module_def.m_name = const_cast( m_module_name.c_str() ); + m_module_def.m_doc = const_cast( module_doc ); + m_module_def.m_methods = m_method_table.table(); + // where does module_ptr get passed in? + + m_module = PyModule_Create( &m_module_def ); +} + +Py::Module ExtensionModuleBase::module( void ) const +{ + return Module( m_module ); +} + +Py::Dict ExtensionModuleBase::moduleDictionary( void ) const +{ + return module().getDict(); +} + +//================================================================================ +// +// Implementation of PythonType +// +//================================================================================ +extern "C" +{ + static void standard_dealloc( PyObject *p ); + // + // All the following functions redirect the call from Python + // onto the matching virtual function in PythonExtensionBase + // + static int print_handler( PyObject *, FILE *, int ); + static PyObject *getattr_handler( PyObject *, char * ); + static int setattr_handler( PyObject *, char *, PyObject * ); + static PyObject *getattro_handler( PyObject *, PyObject * ); + static int setattro_handler( PyObject *, PyObject *, PyObject * ); + static PyObject *rich_compare_handler( PyObject *, PyObject *, int ); + static PyObject *repr_handler( PyObject * ); + static PyObject *str_handler( PyObject * ); + static long hash_handler( PyObject * ); + static PyObject *call_handler( PyObject *, PyObject *, PyObject * ); + static PyObject *iter_handler( PyObject * ); + static PyObject *iternext_handler( PyObject * ); + + // Sequence methods + static Py_ssize_t sequence_length_handler( PyObject * ); + static PyObject *sequence_concat_handler( PyObject *,PyObject * ); + static PyObject *sequence_repeat_handler( PyObject *, Py_ssize_t ); + static PyObject *sequence_item_handler( PyObject *, Py_ssize_t ); + static int sequence_ass_item_handler( PyObject *, Py_ssize_t, PyObject * ); + + // Mapping + static Py_ssize_t mapping_length_handler( PyObject * ); + static PyObject *mapping_subscript_handler( PyObject *, PyObject * ); + static int mapping_ass_subscript_handler( PyObject *, PyObject *, PyObject * ); + + // Numeric methods + static PyObject *number_negative_handler( PyObject * ); + static PyObject *number_positive_handler( PyObject * ); + static PyObject *number_absolute_handler( PyObject * ); + static PyObject *number_invert_handler( PyObject * ); + static PyObject *number_int_handler( PyObject * ); + static PyObject *number_float_handler( PyObject * ); + static PyObject *number_add_handler( PyObject *, PyObject * ); + static PyObject *number_subtract_handler( PyObject *, PyObject * ); + static PyObject *number_multiply_handler( PyObject *, PyObject * ); + static PyObject *number_remainder_handler( PyObject *, PyObject * ); + static PyObject *number_divmod_handler( PyObject *, PyObject * ); + static PyObject *number_lshift_handler( PyObject *, PyObject * ); + static PyObject *number_rshift_handler( PyObject *, PyObject * ); + static PyObject *number_and_handler( PyObject *, PyObject * ); + static PyObject *number_xor_handler( PyObject *, PyObject * ); + static PyObject *number_or_handler( PyObject *, PyObject * ); + static PyObject *number_power_handler( PyObject *, PyObject *, PyObject * ); + + // Buffer + // QQQ +} + +extern "C" void standard_dealloc( PyObject *p ) +{ + PyMem_DEL( p ); +} + +bool PythonType::readyType() +{ + return PyType_Ready( table ) >= 0; +} + +PythonType &PythonType::supportSequenceType() +{ + if( !sequence_table ) + { + sequence_table = new PySequenceMethods; + memset( sequence_table, 0, sizeof( PySequenceMethods ) ); // ensure new fields are 0 + table->tp_as_sequence = sequence_table; + sequence_table->sq_length = sequence_length_handler; + sequence_table->sq_concat = sequence_concat_handler; + sequence_table->sq_repeat = sequence_repeat_handler; + sequence_table->sq_item = sequence_item_handler; + + sequence_table->sq_ass_item = sequence_ass_item_handler; // BAS setup seperately? + // QQQ sq_inplace_concat + // QQQ sq_inplace_repeat + } + return *this; +} + +PythonType &PythonType::supportMappingType() +{ + if( !mapping_table ) + { + mapping_table = new PyMappingMethods; + memset( mapping_table, 0, sizeof( PyMappingMethods ) ); // ensure new fields are 0 + table->tp_as_mapping = mapping_table; + mapping_table->mp_length = mapping_length_handler; + mapping_table->mp_subscript = mapping_subscript_handler; + mapping_table->mp_ass_subscript = mapping_ass_subscript_handler; // BAS setup seperately? + } + return *this; +} + +PythonType &PythonType::supportNumberType() +{ + if( !number_table ) + { + number_table = new PyNumberMethods; + memset( number_table, 0, sizeof( PyNumberMethods ) ); // ensure new fields are 0 + table->tp_as_number = number_table; + number_table->nb_add = number_add_handler; + number_table->nb_subtract = number_subtract_handler; + number_table->nb_multiply = number_multiply_handler; + number_table->nb_remainder = number_remainder_handler; + number_table->nb_divmod = number_divmod_handler; + number_table->nb_power = number_power_handler; + number_table->nb_negative = number_negative_handler; + number_table->nb_positive = number_positive_handler; + number_table->nb_absolute = number_absolute_handler; + number_table->nb_invert = number_invert_handler; + number_table->nb_lshift = number_lshift_handler; + number_table->nb_rshift = number_rshift_handler; + number_table->nb_and = number_and_handler; + number_table->nb_xor = number_xor_handler; + number_table->nb_or = number_or_handler; + number_table->nb_int = number_int_handler; + number_table->nb_float = number_float_handler; + + // QQQ lots of new methods to add + } + return *this; +} + +PythonType &PythonType::supportBufferType() +{ + if( !buffer_table ) + { + buffer_table = new PyBufferProcs; + memset( buffer_table, 0, sizeof( PyBufferProcs ) ); // ensure new fields are 0 + table->tp_as_buffer = buffer_table; + // QQQ bf_getbuffer + // QQQ bf_releasebuffer + } + return *this; +} + +// if you define one sequence method you must define +// all of them except the assigns + +PythonType::PythonType( size_t basic_size, int itemsize, const char *default_name ) +: table( new PyTypeObject ) +, sequence_table( NULL ) +, mapping_table( NULL ) +, number_table( NULL ) +, buffer_table( NULL ) +{ + // PyTypeObject is defined in /Include/object.h + + memset( table, 0, sizeof( PyTypeObject ) ); // ensure new fields are 0 + *reinterpret_cast( table ) = py_object_initializer; + // QQQ table->ob_type = _Type_Type(); + // QQQ table->ob_size = 0; + table->tp_name = const_cast( default_name ); + table->tp_basicsize = basic_size; + table->tp_itemsize = itemsize; + + // Methods to implement standard operations + table->tp_dealloc = (destructor)standard_dealloc; + table->tp_print = 0; + table->tp_getattr = 0; + table->tp_setattr = 0; + table->tp_repr = 0; + + // Method suites for standard classes + table->tp_as_number = 0; + table->tp_as_sequence = 0; + table->tp_as_mapping = 0; + + // More standard operations (here for binary compatibility) + table->tp_hash = 0; + table->tp_call = 0; + table->tp_str = 0; + table->tp_getattro = 0; + table->tp_setattro = 0; + + // Functions to access object as input/output buffer + table->tp_as_buffer = 0; + + // Flags to define presence of optional/expanded features + table->tp_flags = Py_TPFLAGS_DEFAULT; + + // Documentation string + table->tp_doc = 0; + + table->tp_traverse = 0; + + // delete references to contained objects + table->tp_clear = 0; + + // Assigned meaning in release 2.1 + // rich comparisons + table->tp_richcompare = 0; + // weak reference enabler + table->tp_weaklistoffset = 0; + + // Iterators + table->tp_iter = 0; + table->tp_iternext = 0; + + // Attribute descriptor and subclassing stuff + table->tp_methods = 0; + table->tp_members = 0; + table->tp_getset = 0; + table->tp_base = 0; + table->tp_dict = 0; + table->tp_descr_get = 0; + table->tp_descr_set = 0; + table->tp_dictoffset = 0; + table->tp_init = 0; + table->tp_alloc = 0; + table->tp_new = 0; + table->tp_free = 0; // Low-level free-memory routine + table->tp_is_gc = 0; // For PyObject_IS_GC + table->tp_bases = 0; + table->tp_mro = 0; // method resolution order + table->tp_cache = 0; + table->tp_subclasses = 0; + table->tp_weaklist = 0; + table->tp_del = 0; + + // Type attribute cache version tag. Added in version 2.6 + table->tp_version_tag = 0; + +#ifdef COUNT_ALLOCS + table->tp_alloc = 0; + table->tp_free = 0; + table->tp_maxalloc = 0; + table->tp_orev = 0; + table->tp_next = 0; +#endif +} + +PythonType::~PythonType() +{ + delete table; + delete sequence_table; + delete mapping_table; + delete number_table; + delete buffer_table; +} + +PyTypeObject *PythonType::type_object() const +{ + return table; +} + +PythonType &PythonType::name( const char *nam ) +{ + table->tp_name = const_cast( nam ); + return *this; +} + +const char *PythonType::getName() const +{ + return table->tp_name; +} + +PythonType &PythonType::doc( const char *d ) +{ + table->tp_doc = const_cast( d ); + return *this; +} + +const char *PythonType::getDoc() const +{ + return table->tp_doc; +} + +PythonType &PythonType::set_tp_dealloc( void (*tp_dealloc)( PyObject *self ) ) +{ + table->tp_dealloc = tp_dealloc; + return *this; +} + +PythonType &PythonType::set_tp_init( int (*tp_init)( PyObject *self, PyObject *args, PyObject *kwds ) ) +{ + table->tp_init = tp_init; + return *this; +} + +PythonType &PythonType::set_tp_new( PyObject *(*tp_new)( PyTypeObject *subtype, PyObject *args, PyObject *kwds ) ) +{ + table->tp_new = tp_new; + return *this; +} + +PythonType &PythonType::set_methods( PyMethodDef *methods ) +{ + table->tp_methods = methods; + return *this; +} + +PythonType &PythonType::supportClass() +{ + table->tp_flags |= Py_TPFLAGS_BASETYPE; + return *this; +} + +#ifdef PYCXX_PYTHON_2TO3 +PythonType &PythonType::supportPrint() +{ + table->tp_print = print_handler; + return *this; +} +#endif + +PythonType &PythonType::supportGetattr() +{ + table->tp_getattr = getattr_handler; + return *this; +} + +PythonType &PythonType::supportSetattr() +{ + table->tp_setattr = setattr_handler; + return *this; +} + +PythonType &PythonType::supportGetattro() +{ + table->tp_getattro = getattro_handler; + return *this; +} + +PythonType &PythonType::supportSetattro() +{ + table->tp_setattro = setattro_handler; + return *this; +} + +#ifdef PYCXX_PYTHON_2TO3 +PythonType &PythonType::supportCompare( void ) +{ + return *this; +} +#endif + + +PythonType &PythonType::supportRichCompare() +{ + table->tp_richcompare = rich_compare_handler; + return *this; +} + +PythonType &PythonType::supportRepr() +{ + table->tp_repr = repr_handler; + return *this; +} + +PythonType &PythonType::supportStr() +{ + table->tp_str = str_handler; + return *this; +} + +PythonType &PythonType::supportHash() +{ + table->tp_hash = hash_handler; + return *this; +} + +PythonType &PythonType::supportCall() +{ + table->tp_call = call_handler; + return *this; +} + +PythonType &PythonType::supportIter() +{ + table->tp_iter = iter_handler; + table->tp_iternext = iternext_handler; + return *this; +} + +//-------------------------------------------------------------------------------- +// +// Handlers +// +//-------------------------------------------------------------------------------- +PythonExtensionBase *getPythonExtensionBase( PyObject *self ) +{ + if( self->ob_type->tp_flags&Py_TPFLAGS_BASETYPE ) + { + PythonClassInstance *instance = reinterpret_cast( self ); + return instance->m_pycxx_object; + } + else + { + return static_cast( self ); + } +} + +#ifdef PYCXX_PYTHON_2TO3 +extern "C" int print_handler( PyObject *self, FILE *fp, int flags ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->print( fp, flags ); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} +#endif + +extern "C" PyObject *getattr_handler( PyObject *self, char *name ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->getattr( name ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" int setattr_handler( PyObject *self, char *name, PyObject *value ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->setattr( name, Py::Object( value ) ); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +extern "C" PyObject *getattro_handler( PyObject *self, PyObject *name ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->getattro( Py::String( name ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" int setattro_handler( PyObject *self, PyObject *name, PyObject *value ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->setattro( Py::String( name ), Py::Object( value ) ); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +extern "C" PyObject *rich_compare_handler( PyObject *self, PyObject *other, int op ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->rich_compare( Py::Object( other ), op ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *repr_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->repr() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *str_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->str() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" long hash_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->hash(); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +extern "C" PyObject *call_handler( PyObject *self, PyObject *args, PyObject *kw ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + if( kw != NULL ) + return new_reference_to( p->call( Py::Object( args ), Py::Object( kw ) ) ); + else + return new_reference_to( p->call( Py::Object( args ), Py::Object() ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *iter_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->iter() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *iternext_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->iternext(); // might be a NULL ptr on end of iteration + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + + +// Sequence methods +extern "C" Py_ssize_t sequence_length_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->sequence_length(); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +extern "C" PyObject *sequence_concat_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->sequence_concat( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *sequence_repeat_handler( PyObject *self, Py_ssize_t count ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->sequence_repeat( count ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *sequence_item_handler( PyObject *self, Py_ssize_t index ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->sequence_item( index ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" int sequence_ass_item_handler( PyObject *self, Py_ssize_t index, PyObject *value ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->sequence_ass_item( index, Py::Object( value ) ); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +// Mapping +extern "C" Py_ssize_t mapping_length_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->mapping_length(); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +extern "C" PyObject *mapping_subscript_handler( PyObject *self, PyObject *key ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->mapping_subscript( Py::Object( key ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" int mapping_ass_subscript_handler( PyObject *self, PyObject *key, PyObject *value ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return p->mapping_ass_subscript( Py::Object( key ), Py::Object( value ) ); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +// Number +extern "C" PyObject *number_negative_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_negative() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_positive_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_positive() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_absolute_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_absolute() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_invert_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_invert() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_int_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_int() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_float_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_float() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_add_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_add( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_subtract_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_subtract( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_multiply_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_multiply( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_remainder_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_remainder( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_divmod_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_divmod( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_lshift_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_lshift( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_rshift_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_rshift( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_and_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_and( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_xor_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_xor( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_or_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_or( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject *number_power_handler( PyObject *self, PyObject *x1, PyObject *x2 ) +{ + try + { + PythonExtensionBase *p = getPythonExtensionBase( self ); + return new_reference_to( p->number_power( Py::Object( x1 ), Py::Object( x2 ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +// Buffer + +//================================================================================ +// +// Implementation of PythonExtensionBase +// +//================================================================================ +#define missing_method( method ) \ + throw RuntimeError( "Extension object missing implement of " #method ); + +PythonExtensionBase::PythonExtensionBase() +{ + ob_refcnt = 0; +} + +PythonExtensionBase::~PythonExtensionBase() +{ + assert( ob_refcnt == 0 ); +} + +void PythonExtensionBase::reinit( Tuple &args, Dict &kwds ) +{ + throw RuntimeError( "Must not call __init__ twice on this class" ); +} + + +Py::Object PythonExtensionBase::genericGetAttro( const Py::String &name ) +{ + return asObject( PyObject_GenericGetAttr( selfPtr(), name.ptr() ) ); +} + +int PythonExtensionBase::genericSetAttro( const Py::String &name, const Py::Object &value ) +{ + return PyObject_GenericSetAttr( selfPtr(), name.ptr(), value.ptr() ); +} + +#ifdef PYCXX_PYTHON_2TO3 +int PythonExtensionBase::print( FILE *, int ) +{ + missing_method( print ); + return -1; +} +#endif + +Py::Object PythonExtensionBase::getattr( const char * ) +{ + missing_method( getattr ); + return Py::None(); +} + +int PythonExtensionBase::setattr( const char *, const Py::Object & ) +{ + missing_method( setattr ); + return -1; +} + +Py::Object PythonExtensionBase::getattro( const Py::String & ) +{ + missing_method( getattro ); + return Py::None(); +} + +int PythonExtensionBase::setattro( const Py::String &, const Py::Object & ) +{ + missing_method( setattro ); + return -1; +} + + +int PythonExtensionBase::compare( const Py::Object & ) +{ + missing_method( compare ); + return -1; +} + +Py::Object PythonExtensionBase::rich_compare( const Py::Object &, int ) +{ + missing_method( rich_compare ); + return Py::None(); +} + +Py::Object PythonExtensionBase::repr() +{ + missing_method( repr ); + return Py::None(); +} + +Py::Object PythonExtensionBase::str() +{ + missing_method( str ); + return Py::None(); +} + +long PythonExtensionBase::hash() +{ + missing_method( hash ); + return -1; } + + +Py::Object PythonExtensionBase::call( const Py::Object &, const Py::Object & ) +{ + missing_method( call ); + return Py::None(); +} + +Py::Object PythonExtensionBase::iter() +{ + missing_method( iter ); + return Py::None(); +} + +PyObject *PythonExtensionBase::iternext() +{ + missing_method( iternext ); + return NULL; } + + + +// Sequence methods +int PythonExtensionBase::sequence_length() +{ + missing_method( sequence_length ); + return -1; } + + +Py::Object PythonExtensionBase::sequence_concat( const Py::Object & ) +{ + missing_method( sequence_concat ); + return Py::None(); +} + +Py::Object PythonExtensionBase::sequence_repeat( Py_ssize_t ) +{ + missing_method( sequence_repeat ); + return Py::None(); +} + +Py::Object PythonExtensionBase::sequence_item( Py_ssize_t ) +{ + missing_method( sequence_item ); + return Py::None(); +} + +int PythonExtensionBase::sequence_ass_item( Py_ssize_t, const Py::Object & ) +{ + missing_method( sequence_ass_item ); + return -1; +} + + +// Mapping +int PythonExtensionBase::mapping_length() +{ + missing_method( mapping_length ); + return -1; +} + + +Py::Object PythonExtensionBase::mapping_subscript( const Py::Object & ) +{ + missing_method( mapping_subscript ); + return Py::None(); +} + +int PythonExtensionBase::mapping_ass_subscript( const Py::Object &, const Py::Object & ) +{ + missing_method( mapping_ass_subscript ); + return -1; +} + +Py::Object PythonExtensionBase::number_negative() +{ + missing_method( number_negative ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_positive() +{ + missing_method( number_positive ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_absolute() +{ + missing_method( number_absolute ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_invert() +{ + missing_method( number_invert ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_int() +{ + missing_method( number_int ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_float() +{ + missing_method( number_float ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_long() +{ + missing_method( number_long ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_add( const Py::Object & ) +{ + missing_method( number_add ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_subtract( const Py::Object & ) +{ + missing_method( number_subtract ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_multiply( const Py::Object & ) +{ + missing_method( number_multiply ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_remainder( const Py::Object & ) +{ + missing_method( number_remainder ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_divmod( const Py::Object & ) +{ + missing_method( number_divmod ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_lshift( const Py::Object & ) +{ + missing_method( number_lshift ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_rshift( const Py::Object & ) +{ + missing_method( number_rshift ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_and( const Py::Object & ) +{ + missing_method( number_and ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_xor( const Py::Object & ) +{ + missing_method( number_xor ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_or( const Py::Object & ) +{ + missing_method( number_or ); + return Py::None(); +} + +Py::Object PythonExtensionBase::number_power( const Py::Object &, const Py::Object & ) +{ + missing_method( number_power ); + return Py::None(); +} + + +// Buffer +// QQQ + +//-------------------------------------------------------------------------------- +// +// Method call handlers for +// PythonExtensionBase +// ExtensionModuleBase +// +//-------------------------------------------------------------------------------- +// Note: Python calls noargs as varargs buts args==NULL +extern "C" PyObject *method_noargs_call_handler( PyObject *_self_and_name_tuple, PyObject * ) +{ + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + void *self_as_void = PyCObject_AsVoidPtr( self_in_cobject ); + if( self_as_void == NULL ) + return NULL; + + ExtensionModuleBase *self = static_cast( self_as_void ); + + Object result( self->invoke_method_noargs( PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ) ) ); + + return new_reference_to( result.ptr() ); + } + catch( Exception & ) + { + return 0; + } +} + +extern "C" PyObject *method_varargs_call_handler( PyObject *_self_and_name_tuple, PyObject *_args ) +{ + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + void *self_as_void = PyCObject_AsVoidPtr( self_in_cobject ); + if( self_as_void == NULL ) + return NULL; + + ExtensionModuleBase *self = static_cast( self_as_void ); + Tuple args( _args ); + Object result + ( + self->invoke_method_varargs + ( + PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ), + args + ) + ); + + return new_reference_to( result.ptr() ); + } + catch( Exception & ) + { + return 0; + } +} + +extern "C" PyObject *method_keyword_call_handler( PyObject *_self_and_name_tuple, PyObject *_args, PyObject *_keywords ) +{ + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + void *self_as_void = PyCObject_AsVoidPtr( self_in_cobject ); + if( self_as_void == NULL ) + return NULL; + + ExtensionModuleBase *self = static_cast( self_as_void ); + + Tuple args( _args ); + + if( _keywords == NULL ) + { + Dict keywords; // pass an empty dict + + Object result + ( + self->invoke_method_keyword + ( + PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ), + args, + keywords + ) + ); + + return new_reference_to( result.ptr() ); + } + else + { + Dict keywords( _keywords ); // make dict + + Object result + ( + self->invoke_method_keyword + ( + PyCObject_AsVoidPtr( self_and_name_tuple[1].ptr() ), + args, + keywords + ) + ); + + return new_reference_to( result.ptr() ); + } + } + catch( Exception & ) + { + return 0; + } +} + +extern "C" void do_not_dealloc( void * ) +{} + + +//-------------------------------------------------------------------------------- +// +// ExtensionExceptionType +// +//-------------------------------------------------------------------------------- +ExtensionExceptionType::ExtensionExceptionType() + : Py::Object() +{ +} + +void ExtensionExceptionType::init( ExtensionModuleBase &module, const std::string& name ) +{ + std::string module_name( module.fullName() ); + module_name += "."; + module_name += name; + + set( PyErr_NewException( const_cast( module_name.c_str() ), NULL, NULL ), true ); +} + +void ExtensionExceptionType::init( ExtensionModuleBase &module, const std::string& name, ExtensionExceptionType &parent ) + { + std::string module_name( module.fullName() ); + module_name += "."; + module_name += name; + + set( PyErr_NewException( const_cast( module_name.c_str() ), parent.ptr(), NULL ), true ); +} + +ExtensionExceptionType::~ExtensionExceptionType() +{ +} + +Exception::Exception( ExtensionExceptionType &exception, const std::string& reason ) +{ + PyErr_SetString( exception.ptr(), reason.c_str() ); +} + +Exception::Exception( ExtensionExceptionType &exception, Object &reason ) +{ + PyErr_SetObject( exception.ptr(), reason.ptr() ); +} + +Exception::Exception( PyObject *exception, Object &reason ) +{ + PyErr_SetObject( exception, reason.ptr() ); +} + +#if 1 +//------------------------------------------------------------ +// compare operators +bool operator!=( const Long &a, const Long &b ) +{ + return a.as_long() != b.as_long(); +} + +bool operator!=( const Long &a, int b ) +{ + return a.as_long() != b; +} + +bool operator!=( const Long &a, long b ) +{ + return a.as_long() != b; +} + +bool operator!=( int a, const Long &b ) +{ + return a != b.as_long(); +} + +bool operator!=( long a, const Long &b ) +{ + return a != b.as_long(); +} + +//------------------------------ +bool operator==( const Long &a, const Long &b ) +{ + return a.as_long() == b.as_long(); +} + +bool operator==( const Long &a, int b ) +{ + return a.as_long() == b; +} + +bool operator==( const Long &a, long b ) +{ + return a.as_long() == b; +} + +bool operator==( int a, const Long &b ) +{ + return a == b.as_long(); +} + +bool operator==( long a, const Long &b ) +{ + return a == b.as_long(); +} + +//------------------------------ +bool operator>( const Long &a, const Long &b ) +{ + return a.as_long() > b.as_long(); +} + +bool operator>( const Long &a, int b ) +{ + return a.as_long() > b; +} + +bool operator>( const Long &a, long b ) +{ + return a.as_long() > b; +} + +bool operator>( int a, const Long &b ) +{ + return a > b.as_long(); +} + +bool operator>( long a, const Long &b ) +{ + return a > b.as_long(); +} + +//------------------------------ +bool operator>=( const Long &a, const Long &b ) +{ + return a.as_long() >= b.as_long(); +} + +bool operator>=( const Long &a, int b ) +{ + return a.as_long() >= b; +} + +bool operator>=( const Long &a, long b ) +{ + return a.as_long() >= b; +} + +bool operator>=( int a, const Long &b ) +{ + return a >= b.as_long(); +} + +bool operator>=( long a, const Long &b ) +{ + return a >= b.as_long(); +} + +//------------------------------ +bool operator<( const Long &a, const Long &b ) +{ + return a.as_long() < b.as_long(); +} + +bool operator<( const Long &a, int b ) +{ + return a.as_long() < b; +} + +bool operator<( const Long &a, long b ) +{ + return a.as_long() < b; +} + +bool operator<( int a, const Long &b ) +{ + return a < b.as_long(); +} + +bool operator<( long a, const Long &b ) +{ + return a < b.as_long(); +} + +//------------------------------ +bool operator<=( const Long &a, const Long &b ) +{ + return a.as_long() <= b.as_long(); +} + +bool operator<=( int a, const Long &b ) +{ + return a <= b.as_long(); +} + +bool operator<=( long a, const Long &b ) +{ + return a <= b.as_long(); +} + +bool operator<=( const Long &a, int b ) +{ + return a.as_long() <= b; +} + +bool operator<=( const Long &a, long b ) +{ + return a.as_long() <= b; +} + +#ifdef HAVE_LONG_LONG +//------------------------------ +bool operator!=( const Long &a, PY_LONG_LONG b ) +{ + return a.as_long_long() != b; +} + +bool operator!=( PY_LONG_LONG a, const Long &b ) +{ + return a != b.as_long_long(); +} + +//------------------------------ +bool operator==( const Long &a, PY_LONG_LONG b ) +{ + return a.as_long_long() == b; +} + +bool operator==( PY_LONG_LONG a, const Long &b ) +{ + return a == b.as_long_long(); +} + +//------------------------------ +bool operator>( const Long &a, PY_LONG_LONG b ) +{ + return a.as_long_long() > b; +} + +bool operator>( PY_LONG_LONG a, const Long &b ) +{ + return a > b.as_long_long(); +} + +//------------------------------ +bool operator>=( const Long &a, PY_LONG_LONG b ) +{ + return a.as_long_long() >= b; +} + +bool operator>=( PY_LONG_LONG a, const Long &b ) +{ + return a >= b.as_long_long(); +} + +//------------------------------ +bool operator<( const Long &a, PY_LONG_LONG b ) +{ + return a.as_long_long() < b; +} + +bool operator<( PY_LONG_LONG a, const Long &b ) +{ + return a < b.as_long_long(); +} + +//------------------------------ +bool operator<=( const Long &a, PY_LONG_LONG b ) +{ + return a.as_long_long() <= b; +} + +bool operator<=( PY_LONG_LONG a, const Long &b ) +{ + return a <= b.as_long_long(); +} +#endif +#endif + +//------------------------------------------------------------ +// compare operators +bool operator!=( const Float &a, const Float &b ) +{ + return a.as_double() != b.as_double(); +} + +bool operator!=( const Float &a, double b ) +{ + return a.as_double() != b; +} + +bool operator!=( double a, const Float &b ) +{ + return a != b.as_double(); +} + +//------------------------------ +bool operator==( const Float &a, const Float &b ) +{ + return a.as_double() == b.as_double(); +} + +bool operator==( const Float &a, double b ) +{ + return a.as_double() == b; +} + +bool operator==( double a, const Float &b ) +{ + return a == b.as_double(); +} + +//------------------------------ +bool operator>( const Float &a, const Float &b ) +{ + return a.as_double() > b.as_double(); +} + +bool operator>( const Float &a, double b ) +{ + return a.as_double() > b; +} + +bool operator>( double a, const Float &b ) +{ + return a > b.as_double(); +} + +//------------------------------ +bool operator>=( const Float &a, const Float &b ) +{ + return a.as_double() >= b.as_double(); +} + +bool operator>=( const Float &a, double b ) +{ + return a.as_double() >= b; +} + +bool operator>=( double a, const Float &b ) +{ + return a >= b.as_double(); +} + +//------------------------------ +bool operator<( const Float &a, const Float &b ) +{ + return a.as_double() < b.as_double(); +} + +bool operator<( const Float &a, double b ) +{ + return a.as_double() < b; +} + +bool operator<( double a, const Float &b ) +{ + return a < b.as_double(); +} + +//------------------------------ +bool operator<=( const Float &a, const Float &b ) +{ + return a.as_double() <= b.as_double(); +} + +bool operator<=( double a, const Float &b ) +{ + return a <= b.as_double(); +} + +bool operator<=( const Float &a, double b ) +{ + return a.as_double() <= b; +} + +} // end of namespace Py diff --git a/CXX/Python3/cxxextensions.c b/CXX/Python3/cxxextensions.c new file mode 100644 index 000000000000..7feb1e0db278 --- /dev/null +++ b/CXX/Python3/cxxextensions.c @@ -0,0 +1,54 @@ +/*---------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//---------------------------------------------------------------------------*/ + +#include "CXX/WrapPython.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +PyObject py_object_initializer = + { + _PyObject_EXTRA_INIT + 1, + NULL // type must be init'ed by user + }; + +#ifdef __cplusplus +} +#endif diff --git a/CXX/Python3/cxxsupport.cxx b/CXX/Python3/cxxsupport.cxx new file mode 100644 index 000000000000..442d932b2b3e --- /dev/null +++ b/CXX/Python3/cxxsupport.cxx @@ -0,0 +1,228 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#include "CXX/Objects.hxx" +namespace Py +{ + +Py_UNICODE unicode_null_string[1] = { 0 }; + +Type Object::type() const +{ + return Type( PyObject_Type( p ), true ); +} + +String Object::str() const +{ + return String( PyObject_Str( p ), true ); +} + +String Object::repr() const +{ + return String( PyObject_Repr( p ), true ); +} + +std::string Object::as_string() const +{ + return static_cast( str() ); +} + +List Object::dir() const +{ + return List( PyObject_Dir( p ), true ); +} + +bool Object::isType( const Type &t ) const +{ + return type().ptr() == t.ptr(); +} + +Char::operator String() const +{ + return String( ptr() ); +} + +String Bytes::decode( const char *encoding, const char *error ) +{ + return String( PyUnicode_FromEncodedObject( ptr(), encoding, error ), true ); +} + +// Object compares +bool operator==( const Object &o1, const Object &o2 ) +{ + int k = PyObject_RichCompareBool( *o1, *o2, Py_EQ ); + if( PyErr_Occurred() ) + throw Exception(); + return k != 0; +} + +bool operator!=( const Object &o1, const Object &o2 ) +{ + int k = PyObject_RichCompareBool( *o1, *o2, Py_NE ); + if( PyErr_Occurred() ) + throw Exception(); + return k != 0; + +} + +bool operator>=( const Object &o1, const Object &o2 ) +{ + int k = PyObject_RichCompareBool( *o1, *o2, Py_GE ); + if( PyErr_Occurred() ) + throw Exception(); + return k != 0; +} + +bool operator<=( const Object &o1, const Object &o2 ) +{ + int k = PyObject_RichCompareBool( *o1, *o2, Py_LE ); + if( PyErr_Occurred() ) + throw Exception(); + return k != 0; +} + +bool operator<( const Object &o1, const Object &o2 ) +{ + int k = PyObject_RichCompareBool( *o1, *o2, Py_LT ); + if( PyErr_Occurred() ) + throw Exception(); + return k != 0; +} + +bool operator>( const Object &o1, const Object &o2 ) +{ + int k = PyObject_RichCompareBool( *o1, *o2, Py_GT ); + if( PyErr_Occurred() ) + throw Exception(); + return k != 0; +} + +// iterator compares +bool operator==( const Sequence::iterator &left, const Sequence::iterator &right ) +{ + return left.eql( right ); +} + +bool operator!=( const Sequence::iterator &left, const Sequence::iterator &right ) +{ + return left.neq( right ); +} + +bool operator<( const Sequence::iterator &left, const Sequence::iterator &right ) +{ + return left.lss( right ); +} + +bool operator>( const Sequence::iterator &left, const Sequence::iterator &right ) +{ + return left.gtr( right ); +} + +bool operator<=( const Sequence::iterator &left, const Sequence::iterator &right ) +{ + return left.leq( right ); +} + +bool operator>=( const Sequence::iterator &left, const Sequence::iterator &right ) +{ + return left.geq( right ); +} + +// const_iterator compares +bool operator==( const Sequence::const_iterator &left, const Sequence::const_iterator &right ) +{ + return left.eql( right ); +} + +bool operator!=( const Sequence::const_iterator &left, const Sequence::const_iterator &right ) +{ + return left.neq( right ); +} + +bool operator<( const Sequence::const_iterator &left, const Sequence::const_iterator &right ) +{ + return left.lss( right ); +} + +bool operator>( const Sequence::const_iterator &left, const Sequence::const_iterator &right ) +{ + return left.gtr( right ); +} + +bool operator<=( const Sequence::const_iterator &left, const Sequence::const_iterator &right ) +{ + return left.leq( right ); +} + +bool operator>=( const Sequence::const_iterator &left, const Sequence::const_iterator &right ) +{ + return left.geq( right ); +} + +// For mappings: +bool operator==( const Mapping::iterator &left, const Mapping::iterator &right ) +{ + return left.eql( right ); +} + +bool operator!=( const Mapping::iterator &left, const Mapping::iterator &right ) +{ + return left.neq( right ); +} + +// now for const_iterator +bool operator==( const Mapping::const_iterator &left, const Mapping::const_iterator &right ) +{ + return left.eql( right ); +} + +bool operator!=( const Mapping::const_iterator &left, const Mapping::const_iterator &right ) +{ + return left.neq( right ); +} + +// TMM: 31May'01 - Added the #ifndef so I can exclude iostreams. +#ifndef CXX_NO_IOSTREAMS +// output + +std::ostream &operator<<( std::ostream &os, const Object &ob ) +{ + return( os << static_cast( ob.str() ) ); +} +#endif + +} // Py diff --git a/CXX/Version.hxx b/CXX/Version.hxx index 96d911e118f9..398889c90148 100644 --- a/CXX/Version.hxx +++ b/CXX/Version.hxx @@ -38,9 +38,9 @@ #ifndef __PyCXX_version_hxx__ #define __PyCXX_version_hxx__ -#define PYCXX_VERSION_MAJOR 5 -#define PYCXX_VERSION_MINOR 4 -#define PYCXX_VERSION_PATCH 2 +#define PYCXX_VERSION_MAJOR 6 +#define PYCXX_VERSION_MINOR 1 +#define PYCXX_VERSION_PATCH 1 #define PYCXX_MAKEVERSION( major, minor, patch ) ((major<<16)|(minor<<8)|(patch)) #define PYCXX_VERSION PYCXX_MAKEVERSION( PYCXX_VERSION_MAJOR, PYCXX_VERSION_MINOR, PYCXX_VERSION_PATCH ) #endif diff --git a/CXX/WrapPython.h b/CXX/WrapPython.h index b7ac19658a36..118a8740f8ad 100644 --- a/CXX/WrapPython.h +++ b/CXX/WrapPython.h @@ -38,12 +38,23 @@ #ifndef __PyCXX_wrap_python_hxx__ #define __PyCXX_wrap_python_hxx__ -// pull in python definitions -#include - // On some platforms we have to include time.h to get select defined #if !defined(__WIN32__) && !defined(WIN32) && !defined(_WIN32) && !defined(_WIN64) #include #endif +// Prevent multiple conflicting definitions of swab from stdlib.h and unistd.h +#if defined(__sun) || defined(sun) +#if defined(_XPG4) +#undef _XPG4 +#endif +#endif + +// Python.h will redefine these and generate warning in the process +#undef _XOPEN_SOURCE +#undef _POSIX_C_SOURCE + +// pull in python definitions +#include + #endif diff --git a/CXX/cxx_extensions.cxx b/CXX/cxx_extensions.cxx index 65fa21cf230e..898c9f4951b3 100644 --- a/CXX/cxx_extensions.cxx +++ b/CXX/cxx_extensions.cxx @@ -34,1431 +34,10 @@ // DAMAGE. // //----------------------------------------------------------------------------- -#include "CXX/Extensions.hxx" -#include "CXX/Exception.hxx" +#include "CXX/WrapPython.h" -#include - -namespace Py -{ - -void Object::validate() -{ - // release pointer if not the right type - if( !accepts( p ) ) - { -#if defined( _CPPRTTI ) || defined( __GNUG__ ) - std::string s( "PyCXX: Error creating object of type " ); - s += (typeid( *this )).name(); - - if( p != 0 ) - { - String from_repr = repr(); - s += " from "; - s += from_repr.as_std_string(); - } - else - { - s += " from (nil)"; - } -#endif - release(); - if( PyErr_Occurred() ) - { // Error message already set - throw Exception(); - } - // Better error message if RTTI available -#if defined( _CPPRTTI ) || defined( __GNUG__ ) - throw TypeError( s ); +#if PY_MAJOR_VERSION == 2 +#include "Python2/cxx_extensions.cxx" #else - throw TypeError( "PyCXX: type error." ); -#endif - } -} - -//================================================================================ -// -// Implementation of MethodTable -// -//================================================================================ - -PyMethodDef MethodTable::method( const char* method_name, PyCFunction f, int flags, const char* doc ) -{ - PyMethodDef m; - m.ml_name = const_cast( method_name ); - m.ml_meth = f; - m.ml_flags = flags; - m.ml_doc = const_cast( doc ); - return m; -} - -MethodTable::MethodTable() -{ - t.push_back( method( 0, 0, 0, 0 ) ); - mt = 0; -} - -MethodTable::~MethodTable() -{ - delete [] mt; -} - -void MethodTable::add( const char* method_name, PyCFunction f, const char* doc, int flag ) -{ - if( !mt ) - { - t.insert( t.end()-1, method( method_name, f, flag, doc ) ); - } - else - { - throw RuntimeError( "Too late to add a module method!" ); - } -} - -PyMethodDef* MethodTable::table() -{ - if( !mt ) - { - Py_ssize_t t1size = t.size(); - mt = new PyMethodDef[t1size]; - int j = 0; - for( std::vector::iterator i = t.begin(); i != t.end(); i++ ) - { - mt[j++] = *i; - } - } - return mt; -} - -//================================================================================ -// -// Implementation of ExtensionModule -// -//================================================================================ -ExtensionModuleBase::ExtensionModuleBase( const char *name ) - : module_name( name ) - , full_module_name( __Py_PackageContext() != NULL ? std::string( __Py_PackageContext() ) : module_name ) - , method_table() -{} - -ExtensionModuleBase::~ExtensionModuleBase() -{} - -const std::string &ExtensionModuleBase::name() const -{ - return module_name; -} - -const std::string &ExtensionModuleBase::fullName() const -{ - return full_module_name; -} - -class ExtensionModuleBasePtr : public PythonExtension -{ -public: - ExtensionModuleBasePtr( ExtensionModuleBase *_module ) - : module( _module ) - {} - virtual ~ExtensionModuleBasePtr() - {} - - ExtensionModuleBase *module; -}; - - -void ExtensionModuleBase::initialize( const char *module_doc ) -{ - PyObject *module_ptr = new ExtensionModuleBasePtr( this ); - - Py_InitModule4 - ( - const_cast( module_name.c_str() ), // name - method_table.table(), // methods - const_cast( module_doc ), // docs - module_ptr, // pass to functions as "self" - PYTHON_API_VERSION // API version - ); -} - -Py::Module ExtensionModuleBase::module(void) const -{ - return Module( full_module_name ); -} - -Py::Dict ExtensionModuleBase::moduleDictionary(void) const -{ - return module().getDict(); -} - -//-------------------------------------------------------------------------------- - -//================================================================================ -// -// Implementation of PythonType -// -//================================================================================ - -extern "C" -{ - static void standard_dealloc(PyObject* p); - // - // All the following functions redirect the call from Python - // onto the matching virtual function in PythonExtensionBase - // - static int print_handler (PyObject*, FILE *, int); - static PyObject* getattr_handler (PyObject*, char*); - static int setattr_handler (PyObject*, char*, PyObject*); - static PyObject* getattro_handler (PyObject*, PyObject*); - static int setattro_handler (PyObject*, PyObject*, PyObject*); - static int compare_handler (PyObject*, PyObject*); - static PyObject* richcompare_handler (PyObject*, PyObject*, int op); - static PyObject* repr_handler (PyObject*); - static PyObject* str_handler (PyObject*); - static long hash_handler (PyObject*); - static PyObject* call_handler (PyObject*, PyObject*, PyObject*); - static PyObject* iter_handler (PyObject*); - static PyObject* iternext_handler (PyObject*); - - // Sequence methods - static Py_ssize_t sequence_length_handler(PyObject*); - static PyObject* sequence_concat_handler(PyObject*,PyObject*); - static PyObject* sequence_repeat_handler(PyObject*, Py_ssize_t); - static PyObject* sequence_item_handler(PyObject*, Py_ssize_t); - static PyObject* sequence_slice_handler(PyObject*, Py_ssize_t, Py_ssize_t); - static int sequence_ass_item_handler(PyObject*, Py_ssize_t, PyObject*); - static int sequence_ass_slice_handler(PyObject*, Py_ssize_t, Py_ssize_t, PyObject*); - // Mapping - static Py_ssize_t mapping_length_handler(PyObject*); - static PyObject* mapping_subscript_handler(PyObject*, PyObject*); - static int mapping_ass_subscript_handler(PyObject*, PyObject*, PyObject*); - - // Numeric methods - static int number_nonzero_handler (PyObject*); - static PyObject* number_negative_handler (PyObject*); - static PyObject* number_positive_handler (PyObject*); - static PyObject* number_absolute_handler (PyObject*); - static PyObject* number_invert_handler (PyObject*); - static PyObject* number_int_handler (PyObject*); - static PyObject* number_float_handler (PyObject*); - static PyObject* number_long_handler (PyObject*); - static PyObject* number_oct_handler (PyObject*); - static PyObject* number_hex_handler (PyObject*); - static PyObject* number_add_handler (PyObject*, PyObject*); - static PyObject* number_subtract_handler (PyObject*, PyObject*); - static PyObject* number_multiply_handler (PyObject*, PyObject*); - static PyObject* number_divide_handler (PyObject*, PyObject*); - static PyObject* number_remainder_handler (PyObject*, PyObject*); - static PyObject* number_divmod_handler (PyObject*, PyObject*); - static PyObject* number_lshift_handler (PyObject*, PyObject*); - static PyObject* number_rshift_handler (PyObject*, PyObject*); - static PyObject* number_and_handler (PyObject*, PyObject*); - static PyObject* number_xor_handler (PyObject*, PyObject*); - static PyObject* number_or_handler (PyObject*, PyObject*); - static PyObject* number_power_handler(PyObject*, PyObject*, PyObject*); - - // Buffer - static Py_ssize_t buffer_getreadbuffer_handler (PyObject*, Py_ssize_t, void**); - static Py_ssize_t buffer_getwritebuffer_handler (PyObject*, Py_ssize_t, void**); - static Py_ssize_t buffer_getsegcount_handler (PyObject*, Py_ssize_t*); -} - - -extern "C" void standard_dealloc( PyObject* p ) -{ - PyMem_DEL( p ); -} - -PythonType & PythonType::supportSequenceType() -{ - if( !sequence_table ) - { - sequence_table = new PySequenceMethods; - memset( sequence_table, 0, sizeof( PySequenceMethods ) ); // ensure new fields are 0 - table->tp_as_sequence = sequence_table; - sequence_table->sq_length = sequence_length_handler; - sequence_table->sq_concat = sequence_concat_handler; - sequence_table->sq_repeat = sequence_repeat_handler; - sequence_table->sq_item = sequence_item_handler; - sequence_table->sq_slice = sequence_slice_handler; - - sequence_table->sq_ass_item = sequence_ass_item_handler; // BAS setup seperately? - sequence_table->sq_ass_slice = sequence_ass_slice_handler; // BAS setup seperately? - } - return *this; -} - -PythonType & PythonType::supportMappingType() -{ - if( !mapping_table ) - { - mapping_table = new PyMappingMethods; - memset( mapping_table, 0, sizeof( PyMappingMethods ) ); // ensure new fields are 0 - table->tp_as_mapping = mapping_table; - mapping_table->mp_length = mapping_length_handler; - mapping_table->mp_subscript = mapping_subscript_handler; - mapping_table->mp_ass_subscript = mapping_ass_subscript_handler; // BAS setup seperately? - } - return *this; -} - -PythonType & PythonType::supportNumberType() -{ - if( !number_table ) - { - number_table = new PyNumberMethods; - memset( number_table, 0, sizeof( PyNumberMethods ) ); // ensure new fields are 0 - table->tp_as_number = number_table; - number_table->nb_add = number_add_handler; - number_table->nb_subtract = number_subtract_handler; - number_table->nb_multiply = number_multiply_handler; - number_table->nb_divide = number_divide_handler; - number_table->nb_remainder = number_remainder_handler; - number_table->nb_divmod = number_divmod_handler; - number_table->nb_power = number_power_handler; - number_table->nb_negative = number_negative_handler; - number_table->nb_positive = number_positive_handler; - number_table->nb_absolute = number_absolute_handler; - number_table->nb_nonzero = number_nonzero_handler; - number_table->nb_invert = number_invert_handler; - number_table->nb_lshift = number_lshift_handler; - number_table->nb_rshift = number_rshift_handler; - number_table->nb_and = number_and_handler; - number_table->nb_xor = number_xor_handler; - number_table->nb_or = number_or_handler; - number_table->nb_coerce = 0; - number_table->nb_int = number_int_handler; - number_table->nb_long = number_long_handler; - number_table->nb_float = number_float_handler; - number_table->nb_oct = number_oct_handler; - number_table->nb_hex = number_hex_handler; - } - return *this; -} - -PythonType & PythonType::supportBufferType() -{ - if( !buffer_table ) - { - buffer_table = new PyBufferProcs; - memset( buffer_table, 0, sizeof( PyBufferProcs ) ); // ensure new fields are 0 - table->tp_as_buffer = buffer_table; - buffer_table->bf_getreadbuffer = buffer_getreadbuffer_handler; - buffer_table->bf_getwritebuffer = buffer_getwritebuffer_handler; - buffer_table->bf_getsegcount = buffer_getsegcount_handler; - } - return *this; -} - -// if you define one sequence method you must define -// all of them except the assigns - -PythonType::PythonType( size_t basic_size, int itemsize, const char *default_name ) - : table( new PyTypeObject ) - , sequence_table( NULL ) - , mapping_table( NULL ) - , number_table( NULL ) - , buffer_table( NULL ) -{ - memset( table, 0, sizeof( PyTypeObject ) ); // ensure new fields are 0 - *reinterpret_cast( table ) = py_object_initializer; - table->ob_type = _Type_Type(); - table->ob_size = 0; - table->tp_name = const_cast( default_name ); - table->tp_basicsize = basic_size; - table->tp_itemsize = itemsize; - table->tp_dealloc = ( destructor ) standard_dealloc; - table->tp_print = 0; - table->tp_getattr = 0; - table->tp_setattr = 0; - table->tp_compare = 0; - table->tp_repr = 0; - table->tp_as_number = 0; - table->tp_as_sequence = 0; - table->tp_as_mapping = 0; - table->tp_hash = 0; - table->tp_call = 0; - table->tp_str = 0; - table->tp_getattro = 0; - table->tp_setattro = 0; - table->tp_as_buffer = 0; - table->tp_flags = Py_TPFLAGS_DEFAULT; - table->tp_doc = 0; -#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 0) - // first use in 2.0 - table->tp_traverse = 0L; - table->tp_clear = 0L; -#else - table->tp_xxx5 = 0L; - table->tp_xxx6 = 0L; -#endif -#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 1) - // first defined in 2.1 - table->tp_richcompare = 0L; - table->tp_weaklistoffset = 0L; -#else - table->tp_xxx7 = 0L; - table->tp_xxx8 = 0L; -#endif - -#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 2) - // first defined in 2.3 - table->tp_iter = 0L; - table->tp_iternext = 0L; -#endif - -#ifdef COUNT_ALLOCS - table->tp_alloc = 0; - table->tp_free = 0; - table->tp_maxalloc = 0; - table->tp_next = 0; -#endif -} - -PythonType::~PythonType( ) -{ - delete table; - delete sequence_table; - delete mapping_table; - delete number_table; - delete buffer_table; -} - -PyTypeObject* PythonType::type_object( ) const -{return table;} - -PythonType & PythonType::name( const char* nam ) -{ - table->tp_name = const_cast( nam ); - return *this; -} - -const char *PythonType::getName() const -{ - return table->tp_name; -} - -PythonType & PythonType::doc( const char* d ) -{ - table->tp_doc = const_cast( d ); - return *this; -} - -const char *PythonType::getDoc() const -{ - return table->tp_doc; -} - -PythonType & PythonType::dealloc( void( *f )( PyObject* )) -{ - table->tp_dealloc = f; - return *this; -} - -PythonType & PythonType::supportPrint() -{ - table->tp_print = print_handler; - return *this; -} - -PythonType & PythonType::supportGetattr() -{ - table->tp_getattr = getattr_handler; - return *this; -} - -PythonType & PythonType::supportSetattr() -{ - table->tp_setattr = setattr_handler; - return *this; -} - -PythonType & PythonType::supportGetattro() -{ - table->tp_getattro = getattro_handler; - return *this; -} - -PythonType & PythonType::supportSetattro() -{ - table->tp_setattro = setattro_handler; - return *this; -} - -PythonType & PythonType::supportCompare() -{ - table->tp_compare = compare_handler; - return *this; -} - -#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 1) -PythonType & PythonType::supportRichCompare() -{ - table->tp_richcompare = richcompare_handler; - return *this; -} -#endif - -PythonType & PythonType::supportRepr() -{ - table->tp_repr = repr_handler; - return *this; -} - -PythonType & PythonType::supportStr() -{ - table->tp_str = str_handler; - return *this; -} - -PythonType & PythonType::supportHash() -{ - table->tp_hash = hash_handler; - return *this; -} - -PythonType & PythonType::supportCall() -{ - table->tp_call = call_handler; - return *this; -} - -PythonType & PythonType::supportIter() -{ - table->tp_iter = iter_handler; - table->tp_iternext = iternext_handler; - return *this; -} - -//-------------------------------------------------------------------------------- -// -// Handlers -// -//-------------------------------------------------------------------------------- -extern "C" int print_handler( PyObject *self, FILE *fp, int flags ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->print( fp, flags ); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -extern "C" PyObject* getattr_handler( PyObject *self, char *name ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->getattr( name ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" int setattr_handler( PyObject *self, char *name, PyObject *value ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->setattr( name, Py::Object( value ) ); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -extern "C" PyObject* getattro_handler( PyObject *self, PyObject *name ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->getattro( Py::Object( name ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" int setattro_handler( PyObject *self, PyObject *name, PyObject *value ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->setattro( Py::Object( name ), Py::Object( value ) ); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -extern "C" int compare_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->compare( Py::Object( other ) ); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 1) -extern "C" PyObject* richcompare_handler( PyObject *self, PyObject *other, int op ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->rich_compare( Py::Object( other ), op ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} -#endif - -extern "C" PyObject* repr_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->repr() ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* str_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->str() ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" long hash_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->hash(); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -extern "C" PyObject* call_handler( PyObject *self, PyObject *args, PyObject *kw ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - if( kw != NULL ) - return new_reference_to( p->call( Py::Object( args ), Py::Object( kw ) ) ); - else - return new_reference_to( p->call( Py::Object( args ), Py::Object() ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* iter_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->iter() ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* iternext_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->iternext(); // might be a NULL ptr on end of iteration - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - - -// Sequence methods -extern "C" Py_ssize_t sequence_length_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->sequence_length(); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -extern "C" PyObject* sequence_concat_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->sequence_concat( Py::Object( other ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* sequence_repeat_handler( PyObject *self, Py_ssize_t count ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->sequence_repeat( count ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* sequence_item_handler( PyObject *self, Py_ssize_t index ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->sequence_item( index ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* sequence_slice_handler( PyObject *self, Py_ssize_t first, Py_ssize_t last ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->sequence_slice( first, last ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" int sequence_ass_item_handler( PyObject *self, Py_ssize_t index, PyObject *value ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->sequence_ass_item( index, Py::Object( value ) ); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -extern "C" int sequence_ass_slice_handler( PyObject *self, Py_ssize_t first, Py_ssize_t last, PyObject *value ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->sequence_ass_slice( first, last, Py::Object( value ) ); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -// Mapping -extern "C" Py_ssize_t mapping_length_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->mapping_length(); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -extern "C" PyObject* mapping_subscript_handler( PyObject *self, PyObject *key ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->mapping_subscript( Py::Object( key ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" int mapping_ass_subscript_handler( PyObject *self, PyObject *key, PyObject *value ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->mapping_ass_subscript( Py::Object( key ), Py::Object( value ) ); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -// Number -extern "C" int number_nonzero_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->number_nonzero(); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -extern "C" PyObject* number_negative_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_negative() ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_positive_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_positive() ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_absolute_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_absolute() ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_invert_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_invert() ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_int_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_int() ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_float_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_float() ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_long_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_long() ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_oct_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_oct() ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_hex_handler( PyObject *self ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_hex() ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_add_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_add( Py::Object( other ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_subtract_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_subtract( Py::Object( other ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_multiply_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_multiply( Py::Object( other ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_divide_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_divide( Py::Object( other ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_remainder_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_remainder( Py::Object( other ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_divmod_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_divmod( Py::Object( other ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_lshift_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_lshift( Py::Object( other ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_rshift_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_rshift( Py::Object( other ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_and_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_and( Py::Object( other ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_xor_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_xor( Py::Object( other ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_or_handler( PyObject *self, PyObject *other ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_or( Py::Object( other ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -extern "C" PyObject* number_power_handler( PyObject *self, PyObject *x1, PyObject *x2 ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return new_reference_to( p->number_power( Py::Object( x1 ), Py::Object( x2 ) ) ); - } - catch( Py::Exception & ) - { - return NULL; // indicate error - } -} - -// Buffer -extern "C" Py_ssize_t buffer_getreadbuffer_handler( PyObject *self, Py_ssize_t index, void **pp ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->buffer_getreadbuffer( index, pp ); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -extern "C" Py_ssize_t buffer_getwritebuffer_handler( PyObject *self, Py_ssize_t index, void **pp ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->buffer_getwritebuffer( index, pp ); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - -extern "C" Py_ssize_t buffer_getsegcount_handler( PyObject *self, Py_ssize_t *count ) -{ - try - { - PythonExtensionBase *p = static_cast( self ); - return p->buffer_getsegcount( count ); - } - catch( Py::Exception & ) - { - return -1; // indicate error - } -} - - -//================================================================================ -// -// Implementation of PythonExtensionBase -// -//================================================================================ -#define missing_method( method ) \ -throw RuntimeError( "Extension object does not support method " #method ); - -PythonExtensionBase::PythonExtensionBase() -{ -} - -PythonExtensionBase::~PythonExtensionBase() -{ - assert( ob_refcnt == 0 ); -} - -int PythonExtensionBase::print( FILE *, int ) -{ missing_method( print ); return -1; } - -int PythonExtensionBase::setattr( const char*, const Py::Object & ) -{ missing_method( setattr ); return -1; } - -Py::Object PythonExtensionBase::getattro( const Py::Object & ) -{ missing_method( getattro ); return Py::Nothing(); } - -int PythonExtensionBase::setattro( const Py::Object &, const Py::Object & ) -{ missing_method( setattro ); return -1; } - -int PythonExtensionBase::compare( const Py::Object & ) -{ missing_method( compare ); return -1; } - -#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 1) -Py::Object PythonExtensionBase::rich_compare( const Py::Object &, int op ) -{ missing_method( rich_compare ); return Py::None(); } +#include "Python3/cxx_extensions.cxx" #endif - -Py::Object PythonExtensionBase::repr() -{ missing_method( repr ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::str() -{ missing_method( str ); return Py::Nothing(); } - -long PythonExtensionBase::hash() -{ missing_method( hash ); return -1; } - -Py::Object PythonExtensionBase::call( const Py::Object &, const Py::Object & ) -{ missing_method( call ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::iter() -{ missing_method( iter ); return Py::Nothing(); } - -PyObject* PythonExtensionBase::iternext() -{ missing_method( iternext ); return NULL; } - - -// Sequence methods -int PythonExtensionBase::sequence_length() -{ missing_method( sequence_length ); return -1; } - -Py::Object PythonExtensionBase::sequence_concat( const Py::Object & ) -{ missing_method( sequence_concat ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::sequence_repeat( Py_ssize_t ) -{ missing_method( sequence_repeat ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::sequence_item( Py_ssize_t ) -{ missing_method( sequence_item ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::sequence_slice( Py_ssize_t, Py_ssize_t ) -{ missing_method( sequence_slice ); return Py::Nothing(); } - -int PythonExtensionBase::sequence_ass_item( Py_ssize_t, const Py::Object & ) -{ missing_method( sequence_ass_item ); return -1; } - -int PythonExtensionBase::sequence_ass_slice( Py_ssize_t, Py_ssize_t, const Py::Object & ) -{ missing_method( sequence_ass_slice ); return -1; } - - -// Mapping -int PythonExtensionBase::mapping_length() -{ missing_method( mapping_length ); return -1; } - -Py::Object PythonExtensionBase::mapping_subscript( const Py::Object & ) -{ missing_method( mapping_subscript ); return Py::Nothing(); } - -int PythonExtensionBase::mapping_ass_subscript( const Py::Object &, const Py::Object & ) -{ missing_method( mapping_ass_subscript ); return -1; } - - -// Number -int PythonExtensionBase::number_nonzero() -{ missing_method( number_nonzero ); return -1; } - -Py::Object PythonExtensionBase::number_negative() -{ missing_method( number_negative ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_positive() -{ missing_method( number_positive ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_absolute() -{ missing_method( number_absolute ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_invert() -{ missing_method( number_invert ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_int() -{ missing_method( number_int ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_float() -{ missing_method( number_float ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_long() -{ missing_method( number_long ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_oct() -{ missing_method( number_oct ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_hex() -{ missing_method( number_hex ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_add( const Py::Object & ) -{ missing_method( number_add ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_subtract( const Py::Object & ) -{ missing_method( number_subtract ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_multiply( const Py::Object & ) -{ missing_method( number_multiply ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_divide( const Py::Object & ) -{ missing_method( number_divide ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_remainder( const Py::Object & ) -{ missing_method( number_remainder ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_divmod( const Py::Object & ) -{ missing_method( number_divmod ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_lshift( const Py::Object & ) -{ missing_method( number_lshift ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_rshift( const Py::Object & ) -{ missing_method( number_rshift ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_and( const Py::Object & ) -{ missing_method( number_and ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_xor( const Py::Object & ) -{ missing_method( number_xor ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_or( const Py::Object & ) -{ missing_method( number_or ); return Py::Nothing(); } - -Py::Object PythonExtensionBase::number_power( const Py::Object &, const Py::Object & ) -{ missing_method( number_power ); return Py::Nothing(); } - - -// Buffer -Py_ssize_t PythonExtensionBase::buffer_getreadbuffer( Py_ssize_t, void** ) -{ missing_method( buffer_getreadbuffer ); return -1; } - -Py_ssize_t PythonExtensionBase::buffer_getwritebuffer( Py_ssize_t, void** ) -{ missing_method( buffer_getwritebuffer ); return -1; } - -Py_ssize_t PythonExtensionBase::buffer_getsegcount( Py_ssize_t* ) -{ missing_method( buffer_getsegcount ); return -1; } - -//-------------------------------------------------------------------------------- -// -// Method call handlers for -// PythonExtensionBase -// ExtensionModuleBase -// -//-------------------------------------------------------------------------------- - -extern "C" PyObject *method_keyword_call_handler( PyObject *_self_and_name_tuple, PyObject *_args, PyObject *_keywords ) -{ - try - { - Tuple self_and_name_tuple( _self_and_name_tuple ); - - PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); - void *self_as_void = PyCObject_AsVoidPtr( self_in_cobject ); - if( self_as_void == NULL ) - return NULL; - - ExtensionModuleBase *self = static_cast( self_as_void ); - - String py_name( self_and_name_tuple[1] ); - std::string name( py_name.as_std_string() ); - - Tuple args( _args ); - if( _keywords == NULL ) - { - Dict keywords; // pass an empty dict - - Object result( self->invoke_method_keyword( name, args, keywords ) ); - return new_reference_to( result.ptr() ); - } - - Dict keywords( _keywords ); - - Object result( self->invoke_method_keyword( name, args, keywords ) ); - return new_reference_to( result.ptr() ); - } - catch( Exception & ) - { - return 0; - } -} - -extern "C" PyObject *method_varargs_call_handler( PyObject *_self_and_name_tuple, PyObject *_args ) -{ - try - { - Tuple self_and_name_tuple( _self_and_name_tuple ); - - PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); - void *self_as_void = PyCObject_AsVoidPtr( self_in_cobject ); - if( self_as_void == NULL ) - return NULL; - - ExtensionModuleBase *self = static_cast( self_as_void ); - - String py_name( self_and_name_tuple[1] ); - std::string name( py_name.as_std_string() ); - - Tuple args( _args ); - - Object result( self->invoke_method_varargs( name, args ) ); - - return new_reference_to( result.ptr() ); - } - catch( Exception & ) - { - return 0; - } -} - -extern "C" void do_not_dealloc( void * ) -{} - - -//-------------------------------------------------------------------------------- -// -// ExtensionExceptionType -// -//-------------------------------------------------------------------------------- -ExtensionExceptionType::ExtensionExceptionType() - : Py::Object() -{ -} - -void ExtensionExceptionType::init( ExtensionModuleBase &module, const std::string& name ) -{ - std::string module_name( module.fullName() ); - module_name += "."; - module_name += name; - - set( PyErr_NewException( const_cast( module_name.c_str() ), NULL, NULL ), true ); -} - -void ExtensionExceptionType::init( ExtensionModuleBase &module, const std::string& name, ExtensionExceptionType &parent) - { - std::string module_name( module.fullName() ); - module_name += "."; - module_name += name; - - set( PyErr_NewException( const_cast( module_name.c_str() ), parent.ptr(), NULL ), true ); -} - -ExtensionExceptionType::~ExtensionExceptionType() -{ -} - -Exception::Exception( ExtensionExceptionType &exception, const std::string& reason ) -{ - PyErr_SetString (exception.ptr(), reason.c_str()); -} - -Exception::Exception( ExtensionExceptionType &exception, Object &reason ) -{ - PyErr_SetObject (exception.ptr(), reason.ptr()); -} - -Exception::Exception( PyObject* exception, Object &reason ) -{ - PyErr_SetObject (exception, reason.ptr()); -} - -} // end of namespace Py diff --git a/CXX/cxxextensions.c b/CXX/cxxextensions.c index edae3be6bce9..cfab556f059a 100644 --- a/CXX/cxxextensions.c +++ b/CXX/cxxextensions.c @@ -1,4 +1,4 @@ -/*---------------------------------------------------------------------------- +//----------------------------------------------------------------------------- // // Copyright (c) 1998 - 2007, The Regents of the University of California // Produced at the Lawrence Livermore National Laboratory @@ -33,17 +33,11 @@ // OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH // DAMAGE. // -//---------------------------------------------------------------------------*/ - +//----------------------------------------------------------------------------- #include "CXX/WrapPython.h" -#ifdef __cplusplus -extern "C" -{ -#endif - -PyObject py_object_initializer = {PyObject_HEAD_INIT(0)}; - -#ifdef __cplusplus -} +#if PY_MAJOR_VERSION == 2 +#include "Python2/cxxextensions.c" +#else +#include "Python3/cxxextensions.c" #endif diff --git a/CXX/cxxextensions.c~ b/CXX/cxxextensions.c~ new file mode 100644 index 000000000000..28a8e1d3860d --- /dev/null +++ b/CXX/cxxextensions.c~ @@ -0,0 +1,43 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- +#include "CXX/WrapPython.h" + +#if PY_MAJOR_VERSION == 2 +#include "Src/Python2/cxxextensions.c" +#else +#include "Src/Python3/cxxextensions.c" +#endif diff --git a/CXX/cxxsupport.cxx b/CXX/cxxsupport.cxx index 1dfba5a1908b..946e60dc0d92 100644 --- a/CXX/cxxsupport.cxx +++ b/CXX/cxxsupport.cxx @@ -34,141 +34,10 @@ // DAMAGE. // //----------------------------------------------------------------------------- +#include "CXX/WrapPython.h" -#include "CXX/Objects.hxx" -namespace Py { - -Py_UNICODE unicode_null_string[1] = { 0 }; - -Type Object::type () const -{ - return Type (PyObject_Type (p), true); -} - -String Object::str () const -{ - return String (PyObject_Str (p), true); -} - -String Object::repr () const -{ - return String (PyObject_Repr (p), true); -} - -std::string Object::as_string() const -{ - return static_cast(str()); -} - -List Object::dir () const - { - return List (PyObject_Dir (p), true); - } - -bool Object::isType (const Type& t) const -{ - return type ().ptr() == t.ptr(); -} - -Char::operator String() const -{ - return String(ptr()); -} - -// TMM: non-member operaters for iterators - see above -// I've also made a bug fix in respect to the cxx code -// (dereffed the left.seq and right.seq comparison) -bool operator==(const Sequence::iterator& left, const Sequence::iterator& right) -{ - return left.eql( right ); -} - -bool operator!=(const Sequence::iterator& left, const Sequence::iterator& right) -{ - return left.neq( right ); -} - -bool operator< (const Sequence::iterator& left, const Sequence::iterator& right) -{ - return left.lss( right ); -} - -bool operator> (const Sequence::iterator& left, const Sequence::iterator& right) -{ - return left.gtr( right ); -} - -bool operator<=(const Sequence::iterator& left, const Sequence::iterator& right) -{ - return left.leq( right ); -} - -bool operator>=(const Sequence::iterator& left, const Sequence::iterator& right) -{ - return left.geq( right ); -} - -// now for const_iterator -bool operator==(const Sequence::const_iterator& left, const Sequence::const_iterator& right) -{ - return left.eql( right ); -} - -bool operator!=(const Sequence::const_iterator& left, const Sequence::const_iterator& right) -{ - return left.neq( right ); -} - -bool operator< (const Sequence::const_iterator& left, const Sequence::const_iterator& right) -{ - return left.lss( right ); -} - -bool operator> (const Sequence::const_iterator& left, const Sequence::const_iterator& right) -{ - return left.gtr( right ); -} - -bool operator<=(const Sequence::const_iterator& left, const Sequence::const_iterator& right) -{ - return left.leq( right ); -} - -bool operator>=(const Sequence::const_iterator& left, const Sequence::const_iterator& right) -{ - return left.geq( right ); -} - -// For mappings: -bool operator==(const Mapping::iterator& left, const Mapping::iterator& right) -{ - return left.eql( right ); -} - -bool operator!=(const Mapping::iterator& left, const Mapping::iterator& right) -{ - return left.neq( right ); -} - -// now for const_iterator -bool operator==(const Mapping::const_iterator& left, const Mapping::const_iterator& right) -{ - return left.eql( right ); -} - -bool operator!=(const Mapping::const_iterator& left, const Mapping::const_iterator& right) -{ - return left.neq( right ); -} - -// TMM: 31May'01 - Added the #ifndef so I can exclude iostreams. -#ifndef CXX_NO_IOSTREAMS -// output - -std::ostream& operator<< (std::ostream& os, const Object& ob) -{ - return (os << static_cast(ob.str())); -} +#if PY_MAJOR_VERSION == 2 +#include "Python2/cxxsupport.cxx" +#else +#include "Python3/cxxsupport.cxx" #endif - -} // Py diff --git a/CXX/cxxsupport.cxx~ b/CXX/cxxsupport.cxx~ new file mode 100644 index 000000000000..1f2fb432df52 --- /dev/null +++ b/CXX/cxxsupport.cxx~ @@ -0,0 +1,43 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- +#include "CXX/WrapPython.h" + +#if PY_MAJOR_VERSION == 2 +#include "Src/Python2/cxxsupport.cxx" +#else +#include "Src/Python3/cxxsupport.cxx" +#endif From 19c32503d5fd2f57ad1006ac21df82e7cd5f2387 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Sat, 16 Jan 2010 22:08:25 +0000 Subject: [PATCH 0481/1000] remove cxx emacs backupfiles svn path=/trunk/matplotlib/; revision=8085 --- CXX/IndirectPythonInterface.cxx~ | 43 -------------------------------- CXX/cxxextensions.c~ | 43 -------------------------------- CXX/cxxsupport.cxx~ | 43 -------------------------------- 3 files changed, 129 deletions(-) delete mode 100644 CXX/IndirectPythonInterface.cxx~ delete mode 100644 CXX/cxxextensions.c~ delete mode 100644 CXX/cxxsupport.cxx~ diff --git a/CXX/IndirectPythonInterface.cxx~ b/CXX/IndirectPythonInterface.cxx~ deleted file mode 100644 index 0ee480df5c48..000000000000 --- a/CXX/IndirectPythonInterface.cxx~ +++ /dev/null @@ -1,43 +0,0 @@ -//----------------------------------------------------------------------------- -// -// Copyright (c) 1998 - 2007, The Regents of the University of California -// Produced at the Lawrence Livermore National Laboratory -// All rights reserved. -// -// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The -// full copyright notice is contained in the file COPYRIGHT located at the root -// of the PyCXX distribution. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, -// this list of conditions and the disclaimer below. -// - Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the disclaimer (as noted below) in the -// documentation and/or materials provided with the distribution. -// - Neither the name of the UC/LLNL nor the names of its contributors may be -// used to endorse or promote products derived from this software without -// specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF -// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -// DAMAGE. -// -//----------------------------------------------------------------------------- -#include "CXX/WrapPython.h" - -#if PY_MAJOR_VERSION == 2 -#include "Src/Python2/IndirectPythonInterface.cxx" -#else -#include "Src/Python3/IndirectPythonInterface.cxx" -#endif diff --git a/CXX/cxxextensions.c~ b/CXX/cxxextensions.c~ deleted file mode 100644 index 28a8e1d3860d..000000000000 --- a/CXX/cxxextensions.c~ +++ /dev/null @@ -1,43 +0,0 @@ -//----------------------------------------------------------------------------- -// -// Copyright (c) 1998 - 2007, The Regents of the University of California -// Produced at the Lawrence Livermore National Laboratory -// All rights reserved. -// -// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The -// full copyright notice is contained in the file COPYRIGHT located at the root -// of the PyCXX distribution. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, -// this list of conditions and the disclaimer below. -// - Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the disclaimer (as noted below) in the -// documentation and/or materials provided with the distribution. -// - Neither the name of the UC/LLNL nor the names of its contributors may be -// used to endorse or promote products derived from this software without -// specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF -// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -// DAMAGE. -// -//----------------------------------------------------------------------------- -#include "CXX/WrapPython.h" - -#if PY_MAJOR_VERSION == 2 -#include "Src/Python2/cxxextensions.c" -#else -#include "Src/Python3/cxxextensions.c" -#endif diff --git a/CXX/cxxsupport.cxx~ b/CXX/cxxsupport.cxx~ deleted file mode 100644 index 1f2fb432df52..000000000000 --- a/CXX/cxxsupport.cxx~ +++ /dev/null @@ -1,43 +0,0 @@ -//----------------------------------------------------------------------------- -// -// Copyright (c) 1998 - 2007, The Regents of the University of California -// Produced at the Lawrence Livermore National Laboratory -// All rights reserved. -// -// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The -// full copyright notice is contained in the file COPYRIGHT located at the root -// of the PyCXX distribution. -// -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are met: -// -// - Redistributions of source code must retain the above copyright notice, -// this list of conditions and the disclaimer below. -// - Redistributions in binary form must reproduce the above copyright notice, -// this list of conditions and the disclaimer (as noted below) in the -// documentation and/or materials provided with the distribution. -// - Neither the name of the UC/LLNL nor the names of its contributors may be -// used to endorse or promote products derived from this software without -// specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF -// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR -// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT -// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY -// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH -// DAMAGE. -// -//----------------------------------------------------------------------------- -#include "CXX/WrapPython.h" - -#if PY_MAJOR_VERSION == 2 -#include "Src/Python2/cxxsupport.cxx" -#else -#include "Src/Python3/cxxsupport.cxx" -#endif From 7a5429ef19189d3aab544ea9574cbd44b09c9313 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Sat, 16 Jan 2010 23:00:27 +0000 Subject: [PATCH 0482/1000] move cxx6 svn path=/trunk/matplotlib/; revision=8086 --- {CXX => CXX64}/Config.hxx | 0 {CXX => CXX64}/Exception.hxx | 0 {CXX => CXX64}/Extensions.hxx | 0 {CXX => CXX64}/IndirectPythonInterface.cxx | 0 {CXX => CXX64}/IndirectPythonInterface.hxx | 0 {CXX => CXX64}/Objects.hxx | 0 {CXX => CXX64}/Python2/Config.hxx | 0 {CXX => CXX64}/Python2/CxxDebug.hxx | 0 {CXX => CXX64}/Python2/Exception.hxx | 0 {CXX => CXX64}/Python2/ExtensionModule.hxx | 0 {CXX => CXX64}/Python2/ExtensionOldType.hxx | 0 {CXX => CXX64}/Python2/ExtensionType.hxx | 0 {CXX => CXX64}/Python2/ExtensionTypeBase.hxx | 0 {CXX => CXX64}/Python2/Extensions.hxx | 0 {CXX => CXX64}/Python2/IndirectPythonInterface.cxx | 0 {CXX => CXX64}/Python2/IndirectPythonInterface.hxx | 0 {CXX => CXX64}/Python2/Objects.hxx | 0 {CXX => CXX64}/Python2/PythonType.hxx | 0 {CXX => CXX64}/Python2/cxx_extensions.cxx | 0 {CXX => CXX64}/Python2/cxxextensions.c | 0 {CXX => CXX64}/Python2/cxxsupport.cxx | 0 {CXX => CXX64}/Python3/Config.hxx | 0 {CXX => CXX64}/Python3/CxxDebug.hxx | 0 {CXX => CXX64}/Python3/Exception.hxx | 0 {CXX => CXX64}/Python3/ExtensionModule.hxx | 0 {CXX => CXX64}/Python3/ExtensionOldType.hxx | 0 {CXX => CXX64}/Python3/ExtensionType.hxx | 0 {CXX => CXX64}/Python3/ExtensionTypeBase.hxx | 0 {CXX => CXX64}/Python3/Extensions.hxx | 0 {CXX => CXX64}/Python3/IndirectPythonInterface.cxx | 0 {CXX => CXX64}/Python3/IndirectPythonInterface.hxx | 0 {CXX => CXX64}/Python3/Objects.hxx | 0 {CXX => CXX64}/Python3/PythonType.hxx | 0 {CXX => CXX64}/Python3/cxx_extensions.cxx | 0 {CXX => CXX64}/Python3/cxxextensions.c | 0 {CXX => CXX64}/Python3/cxxsupport.cxx | 0 {CXX => CXX64}/Version.hxx | 0 {CXX => CXX64}/WrapPython.h | 0 {CXX => CXX64}/cxx_extensions.cxx | 0 {CXX => CXX64}/cxxextensions.c | 0 {CXX => CXX64}/cxxsupport.cxx | 0 41 files changed, 0 insertions(+), 0 deletions(-) rename {CXX => CXX64}/Config.hxx (100%) rename {CXX => CXX64}/Exception.hxx (100%) rename {CXX => CXX64}/Extensions.hxx (100%) rename {CXX => CXX64}/IndirectPythonInterface.cxx (100%) rename {CXX => CXX64}/IndirectPythonInterface.hxx (100%) rename {CXX => CXX64}/Objects.hxx (100%) rename {CXX => CXX64}/Python2/Config.hxx (100%) rename {CXX => CXX64}/Python2/CxxDebug.hxx (100%) rename {CXX => CXX64}/Python2/Exception.hxx (100%) rename {CXX => CXX64}/Python2/ExtensionModule.hxx (100%) rename {CXX => CXX64}/Python2/ExtensionOldType.hxx (100%) rename {CXX => CXX64}/Python2/ExtensionType.hxx (100%) rename {CXX => CXX64}/Python2/ExtensionTypeBase.hxx (100%) rename {CXX => CXX64}/Python2/Extensions.hxx (100%) rename {CXX => CXX64}/Python2/IndirectPythonInterface.cxx (100%) rename {CXX => CXX64}/Python2/IndirectPythonInterface.hxx (100%) rename {CXX => CXX64}/Python2/Objects.hxx (100%) rename {CXX => CXX64}/Python2/PythonType.hxx (100%) rename {CXX => CXX64}/Python2/cxx_extensions.cxx (100%) rename {CXX => CXX64}/Python2/cxxextensions.c (100%) rename {CXX => CXX64}/Python2/cxxsupport.cxx (100%) rename {CXX => CXX64}/Python3/Config.hxx (100%) rename {CXX => CXX64}/Python3/CxxDebug.hxx (100%) rename {CXX => CXX64}/Python3/Exception.hxx (100%) rename {CXX => CXX64}/Python3/ExtensionModule.hxx (100%) rename {CXX => CXX64}/Python3/ExtensionOldType.hxx (100%) rename {CXX => CXX64}/Python3/ExtensionType.hxx (100%) rename {CXX => CXX64}/Python3/ExtensionTypeBase.hxx (100%) rename {CXX => CXX64}/Python3/Extensions.hxx (100%) rename {CXX => CXX64}/Python3/IndirectPythonInterface.cxx (100%) rename {CXX => CXX64}/Python3/IndirectPythonInterface.hxx (100%) rename {CXX => CXX64}/Python3/Objects.hxx (100%) rename {CXX => CXX64}/Python3/PythonType.hxx (100%) rename {CXX => CXX64}/Python3/cxx_extensions.cxx (100%) rename {CXX => CXX64}/Python3/cxxextensions.c (100%) rename {CXX => CXX64}/Python3/cxxsupport.cxx (100%) rename {CXX => CXX64}/Version.hxx (100%) rename {CXX => CXX64}/WrapPython.h (100%) rename {CXX => CXX64}/cxx_extensions.cxx (100%) rename {CXX => CXX64}/cxxextensions.c (100%) rename {CXX => CXX64}/cxxsupport.cxx (100%) diff --git a/CXX/Config.hxx b/CXX64/Config.hxx similarity index 100% rename from CXX/Config.hxx rename to CXX64/Config.hxx diff --git a/CXX/Exception.hxx b/CXX64/Exception.hxx similarity index 100% rename from CXX/Exception.hxx rename to CXX64/Exception.hxx diff --git a/CXX/Extensions.hxx b/CXX64/Extensions.hxx similarity index 100% rename from CXX/Extensions.hxx rename to CXX64/Extensions.hxx diff --git a/CXX/IndirectPythonInterface.cxx b/CXX64/IndirectPythonInterface.cxx similarity index 100% rename from CXX/IndirectPythonInterface.cxx rename to CXX64/IndirectPythonInterface.cxx diff --git a/CXX/IndirectPythonInterface.hxx b/CXX64/IndirectPythonInterface.hxx similarity index 100% rename from CXX/IndirectPythonInterface.hxx rename to CXX64/IndirectPythonInterface.hxx diff --git a/CXX/Objects.hxx b/CXX64/Objects.hxx similarity index 100% rename from CXX/Objects.hxx rename to CXX64/Objects.hxx diff --git a/CXX/Python2/Config.hxx b/CXX64/Python2/Config.hxx similarity index 100% rename from CXX/Python2/Config.hxx rename to CXX64/Python2/Config.hxx diff --git a/CXX/Python2/CxxDebug.hxx b/CXX64/Python2/CxxDebug.hxx similarity index 100% rename from CXX/Python2/CxxDebug.hxx rename to CXX64/Python2/CxxDebug.hxx diff --git a/CXX/Python2/Exception.hxx b/CXX64/Python2/Exception.hxx similarity index 100% rename from CXX/Python2/Exception.hxx rename to CXX64/Python2/Exception.hxx diff --git a/CXX/Python2/ExtensionModule.hxx b/CXX64/Python2/ExtensionModule.hxx similarity index 100% rename from CXX/Python2/ExtensionModule.hxx rename to CXX64/Python2/ExtensionModule.hxx diff --git a/CXX/Python2/ExtensionOldType.hxx b/CXX64/Python2/ExtensionOldType.hxx similarity index 100% rename from CXX/Python2/ExtensionOldType.hxx rename to CXX64/Python2/ExtensionOldType.hxx diff --git a/CXX/Python2/ExtensionType.hxx b/CXX64/Python2/ExtensionType.hxx similarity index 100% rename from CXX/Python2/ExtensionType.hxx rename to CXX64/Python2/ExtensionType.hxx diff --git a/CXX/Python2/ExtensionTypeBase.hxx b/CXX64/Python2/ExtensionTypeBase.hxx similarity index 100% rename from CXX/Python2/ExtensionTypeBase.hxx rename to CXX64/Python2/ExtensionTypeBase.hxx diff --git a/CXX/Python2/Extensions.hxx b/CXX64/Python2/Extensions.hxx similarity index 100% rename from CXX/Python2/Extensions.hxx rename to CXX64/Python2/Extensions.hxx diff --git a/CXX/Python2/IndirectPythonInterface.cxx b/CXX64/Python2/IndirectPythonInterface.cxx similarity index 100% rename from CXX/Python2/IndirectPythonInterface.cxx rename to CXX64/Python2/IndirectPythonInterface.cxx diff --git a/CXX/Python2/IndirectPythonInterface.hxx b/CXX64/Python2/IndirectPythonInterface.hxx similarity index 100% rename from CXX/Python2/IndirectPythonInterface.hxx rename to CXX64/Python2/IndirectPythonInterface.hxx diff --git a/CXX/Python2/Objects.hxx b/CXX64/Python2/Objects.hxx similarity index 100% rename from CXX/Python2/Objects.hxx rename to CXX64/Python2/Objects.hxx diff --git a/CXX/Python2/PythonType.hxx b/CXX64/Python2/PythonType.hxx similarity index 100% rename from CXX/Python2/PythonType.hxx rename to CXX64/Python2/PythonType.hxx diff --git a/CXX/Python2/cxx_extensions.cxx b/CXX64/Python2/cxx_extensions.cxx similarity index 100% rename from CXX/Python2/cxx_extensions.cxx rename to CXX64/Python2/cxx_extensions.cxx diff --git a/CXX/Python2/cxxextensions.c b/CXX64/Python2/cxxextensions.c similarity index 100% rename from CXX/Python2/cxxextensions.c rename to CXX64/Python2/cxxextensions.c diff --git a/CXX/Python2/cxxsupport.cxx b/CXX64/Python2/cxxsupport.cxx similarity index 100% rename from CXX/Python2/cxxsupport.cxx rename to CXX64/Python2/cxxsupport.cxx diff --git a/CXX/Python3/Config.hxx b/CXX64/Python3/Config.hxx similarity index 100% rename from CXX/Python3/Config.hxx rename to CXX64/Python3/Config.hxx diff --git a/CXX/Python3/CxxDebug.hxx b/CXX64/Python3/CxxDebug.hxx similarity index 100% rename from CXX/Python3/CxxDebug.hxx rename to CXX64/Python3/CxxDebug.hxx diff --git a/CXX/Python3/Exception.hxx b/CXX64/Python3/Exception.hxx similarity index 100% rename from CXX/Python3/Exception.hxx rename to CXX64/Python3/Exception.hxx diff --git a/CXX/Python3/ExtensionModule.hxx b/CXX64/Python3/ExtensionModule.hxx similarity index 100% rename from CXX/Python3/ExtensionModule.hxx rename to CXX64/Python3/ExtensionModule.hxx diff --git a/CXX/Python3/ExtensionOldType.hxx b/CXX64/Python3/ExtensionOldType.hxx similarity index 100% rename from CXX/Python3/ExtensionOldType.hxx rename to CXX64/Python3/ExtensionOldType.hxx diff --git a/CXX/Python3/ExtensionType.hxx b/CXX64/Python3/ExtensionType.hxx similarity index 100% rename from CXX/Python3/ExtensionType.hxx rename to CXX64/Python3/ExtensionType.hxx diff --git a/CXX/Python3/ExtensionTypeBase.hxx b/CXX64/Python3/ExtensionTypeBase.hxx similarity index 100% rename from CXX/Python3/ExtensionTypeBase.hxx rename to CXX64/Python3/ExtensionTypeBase.hxx diff --git a/CXX/Python3/Extensions.hxx b/CXX64/Python3/Extensions.hxx similarity index 100% rename from CXX/Python3/Extensions.hxx rename to CXX64/Python3/Extensions.hxx diff --git a/CXX/Python3/IndirectPythonInterface.cxx b/CXX64/Python3/IndirectPythonInterface.cxx similarity index 100% rename from CXX/Python3/IndirectPythonInterface.cxx rename to CXX64/Python3/IndirectPythonInterface.cxx diff --git a/CXX/Python3/IndirectPythonInterface.hxx b/CXX64/Python3/IndirectPythonInterface.hxx similarity index 100% rename from CXX/Python3/IndirectPythonInterface.hxx rename to CXX64/Python3/IndirectPythonInterface.hxx diff --git a/CXX/Python3/Objects.hxx b/CXX64/Python3/Objects.hxx similarity index 100% rename from CXX/Python3/Objects.hxx rename to CXX64/Python3/Objects.hxx diff --git a/CXX/Python3/PythonType.hxx b/CXX64/Python3/PythonType.hxx similarity index 100% rename from CXX/Python3/PythonType.hxx rename to CXX64/Python3/PythonType.hxx diff --git a/CXX/Python3/cxx_extensions.cxx b/CXX64/Python3/cxx_extensions.cxx similarity index 100% rename from CXX/Python3/cxx_extensions.cxx rename to CXX64/Python3/cxx_extensions.cxx diff --git a/CXX/Python3/cxxextensions.c b/CXX64/Python3/cxxextensions.c similarity index 100% rename from CXX/Python3/cxxextensions.c rename to CXX64/Python3/cxxextensions.c diff --git a/CXX/Python3/cxxsupport.cxx b/CXX64/Python3/cxxsupport.cxx similarity index 100% rename from CXX/Python3/cxxsupport.cxx rename to CXX64/Python3/cxxsupport.cxx diff --git a/CXX/Version.hxx b/CXX64/Version.hxx similarity index 100% rename from CXX/Version.hxx rename to CXX64/Version.hxx diff --git a/CXX/WrapPython.h b/CXX64/WrapPython.h similarity index 100% rename from CXX/WrapPython.h rename to CXX64/WrapPython.h diff --git a/CXX/cxx_extensions.cxx b/CXX64/cxx_extensions.cxx similarity index 100% rename from CXX/cxx_extensions.cxx rename to CXX64/cxx_extensions.cxx diff --git a/CXX/cxxextensions.c b/CXX64/cxxextensions.c similarity index 100% rename from CXX/cxxextensions.c rename to CXX64/cxxextensions.c diff --git a/CXX/cxxsupport.cxx b/CXX64/cxxsupport.cxx similarity index 100% rename from CXX/cxxsupport.cxx rename to CXX64/cxxsupport.cxx From 68a60386e8af3338d4baedafe58288bdd8dd4d48 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Sat, 16 Jan 2010 23:01:21 +0000 Subject: [PATCH 0483/1000] restore cxx5 svn path=/trunk/matplotlib/; revision=8087 --- CXX/Config.hxx | 134 ++ CXX/Exception.hxx | 249 +++ CXX/Extensions.hxx | 928 ++++++++++ CXX/IndirectPythonInterface.cxx | 597 ++++++ CXX/IndirectPythonInterface.hxx | 198 ++ CXX/Objects.hxx | 3040 +++++++++++++++++++++++++++++++ CXX/Version.hxx | 46 + CXX/WrapPython.h | 49 + CXX/cxx_extensions.cxx | 1464 +++++++++++++++ CXX/cxxextensions.c | 49 + CXX/cxxsupport.cxx | 174 ++ 11 files changed, 6928 insertions(+) create mode 100644 CXX/Config.hxx create mode 100644 CXX/Exception.hxx create mode 100644 CXX/Extensions.hxx create mode 100644 CXX/IndirectPythonInterface.cxx create mode 100644 CXX/IndirectPythonInterface.hxx create mode 100644 CXX/Objects.hxx create mode 100644 CXX/Version.hxx create mode 100644 CXX/WrapPython.h create mode 100644 CXX/cxx_extensions.cxx create mode 100644 CXX/cxxextensions.c create mode 100644 CXX/cxxsupport.cxx diff --git a/CXX/Config.hxx b/CXX/Config.hxx new file mode 100644 index 000000000000..2e3c70e23aa4 --- /dev/null +++ b/CXX/Config.hxx @@ -0,0 +1,134 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __PyCXX_config_hh__ +#define __PyCXX_config_hh__ + +// +// Microsoft VC++ 6.0 has no traits +// +#if defined( _MSC_VER ) + +# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 1 + +#elif defined( __GNUC__ ) +# if __GNUC__ >= 3 +# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 1 +# else +# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 0 +#endif + +// +// Assume all other compilers do +// +#else + +// Macros to deal with deficiencies in compilers +# define STANDARD_LIBRARY_HAS_ITERATOR_TRAITS 1 +#endif + +#if STANDARD_LIBRARY_HAS_ITERATOR_TRAITS +# define random_access_iterator_parent(itemtype) std::iterator +#else +# define random_access_iterator_parent(itemtype) std::random_access_iterator +#endif + +// +// Which C++ standard is in use? +// +#if defined( _MSC_VER ) +# if _MSC_VER <= 1200 +// MSVC++ 6.0 +# define PYCXX_ISO_CPP_LIB 0 +# define STR_STREAM +# define TEMPLATE_TYPENAME class +# else +# define PYCXX_ISO_CPP_LIB 1 +# define STR_STREAM +# define TEMPLATE_TYPENAME typename +# endif +#elif defined( __GNUC__ ) +# if __GNUC__ >= 3 +# define PYCXX_ISO_CPP_LIB 1 +# define STR_STREAM +# define TEMPLATE_TYPENAME typename +# else +# define PYCXX_ISO_CPP_LIB 0 +# define STR_STREAM +# define TEMPLATE_TYPENAME class +# endif +#endif + +#if PYCXX_ISO_CPP_LIB +# define STR_STREAM +# define OSTRSTREAM ostringstream +# define EXPLICIT_TYPENAME typename +# define EXPLICIT_CLASS class +# define TEMPLATE_TYPENAME typename +#else +# define STR_STREAM +# define OSTRSTREAM ostrstream +# define EXPLICIT_TYPENAME +# define EXPLICIT_CLASS +# define TEMPLATE_TYPENAME class +#endif + +// before 2.5 Py_ssize_t was missing +#ifndef PY_MAJOR_VERSION +#error not defined PY_MAJOR_VERSION +#endif +#if PY_MAJOR_VERSION < 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION < 5) +typedef int Py_ssize_t; +#endif + +// hash_map container usage selection +// 1) if PYCXX_USING_STD_MAP is defined PyCXX will be using std::map<> container +// implementation only. +// 2) if compilers are used other than MS Visual Studio (7.1+) or GCC 3.x +// STANDARD_LIBRARY_HAS_HASH_MAP must be defined before compilation to +// make PyCXX using hash_map container. +#if !defined( PYCXX_USING_STD_MAP ) + #if defined( _MSC_VER ) || defined( __INTEL_COMPILER ) || defined ( __ICC ) || (defined( __GNUC__ ) && ( __GNUC__ > 3 )) + # define PYCXX_USING_HASH_MAP + #else + # if defined( STANDARD_LIBRARY_HAS_HASH_MAP ) && !defined( PYCXX_USING_HASH_MAP ) + # define PYCXX_USING_HASH_MAP + # endif + #endif +#endif + +#endif // __PyCXX_config_hh__ diff --git a/CXX/Exception.hxx b/CXX/Exception.hxx new file mode 100644 index 000000000000..1ef087cac9fe --- /dev/null +++ b/CXX/Exception.hxx @@ -0,0 +1,249 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_Exception_h +#define __CXX_Exception_h + +#include "CXX/WrapPython.h" +#include "CXX/Version.hxx" +#include "CXX/Config.hxx" +#include "CXX/IndirectPythonInterface.hxx" + +#include +#include + +// This mimics the Python structure, in order to minimize confusion +namespace Py +{ + class ExtensionExceptionType; + + class Object; + + class Exception + { + public: + Exception( ExtensionExceptionType &exception, const std::string& reason ); + Exception( ExtensionExceptionType &exception, Object &reason ); + + explicit Exception () + {} + + Exception (const std::string& reason) + { + PyErr_SetString (Py::_Exc_RuntimeError(), reason.c_str()); + } + + Exception (PyObject* exception, const std::string& reason) + { + PyErr_SetString (exception, reason.c_str()); + } + + Exception (PyObject* exception, Object &reason); + + void clear() // clear the error + // technically but not philosophically const + { + PyErr_Clear(); + } + }; + + + // Abstract + class StandardError: public Exception + { + protected: + explicit StandardError() + {} + }; + + class LookupError: public StandardError + { + protected: + explicit LookupError() + {} + }; + + class ArithmeticError: public StandardError + { + protected: + explicit ArithmeticError() + {} + }; + + class EnvironmentError: public StandardError + { + protected: + explicit EnvironmentError() + {} + }; + + // Concrete + + class TypeError: public StandardError + { + public: + TypeError (const std::string& reason) + : StandardError() + { + PyErr_SetString (Py::_Exc_TypeError(),reason.c_str()); + } + }; + + class IndexError: public LookupError + { + public: + IndexError (const std::string& reason) + : LookupError() + { + PyErr_SetString (Py::_Exc_IndexError(), reason.c_str()); + } + }; + + class AttributeError: public StandardError + { + public: + AttributeError (const std::string& reason) + : StandardError() + { + PyErr_SetString (Py::_Exc_AttributeError(), reason.c_str()); + } + }; + + class NameError: public StandardError + { + public: + NameError (const std::string& reason) + : StandardError() + { + PyErr_SetString (Py::_Exc_NameError(), reason.c_str()); + } + }; + + class RuntimeError: public StandardError + { + public: + RuntimeError (const std::string& reason) + : StandardError() + { + PyErr_SetString (Py::_Exc_RuntimeError(), reason.c_str()); + } + }; + + class SystemError: public StandardError + { + public: + SystemError (const std::string& reason) + : StandardError() + { + PyErr_SetString (Py::_Exc_SystemError(),reason.c_str()); + } + }; + + class KeyError: public LookupError + { + public: + KeyError (const std::string& reason) + : LookupError() + { + PyErr_SetString (Py::_Exc_KeyError(),reason.c_str()); + } + }; + + + class ValueError: public StandardError + { + public: + ValueError (const std::string& reason) + : StandardError() + { + PyErr_SetString (Py::_Exc_ValueError(), reason.c_str()); + } + }; + + class OverflowError: public ArithmeticError + { + public: + OverflowError (const std::string& reason) + : ArithmeticError() + { + PyErr_SetString (Py::_Exc_OverflowError(), reason.c_str()); + } + }; + + class ZeroDivisionError: public ArithmeticError + { + public: + ZeroDivisionError (const std::string& reason) + : ArithmeticError() + { + PyErr_SetString (Py::_Exc_ZeroDivisionError(), reason.c_str()); + } + }; + + class FloatingPointError: public ArithmeticError + { + public: + FloatingPointError (const std::string& reason) + : ArithmeticError() + { + PyErr_SetString (Py::_Exc_FloatingPointError(), reason.c_str()); + } + }; + + class MemoryError: public StandardError + { + public: + MemoryError (const std::string& reason) + : StandardError() + { + PyErr_SetString (Py::_Exc_MemoryError(), reason.c_str()); + } + }; + + class SystemExit: public StandardError + { + public: + SystemExit (const std::string& reason) + : StandardError() + { + PyErr_SetString (Py::_Exc_SystemExit(),reason.c_str()); + } + }; + +}// Py + +#endif diff --git a/CXX/Extensions.hxx b/CXX/Extensions.hxx new file mode 100644 index 000000000000..815d17b1d1da --- /dev/null +++ b/CXX/Extensions.hxx @@ -0,0 +1,928 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_Extensions__h +#define __CXX_Extensions__h + + +#ifdef _MSC_VER +// disable warning C4786: symbol greater than 255 character, +// okay to ignore +#pragma warning(disable: 4786) +#endif + +#include "CXX/WrapPython.h" +#include "CXX/Version.hxx" +#include "CXX/Config.hxx" +#include "CXX/Objects.hxx" + +extern "C" +{ + extern PyObject py_object_initializer; +} + +#include + +// std::map / hash_map selection and declarations ---------------------------- +#if !defined( PYCXX_USING_HASH_MAP ) + +#include + +#else + +#if defined( __GNUC__) && !defined( _STLPORT_VERSION ) + #include +#else + #include +#endif +#if defined( _STLPORT_VERSION ) + #define __PYCXX_HASHMAP_NAMESPACE std + using namespace std; +#elif defined ( _MSC_VER ) && !defined( __INTEL_COMPILER ) && !defined( __ICC ) && !defined( __ICL ) && !defined( __ECC ) + #define __PYCXX_HASHMAP_NAMESPACE stdext + using namespace stdext; +#elif defined( __INTEL_COMPILER ) || defined( __ICC ) || defined( __ICL ) || defined( __ECC ) + #define __PYCXX_HASHMAP_NAMESPACE stdext + using namespace stdext; +#elif defined( __GNUC__ ) + #define __PYCXX_HASHMAP_NAMESPACE __gnu_cxx + using namespace __gnu_cxx; +#else + #define __PYCXX_HASHMAP_NAMESPACE std + using namespace std; +#endif + +class __pycxx_str_hash_func +{ +public: + enum + { + // parameters for hash table + bucket_size = 4, // 0 < bucket_size + min_buckets = 8 // min_buckets = 2 ^^ N, 0 < N + }; + + // http://www.azillionmonkeys.com/qed/hash.html + size_t operator()( const std::string &str ) const + { + const unsigned char * data = reinterpret_cast( str.c_str() ); + int len = (int)str.length(); + unsigned int hash = len; + unsigned int tmp; + int rem; + + if (len <= 0 || data == NULL) + return 0; + + rem = len & 3; + len >>= 2; + + /* Main loop */ + for (;len > 0; len--) + { + hash += (data[1] << 8) | data[0]; + tmp = (((data[3] << 8) | data[2]) << 11) ^ hash; + hash = (hash << 16) ^ tmp; + data += 2*sizeof (unsigned short); + hash += hash >> 11; + } + + /* Handle end cases */ + switch (rem) + { + case 3: hash += (data[1] << 8) | data[0]; + hash ^= hash << 16; + hash ^= data[sizeof (unsigned short)] << 18; + hash += hash >> 11; + break; + case 2: hash += (data[1] << 8) | data[0]; + hash ^= hash << 11; + hash += hash >> 17; + break; + case 1: hash += *data; + hash ^= hash << 10; + hash += hash >> 1; + } + + /* Force "avalanching" of final 127 bits */ + hash ^= hash << 3; + hash += hash >> 5; + hash ^= hash << 4; + hash += hash >> 17; + hash ^= hash << 25; + hash += hash >> 6; + + return hash; + } + + bool operator()(const std::string &str_1, const std::string &str_2) const + { + // test if str_1 ordered before str_2 + return str_1 < str_2; + } +}; +#endif // PYCXX_USING_HASH_MAP +// ---------------------------------------------------------------------- + +namespace Py +{ + class ExtensionModuleBase; + + // Make an Exception Type for use in raising custom exceptions + class ExtensionExceptionType : public Object + { + public: + ExtensionExceptionType(); + virtual ~ExtensionExceptionType(); + + // call init to create the type + void init( ExtensionModuleBase &module, const std::string& name, ExtensionExceptionType &parent ); + void init( ExtensionModuleBase &module, const std::string& name ); + }; + + + class MethodTable + { + public: + MethodTable(); + virtual ~MethodTable(); + + void add(const char* method_name, PyCFunction f, const char* doc="", int flag=1); + PyMethodDef* table(); + + protected: + std::vector t; // accumulator of PyMethodDef's + PyMethodDef *mt; // Actual method table produced when full + + static PyMethodDef method (const char* method_name, PyCFunction f, int flags = 1, const char* doc=""); + + private: + // + // prevent the compiler generating these unwanted functions + // + MethodTable(const MethodTable& m); //unimplemented + void operator=(const MethodTable& m); //unimplemented + + }; // end class MethodTable + + extern "C" + { + typedef PyObject *(*method_varargs_call_handler_t)( PyObject *_self, PyObject *_args ); + typedef PyObject *(*method_keyword_call_handler_t)( PyObject *_self, PyObject *_args, PyObject *_dict ); + } + + template + class MethodDefExt : public PyMethodDef + { + public: + typedef Object (T::*method_varargs_function_t)( const Tuple &args ); + typedef Object (T::*method_keyword_function_t)( const Tuple &args, const Dict &kws ); + + MethodDefExt + ( + const char *_name, + method_varargs_function_t _function, + method_varargs_call_handler_t _handler, + const char *_doc + ) + { + ext_meth_def.ml_name = const_cast(_name); + ext_meth_def.ml_meth = _handler; + ext_meth_def.ml_flags = METH_VARARGS; + ext_meth_def.ml_doc = const_cast(_doc); + + ext_varargs_function = _function; + ext_keyword_function = NULL; + } + + MethodDefExt + ( + const char *_name, + method_keyword_function_t _function, + method_keyword_call_handler_t _handler, + const char *_doc + ) + { + ext_meth_def.ml_name = const_cast(_name); + ext_meth_def.ml_meth = method_varargs_call_handler_t( _handler ); + ext_meth_def.ml_flags = METH_VARARGS|METH_KEYWORDS; + ext_meth_def.ml_doc = const_cast(_doc); + + ext_varargs_function = NULL; + ext_keyword_function = _function; + } + + ~MethodDefExt() + {} + + PyMethodDef ext_meth_def; + method_varargs_function_t ext_varargs_function; + method_keyword_function_t ext_keyword_function; + }; + + class ExtensionModuleBase + { + public: + ExtensionModuleBase( const char *name ); + virtual ~ExtensionModuleBase(); + + Module module(void) const; // only valid after initialize() has been called + Dict moduleDictionary(void) const; // only valid after initialize() has been called + + virtual Object invoke_method_keyword( const std::string &_name, const Tuple &_args, const Dict &_keywords ) = 0; + virtual Object invoke_method_varargs( const std::string &_name, const Tuple &_args ) = 0; + + const std::string &name() const; + const std::string &fullName() const; + + protected: + // Initialize the module + void initialize( const char *module_doc ); + + const std::string module_name; + const std::string full_module_name; + MethodTable method_table; + + private: + + // + // prevent the compiler generating these unwanted functions + // + ExtensionModuleBase( const ExtensionModuleBase & ); //unimplemented + void operator=( const ExtensionModuleBase & ); //unimplemented + + }; + + extern "C" PyObject *method_keyword_call_handler( PyObject *_self_and_name_tuple, PyObject *_args, PyObject *_keywords ); + extern "C" PyObject *method_varargs_call_handler( PyObject *_self_and_name_tuple, PyObject *_args ); + extern "C" void do_not_dealloc( void * ); + + + template + class ExtensionModule : public ExtensionModuleBase + { + public: + ExtensionModule( const char *name ) + : ExtensionModuleBase( name ) + {} + virtual ~ExtensionModule() + {} + + protected: + typedef Object (T::*method_varargs_function_t)( const Tuple &args ); + typedef Object (T::*method_keyword_function_t)( const Tuple &args, const Dict &kws ); + +#if defined( PYCXX_USING_HASH_MAP ) + typedef __PYCXX_HASHMAP_NAMESPACE::hash_map *, __pycxx_str_hash_func> method_map_t; +#else + typedef std::map *> method_map_t; +#endif + + static void add_varargs_method( const char *name, method_varargs_function_t function, const char *doc="" ) + { + method_map_t &mm = methods(); + + MethodDefExt *method_definition = new MethodDefExt + ( + name, + function, + method_varargs_call_handler, + doc + ); + + mm[std::string( name )] = method_definition; + } + + static void add_keyword_method( const char *name, method_keyword_function_t function, const char *doc="" ) + { + method_map_t &mm = methods(); + + MethodDefExt *method_definition = new MethodDefExt + ( + name, + function, + method_keyword_call_handler, + doc + ); + + mm[std::string( name )] = method_definition; + } + + void initialize( const char *module_doc="" ) + { + ExtensionModuleBase::initialize( module_doc ); + Dict dict( moduleDictionary() ); + + // + // put each of the methods into the modules dictionary + // so that we get called back at the function in T. + // + method_map_t &mm = methods(); + EXPLICIT_TYPENAME method_map_t::const_iterator i; + + for( i=mm.begin(); i != mm.end(); ++i ) + { + MethodDefExt *method_definition = (*i).second; + + static PyObject *self = PyCObject_FromVoidPtr( this, do_not_dealloc ); + + Tuple args( 2 ); + args[0] = Object( self ); + args[1] = String( (*i).first ); + + PyObject *func = PyCFunction_New + ( + &method_definition->ext_meth_def, + new_reference_to( args ) + ); + + dict[ (*i).first ] = Object( func ); + } + } + + protected: // Tom Malcolmson reports that derived classes need access to these + + static method_map_t &methods(void) + { + static method_map_t *map_of_methods = NULL; + if( map_of_methods == NULL ) + map_of_methods = new method_map_t; + + return *map_of_methods; + } + + + // this invoke function must be called from within a try catch block + virtual Object invoke_method_keyword( const std::string &name, const Tuple &args, const Dict &keywords ) + { + method_map_t &mm = methods(); + MethodDefExt *meth_def = mm[ name ]; + if( meth_def == NULL ) + { + std::string error_msg( "CXX - cannot invoke keyword method named " ); + error_msg += name; + throw RuntimeError( error_msg ); + } + + // cast up to the derived class + T *self = static_cast(this); + + return (self->*meth_def->ext_keyword_function)( args, keywords ); + } + + // this invoke function must be called from within a try catch block + virtual Object invoke_method_varargs( const std::string &name, const Tuple &args ) + { + method_map_t &mm = methods(); + MethodDefExt *meth_def = mm[ name ]; + if( meth_def == NULL ) + { + std::string error_msg( "CXX - cannot invoke varargs method named " ); + error_msg += name; + throw RuntimeError( error_msg ); + } + + // cast up to the derived class + T *self = static_cast(this); + + return (self->*meth_def->ext_varargs_function)( args ); + } + + private: + // + // prevent the compiler generating these unwanted functions + // + ExtensionModule( const ExtensionModule & ); //unimplemented + void operator=( const ExtensionModule & ); //unimplemented + }; + + + class PythonType + { + public: + // if you define one sequence method you must define + // all of them except the assigns + + PythonType (size_t base_size, int itemsize, const char *default_name ); + virtual ~PythonType (); + + const char *getName () const; + const char *getDoc () const; + + PyTypeObject* type_object () const; + PythonType & name (const char* nam); + PythonType & doc (const char* d); + PythonType & dealloc(void (*f)(PyObject*)); + + PythonType & supportPrint(void); + PythonType & supportGetattr(void); + PythonType & supportSetattr(void); + PythonType & supportGetattro(void); + PythonType & supportSetattro(void); + PythonType & supportCompare(void); +#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 1) + PythonType & supportRichCompare(void); +#endif + PythonType & supportRepr(void); + PythonType & supportStr(void); + PythonType & supportHash(void); + PythonType & supportCall(void); + PythonType & supportIter(void); + + PythonType & supportSequenceType(void); + PythonType & supportMappingType(void); + PythonType & supportNumberType(void); + PythonType & supportBufferType(void); + + protected: + PyTypeObject *table; + PySequenceMethods *sequence_table; + PyMappingMethods *mapping_table; + PyNumberMethods *number_table; + PyBufferProcs *buffer_table; + + void init_sequence(); + void init_mapping(); + void init_number(); + void init_buffer(); + + private: + // + // prevent the compiler generating these unwanted functions + // + PythonType (const PythonType& tb); // unimplemented + void operator=(const PythonType& t); // unimplemented + + }; // end of PythonType + + + + // Class PythonExtension is what you inherit from to create + // a new Python extension type. You give your class itself + // as the template paramter. + + // There are two ways that extension objects can get destroyed. + // 1. Their reference count goes to zero + // 2. Someone does an explicit delete on a pointer. + // In (1) the problem is to get the destructor called + // We register a special deallocator in the Python type object + // (see behaviors()) to do this. + // In (2) there is no problem, the dtor gets called. + + // PythonExtension does not use the usual Python heap allocator, + // instead using new/delete. We do the setting of the type object + // and reference count, usually done by PyObject_New, in the + // base class ctor. + + // This special deallocator does a delete on the pointer. + + + class PythonExtensionBase : public PyObject + { + public: + PythonExtensionBase(); + virtual ~PythonExtensionBase(); + + public: + virtual int print( FILE *, int ); + virtual Object getattr( const char * ) = 0; + virtual int setattr( const char *, const Object & ); + virtual Object getattro( const Object & ); + virtual int setattro( const Object &, const Object & ); + virtual int compare( const Object & ); + virtual Object rich_compare( const Object &, int op ); + virtual Object repr(); + virtual Object str(); + virtual long hash(); + virtual Object call( const Object &, const Object & ); + virtual Object iter(); + virtual PyObject* iternext(); + + // Sequence methods + virtual int sequence_length(); + virtual Object sequence_concat( const Object & ); + virtual Object sequence_repeat( Py_ssize_t ); + virtual Object sequence_item( Py_ssize_t ); + virtual Object sequence_slice( Py_ssize_t, Py_ssize_t ); + virtual int sequence_ass_item( Py_ssize_t, const Object & ); + virtual int sequence_ass_slice( Py_ssize_t, Py_ssize_t, const Object & ); + + // Mapping + virtual int mapping_length(); + virtual Object mapping_subscript( const Object & ); + virtual int mapping_ass_subscript( const Object &, const Object & ); + + // Number + virtual int number_nonzero(); + virtual Object number_negative(); + virtual Object number_positive(); + virtual Object number_absolute(); + virtual Object number_invert(); + virtual Object number_int(); + virtual Object number_float(); + virtual Object number_long(); + virtual Object number_oct(); + virtual Object number_hex(); + virtual Object number_add( const Object & ); + virtual Object number_subtract( const Object & ); + virtual Object number_multiply( const Object & ); + virtual Object number_divide( const Object & ); + virtual Object number_remainder( const Object & ); + virtual Object number_divmod( const Object & ); + virtual Object number_lshift( const Object & ); + virtual Object number_rshift( const Object & ); + virtual Object number_and( const Object & ); + virtual Object number_xor( const Object & ); + virtual Object number_or( const Object & ); + virtual Object number_power( const Object &, const Object & ); + + // Buffer + virtual Py_ssize_t buffer_getreadbuffer( Py_ssize_t, void** ); + virtual Py_ssize_t buffer_getwritebuffer( Py_ssize_t, void** ); + virtual Py_ssize_t buffer_getsegcount( Py_ssize_t* ); + + private: + void missing_method( void ); + static PyObject *method_call_handler( PyObject *self, PyObject *args ); + }; + + template + class PythonExtension: public PythonExtensionBase + { + public: + static PyTypeObject* type_object() + { + return behaviors().type_object(); + } + + static int check( PyObject *p ) + { + // is p like me? + return p->ob_type == type_object(); + } + + static int check( const Object& ob ) + { + return check( ob.ptr()); + } + + + // + // every object needs getattr implemented + // to support methods + // + virtual Object getattr( const char *name ) + { + return getattr_methods( name ); + } + + protected: + explicit PythonExtension() + : PythonExtensionBase() + { + #ifdef PyObject_INIT + (void)PyObject_INIT( this, type_object() ); + #else + ob_refcnt = 1; + ob_type = type_object(); + #endif + + // every object must support getattr + behaviors().supportGetattr(); + } + + virtual ~PythonExtension() + {} + + static PythonType &behaviors() + { + static PythonType* p; + if( p == NULL ) + { +#if defined( _CPPRTTI ) || defined(__GNUG__) + const char *default_name = (typeid ( T )).name(); +#else + const char *default_name = "unknown"; +#endif + p = new PythonType( sizeof( T ), 0, default_name ); + p->dealloc( extension_object_deallocator ); + } + + return *p; + } + + + typedef Object (T::*method_varargs_function_t)( const Tuple &args ); + typedef Object (T::*method_keyword_function_t)( const Tuple &args, const Dict &kws ); + +#if defined( PYCXX_USING_HASH_MAP ) + typedef __PYCXX_HASHMAP_NAMESPACE::hash_map *, __pycxx_str_hash_func> method_map_t; +#else + typedef std::map *> method_map_t; +#endif + + // support the default attributes, __name__, __doc__ and methods + virtual Object getattr_default( const char *_name ) + { + std::string name( _name ); + + if( name == "__name__" && type_object()->tp_name != NULL ) + { + return Py::String( type_object()->tp_name ); + } + if( name == "__doc__" && type_object()->tp_doc != NULL ) + { + return Py::String( type_object()->tp_doc ); + } + +// trying to fake out being a class for help() +// else if( name == "__bases__" ) +// { +// return Py::Tuple(0); +// } +// else if( name == "__module__" ) +// { +// return Py::Nothing(); +// } +// else if( name == "__dict__" ) +// { +// return Py::Dict(); +// } + + return getattr_methods( _name ); + } + + // turn a name into function object + virtual Object getattr_methods( const char *_name ) + { + std::string name( _name ); + + method_map_t &mm = methods(); + + EXPLICIT_TYPENAME method_map_t::const_iterator i; + + if( name == "__methods__" ) + { + List methods; + + for( i = mm.begin(); i != mm.end(); ++i ) + methods.append( String( (*i).first ) ); + + return methods; + } + + // see if name exists and get entry with method + i = mm.find( name ); + if( i == mm.end() ) + throw AttributeError( name ); + + Tuple self( 2 ); + + self[0] = Object( this ); + self[1] = String( name ); + + MethodDefExt *method_definition = i->second; + + PyObject *func = PyCFunction_New( &method_definition->ext_meth_def, self.ptr() ); + + return Object(func, true); + } + + static void add_varargs_method( const char *name, method_varargs_function_t function, const char *doc="" ) + { + method_map_t &mm = methods(); + + // check that all methods added are unique + EXPLICIT_TYPENAME method_map_t::const_iterator i; + i = mm.find( name ); + if( i != mm.end() ) + throw AttributeError( name ); + + MethodDefExt *method_definition = new MethodDefExt + ( + name, + function, + method_varargs_call_handler, + doc + ); + + mm[std::string( name )] = method_definition; + } + + static void add_keyword_method( const char *name, method_keyword_function_t function, const char *doc="" ) + { + method_map_t &mm = methods(); + + // check that all methods added are unique + EXPLICIT_TYPENAME method_map_t::const_iterator i; + i = mm.find( name ); + if( i != mm.end() ) + throw AttributeError( name ); + + MethodDefExt *method_definition = new MethodDefExt + ( + name, + function, + method_keyword_call_handler, + doc + ); + + mm[std::string( name )] = method_definition; + } + + private: + static method_map_t &methods(void) + { + static method_map_t *map_of_methods = NULL; + if( map_of_methods == NULL ) + map_of_methods = new method_map_t; + + return *map_of_methods; + } + + static PyObject *method_keyword_call_handler( PyObject *_self_and_name_tuple, PyObject *_args, PyObject *_keywords ) + { + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + T *self = static_cast( self_in_cobject ); + + String name( self_and_name_tuple[1] ); + + method_map_t &mm = methods(); + + EXPLICIT_TYPENAME method_map_t::const_iterator i; + i = mm.find( name ); + if( i == mm.end() ) + return 0; + + MethodDefExt *meth_def = i->second; + + Tuple args( _args ); + + // _keywords may be NULL so be careful about the way the dict is created + Dict keywords; + if( _keywords != NULL ) + keywords = Dict( _keywords ); + + Object result( (self->*meth_def->ext_keyword_function)( args, keywords ) ); + + return new_reference_to( result.ptr() ); + } + catch( Exception & ) + { + return 0; + } + } + + static PyObject *method_varargs_call_handler( PyObject *_self_and_name_tuple, PyObject *_args ) + { + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + T *self = static_cast( self_in_cobject ); + + String name( self_and_name_tuple[1] ); + + method_map_t &mm = methods(); + + EXPLICIT_TYPENAME method_map_t::const_iterator i; + i = mm.find( name ); + if( i == mm.end() ) + return 0; + + MethodDefExt *meth_def = i->second; + + Tuple args( _args ); + + Object result; + + // TMM: 7Jun'01 - Adding try & catch in case of STL debug-mode exceptions. + #ifdef _STLP_DEBUG + try + { + result = (self->*meth_def->ext_varargs_function)( args ); + } + catch (std::__stl_debug_exception) + { + // throw cxx::RuntimeError( sErrMsg ); + throw cxx::RuntimeError( "Error message not set yet." ); + } + #else + result = (self->*meth_def->ext_varargs_function)( args ); + #endif // _STLP_DEBUG + + return new_reference_to( result.ptr() ); + } + catch( Exception & ) + { + return 0; + } + } + + static void extension_object_deallocator ( PyObject* t ) + { + delete (T *)( t ); + } + + // + // prevent the compiler generating these unwanted functions + // + explicit PythonExtension( const PythonExtension& other ); + void operator=( const PythonExtension& rhs ); + }; + + // + // ExtensionObject is an Object that will accept only T's. + // + template + class ExtensionObject: public Object + { + public: + + explicit ExtensionObject ( PyObject *pyob ) + : Object( pyob ) + { + validate(); + } + + ExtensionObject( const ExtensionObject& other ) + : Object( *other ) + { + validate(); + } + + ExtensionObject( const Object& other ) + : Object( *other ) + { + validate(); + } + + ExtensionObject& operator= ( const Object& rhs ) + { + return (*this = *rhs ); + } + + ExtensionObject& operator= ( PyObject* rhsp ) + { + if( ptr() == rhsp ) + return *this; + set( rhsp ); + return *this; + } + + virtual bool accepts ( PyObject *pyob ) const + { + return ( pyob && T::check( pyob )); + } + + // + // Obtain a pointer to the PythonExtension object + // + T *extensionObject(void) + { + return static_cast( ptr() ); + } + }; + +} // Namespace Py +// End of CXX_Extensions.h +#endif diff --git a/CXX/IndirectPythonInterface.cxx b/CXX/IndirectPythonInterface.cxx new file mode 100644 index 000000000000..d36d1b52612d --- /dev/null +++ b/CXX/IndirectPythonInterface.cxx @@ -0,0 +1,597 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#include "CXX/IndirectPythonInterface.hxx" + +namespace Py +{ +bool _Buffer_Check( PyObject *op ) { return (op)->ob_type == _Buffer_Type(); } +bool _CFunction_Check( PyObject *op ) { return (op)->ob_type == _CFunction_Type(); } +bool _Class_Check( PyObject *op ) { return (op)->ob_type == _Class_Type(); } +bool _CObject_Check( PyObject *op ) { return (op)->ob_type == _CObject_Type(); } +bool _Complex_Check( PyObject *op ) { return (op)->ob_type == _Complex_Type(); } +bool _Dict_Check( PyObject *op ) { return (op)->ob_type == _Dict_Type(); } +bool _File_Check( PyObject *op ) { return (op)->ob_type == _File_Type(); } +bool _Float_Check( PyObject *op ) { return (op)->ob_type == _Float_Type(); } +bool _Function_Check( PyObject *op ) { return (op)->ob_type == _Function_Type(); } +bool _Instance_Check( PyObject *op ) { return (op)->ob_type == _Instance_Type(); } +bool _Boolean_Check( PyObject *op ) { return (op)->ob_type == _Bool_Type(); } +bool _Int_Check( PyObject *op ) { return (op)->ob_type == _Int_Type(); } +bool _List_Check( PyObject *o ) { return o->ob_type == _List_Type(); } +bool _Long_Check( PyObject *op ) { return (op)->ob_type == _Long_Type(); } +bool _Method_Check( PyObject *op ) { return (op)->ob_type == _Method_Type(); } +bool _Module_Check( PyObject *op ) { return (op)->ob_type == _Module_Type(); } +bool _Range_Check( PyObject *op ) { return (op)->ob_type == _Range_Type(); } +bool _Slice_Check( PyObject *op ) { return (op)->ob_type == _Slice_Type(); } +bool _String_Check( PyObject *o ) { return o->ob_type == _String_Type(); } +bool _TraceBack_Check( PyObject *v ) { return (v)->ob_type == _TraceBack_Type(); } +bool _Tuple_Check( PyObject *op ) { return (op)->ob_type == _Tuple_Type(); } +bool _Type_Check( PyObject *op ) { return (op)->ob_type == _Type_Type(); } + +#if PY_MAJOR_VERSION >= 2 +bool _Unicode_Check( PyObject *op ) { return (op)->ob_type == _Unicode_Type(); } +#endif + + + +#if defined(PY_WIN32_DELAYLOAD_PYTHON_DLL) + +#if defined(MS_WINDOWS) +#include + + +static HMODULE python_dll; + +static PyObject *ptr__Exc_ArithmeticError = NULL; +static PyObject *ptr__Exc_AssertionError = NULL; +static PyObject *ptr__Exc_AttributeError = NULL; +static PyObject *ptr__Exc_EnvironmentError = NULL; +static PyObject *ptr__Exc_EOFError = NULL; +static PyObject *ptr__Exc_Exception = NULL; +static PyObject *ptr__Exc_FloatingPointError = NULL; +static PyObject *ptr__Exc_ImportError = NULL; +static PyObject *ptr__Exc_IndexError = NULL; +static PyObject *ptr__Exc_IOError = NULL; +static PyObject *ptr__Exc_KeyboardInterrupt = NULL; +static PyObject *ptr__Exc_KeyError = NULL; +static PyObject *ptr__Exc_LookupError = NULL; +static PyObject *ptr__Exc_MemoryError = NULL; +static PyObject *ptr__Exc_MemoryErrorInst = NULL; +static PyObject *ptr__Exc_NameError = NULL; +static PyObject *ptr__Exc_NotImplementedError = NULL; +static PyObject *ptr__Exc_OSError = NULL; +static PyObject *ptr__Exc_OverflowError = NULL; +static PyObject *ptr__Exc_RuntimeError = NULL; +static PyObject *ptr__Exc_StandardError = NULL; +static PyObject *ptr__Exc_SyntaxError = NULL; +static PyObject *ptr__Exc_SystemError = NULL; +static PyObject *ptr__Exc_SystemExit = NULL; +static PyObject *ptr__Exc_TypeError = NULL; +static PyObject *ptr__Exc_ValueError = NULL; +static PyObject *ptr__Exc_ZeroDivisionError = NULL; + +#ifdef MS_WINDOWS +static PyObject *ptr__Exc_WindowsError = NULL; +#endif + +#if PY_MAJOR_VERSION >= 2 +static PyObject *ptr__Exc_IndentationError = NULL; +static PyObject *ptr__Exc_TabError = NULL; +static PyObject *ptr__Exc_UnboundLocalError = NULL; +static PyObject *ptr__Exc_UnicodeError = NULL; +#endif + +static PyObject *ptr__PyNone = NULL; + +static PyObject *ptr__PyFalse = NULL; +static PyObject *ptr__PyTrue = NULL; + +static PyTypeObject *ptr__Buffer_Type = NULL; +static PyTypeObject *ptr__CFunction_Type = NULL; +static PyTypeObject *ptr__Class_Type = NULL; +static PyTypeObject *ptr__CObject_Type = NULL; +static PyTypeObject *ptr__Complex_Type = NULL; +static PyTypeObject *ptr__Dict_Type = NULL; +static PyTypeObject *ptr__File_Type = NULL; +static PyTypeObject *ptr__Float_Type = NULL; +static PyTypeObject *ptr__Function_Type = NULL; +static PyTypeObject *ptr__Instance_Type = NULL; +static PyTypeObject *ptr__Int_Type = NULL; +static PyTypeObject *ptr__List_Type = NULL; +static PyTypeObject *ptr__Long_Type = NULL; +static PyTypeObject *ptr__Method_Type = NULL; +static PyTypeObject *ptr__Module_Type = NULL; +static PyTypeObject *ptr__Range_Type = NULL; +static PyTypeObject *ptr__Slice_Type = NULL; +static PyTypeObject *ptr__String_Type = NULL; +static PyTypeObject *ptr__TraceBack_Type = NULL; +static PyTypeObject *ptr__Tuple_Type = NULL; +static PyTypeObject *ptr__Type_Type = NULL; + +#if PY_MAJOR_VERSION >= 2 +static PyTypeObject *ptr__Unicode_Type = NULL; +#endif + +static int *ptr_Py_DebugFlag = NULL; +static int *ptr_Py_InteractiveFlag = NULL; +static int *ptr_Py_OptimizeFlag = NULL; +static int *ptr_Py_NoSiteFlag = NULL; +static int *ptr_Py_TabcheckFlag = NULL; +static int *ptr_Py_VerboseFlag = NULL; + +#if PY_MAJOR_VERSION >= 2 +static int *ptr_Py_UnicodeFlag = NULL; +#endif + +static char **ptr__Py_PackageContext = NULL; + +#ifdef Py_REF_DEBUG +int *ptr_Py_RefTotal; +#endif + + +//-------------------------------------------------------------------------------- +class GetAddressException +{ +public: + GetAddressException( const char *_name ) + : name( _name ) + {} + virtual ~GetAddressException() {} + const char *name; +}; + + +//-------------------------------------------------------------------------------- +static PyObject *GetPyObjectPointer_As_PyObjectPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return *(PyObject **)addr; +} + +static PyObject *GetPyObject_As_PyObjectPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return (PyObject *)addr; +} + +static PyTypeObject *GetPyTypeObjectPointer_As_PyTypeObjectPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return *(PyTypeObject **)addr; +} + +static PyTypeObject *GetPyTypeObject_As_PyTypeObjectPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return (PyTypeObject *)addr; +} + +static int *GetInt_as_IntPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return (int *)addr; +} + +static char **GetCharPointer_as_CharPointerPointer( const char *name ) +{ + FARPROC addr = GetProcAddress( python_dll, name ); + if( addr == NULL ) + throw GetAddressException( name ); + + return (char **)addr; +} + + +#ifdef _DEBUG +static const char python_dll_name_format[] = "PYTHON%1.1d%1.1d_D.DLL"; +#else +static const char python_dll_name_format[] = "PYTHON%1.1d%1.1d.DLL"; +#endif + +//-------------------------------------------------------------------------------- +bool InitialisePythonIndirectInterface() +{ + char python_dll_name[sizeof(python_dll_name_format)]; + + sprintf( python_dll_name, python_dll_name_format, PY_MAJOR_VERSION, PY_MINOR_VERSION ); + + python_dll = LoadLibrary( python_dll_name ); + if( python_dll == NULL ) + return false; + + try +{ +#ifdef Py_REF_DEBUG + ptr_Py_RefTotal = GetInt_as_IntPointer( "_Py_RefTotal" ); +#endif + ptr_Py_DebugFlag = GetInt_as_IntPointer( "Py_DebugFlag" ); + ptr_Py_InteractiveFlag = GetInt_as_IntPointer( "Py_InteractiveFlag" ); + ptr_Py_OptimizeFlag = GetInt_as_IntPointer( "Py_OptimizeFlag" ); + ptr_Py_NoSiteFlag = GetInt_as_IntPointer( "Py_NoSiteFlag" ); + ptr_Py_TabcheckFlag = GetInt_as_IntPointer( "Py_TabcheckFlag" ); + ptr_Py_VerboseFlag = GetInt_as_IntPointer( "Py_VerboseFlag" ); +#if PY_MAJOR_VERSION >= 2 + ptr_Py_UnicodeFlag = GetInt_as_IntPointer( "Py_UnicodeFlag" ); +#endif + ptr__Py_PackageContext = GetCharPointer_as_CharPointerPointer( "_Py_PackageContext" ); + + ptr__Exc_ArithmeticError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ArithmeticError" ); + ptr__Exc_AssertionError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_AssertionError" ); + ptr__Exc_AttributeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_AttributeError" ); + ptr__Exc_EnvironmentError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_EnvironmentError" ); + ptr__Exc_EOFError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_EOFError" ); + ptr__Exc_Exception = GetPyObjectPointer_As_PyObjectPointer( "PyExc_Exception" ); + ptr__Exc_FloatingPointError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_FloatingPointError" ); + ptr__Exc_ImportError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ImportError" ); + ptr__Exc_IndexError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_IndexError" ); + ptr__Exc_IOError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_IOError" ); + ptr__Exc_KeyboardInterrupt = GetPyObjectPointer_As_PyObjectPointer( "PyExc_KeyboardInterrupt" ); + ptr__Exc_KeyError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_KeyError" ); + ptr__Exc_LookupError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_LookupError" ); + ptr__Exc_MemoryError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_MemoryError" ); + ptr__Exc_MemoryErrorInst = GetPyObjectPointer_As_PyObjectPointer( "PyExc_MemoryErrorInst" ); + ptr__Exc_NameError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_NameError" ); + ptr__Exc_NotImplementedError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_NotImplementedError" ); + ptr__Exc_OSError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_OSError" ); + ptr__Exc_OverflowError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_OverflowError" ); + ptr__Exc_RuntimeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_RuntimeError" ); + ptr__Exc_StandardError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_StandardError" ); + ptr__Exc_SyntaxError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_SyntaxError" ); + ptr__Exc_SystemError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_SystemError" ); + ptr__Exc_SystemExit = GetPyObjectPointer_As_PyObjectPointer( "PyExc_SystemExit" ); + ptr__Exc_TypeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_TypeError" ); + ptr__Exc_ValueError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ValueError" ); +#ifdef MS_WINDOWS + ptr__Exc_WindowsError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_WindowsError" ); +#endif + ptr__Exc_ZeroDivisionError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_ZeroDivisionError" ); + +#if PY_MAJOR_VERSION >= 2 + ptr__Exc_IndentationError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_IndentationError" ); + ptr__Exc_TabError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_TabError" ); + ptr__Exc_UnboundLocalError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_UnboundLocalError" ); + ptr__Exc_UnicodeError = GetPyObjectPointer_As_PyObjectPointer( "PyExc_UnicodeError" ); +#endif + ptr__PyNone = GetPyObject_As_PyObjectPointer( "_Py_NoneStruct" ); + + ptr__PyFalse = GetPyObject_As_PyObjectPointer( "_Py_ZeroStruct" ); + ptr__PyTrue = GetPyObject_As_PyObjectPointer( "_Py_TrueStruct" ); + + ptr__Buffer_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyBuffer_Type" ); + ptr__CFunction_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyCFunction_Type" ); + ptr__Class_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyClass_Type" ); + ptr__CObject_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyCObject_Type" ); + ptr__Complex_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyComplex_Type" ); + ptr__Dict_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyDict_Type" ); + ptr__File_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyFile_Type" ); + ptr__Float_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyFloat_Type" ); + ptr__Function_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyFunction_Type" ); + ptr__Instance_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyInstance_Type" ); + ptr__Int_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyInt_Type" ); + ptr__List_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyList_Type" ); + ptr__Long_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyLong_Type" ); + ptr__Method_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyMethod_Type" ); + ptr__Module_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyModule_Type" ); + ptr__Range_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyRange_Type" ); + ptr__Slice_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PySlice_Type" ); + ptr__String_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyString_Type" ); + ptr__TraceBack_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyTraceBack_Type" ); + ptr__Tuple_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyTuple_Type" ); + ptr__Type_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyType_Type" ); + +#if PY_MAJOR_VERSION >= 2 + ptr__Unicode_Type = GetPyTypeObject_As_PyTypeObjectPointer( "PyUnicode_Type" ); +#endif +} + catch( GetAddressException &e ) + { + OutputDebugString( python_dll_name ); + OutputDebugString( " does not contain symbol "); + OutputDebugString( e.name ); + OutputDebugString( "\n" ); + + return false; + } + + return true; +} + +// +// Wrap variables as function calls +// +PyObject * _Exc_ArithmeticError(){ return ptr__Exc_ArithmeticError; } +PyObject * _Exc_AssertionError(){ return ptr__Exc_AssertionError; } +PyObject * _Exc_AttributeError(){ return ptr__Exc_AttributeError; } +PyObject * _Exc_EnvironmentError(){ return ptr__Exc_EnvironmentError; } +PyObject * _Exc_EOFError() { return ptr__Exc_EOFError; } +PyObject * _Exc_Exception() { return ptr__Exc_Exception; } +PyObject * _Exc_FloatingPointError(){ return ptr__Exc_FloatingPointError; } +PyObject * _Exc_ImportError() { return ptr__Exc_ImportError; } +PyObject * _Exc_IndexError() { return ptr__Exc_IndexError; } +PyObject * _Exc_IOError() { return ptr__Exc_IOError; } +PyObject * _Exc_KeyboardInterrupt(){ return ptr__Exc_KeyboardInterrupt; } +PyObject * _Exc_KeyError() { return ptr__Exc_KeyError; } +PyObject * _Exc_LookupError() { return ptr__Exc_LookupError; } +PyObject * _Exc_MemoryError() { return ptr__Exc_MemoryError; } +PyObject * _Exc_MemoryErrorInst(){ return ptr__Exc_MemoryErrorInst; } +PyObject * _Exc_NameError() { return ptr__Exc_NameError; } +PyObject * _Exc_NotImplementedError(){ return ptr__Exc_NotImplementedError; } +PyObject * _Exc_OSError() { return ptr__Exc_OSError; } +PyObject * _Exc_OverflowError() { return ptr__Exc_OverflowError; } +PyObject * _Exc_RuntimeError() { return ptr__Exc_RuntimeError; } +PyObject * _Exc_StandardError() { return ptr__Exc_StandardError; } +PyObject * _Exc_SyntaxError() { return ptr__Exc_SyntaxError; } +PyObject * _Exc_SystemError() { return ptr__Exc_SystemError; } +PyObject * _Exc_SystemExit() { return ptr__Exc_SystemExit; } +PyObject * _Exc_TypeError() { return ptr__Exc_TypeError; } +PyObject * _Exc_ValueError() { return ptr__Exc_ValueError; } +#ifdef MS_WINDOWS +PyObject * _Exc_WindowsError() { return ptr__Exc_WindowsError; } +#endif +PyObject * _Exc_ZeroDivisionError(){ return ptr__Exc_ZeroDivisionError; } + +#if PY_MAJOR_VERSION >= 2 +PyObject * _Exc_IndentationError(){ return ptr__Exc_IndentationError; } +PyObject * _Exc_TabError() { return ptr__Exc_TabError; } +PyObject * _Exc_UnboundLocalError(){ return ptr__Exc_UnboundLocalError; } +PyObject * _Exc_UnicodeError() { return ptr__Exc_UnicodeError; } +#endif + +// +// wrap items in Object.h +// +PyObject * _None() { return ptr__PyNone; } + +PyObject * _False() { return ptr__PyFalse; } +PyObject * _True() { return ptr__PyTrue; } + +PyTypeObject * _Buffer_Type() { return ptr__Buffer_Type; } +PyTypeObject * _CFunction_Type(){ return ptr__CFunction_Type; } +PyTypeObject * _Class_Type() { return ptr__Class_Type; } +PyTypeObject * _CObject_Type() { return ptr__CObject_Type; } +PyTypeObject * _Complex_Type() { return ptr__Complex_Type; } +PyTypeObject * _Dict_Type() { return ptr__Dict_Type; } +PyTypeObject * _File_Type() { return ptr__File_Type; } +PyTypeObject * _Float_Type() { return ptr__Float_Type; } +PyTypeObject * _Function_Type() { return ptr__Function_Type; } +PyTypeObject * _Instance_Type() { return ptr__Instance_Type; } +PyTypeObject * _Bool_Type() { return ptr__Bool_Type; } +PyTypeObject * _Int_Type() { return ptr__Int_Type; } +PyTypeObject * _List_Type() { return ptr__List_Type; } +PyTypeObject * _Long_Type() { return ptr__Long_Type; } +PyTypeObject * _Method_Type() { return ptr__Method_Type; } +PyTypeObject * _Module_Type() { return ptr__Module_Type; } +PyTypeObject * _Range_Type() { return ptr__Range_Type; } +PyTypeObject * _Slice_Type() { return ptr__Slice_Type; } +PyTypeObject * _String_Type() { return ptr__String_Type; } +PyTypeObject * _TraceBack_Type(){ return ptr__TraceBack_Type; } +PyTypeObject * _Tuple_Type() { return ptr__Tuple_Type; } +PyTypeObject * _Type_Type() { return ptr__Type_Type; } + +#if PY_MAJOR_VERSION >= 2 +PyTypeObject * _Unicode_Type() { return ptr__Unicode_Type; } +#endif + +char *__Py_PackageContext() { return *ptr__Py_PackageContext; } + + +// +// wrap the Python Flag variables +// +int &_Py_DebugFlag() { return *ptr_Py_DebugFlag; } +int &_Py_InteractiveFlag() { return *ptr_Py_InteractiveFlag; } +int &_Py_OptimizeFlag() { return *ptr_Py_OptimizeFlag; } +int &_Py_NoSiteFlag() { return *ptr_Py_NoSiteFlag; } +int &_Py_TabcheckFlag() { return *ptr_Py_TabcheckFlag; } +int &_Py_VerboseFlag() { return *ptr_Py_VerboseFlag; } +#if PY_MAJOR_VERSION >= 2 +int &_Py_UnicodeFlag() { return *ptr_Py_UnicodeFlag; } +#endif + +void _XINCREF( PyObject *op ) +{ + // This function must match the contents of Py_XINCREF(op) + if( op == NULL ) + return; + +#ifdef Py_REF_DEBUG + (*ptr_Py_RefTotal)++; +#endif + (op)->ob_refcnt++; + +} + +void _XDECREF( PyObject *op ) +{ + // This function must match the contents of Py_XDECREF(op); + if( op == NULL ) + return; + +#ifdef Py_REF_DEBUG + (*ptr_Py_RefTotal)--; +#endif + + if (--(op)->ob_refcnt == 0) + _Py_Dealloc((PyObject *)(op)); +} + + +#else +#error "Can only delay load under Win32" +#endif + +#else + +// +// Duplicated these declarations from rangeobject.h which is missing the +// extern "C". This has been reported as a bug upto and include 2.1 +// +extern "C" DL_IMPORT(PyTypeObject) PyRange_Type; +extern "C" DL_IMPORT(PyObject *) PyRange_New(long, long, long, int); + + +//================================================================================ +// +// Map onto Macros +// +//================================================================================ + +// +// Wrap variables as function calls +// + +PyObject * _Exc_ArithmeticError() { return ::PyExc_ArithmeticError; } +PyObject * _Exc_AssertionError() { return ::PyExc_AssertionError; } +PyObject * _Exc_AttributeError() { return ::PyExc_AttributeError; } +PyObject * _Exc_EnvironmentError() { return ::PyExc_EnvironmentError; } +PyObject * _Exc_EOFError() { return ::PyExc_EOFError; } +PyObject * _Exc_Exception() { return ::PyExc_Exception; } +PyObject * _Exc_FloatingPointError() { return ::PyExc_FloatingPointError; } +PyObject * _Exc_ImportError() { return ::PyExc_ImportError; } +PyObject * _Exc_IndexError() { return ::PyExc_IndexError; } +PyObject * _Exc_IOError() { return ::PyExc_IOError; } +PyObject * _Exc_KeyboardInterrupt() { return ::PyExc_KeyboardInterrupt; } +PyObject * _Exc_KeyError() { return ::PyExc_KeyError; } +PyObject * _Exc_LookupError() { return ::PyExc_LookupError; } +PyObject * _Exc_MemoryError() { return ::PyExc_MemoryError; } +PyObject * _Exc_MemoryErrorInst() { return ::PyExc_MemoryErrorInst; } +PyObject * _Exc_NameError() { return ::PyExc_NameError; } +PyObject * _Exc_NotImplementedError() { return ::PyExc_NotImplementedError; } +PyObject * _Exc_OSError() { return ::PyExc_OSError; } +PyObject * _Exc_OverflowError() { return ::PyExc_OverflowError; } +PyObject * _Exc_RuntimeError() { return ::PyExc_RuntimeError; } +PyObject * _Exc_StandardError() { return ::PyExc_StandardError; } +PyObject * _Exc_SyntaxError() { return ::PyExc_SyntaxError; } +PyObject * _Exc_SystemError() { return ::PyExc_SystemError; } +PyObject * _Exc_SystemExit() { return ::PyExc_SystemExit; } +PyObject * _Exc_TypeError() { return ::PyExc_TypeError; } +PyObject * _Exc_ValueError() { return ::PyExc_ValueError; } +PyObject * _Exc_ZeroDivisionError() { return ::PyExc_ZeroDivisionError; } + +#ifdef MS_WINDOWS +PyObject * _Exc_WindowsError() { return ::PyExc_WindowsError; } +#endif + + +#if PY_MAJOR_VERSION >= 2 +PyObject * _Exc_IndentationError() { return ::PyExc_IndentationError; } +PyObject * _Exc_TabError() { return ::PyExc_TabError; } +PyObject * _Exc_UnboundLocalError() { return ::PyExc_UnboundLocalError; } +PyObject * _Exc_UnicodeError() { return ::PyExc_UnicodeError; } +#endif + + +// +// wrap items in Object.h +// +PyObject * _None() { return &::_Py_NoneStruct; } + +PyObject * _False() { return Py_False; } +PyObject * _True() { return Py_True; } + +PyTypeObject * _Buffer_Type() { return &PyBuffer_Type; } +PyTypeObject * _CFunction_Type() { return &PyCFunction_Type; } +PyTypeObject * _Class_Type() { return &PyClass_Type; } +PyTypeObject * _CObject_Type() { return &PyCObject_Type; } +PyTypeObject * _Complex_Type() { return &PyComplex_Type; } +PyTypeObject * _Dict_Type() { return &PyDict_Type; } +PyTypeObject * _File_Type() { return &PyFile_Type; } +PyTypeObject * _Float_Type() { return &PyFloat_Type; } +PyTypeObject * _Function_Type() { return &PyFunction_Type; } +PyTypeObject * _Instance_Type() { return &PyInstance_Type; } +PyTypeObject * _Bool_Type() { return &PyBool_Type; } +PyTypeObject * _Int_Type() { return &PyInt_Type; } +PyTypeObject * _List_Type() { return &PyList_Type; } +PyTypeObject * _Long_Type() { return &PyLong_Type; } +PyTypeObject * _Method_Type() { return &PyMethod_Type; } +PyTypeObject * _Module_Type() { return &PyModule_Type; } +PyTypeObject * _Range_Type() { return &PyRange_Type; } +PyTypeObject * _Slice_Type() { return &PySlice_Type; } +PyTypeObject * _String_Type() { return &PyString_Type; } +PyTypeObject * _TraceBack_Type() { return &PyTraceBack_Type; } +PyTypeObject * _Tuple_Type() { return &PyTuple_Type; } +PyTypeObject * _Type_Type() { return &PyType_Type; } + +#if PY_MAJOR_VERSION >= 2 +PyTypeObject * _Unicode_Type() { return &PyUnicode_Type; } +#endif + +// +// wrap flags +// +int &_Py_DebugFlag() { return Py_DebugFlag; } +int &_Py_InteractiveFlag(){ return Py_InteractiveFlag; } +int &_Py_OptimizeFlag() { return Py_OptimizeFlag; } +int &_Py_NoSiteFlag() { return Py_NoSiteFlag; } +int &_Py_TabcheckFlag() { return Py_TabcheckFlag; } +int &_Py_VerboseFlag() { return Py_VerboseFlag; } +#if PY_MAJOR_VERSION >= 2 +int &_Py_UnicodeFlag() { return Py_UnicodeFlag; } +#endif +char *__Py_PackageContext(){ return _Py_PackageContext; } + +// +// Needed to keep the abstactions for delayload interface +// +void _XINCREF( PyObject *op ) +{ + Py_XINCREF(op); +} + +void _XDECREF( PyObject *op ) +{ + Py_XDECREF(op); +} + +#endif +} diff --git a/CXX/IndirectPythonInterface.hxx b/CXX/IndirectPythonInterface.hxx new file mode 100644 index 000000000000..a29a394c6c6a --- /dev/null +++ b/CXX/IndirectPythonInterface.hxx @@ -0,0 +1,198 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_INDIRECT_PYTHON_INTERFACE__HXX__ +#define __CXX_INDIRECT_PYTHON_INTERFACE__HXX__ + +#include "CXX/WrapPython.h" + +namespace Py +{ +bool InitialisePythonIndirectInterface(); + +// +// Wrap Exception variables as function calls +// +PyObject * _Exc_Exception(); +PyObject * _Exc_StandardError(); +PyObject * _Exc_ArithmeticError(); +PyObject * _Exc_LookupError(); + +PyObject * _Exc_AssertionError(); +PyObject * _Exc_AttributeError(); +PyObject * _Exc_EOFError(); +PyObject * _Exc_FloatingPointError(); +PyObject * _Exc_EnvironmentError(); +PyObject * _Exc_IOError(); +PyObject * _Exc_OSError(); +PyObject * _Exc_ImportError(); +PyObject * _Exc_IndexError(); +PyObject * _Exc_KeyError(); +PyObject * _Exc_KeyboardInterrupt(); +PyObject * _Exc_MemoryError(); +PyObject * _Exc_NameError(); +PyObject * _Exc_OverflowError(); +PyObject * _Exc_RuntimeError(); +PyObject * _Exc_NotImplementedError(); +PyObject * _Exc_SyntaxError(); +PyObject * _Exc_SystemError(); +PyObject * _Exc_SystemExit(); +PyObject * _Exc_TypeError(); +PyObject * _Exc_ValueError(); +PyObject * _Exc_ZeroDivisionError(); +#ifdef MS_WINDOWS +PyObject * _Exc_WindowsError(); +#endif + +PyObject * _Exc_MemoryErrorInst(); + +#if PY_MAJOR_VERSION >= 2 +PyObject * _Exc_IndentationError(); +PyObject * _Exc_TabError(); +PyObject * _Exc_UnboundLocalError(); +PyObject * _Exc_UnicodeError(); +#endif + +// +// Wrap Object variables as function calls +// +PyObject * _None(); + +PyObject * _False(); +PyObject * _True(); + +// +// Wrap Type variables as function calls +// +PyTypeObject * _List_Type(); +bool _List_Check( PyObject *o ); + +PyTypeObject * _Buffer_Type(); +bool _Buffer_Check( PyObject *op ); + +PyTypeObject * _Class_Type(); +bool _Class_Check( PyObject *op ); + +PyTypeObject * _Instance_Type(); +bool _Instance_Check( PyObject *op ); + +PyTypeObject * _Method_Type(); +bool _Method_Check( PyObject *op ); + +PyTypeObject * _CObject_Type(); +bool _CObject_Check( PyObject *op ); + +PyTypeObject * _Complex_Type(); +bool _Complex_Check( PyObject *op ); + +PyTypeObject * _Dict_Type(); +bool _Dict_Check( PyObject *op ); + +PyTypeObject * _File_Type(); +bool _File_Check( PyObject *op ); + +PyTypeObject * _Float_Type(); +bool _Float_Check( PyObject *op ); + +PyTypeObject * _Frame_Type(); +bool _Frame_Check( PyObject *op ); + +PyTypeObject * _Function_Type(); +bool _Function_Check( PyObject *op ); + +PyTypeObject * _Bool_Type(); +bool _Boolean_Check( PyObject *op ); + +PyTypeObject * _Int_Type(); +bool _Int_Check( PyObject *op ); + +PyTypeObject * _List_Type(); +bool _List_Check( PyObject *op ); + +PyTypeObject * _Long_Type(); +bool _Long_Check( PyObject *op ); + +PyTypeObject * _CFunction_Type(); +bool _CFunction_Check( PyObject *op ); + +PyTypeObject * _Module_Type(); +bool _Module_Check( PyObject *op ); + +PyTypeObject * _Type_Type(); +bool _Type_Check( PyObject *op ); + +PyTypeObject * _Range_Type(); +bool _Range_Check( PyObject *op ); + +PyTypeObject * _Slice_Type(); +bool _Slice_Check( PyObject *op ); + +PyTypeObject * _String_Type(); +bool _String_Check( PyObject *op ); + +PyTypeObject * _Unicode_Type(); +bool _Unicode_Check( PyObject *op ); + +PyTypeObject * _TraceBack_Type(); +bool _TraceBack_Check( PyObject *v ); + +PyTypeObject * _Tuple_Type(); +bool _Tuple_Check( PyObject *op ); + +#if PY_MAJOR_VERSION >= 2 +PyTypeObject * _Unicode_Type(); +bool _Unicode_Check( PyObject *op ); +#endif + +int &_Py_DebugFlag(); +int &_Py_InteractiveFlag(); +int &_Py_OptimizeFlag(); +int &_Py_NoSiteFlag(); +int &_Py_TabcheckFlag(); +int &_Py_VerboseFlag(); + +#if PY_MAJOR_VERSION >= 2 +int &_Py_UnicodeFlag(); +#endif + +void _XINCREF( PyObject *op ); +void _XDECREF( PyObject *op ); + +char *__Py_PackageContext(); +} + +#endif // __CXX_INDIRECT_PYTHON_INTERFACE__HXX__ diff --git a/CXX/Objects.hxx b/CXX/Objects.hxx new file mode 100644 index 000000000000..e9d59a44e0b0 --- /dev/null +++ b/CXX/Objects.hxx @@ -0,0 +1,3040 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __CXX_Objects__h +#define __CXX_Objects__h + +#include "CXX/WrapPython.h" +#include "CXX/Version.hxx" +#include "CXX/Config.hxx" +#include "CXX/Exception.hxx" + +#include +#include STR_STREAM +#include +#include +#include +#include + +namespace Py +{ + typedef int sequence_index_type; // type of an index into a sequence + + // Forward declarations + class Object; + class Type; + template class SeqBase; + class String; + class List; + template class MapBase; + + // new_reference_to also overloaded below on Object + inline PyObject* new_reference_to(PyObject* p) + { + Py::_XINCREF(p); + return p; + } + + // returning Null() from an extension method triggers a + // Python exception + inline PyObject* Null() + { + return (static_cast(0)); + } + + //===========================================================================// + // class Object + // The purpose of this class is to serve as the most general kind of + // Python object, for the purpose of writing C++ extensions in Python + // Objects hold a PyObject* which they own. This pointer is always a + // valid pointer to a Python object. In children we must maintain this behavior. + // + // Instructions on how to make your own class MyType descended from Object: + // (0) Pick a base class, either Object or perhaps SeqBase or MapBase. + // This example assumes Object. + + // (1) Write a routine int MyType_Check (PyObject *) modeled after PyInt_Check, + // PyFloat_Check, etc. + + // (2) Add method accepts: + // virtual bool accepts (PyObject *pyob) const { + // return pyob && MyType_Check (pyob); + // } + + // (3) Include the following constructor and copy constructor + // + /* + explicit MyType (PyObject *pyob): Object(pyob) { + validate(); +} + + MyType(const Object& other): Object(other.ptr()) { + validate(); +} + */ + + // Alernate version for the constructor to allow for construction from owned pointers: + /* + explicit MyType (PyObject *pyob): Object(pyob) { + validate(); +} + */ + + // You may wish to add other constructors; see the classes below for examples. + // Each constructor must use "set" to set the pointer + // and end by validating the pointer you have created. + + // (4) Each class needs at least these two assignment operators: + /* + MyType& operator= (const Object& rhs) { + return (*this = *rhs); +} + + Mytype& operator= (PyObject* rhsp) { + if(ptr() == rhsp) return *this; + set(rhsp); + return *this; +} + */ + // Note on accepts: constructors call the base class + // version of a virtual when calling the base class constructor, + // so the test has to be done explicitly in a descendent. + + // If you are inheriting from PythonExtension to define an object + // note that it contains PythonExtension::check + // which you can use in accepts when writing a wrapper class. + // See Demo/range.h and Demo/range.cxx for an example. + + class Object + { + private: + // the pointer to the Python object + // Only Object sets this directly. + // The default constructor for Object sets it to Py_None and + // child classes must use "set" to set it + // + PyObject* p; + + protected: + + void set (PyObject* pyob, bool owned = false) + { + release(); + p = pyob; + if (!owned) + { + Py::_XINCREF (p); + } + validate(); + } + + void release () + { + Py::_XDECREF (p); + p = 0; + } + + void validate(); + + public: + // Constructor acquires new ownership of pointer unless explicitly told not to. + explicit Object (PyObject* pyob=Py::_None(), bool owned = false): p (pyob) + { + if(!owned) + { + Py::_XINCREF (p); + } + validate(); + } + + // Copy constructor acquires new ownership of pointer + Object (const Object& ob): p(ob.p) + { + Py::_XINCREF (p); + validate(); + } + + // Assignment acquires new ownership of pointer + Object& operator= (const Object& rhs) + { + set(rhs.p); + return *this; + } + + Object& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + + // Destructor + virtual ~Object () + { + release (); + } + + // Loaning the pointer to others, retain ownership + PyObject* operator* () const + { + return p; + } + + // Explicit reference_counting changes + void increment_reference_count() + { + Py::_XINCREF(p); + } + + void decrement_reference_count() + { + // not allowed to commit suicide, however + if(reference_count() == 1) + throw RuntimeError("Object::decrement_reference_count error."); + Py::_XDECREF(p); + } + // Would like to call this pointer() but messes up STL in SeqBase + PyObject* ptr () const + { + return p; + } + + // + // Queries + // + + // Can pyob be used in this object's constructor? + virtual bool accepts (PyObject *pyob) const + { + return (pyob != 0); + } + + Py_ssize_t reference_count () const + { // the reference count + return p ? p->ob_refcnt : 0; + } + + Type type () const; // the type object associated with this one + + String str () const; // the str() representation + + std::string as_string() const; + + String repr () const; // the repr () representation + + List dir () const; // the dir() list + + bool hasAttr (const std::string& s) const + { + return PyObject_HasAttrString (p, const_cast(s.c_str())) ? true: false; + } + + Object getAttr (const std::string& s) const + { + return Object (PyObject_GetAttrString (p, const_cast(s.c_str())), true); + } + + Object getItem (const Object& key) const + { + return Object (PyObject_GetItem(p, *key), true); + } + + long hashValue () const + { + return PyObject_Hash (p); + } + + // + // int print (FILE* fp, int flags=Py_Print_RAW) + //{ + // return PyObject_Print (p, fp, flags); + //} + // + bool is(PyObject *pother) const + { // identity test + return p == pother; + } + + bool is(const Object& other) const + { // identity test + return p == other.p; + } + + bool isNone() const + { + return p == _None(); + } + + bool isCallable () const + { + return PyCallable_Check (p) != 0; + } + + bool isInstance () const + { + return PyInstance_Check (p) != 0; + } + + bool isDict () const + { + return Py::_Dict_Check (p); + } + + bool isList () const + { + return Py::_List_Check (p); + } + + bool isMapping () const + { + return PyMapping_Check (p) != 0; + } + + bool isNumeric () const + { + return PyNumber_Check (p) != 0; + } + + bool isSequence () const + { + return PySequence_Check (p) != 0; + } + + bool isTrue () const + { + return PyObject_IsTrue (p) != 0; + } + + bool isType (const Type& t) const; + + bool isTuple() const + { + return Py::_Tuple_Check(p); + } + + bool isString() const + { + return Py::_String_Check(p) || Py::_Unicode_Check(p); + } + + bool isUnicode() const + { + return Py::_Unicode_Check(p); + } + + // Commands + void setAttr (const std::string& s, const Object& value) + { + if(PyObject_SetAttrString (p, const_cast(s.c_str()), *value) == -1) + throw AttributeError ("getAttr failed."); + } + + void delAttr (const std::string& s) + { + if(PyObject_DelAttrString (p, const_cast(s.c_str())) == -1) + throw AttributeError ("delAttr failed."); + } + + // PyObject_SetItem is too weird to be using from C++ + // so it is intentionally omitted. + + void delItem (const Object& key) + { + //if(PyObject_DelItem(p, *key) == -1) + // failed to link on Windows? + throw KeyError("delItem failed."); + } + + // Equality and comparison use PyObject_RichCompareBool + + bool operator==(const Object& o2) const + { + int k = PyObject_RichCompareBool (p, *o2, Py_EQ); + if (PyErr_Occurred()) throw Exception(); + return k != 0; + } + + bool operator!=(const Object& o2) const + { + int k = PyObject_RichCompareBool (p, *o2, Py_NE); + if (PyErr_Occurred()) throw Exception(); + return k != 0; + + } + + bool operator>=(const Object& o2) const + { + int k = PyObject_RichCompareBool (p, *o2, Py_GE); + if (PyErr_Occurred()) throw Exception(); + return k != 0; + } + + bool operator<=(const Object& o2) const + { + int k = PyObject_RichCompareBool (p, *o2, Py_LE); + if (PyErr_Occurred()) throw Exception(); + return k != 0; + } + + bool operator<(const Object& o2) const + { + int k = PyObject_RichCompareBool (p, *o2, Py_LT); + if (PyErr_Occurred()) throw Exception(); + return k != 0; + } + + bool operator>(const Object& o2) const + { + int k = PyObject_RichCompareBool (p, *o2, Py_GT); + if (PyErr_Occurred()) throw Exception(); + return k != 0; + } + }; + // End of class Object + inline PyObject* new_reference_to(const Object& g) + { + PyObject* p = g.ptr(); + Py::_XINCREF(p); + return p; + } + + // Nothing() is what an extension method returns if + // there is no other return value. + inline Object Nothing() + { + return Object(Py::_None()); + } + + // Python special None value + inline Object None() + { + return Object(Py::_None()); + } + + // Python special Boolean values + inline Object False() + { + return Object(Py::_False()); + } + + inline Object True() + { + return Object(Py::_True()); + } + + // TMM: 31May'01 - Added the #ifndef so I can exlude iostreams. +#ifndef CXX_NO_IOSTREAMS + std::ostream& operator<< (std::ostream& os, const Object& ob); +#endif + + // Class Type + class Type: public Object + { + public: + explicit Type (PyObject* pyob, bool owned = false): Object(pyob, owned) + { + validate(); + } + + Type (const Object& ob): Object(*ob) + { + validate(); + } + + Type(const Type& t): Object(t) + { + validate(); + } + + Type& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Type& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_Type_Check (pyob); + } + }; + + + // + // Convert an owned Python pointer into a CXX Object + // + inline Object asObject (PyObject *p) + { + return Object(p, true); + } + + // =============================================== + // class boolean + class Boolean: public Object + { + public: + // Constructor + Boolean (PyObject *pyob, bool owned = false): Object (pyob, owned) + { + validate(); + } + + Boolean (const Boolean& ob): Object(*ob) + { + validate(); + } + + // create from bool + Boolean (bool v=false) + { + set(PyBool_FromLong(v ? 1 : 0), true); + validate(); + } + + explicit Boolean (const Object& ob) + { + set(*ob, true); + validate(); + } + + // Assignment acquires new ownership of pointer + + Boolean& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Boolean& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp, true); + return *this; + } + + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_Boolean_Check (pyob); + } + + // convert to long + operator bool() const + { + return PyObject_IsTrue (ptr()) != 0; + } + + Boolean& operator= (bool v) + { + set (PyBool_FromLong (v ? 1 : 0), true); + return *this; + } + }; + + // =============================================== + // class Int + class Int: public Object + { + public: + // Constructor + Int (PyObject *pyob, bool owned = false): Object (pyob, owned) + { + validate(); + } + + Int (const Int& ob): Object(*ob) + { + validate(); + } + + // create from long + Int (long v = 0L): Object(PyInt_FromLong(v), true) + { + validate(); + } + + // create from int + Int (int v) + { + long w = v; + set(PyInt_FromLong(w), true); + validate(); + } + + // create from bool + Int (bool v) + { + long w = v ? 1 : 0; + set(PyInt_FromLong(w), true); + validate(); + } + + explicit Int (const Object& ob) + { + set(PyNumber_Int(*ob), true); + validate(); + } + + // Assignment acquires new ownership of pointer + + Int& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Int& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (PyNumber_Int(rhsp), true); + return *this; + } + + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_Int_Check (pyob); + } + + // convert to long + operator long() const + { + return PyInt_AsLong (ptr()); + } + +#ifdef HAVE_LONG_LONG + // convert to long long + PY_LONG_LONG asLongLong() const + { + return PyLong_AsLongLong (ptr()); + } + // convert to unsigned long long + unsigned PY_LONG_LONG asUnsignedLongLong() const + { + return PyLong_AsUnsignedLongLong (ptr()); + } +#endif + + // assign from an int + Int& operator= (int v) + { + set (PyInt_FromLong (long(v)), true); + return *this; + } + + // assign from long + Int& operator= (long v) + { + set (PyInt_FromLong (v), true); + return *this; + } + +#ifdef HAVE_LONG_LONG + // assign from long long + Int& operator= (PY_LONG_LONG v) + { + set (PyLong_FromLongLong (v), true); + return *this; + } + // assign from unsigned long long + Int& operator= (unsigned PY_LONG_LONG v) + { + set (PyLong_FromUnsignedLongLong (v), true); + return *this; + } +#endif + }; + + // =============================================== + // class Long + class Long: public Object + { + public: + // Constructor + explicit Long (PyObject *pyob, bool owned = false): Object (pyob, owned) + { + validate(); + } + + Long (const Long& ob): Object(ob.ptr()) + { + validate(); + } + + // create from long + explicit Long (long v = 0L) + : Object(PyLong_FromLong(v), true) + { + validate(); + } + // create from unsigned long + explicit Long (unsigned long v) + : Object(PyLong_FromUnsignedLong(v), true) + { + validate(); + } + // create from int + explicit Long (int v) + : Object(PyLong_FromLong(static_cast(v)), true) + { + validate(); + } + + // try to create from any object + Long (const Object& ob) + : Object(PyNumber_Long(*ob), true) + { + validate(); + } + + // Assignment acquires new ownership of pointer + + Long& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Long& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (PyNumber_Long(rhsp), true); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_Long_Check (pyob); + } + // convert to long + operator long() const + { + return PyLong_AsLong (ptr()); + } + // convert to unsigned + operator unsigned long() const + { + return PyLong_AsUnsignedLong (ptr()); + } + operator double() const + { + return PyLong_AsDouble (ptr()); + } + // assign from an int + Long& operator= (int v) + { + set(PyLong_FromLong (long(v)), true); + return *this; + } + // assign from long + Long& operator= (long v) + { + set(PyLong_FromLong (v), true); + return *this; + } + // assign from unsigned long + Long& operator= (unsigned long v) + { + set(PyLong_FromUnsignedLong (v), true); + return *this; + } + }; + +#ifdef HAVE_LONG_LONG + // =============================================== + // class LongLong + class LongLong: public Object + { + public: + // Constructor + explicit LongLong (PyObject *pyob, bool owned = false): Object (pyob, owned) + { + validate(); + } + + LongLong (const LongLong& ob): Object(ob.ptr()) + { + validate(); + } + // create from long long + explicit LongLong (PY_LONG_LONG v = 0L) + : Object(PyLong_FromLongLong(v), true) + { + validate(); + } + // create from unsigned long long + explicit LongLong (unsigned PY_LONG_LONG v) + : Object(PyLong_FromUnsignedLongLong(v), true) + { + validate(); + } + // create from long + explicit LongLong (long v) + : Object(PyLong_FromLongLong(v), true) + { + validate(); + } + // create from unsigned long + explicit LongLong (unsigned long v) + : Object(PyLong_FromUnsignedLongLong(v), true) + { + validate(); + } + // create from int + explicit LongLong (int v) + : Object(PyLong_FromLongLong(static_cast(v)), true) + { + validate(); + } + + // try to create from any object + LongLong (const Object& ob) + : Object(PyNumber_Long(*ob), true) + { + validate(); + } + + // Assignment acquires new ownership of pointer + + LongLong& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + LongLong& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (PyNumber_Long(rhsp), true); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_Long_Check (pyob); + } + // convert to long long + operator PY_LONG_LONG() const + { + return PyLong_AsLongLong (ptr()); + } + // convert to unsigned long + operator unsigned PY_LONG_LONG() const + { + return PyLong_AsUnsignedLongLong (ptr()); + } + // convert to long + operator long() const + { + return PyLong_AsLong (ptr()); + } + // convert to unsigned + operator unsigned long() const + { + return PyLong_AsUnsignedLong (ptr()); + } + operator double() const + { + return PyLong_AsDouble (ptr()); + } + // assign from an int + LongLong& operator= (int v) + { + set(PyLong_FromLongLong (long(v)), true); + return *this; + } + // assign from long long + LongLong& operator= (PY_LONG_LONG v) + { + set(PyLong_FromLongLong (v), true); + return *this; + } + // assign from unsigned long long + LongLong& operator= (unsigned PY_LONG_LONG v) + { + set(PyLong_FromUnsignedLongLong (v), true); + return *this; + } + // assign from long + LongLong& operator= (long v) + { + set(PyLong_FromLongLong (v), true); + return *this; + } + // assign from unsigned long + LongLong& operator= (unsigned long v) + { + set(PyLong_FromUnsignedLongLong (v), true); + return *this; + } + }; +#endif + + // =============================================== + // class Float + // + class Float: public Object + { + public: + // Constructor + explicit Float (PyObject *pyob, bool owned = false): Object(pyob, owned) + { + validate(); + } + + Float (const Float& f): Object(f) + { + validate(); + } + + // make from double + explicit Float (double v=0.0) + : Object(PyFloat_FromDouble (v), true) + { + validate(); + } + + // try to make from any object + Float (const Object& ob) + : Object(PyNumber_Float(*ob), true) + { + validate(); + } + + Float& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Float& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (PyNumber_Float(rhsp), true); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_Float_Check (pyob); + } + // convert to double + operator double () const + { + return PyFloat_AsDouble (ptr()); + } + // assign from a double + Float& operator= (double v) + { + set(PyFloat_FromDouble (v), true); + return *this; + } + // assign from an int + Float& operator= (int v) + { + set(PyFloat_FromDouble (double(v)), true); + return *this; + } + // assign from long + Float& operator= (long v) + { + set(PyFloat_FromDouble (double(v)), true); + return *this; + } + // assign from an Int + Float& operator= (const Int& iob) + { + set(PyFloat_FromDouble (double(long(iob))), true); + return *this; + } + }; + + // =============================================== + // class Complex + class Complex: public Object + { + public: + // Constructor + explicit Complex (PyObject *pyob, bool owned = false): Object(pyob, owned) + { + validate(); + } + + Complex (const Complex& f): Object(f) + { + validate(); + } + + // make from double + explicit Complex (double v=0.0, double w=0.0) + :Object(PyComplex_FromDoubles (v, w), true) + { + validate(); + } + + Complex& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Complex& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_Complex_Check (pyob); + } + // convert to Py_complex + operator Py_complex () const + { + return PyComplex_AsCComplex (ptr()); + } + // assign from a Py_complex + Complex& operator= (const Py_complex& v) + { + set(PyComplex_FromCComplex (v), true); + return *this; + } + // assign from a double + Complex& operator= (double v) + { + set(PyComplex_FromDoubles (v, 0.0), true); + return *this; + } + // assign from an int + Complex& operator= (int v) + { + set(PyComplex_FromDoubles (double(v), 0.0), true); + return *this; + } + // assign from long + Complex& operator= (long v) + { + set(PyComplex_FromDoubles (double(v), 0.0), true); + return *this; + } + // assign from an Int + Complex& operator= (const Int& iob) + { + set(PyComplex_FromDoubles (double(long(iob)), 0.0), true); + return *this; + } + + double real() const + { + return PyComplex_RealAsDouble(ptr()); + } + + double imag() const + { + return PyComplex_ImagAsDouble(ptr()); + } + }; + // Sequences + // Sequences are here represented as sequences of items of type T. + // The base class SeqBase represents that. + // In basic Python T is always "Object". + + // seqref is what you get if you get elements from a non-const SeqBase. + // Note: seqref could probably be a nested class in SeqBase but that might stress + // some compilers needlessly. Simlarly for mapref later. + + // While this class is not intended for enduser use, it needs some public + // constructors for the benefit of the STL. + + // See Scott Meyer's More Essential C++ for a description of proxies. + // This application is even more complicated. We are doing an unusual thing + // in having a double proxy. If we want the STL to work + // properly we have to compromise by storing the rvalue inside. The + // entire Object API is repeated so that things like s[i].isList() will + // work properly. + + // Still, once in a while a weird compiler message may occur using expressions like x[i] + // Changing them to Object(x[i]) helps the compiler to understand that the + // conversion of a seqref to an Object is wanted. + + template + class seqref + { + protected: + SeqBase& s; // the sequence + int offset; // item number + T the_item; // lvalue + public: + + seqref (SeqBase& seq, sequence_index_type j) + : s(seq), offset(j), the_item (s.getItem(j)) + {} + + seqref (const seqref& range) + : s(range.s), offset(range.offset), the_item(range.the_item) + {} + + // TMM: added this seqref ctor for use with STL algorithms + seqref (Object& obj) + : s(dynamic_cast< SeqBase&>(obj)) + , offset( NULL ) + , the_item(s.getItem(offset)) + {} + ~seqref() + {} + + operator T() const + { // rvalue + return the_item; + } + + seqref& operator=(const seqref& rhs) + { //used as lvalue + the_item = rhs.the_item; + s.setItem(offset, the_item); + return *this; + } + + seqref& operator=(const T& ob) + { // used as lvalue + the_item = ob; + s.setItem(offset, ob); + return *this; + } + + // forward everything else to the item + PyObject* ptr () const + { + return the_item.ptr(); + } + + int reference_count () const + { // the reference count + return the_item.reference_count(); + } + + Type type () const + { + return the_item.type(); + } + + String str () const; + + String repr () const; + + bool hasAttr (const std::string& attr_name) const + { + return the_item.hasAttr(attr_name); + } + + Object getAttr (const std::string& attr_name) const + { + return the_item.getAttr(attr_name); + } + + Object getItem (const Object& key) const + { + return the_item.getItem(key); + } + + long hashValue () const + { + return the_item.hashValue(); + } + + bool isCallable () const + { + return the_item.isCallable(); + } + + bool isInstance () const + { + return the_item.isInstance(); + } + + bool isDict () const + { + return the_item.isDict(); + } + + bool isList () const + { + return the_item.isList(); + } + + bool isMapping () const + { + return the_item.isMapping(); + } + + bool isNumeric () const + { + return the_item.isNumeric(); + } + + bool isSequence () const + { + return the_item.isSequence(); + } + + bool isTrue () const + { + return the_item.isTrue(); + } + + bool isType (const Type& t) const + { + return the_item.isType (t); + } + + bool isTuple() const + { + return the_item.isTuple(); + } + + bool isString() const + { + return the_item.isString(); + } + // Commands + void setAttr (const std::string& attr_name, const Object& value) + { + the_item.setAttr(attr_name, value); + } + + void delAttr (const std::string& attr_name) + { + the_item.delAttr(attr_name); + } + + void delItem (const Object& key) + { + the_item.delItem(key); + } + + bool operator==(const Object& o2) const + { + return the_item == o2; + } + + bool operator!=(const Object& o2) const + { + return the_item != o2; + } + + bool operator>=(const Object& o2) const + { + return the_item >= o2; + } + + bool operator<=(const Object& o2) const + { + return the_item <= o2; + } + + bool operator<(const Object& o2) const + { + return the_item < o2; + } + + bool operator>(const Object& o2) const + { + return the_item > o2; + } + }; // end of seqref + + + // class SeqBase + // ...the base class for all sequence types + + template + class SeqBase: public Object + { + public: + // STL definitions + typedef size_t size_type; + typedef seqref reference; + typedef T const_reference; + typedef seqref* pointer; + typedef int difference_type; + typedef T value_type; // TMM: 26Jun'01 + + virtual size_type max_size() const + { + return std::string::npos; // ? + } + + virtual size_type capacity() const + { + return size(); + } + + virtual void swap(SeqBase& c) + { + SeqBase temp = c; + c = ptr(); + set(temp.ptr()); + } + + virtual size_type size () const + { + return PySequence_Length (ptr()); + } + + explicit SeqBase () + :Object(PyTuple_New(0), true) + { + validate(); + } + + explicit SeqBase (PyObject* pyob, bool owned=false) + : Object(pyob, owned) + { + validate(); + } + + SeqBase (const Object& ob): Object(ob) + { + validate(); + } + + // Assignment acquires new ownership of pointer + + SeqBase& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + SeqBase& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + + virtual bool accepts (PyObject *pyob) const + { + return pyob && PySequence_Check (pyob); + } + + size_type length () const + { + return PySequence_Length (ptr()); + } + + // Element access + const T operator[](sequence_index_type index) const + { + return getItem(index); + } + + seqref operator[](sequence_index_type index) + { + return seqref(*this, index); + } + + virtual T getItem (sequence_index_type i) const + { + return T(asObject(PySequence_GetItem (ptr(), i))); + } + + virtual void setItem (sequence_index_type i, const T& ob) + { + if (PySequence_SetItem (ptr(), i, *ob) == -1) + { + throw Exception(); + } + } + + SeqBase repeat (int count) const + { + return SeqBase (PySequence_Repeat (ptr(), count), true); + } + + SeqBase concat (const SeqBase& other) const + { + return SeqBase (PySequence_Concat(ptr(), *other), true); + } + + // more STL compatability + const T front () const + { + return getItem(0); + } + + seqref front() + { + return seqref(this, 0); + } + + const T back () const + { + return getItem(size()-1); + } + + seqref back() + { + return seqref(this, size()-1); + } + + void verify_length(size_type required_size) const + { + if (size() != required_size) + throw IndexError ("Unexpected SeqBase length."); + } + + void verify_length(size_type min_size, size_type max_size) const + { + size_type n = size(); + if (n < min_size || n > max_size) + throw IndexError ("Unexpected SeqBase length."); + } + + class iterator + : public random_access_iterator_parent(seqref) + { + protected: + friend class SeqBase; + SeqBase* seq; + int count; + + public: + ~iterator () + {} + + iterator () + : seq( 0 ) + , count( 0 ) + {} + + iterator (SeqBase* s, int where) + : seq( s ) + , count( where ) + {} + + iterator (const iterator& other) + : seq( other.seq ) + , count( other.count ) + {} + + bool eql (const iterator& other) const + { + return (seq->ptr() == other.seq->ptr()) && (count == other.count); + } + + bool neq (const iterator& other) const + { + return (seq->ptr() != other.seq->ptr()) || (count != other.count); + } + + bool lss (const iterator& other) const + { + return (count < other.count); + } + + bool gtr (const iterator& other) const + { + return (count > other.count); + } + + bool leq (const iterator& other) const + { + return (count <= other.count); + } + + bool geq (const iterator& other) const + { + return (count >= other.count); + } + + seqref operator*() + { + return seqref(*seq, count); + } + + seqref operator[] (sequence_index_type i) + { + return seqref(*seq, count + i); + } + + iterator& operator=(const iterator& other) + { + if (this == &other) return *this; + seq = other.seq; + count = other.count; + return *this; + } + + iterator operator+(int n) const + { + return iterator(seq, count + n); + } + + iterator operator-(int n) const + { + return iterator(seq, count - n); + } + + iterator& operator+=(int n) + { + count = count + n; + return *this; + } + + iterator& operator-=(int n) + { + count = count - n; + return *this; + } + + int operator-(const iterator& other) const + { + if (*seq != *other.seq) + throw RuntimeError ("SeqBase::iterator comparison error"); + return count - other.count; + } + + // prefix ++ + iterator& operator++ () + { count++; return *this;} + // postfix ++ + iterator operator++ (int) + { return iterator(seq, count++);} + // prefix -- + iterator& operator-- () + { count--; return *this;} + // postfix -- + iterator operator-- (int) + { return iterator(seq, count--);} + + std::string diagnose() const + { + std::OSTRSTREAM oss; + oss << "iterator diagnosis " << seq << ", " << count << std::ends; + return std::string(oss.str()); + } + }; // end of class SeqBase::iterator + + iterator begin () + { + return iterator(this, 0); + } + + iterator end () + { + return iterator(this, length()); + } + + class const_iterator + : public random_access_iterator_parent(const Object) + { + protected: + friend class SeqBase; + const SeqBase* seq; + sequence_index_type count; + + private: + const_iterator (const SeqBase* s, int where) + : seq( s ) + , count( where ) + {} + + public: + ~const_iterator () + {} + + const_iterator () + : seq( 0 ) + , count( 0 ) + {} + + const_iterator(const const_iterator& other) + : seq( other.seq ) + , count( other.count ) + {} + + const T operator*() const + { + return seq->getItem(count); + } + + const T operator[] (sequence_index_type i) const + { + return seq->getItem(count + i); + } + + const_iterator& operator=(const const_iterator& other) + { + if (this == &other) return *this; + seq = other.seq; + count = other.count; + return *this; + } + + const_iterator operator+(int n) const + { + return const_iterator(seq, count + n); + } + + bool eql (const const_iterator& other) const + { + return (seq->ptr() == other.seq->ptr()) && (count == other.count); + } + + bool neq (const const_iterator& other) const + { + return (seq->ptr() != other.seq->ptr()) || (count != other.count); + } + + bool lss (const const_iterator& other) const + { + return (count < other.count); + } + + bool gtr (const const_iterator& other) const + { + return (count > other.count); + } + + bool leq (const const_iterator& other) const + { + return (count <= other.count); + } + + bool geq (const const_iterator& other) const + { + return (count >= other.count); + } + + const_iterator operator-(int n) + { + return const_iterator(seq, count - n); + } + + const_iterator& operator+=(int n) + { + count = count + n; + return *this; + } + + const_iterator& operator-=(int n) + { + count = count - n; + return *this; + } + + int operator-(const const_iterator& other) const + { + if (*seq != *other.seq) + throw RuntimeError ("SeqBase::const_iterator::- error"); + return count - other.count; + } + // prefix ++ + const_iterator& operator++ () + { count++; return *this;} + // postfix ++ + const_iterator operator++ (int) + { return const_iterator(seq, count++);} + // prefix -- + const_iterator& operator-- () + { count--; return *this;} + // postfix -- + const_iterator operator-- (int) + { return const_iterator(seq, count--);} + }; // end of class SeqBase::const_iterator + + const_iterator begin () const + { + return const_iterator(this, 0); + } + + const_iterator end () const + { + return const_iterator(this, length()); + } + }; + + // Here's an important typedef you might miss if reading too fast... + typedef SeqBase Sequence; + + template bool operator==(const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); + template bool operator!=(const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); + template bool operator< (const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); + template bool operator> (const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); + template bool operator<=(const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); + template bool operator>=(const EXPLICIT_TYPENAME SeqBase::iterator& left, const EXPLICIT_TYPENAME SeqBase::iterator& right); + + template bool operator==(const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); + template bool operator!=(const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); + template bool operator< (const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); + template bool operator> (const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); + template bool operator<=(const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); + template bool operator>=(const EXPLICIT_TYPENAME SeqBase::const_iterator& left, const EXPLICIT_TYPENAME SeqBase::const_iterator& right); + + + extern bool operator==(const Sequence::iterator& left, const Sequence::iterator& right); + extern bool operator!=(const Sequence::iterator& left, const Sequence::iterator& right); + extern bool operator< (const Sequence::iterator& left, const Sequence::iterator& right); + extern bool operator> (const Sequence::iterator& left, const Sequence::iterator& right); + extern bool operator<=(const Sequence::iterator& left, const Sequence::iterator& right); + extern bool operator>=(const Sequence::iterator& left, const Sequence::iterator& right); + + extern bool operator==(const Sequence::const_iterator& left, const Sequence::const_iterator& right); + extern bool operator!=(const Sequence::const_iterator& left, const Sequence::const_iterator& right); + extern bool operator< (const Sequence::const_iterator& left, const Sequence::const_iterator& right); + extern bool operator> (const Sequence::const_iterator& left, const Sequence::const_iterator& right); + extern bool operator<=(const Sequence::const_iterator& left, const Sequence::const_iterator& right); + extern bool operator>=(const Sequence::const_iterator& left, const Sequence::const_iterator& right); + + // ================================================== + // class Char + // Python strings return strings as individual elements. + // I'll try having a class Char which is a String of length 1 + // + typedef std::basic_string unicodestring; + extern Py_UNICODE unicode_null_string[1]; + + class Char: public Object + { + public: + explicit Char (PyObject *pyob, bool owned = false): Object(pyob, owned) + { + validate(); + } + + Char (const Object& ob): Object(ob) + { + validate(); + } + + Char (const std::string& v = "") + :Object(PyString_FromStringAndSize (const_cast(v.c_str()),1), true) + { + validate(); + } + + Char (char v) + : Object(PyString_FromStringAndSize (&v, 1), true) + { + validate(); + } + + Char (Py_UNICODE v) + : Object(PyUnicode_FromUnicode (&v, 1), true) + { + validate(); + } + // Assignment acquires new ownership of pointer + Char& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Char& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && (Py::_String_Check(pyob) || Py::_Unicode_Check(pyob)) && PySequence_Length (pyob) == 1; + } + + // Assignment from C string + Char& operator= (const std::string& v) + { + set(PyString_FromStringAndSize (const_cast(v.c_str()),1), true); + return *this; + } + + Char& operator= (char v) + { + set(PyString_FromStringAndSize (&v, 1), true); + return *this; + } + + Char& operator= (const unicodestring& v) + { + set(PyUnicode_FromUnicode (const_cast(v.data()),1), true); + return *this; + } + + Char& operator= (Py_UNICODE v) + { + set(PyUnicode_FromUnicode (&v, 1), true); + return *this; + } + + // Conversion + operator String() const; + + operator std::string () const + { + return std::string(PyString_AsString (ptr())); + } + }; + + class String: public SeqBase + { + public: + virtual size_type capacity() const + { + return max_size(); + } + + explicit String (PyObject *pyob, bool owned = false): SeqBase(pyob, owned) + { + validate(); + } + + String (const Object& ob): SeqBase(ob) + { + validate(); + } + + String() + : SeqBase( PyString_FromStringAndSize( "", 0 ), true ) + { + validate(); + } + + String( const std::string& v ) + : SeqBase( PyString_FromStringAndSize( const_cast(v.data()), + static_cast( v.length() ) ), true ) + { + validate(); + } + + String( const char *s, const char *encoding, const char *error="strict" ) + : SeqBase( PyUnicode_Decode( s, strlen( s ), encoding, error ), true ) + { + validate(); + } + + String( const char *s, int len, const char *encoding, const char *error="strict" ) + : SeqBase( PyUnicode_Decode( s, len, encoding, error ), true ) + { + validate(); + } + + String( const std::string &s, const char *encoding, const char *error="strict" ) + : SeqBase( PyUnicode_Decode( s.c_str(), s.length(), encoding, error ), true ) + { + validate(); + } + + String( const std::string& v, std::string::size_type vsize ) + : SeqBase(PyString_FromStringAndSize( const_cast(v.data()), + static_cast( vsize ) ), true) + { + validate(); + } + + String( const char *v, int vsize ) + : SeqBase(PyString_FromStringAndSize( const_cast(v), vsize ), true ) + { + validate(); + } + + String( const char* v ) + : SeqBase( PyString_FromString( v ), true ) + { + validate(); + } + + // Assignment acquires new ownership of pointer + String& operator= ( const Object& rhs ) + { + return *this = *rhs; + } + + String& operator= (PyObject* rhsp) + { + if( ptr() == rhsp ) + return *this; + set (rhsp); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && (Py::_String_Check(pyob) || Py::_Unicode_Check(pyob)); + } + + // Assignment from C string + String& operator= (const std::string& v) + { + set( PyString_FromStringAndSize( const_cast( v.data() ), + static_cast( v.length() ) ), true ); + return *this; + } + String& operator= (const unicodestring& v) + { + set( PyUnicode_FromUnicode( const_cast( v.data() ), + static_cast( v.length() ) ), true ); + return *this; + } + + + // Encode + String encode( const char *encoding, const char *error="strict" ) + { + if( isUnicode() ) + { + return String( PyUnicode_AsEncodedString( ptr(), encoding, error ) ); + } + else + { + return String( PyString_AsEncodedObject( ptr(), encoding, error ) ); + } + } + + String decode( const char *encoding, const char *error="strict" ) + { + return Object( PyString_AsDecodedObject( ptr(), encoding, error ) ); + } + + // Queries + virtual size_type size () const + { + if( isUnicode() ) + { + return static_cast( PyUnicode_GET_SIZE (ptr()) ); + } + else + { + return static_cast( PyString_Size (ptr()) ); + } + } + + operator std::string () const + { + return as_std_string(); + } + + std::string as_std_string() const + { + if( isUnicode() ) + { + throw TypeError("cannot return std::string from Unicode object"); + } + else + { + return std::string( PyString_AsString( ptr() ), static_cast( PyString_Size( ptr() ) ) ); + } + } + + unicodestring as_unicodestring() const + { + if( isUnicode() ) + { + return unicodestring( PyUnicode_AS_UNICODE( ptr() ), + static_cast( PyUnicode_GET_SIZE( ptr() ) ) ); + } + else + { + throw TypeError("can only return unicodestring from Unicode object"); + } + } + }; + + // ================================================== + // class Tuple + class Tuple: public Sequence + { + public: + virtual void setItem (sequence_index_type offset, const Object&ob) + { + // note PyTuple_SetItem is a thief... + if(PyTuple_SetItem (ptr(), offset, new_reference_to(ob)) == -1) + { + throw Exception(); + } + } + + // Constructor + explicit Tuple (PyObject *pyob, bool owned = false): Sequence (pyob, owned) + { + validate(); + } + + Tuple (const Object& ob): Sequence(ob) + { + validate(); + } + + // New tuple of a given size + explicit Tuple (int size = 0) + { + set(PyTuple_New (size), true); + validate (); + for (sequence_index_type i=0; i < size; i++) + { + if(PyTuple_SetItem (ptr(), i, new_reference_to(Py::_None())) == -1) + { + throw Exception(); + } + } + } + // Tuple from any sequence + explicit Tuple (const Sequence& s) + { + sequence_index_type limit( sequence_index_type( s.length() ) ); + + set(PyTuple_New (limit), true); + validate(); + + for(sequence_index_type i=0; i < limit; i++) + { + if(PyTuple_SetItem (ptr(), i, new_reference_to(s[i])) == -1) + { + throw Exception(); + } + } + } + // Assignment acquires new ownership of pointer + + Tuple& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Tuple& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_Tuple_Check (pyob); + } + + Tuple getSlice (int i, int j) const + { + return Tuple (PySequence_GetSlice (ptr(), i, j), true); + } + + }; + + // ================================================== + // class List + + class List: public Sequence + { + public: + // Constructor + explicit List (PyObject *pyob, bool owned = false): Sequence(pyob, owned) + { + validate(); + } + List (const Object& ob): Sequence(ob) + { + validate(); + } + // Creation at a fixed size + List (int size = 0) + { + set(PyList_New (size), true); + validate(); + for (sequence_index_type i=0; i < size; i++) + { + if(PyList_SetItem (ptr(), i, new_reference_to(Py::_None())) == -1) + { + throw Exception(); + } + } + } + + // List from a sequence + List (const Sequence& s): Sequence() + { + int n = (int)s.length(); + set(PyList_New (n), true); + validate(); + for (sequence_index_type i=0; i < n; i++) + { + if(PyList_SetItem (ptr(), i, new_reference_to(s[i])) == -1) + { + throw Exception(); + } + } + } + + virtual size_type capacity() const + { + return max_size(); + } + // Assignment acquires new ownership of pointer + + List& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + List& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_List_Check (pyob); + } + + List getSlice (int i, int j) const + { + return List (PyList_GetSlice (ptr(), i, j), true); + } + + void setSlice (int i, int j, const Object& v) + { + if(PyList_SetSlice (ptr(), i, j, *v) == -1) + { + throw Exception(); + } + } + + void append (const Object& ob) + { + if(PyList_Append (ptr(), *ob) == -1) + { + throw Exception(); + } + } + + void insert (int i, const Object& ob) + { + if(PyList_Insert (ptr(), i, *ob) == -1) + { + throw Exception(); + } + } + + void sort () + { + if(PyList_Sort(ptr()) == -1) + { + throw Exception(); + } + } + + void reverse () + { + if(PyList_Reverse(ptr()) == -1) + { + throw Exception(); + } + } + }; + + + // Mappings + // ================================================== + template + class mapref + { + protected: + MapBase& s; // the map + Object key; // item key + T the_item; + + public: + mapref (MapBase& map, const std::string& k) + : s(map), the_item() + { + key = String(k); + if(map.hasKey(key)) the_item = map.getItem(key); + } + + mapref (MapBase& map, const Object& k) + : s(map), key(k), the_item() + { + if(map.hasKey(key)) the_item = map.getItem(key); + } + + virtual ~mapref() + {} + + // MapBase stuff + // lvalue + mapref& operator=(const mapref& other) + { + if(this == &other) return *this; + the_item = other.the_item; + s.setItem(key, other.the_item); + return *this; + } + + mapref& operator= (const T& ob) + { + the_item = ob; + s.setItem (key, ob); + return *this; + } + + // rvalue + operator T() const + { + return the_item; + } + + // forward everything else to the_item + PyObject* ptr () const + { + return the_item.ptr(); + } + + int reference_count () const + { // the mapref count + return the_item.reference_count(); + } + + Type type () const + { + return the_item.type(); + } + + String str () const + { + return the_item.str(); + } + + String repr () const + { + return the_item.repr(); + } + + bool hasAttr (const std::string& attr_name) const + { + return the_item.hasAttr(attr_name); + } + + Object getAttr (const std::string& attr_name) const + { + return the_item.getAttr(attr_name); + } + + Object getItem (const Object& k) const + { + return the_item.getItem(k); + } + + long hashValue () const + { + return the_item.hashValue(); + } + + bool isCallable () const + { + return the_item.isCallable(); + } + + bool isInstance () const + { + return the_item.isInstance(); + } + + bool isList () const + { + return the_item.isList(); + } + + bool isMapping () const + { + return the_item.isMapping(); + } + + bool isNumeric () const + { + return the_item.isNumeric(); + } + + bool isSequence () const + { + return the_item.isSequence(); + } + + bool isTrue () const + { + return the_item.isTrue(); + } + + bool isType (const Type& t) const + { + return the_item.isType (t); + } + + bool isTuple() const + { + return the_item.isTuple(); + } + + bool isString() const + { + return the_item.isString(); + } + + // Commands + void setAttr (const std::string& attr_name, const Object& value) + { + the_item.setAttr(attr_name, value); + } + + void delAttr (const std::string& attr_name) + { + the_item.delAttr(attr_name); + } + + void delItem (const Object& k) + { + the_item.delItem(k); + } + }; // end of mapref + + // TMM: now for mapref + template< class T > + bool operator==(const mapref& left, const mapref& right) + { + return true; // NOT completed. + } + + template< class T > + bool operator!=(const mapref& left, const mapref& right) + { + return true; // not completed. + } + + template + class MapBase: public Object + { + protected: + explicit MapBase() + {} + public: + // reference: proxy class for implementing [] + // TMM: 26Jun'01 - the types + // If you assume that Python mapping is a hash_map... + // hash_map::value_type is not assignable, but + // (*it).second = data must be a valid expression + typedef size_t size_type; + typedef Object key_type; + typedef mapref data_type; + typedef std::pair< const T, T > value_type; + typedef std::pair< const T, mapref > reference; + typedef const std::pair< const T, const T > const_reference; + typedef std::pair< const T, mapref > pointer; + + // Constructor + explicit MapBase (PyObject *pyob, bool owned = false): Object(pyob, owned) + { + validate(); + } + + // TMM: 02Jul'01 - changed MapBase to Object in next line + MapBase (const Object& ob): Object(ob) + { + validate(); + } + + // Assignment acquires new ownership of pointer + MapBase& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + MapBase& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && PyMapping_Check(pyob); + } + + // Clear -- PyMapping Clear is missing + // + + void clear () + { + List k = keys(); + for(List::iterator i = k.begin(); i != k.end(); i++) + { + delItem(*i); + } + } + + virtual size_type size() const + { + return PyMapping_Length (ptr()); + } + + // Element Access + T operator[](const std::string& key) const + { + return getItem(key); + } + + T operator[](const Object& key) const + { + return getItem(key); + } + + mapref operator[](const std::string& key) + { + return mapref(*this, key); + } + + mapref operator[](const Object& key) + { + return mapref(*this, key); + } + + int length () const + { + return PyMapping_Length (ptr()); + } + + bool hasKey (const std::string& s) const + { + return PyMapping_HasKeyString (ptr(),const_cast(s.c_str())) != 0; + } + + bool hasKey (const Object& s) const + { + return PyMapping_HasKey (ptr(), s.ptr()) != 0; + } + + T getItem (const std::string& s) const + { + return T( + asObject(PyMapping_GetItemString (ptr(),const_cast(s.c_str()))) + ); + } + + T getItem (const Object& s) const + { + return T( + asObject(PyObject_GetItem (ptr(), s.ptr())) + ); + } + + virtual void setItem (const char *s, const Object& ob) + { + if (PyMapping_SetItemString (ptr(), const_cast(s), *ob) == -1) + { + throw Exception(); + } + } + + virtual void setItem (const std::string& s, const Object& ob) + { + if (PyMapping_SetItemString (ptr(), const_cast(s.c_str()), *ob) == -1) + { + throw Exception(); + } + } + + virtual void setItem (const Object& s, const Object& ob) + { + if (PyObject_SetItem (ptr(), s.ptr(), ob.ptr()) == -1) + { + throw Exception(); + } + } + + void delItem (const std::string& s) + { + if (PyMapping_DelItemString (ptr(), const_cast(s.c_str())) == -1) + { + throw Exception(); + } + } + + void delItem (const Object& s) + { + if (PyMapping_DelItem (ptr(), *s) == -1) + { + throw Exception(); + } + } + // Queries + List keys () const + { + return List(PyMapping_Keys(ptr()), true); + } + + List values () const + { // each returned item is a (key, value) pair + return List(PyMapping_Values(ptr()), true); + } + + List items () const + { + return List(PyMapping_Items(ptr()), true); + } + + class iterator + { + // : public forward_iterator_parent( std::pair ) { + protected: + typedef std::forward_iterator_tag iterator_category; + typedef std::pair< const T, T > value_type; + typedef int difference_type; + typedef std::pair< const T, mapref > pointer; + typedef std::pair< const T, mapref > reference; + + friend class MapBase; + // + MapBase* map; + List keys; // for iterating over the map + int pos; // index into the keys + + private: + iterator( MapBase* m, List k, int p ) + : map( m ) + , keys( k ) + , pos( p ) + {} + + public: + ~iterator () + {} + + iterator () + : map( 0 ) + , keys() + , pos() + {} + + iterator (MapBase* m, bool end = false ) + : map( m ) + , keys( m->keys() ) + , pos( end ? keys.length() : 0 ) + {} + + iterator (const iterator& other) + : map( other.map ) + , keys( other.keys ) + , pos( other.pos ) + {} + + reference operator*() + { + Object key = keys[ pos ]; + return std::make_pair(key, mapref(*map,key)); + } + + iterator& operator=(const iterator& other) + { + if (this == &other) + return *this; + map = other.map; + keys = other.keys; + pos = other.pos; + return *this; + } + + bool eql(const iterator& right) const + { + return map->ptr() == right.map->ptr() && pos == right.pos; + } + bool neq( const iterator& right ) const + { + return map->ptr() != right.map->ptr() || pos != right.pos; + } + + // pointer operator->() { + // return ; + // } + + // prefix ++ + iterator& operator++ () + { pos++; return *this;} + // postfix ++ + iterator operator++ (int) + { return iterator(map, keys, pos++);} + // prefix -- + iterator& operator-- () + { pos--; return *this;} + // postfix -- + iterator operator-- (int) + { return iterator(map, keys, pos--);} + + std::string diagnose() const + { + std::OSTRSTREAM oss; + oss << "iterator diagnosis " << map << ", " << pos << std::ends; + return std::string(oss.str()); + } + }; // end of class MapBase::iterator + + iterator begin () + { + return iterator(this); + } + + iterator end () + { + return iterator(this, true); + } + + class const_iterator + { + protected: + typedef std::forward_iterator_tag iterator_category; + typedef const std::pair< const T, T > value_type; + typedef int difference_type; + typedef const std::pair< const T, T > pointer; + typedef const std::pair< const T, T > reference; + + friend class MapBase; + const MapBase* map; + List keys; // for iterating over the map + int pos; // index into the keys + + private: + const_iterator( MapBase* m, List k, int p ) + : map( m ) + , keys( k ) + , pos( p ) + {} + + public: + ~const_iterator () + {} + + const_iterator () + : map( 0 ) + , keys() + , pos() + {} + + const_iterator (MapBase* m, bool end = false ) + : map( m ) + , keys( m->keys() ) + , pos( end ? keys.length() : 0 ) + {} + + const_iterator(const const_iterator& other) + : map( other.map ) + , keys( other.keys ) + , pos( other.pos ) + {} + + bool eql(const const_iterator& right) const + { + return map->ptr() == right.map->ptr() && pos == right.pos; + } + + bool neq( const const_iterator& right ) const + { + return map->ptr() != right.map->ptr() || pos != right.pos; + } + + const_reference operator*() + { + Object key = keys[ pos ]; + return std::make_pair( key, mapref( *map, key ) ); + } + + const_iterator& operator=(const const_iterator& other) + { + if (this == &other) return *this; + map = other.map; + keys = other.keys; + pos = other.pos; + return *this; + } + + // prefix ++ + const_iterator& operator++ () + { pos++; return *this;} + // postfix ++ + const_iterator operator++ (int) + { return const_iterator(map, keys, pos++);} + // prefix -- + const_iterator& operator-- () + { pos--; return *this;} + // postfix -- + const_iterator operator-- (int) + { return const_iterator(map, keys, pos--);} + }; // end of class MapBase::const_iterator + + const_iterator begin () const + { + return const_iterator(this); + } + + const_iterator end () const + { + return const_iterator(this, true); + } + + }; // end of MapBase + + typedef MapBase Mapping; + + template bool operator==(const EXPLICIT_TYPENAME MapBase::iterator& left, const EXPLICIT_TYPENAME MapBase::iterator& right); + template bool operator!=(const EXPLICIT_TYPENAME MapBase::iterator& left, const EXPLICIT_TYPENAME MapBase::iterator& right); + template bool operator==(const EXPLICIT_TYPENAME MapBase::const_iterator& left, const EXPLICIT_TYPENAME MapBase::const_iterator& right); + template bool operator!=(const EXPLICIT_TYPENAME MapBase::const_iterator& left, const EXPLICIT_TYPENAME MapBase::const_iterator& right); + + extern bool operator==(const Mapping::iterator& left, const Mapping::iterator& right); + extern bool operator!=(const Mapping::iterator& left, const Mapping::iterator& right); + extern bool operator==(const Mapping::const_iterator& left, const Mapping::const_iterator& right); + extern bool operator!=(const Mapping::const_iterator& left, const Mapping::const_iterator& right); + + + // ================================================== + // class Dict + class Dict: public Mapping + { + public: + // Constructor + explicit Dict (PyObject *pyob, bool owned=false): Mapping (pyob, owned) + { + validate(); + } + Dict (const Object& ob): Mapping(ob) + { + validate(); + } + // Creation + Dict () + { + set(PyDict_New (), true); + validate(); + } + // Assignment acquires new ownership of pointer + + Dict& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Dict& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set(rhsp); + return *this; + } + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && Py::_Dict_Check (pyob); + } + }; + + class Callable: public Object + { + public: + // Constructor + explicit Callable (): Object() {} + explicit Callable (PyObject *pyob, bool owned = false): Object (pyob, owned) + { + validate(); + } + + Callable (const Object& ob): Object(ob) + { + validate(); + } + + // Assignment acquires new ownership of pointer + + Callable& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Callable& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set (rhsp); + return *this; + } + + // Membership + virtual bool accepts (PyObject *pyob) const + { + return pyob && PyCallable_Check (pyob); + } + + // Call + Object apply(const Tuple& args) const + { + return asObject(PyObject_CallObject(ptr(), args.ptr())); + } + + // Call with keywords + Object apply(const Tuple& args, const Dict& kw) const + { + return asObject( PyEval_CallObjectWithKeywords( ptr(), args.ptr(), kw.ptr() ) ); + } + + Object apply(PyObject* pargs = 0) const + { + return apply (Tuple(pargs)); + } + }; + + class Module: public Object + { + public: + explicit Module (PyObject* pyob, bool owned = false): Object (pyob, owned) + { + validate(); + } + + // Construct from module name + explicit Module (const std::string&s): Object() + { + PyObject *m = PyImport_AddModule( const_cast(s.c_str()) ); + set( m, false ); + validate (); + } + + // Copy constructor acquires new ownership of pointer + Module (const Module& ob): Object(*ob) + { + validate(); + } + + Module& operator= (const Object& rhs) + { + return (*this = *rhs); + } + + Module& operator= (PyObject* rhsp) + { + if(ptr() == rhsp) return *this; + set(rhsp); + return *this; + } + + Dict getDict() + { + return Dict(PyModule_GetDict(ptr())); + // Caution -- PyModule_GetDict returns borrowed reference! + } + }; + + // Numeric interface + inline Object operator+ (const Object& a) + { + return asObject(PyNumber_Positive(*a)); + } + inline Object operator- (const Object& a) + { + return asObject(PyNumber_Negative(*a)); + } + + inline Object abs(const Object& a) + { + return asObject(PyNumber_Absolute(*a)); + } + + inline std::pair coerce(const Object& a, const Object& b) + { + PyObject *p1, *p2; + p1 = *a; + p2 = *b; + if(PyNumber_Coerce(&p1,&p2) == -1) + { + throw Exception(); + } + return std::pair(asObject(p1), asObject(p2)); + } + + inline Object operator+ (const Object& a, const Object& b) + { + return asObject(PyNumber_Add(*a, *b)); + } + inline Object operator+ (const Object& a, int j) + { + return asObject(PyNumber_Add(*a, *Int(j))); + } + inline Object operator+ (const Object& a, double v) + { + return asObject(PyNumber_Add(*a, *Float(v))); + } + inline Object operator+ (int j, const Object& b) + { + return asObject(PyNumber_Add(*Int(j), *b)); + } + inline Object operator+ (double v, const Object& b) + { + return asObject(PyNumber_Add(*Float(v), *b)); + } + + inline Object operator- (const Object& a, const Object& b) + { + return asObject(PyNumber_Subtract(*a, *b)); + } + inline Object operator- (const Object& a, int j) + { + return asObject(PyNumber_Subtract(*a, *Int(j))); + } + inline Object operator- (const Object& a, double v) + { + return asObject(PyNumber_Subtract(*a, *Float(v))); + } + inline Object operator- (int j, const Object& b) + { + return asObject(PyNumber_Subtract(*Int(j), *b)); + } + inline Object operator- (double v, const Object& b) + { + return asObject(PyNumber_Subtract(*Float(v), *b)); + } + + inline Object operator* (const Object& a, const Object& b) + { + return asObject(PyNumber_Multiply(*a, *b)); + } + inline Object operator* (const Object& a, int j) + { + return asObject(PyNumber_Multiply(*a, *Int(j))); + } + inline Object operator* (const Object& a, double v) + { + return asObject(PyNumber_Multiply(*a, *Float(v))); + } + inline Object operator* (int j, const Object& b) + { + return asObject(PyNumber_Multiply(*Int(j), *b)); + } + inline Object operator* (double v, const Object& b) + { + return asObject(PyNumber_Multiply(*Float(v), *b)); + } + + inline Object operator/ (const Object& a, const Object& b) + { + return asObject(PyNumber_Divide(*a, *b)); + } + inline Object operator/ (const Object& a, int j) + { + return asObject(PyNumber_Divide(*a, *Int(j))); + } + inline Object operator/ (const Object& a, double v) + { + return asObject(PyNumber_Divide(*a, *Float(v))); + } + inline Object operator/ (int j, const Object& b) + { + return asObject(PyNumber_Divide(*Int(j), *b)); + } + inline Object operator/ (double v, const Object& b) + { + return asObject(PyNumber_Divide(*Float(v), *b)); + } + + inline Object operator% (const Object& a, const Object& b) + { + return asObject(PyNumber_Remainder(*a, *b)); + } + inline Object operator% (const Object& a, int j) + { + return asObject(PyNumber_Remainder(*a, *Int(j))); + } + inline Object operator% (const Object& a, double v) + { + return asObject(PyNumber_Remainder(*a, *Float(v))); + } + inline Object operator% (int j, const Object& b) + { + return asObject(PyNumber_Remainder(*Int(j), *b)); + } + inline Object operator% (double v, const Object& b) + { + return asObject(PyNumber_Remainder(*Float(v), *b)); + } + + inline Object type(const Exception&) // return the type of the error + { + PyObject *ptype, *pvalue, *ptrace; + PyErr_Fetch(&ptype, &pvalue, &ptrace); + Object result; + if(ptype) result = ptype; + PyErr_Restore(ptype, pvalue, ptrace); + return result; + } + + inline Object value(const Exception&) // return the value of the error + { + PyObject *ptype, *pvalue, *ptrace; + PyErr_Fetch(&ptype, &pvalue, &ptrace); + Object result; + if(pvalue) result = pvalue; + PyErr_Restore(ptype, pvalue, ptrace); + return result; + } + + inline Object trace(const Exception&) // return the traceback of the error + { + PyObject *ptype, *pvalue, *ptrace; + PyErr_Fetch(&ptype, &pvalue, &ptrace); + Object result; + if(ptrace) result = ptrace; + PyErr_Restore(ptype, pvalue, ptrace); + return result; + } + +template +String seqref::str () const +{ + return the_item.str(); +} + +template +String seqref::repr () const +{ + return the_item.repr(); +} + +} // namespace Py +#endif // __CXX_Objects__h diff --git a/CXX/Version.hxx b/CXX/Version.hxx new file mode 100644 index 000000000000..96d911e118f9 --- /dev/null +++ b/CXX/Version.hxx @@ -0,0 +1,46 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __PyCXX_version_hxx__ +#define __PyCXX_version_hxx__ + +#define PYCXX_VERSION_MAJOR 5 +#define PYCXX_VERSION_MINOR 4 +#define PYCXX_VERSION_PATCH 2 +#define PYCXX_MAKEVERSION( major, minor, patch ) ((major<<16)|(minor<<8)|(patch)) +#define PYCXX_VERSION PYCXX_MAKEVERSION( PYCXX_VERSION_MAJOR, PYCXX_VERSION_MINOR, PYCXX_VERSION_PATCH ) +#endif diff --git a/CXX/WrapPython.h b/CXX/WrapPython.h new file mode 100644 index 000000000000..b7ac19658a36 --- /dev/null +++ b/CXX/WrapPython.h @@ -0,0 +1,49 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#ifndef __PyCXX_wrap_python_hxx__ +#define __PyCXX_wrap_python_hxx__ + +// pull in python definitions +#include + +// On some platforms we have to include time.h to get select defined +#if !defined(__WIN32__) && !defined(WIN32) && !defined(_WIN32) && !defined(_WIN64) +#include +#endif + +#endif diff --git a/CXX/cxx_extensions.cxx b/CXX/cxx_extensions.cxx new file mode 100644 index 000000000000..65fa21cf230e --- /dev/null +++ b/CXX/cxx_extensions.cxx @@ -0,0 +1,1464 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- +#include "CXX/Extensions.hxx" +#include "CXX/Exception.hxx" + +#include + +namespace Py +{ + +void Object::validate() +{ + // release pointer if not the right type + if( !accepts( p ) ) + { +#if defined( _CPPRTTI ) || defined( __GNUG__ ) + std::string s( "PyCXX: Error creating object of type " ); + s += (typeid( *this )).name(); + + if( p != 0 ) + { + String from_repr = repr(); + s += " from "; + s += from_repr.as_std_string(); + } + else + { + s += " from (nil)"; + } +#endif + release(); + if( PyErr_Occurred() ) + { // Error message already set + throw Exception(); + } + // Better error message if RTTI available +#if defined( _CPPRTTI ) || defined( __GNUG__ ) + throw TypeError( s ); +#else + throw TypeError( "PyCXX: type error." ); +#endif + } +} + +//================================================================================ +// +// Implementation of MethodTable +// +//================================================================================ + +PyMethodDef MethodTable::method( const char* method_name, PyCFunction f, int flags, const char* doc ) +{ + PyMethodDef m; + m.ml_name = const_cast( method_name ); + m.ml_meth = f; + m.ml_flags = flags; + m.ml_doc = const_cast( doc ); + return m; +} + +MethodTable::MethodTable() +{ + t.push_back( method( 0, 0, 0, 0 ) ); + mt = 0; +} + +MethodTable::~MethodTable() +{ + delete [] mt; +} + +void MethodTable::add( const char* method_name, PyCFunction f, const char* doc, int flag ) +{ + if( !mt ) + { + t.insert( t.end()-1, method( method_name, f, flag, doc ) ); + } + else + { + throw RuntimeError( "Too late to add a module method!" ); + } +} + +PyMethodDef* MethodTable::table() +{ + if( !mt ) + { + Py_ssize_t t1size = t.size(); + mt = new PyMethodDef[t1size]; + int j = 0; + for( std::vector::iterator i = t.begin(); i != t.end(); i++ ) + { + mt[j++] = *i; + } + } + return mt; +} + +//================================================================================ +// +// Implementation of ExtensionModule +// +//================================================================================ +ExtensionModuleBase::ExtensionModuleBase( const char *name ) + : module_name( name ) + , full_module_name( __Py_PackageContext() != NULL ? std::string( __Py_PackageContext() ) : module_name ) + , method_table() +{} + +ExtensionModuleBase::~ExtensionModuleBase() +{} + +const std::string &ExtensionModuleBase::name() const +{ + return module_name; +} + +const std::string &ExtensionModuleBase::fullName() const +{ + return full_module_name; +} + +class ExtensionModuleBasePtr : public PythonExtension +{ +public: + ExtensionModuleBasePtr( ExtensionModuleBase *_module ) + : module( _module ) + {} + virtual ~ExtensionModuleBasePtr() + {} + + ExtensionModuleBase *module; +}; + + +void ExtensionModuleBase::initialize( const char *module_doc ) +{ + PyObject *module_ptr = new ExtensionModuleBasePtr( this ); + + Py_InitModule4 + ( + const_cast( module_name.c_str() ), // name + method_table.table(), // methods + const_cast( module_doc ), // docs + module_ptr, // pass to functions as "self" + PYTHON_API_VERSION // API version + ); +} + +Py::Module ExtensionModuleBase::module(void) const +{ + return Module( full_module_name ); +} + +Py::Dict ExtensionModuleBase::moduleDictionary(void) const +{ + return module().getDict(); +} + +//-------------------------------------------------------------------------------- + +//================================================================================ +// +// Implementation of PythonType +// +//================================================================================ + +extern "C" +{ + static void standard_dealloc(PyObject* p); + // + // All the following functions redirect the call from Python + // onto the matching virtual function in PythonExtensionBase + // + static int print_handler (PyObject*, FILE *, int); + static PyObject* getattr_handler (PyObject*, char*); + static int setattr_handler (PyObject*, char*, PyObject*); + static PyObject* getattro_handler (PyObject*, PyObject*); + static int setattro_handler (PyObject*, PyObject*, PyObject*); + static int compare_handler (PyObject*, PyObject*); + static PyObject* richcompare_handler (PyObject*, PyObject*, int op); + static PyObject* repr_handler (PyObject*); + static PyObject* str_handler (PyObject*); + static long hash_handler (PyObject*); + static PyObject* call_handler (PyObject*, PyObject*, PyObject*); + static PyObject* iter_handler (PyObject*); + static PyObject* iternext_handler (PyObject*); + + // Sequence methods + static Py_ssize_t sequence_length_handler(PyObject*); + static PyObject* sequence_concat_handler(PyObject*,PyObject*); + static PyObject* sequence_repeat_handler(PyObject*, Py_ssize_t); + static PyObject* sequence_item_handler(PyObject*, Py_ssize_t); + static PyObject* sequence_slice_handler(PyObject*, Py_ssize_t, Py_ssize_t); + static int sequence_ass_item_handler(PyObject*, Py_ssize_t, PyObject*); + static int sequence_ass_slice_handler(PyObject*, Py_ssize_t, Py_ssize_t, PyObject*); + // Mapping + static Py_ssize_t mapping_length_handler(PyObject*); + static PyObject* mapping_subscript_handler(PyObject*, PyObject*); + static int mapping_ass_subscript_handler(PyObject*, PyObject*, PyObject*); + + // Numeric methods + static int number_nonzero_handler (PyObject*); + static PyObject* number_negative_handler (PyObject*); + static PyObject* number_positive_handler (PyObject*); + static PyObject* number_absolute_handler (PyObject*); + static PyObject* number_invert_handler (PyObject*); + static PyObject* number_int_handler (PyObject*); + static PyObject* number_float_handler (PyObject*); + static PyObject* number_long_handler (PyObject*); + static PyObject* number_oct_handler (PyObject*); + static PyObject* number_hex_handler (PyObject*); + static PyObject* number_add_handler (PyObject*, PyObject*); + static PyObject* number_subtract_handler (PyObject*, PyObject*); + static PyObject* number_multiply_handler (PyObject*, PyObject*); + static PyObject* number_divide_handler (PyObject*, PyObject*); + static PyObject* number_remainder_handler (PyObject*, PyObject*); + static PyObject* number_divmod_handler (PyObject*, PyObject*); + static PyObject* number_lshift_handler (PyObject*, PyObject*); + static PyObject* number_rshift_handler (PyObject*, PyObject*); + static PyObject* number_and_handler (PyObject*, PyObject*); + static PyObject* number_xor_handler (PyObject*, PyObject*); + static PyObject* number_or_handler (PyObject*, PyObject*); + static PyObject* number_power_handler(PyObject*, PyObject*, PyObject*); + + // Buffer + static Py_ssize_t buffer_getreadbuffer_handler (PyObject*, Py_ssize_t, void**); + static Py_ssize_t buffer_getwritebuffer_handler (PyObject*, Py_ssize_t, void**); + static Py_ssize_t buffer_getsegcount_handler (PyObject*, Py_ssize_t*); +} + + +extern "C" void standard_dealloc( PyObject* p ) +{ + PyMem_DEL( p ); +} + +PythonType & PythonType::supportSequenceType() +{ + if( !sequence_table ) + { + sequence_table = new PySequenceMethods; + memset( sequence_table, 0, sizeof( PySequenceMethods ) ); // ensure new fields are 0 + table->tp_as_sequence = sequence_table; + sequence_table->sq_length = sequence_length_handler; + sequence_table->sq_concat = sequence_concat_handler; + sequence_table->sq_repeat = sequence_repeat_handler; + sequence_table->sq_item = sequence_item_handler; + sequence_table->sq_slice = sequence_slice_handler; + + sequence_table->sq_ass_item = sequence_ass_item_handler; // BAS setup seperately? + sequence_table->sq_ass_slice = sequence_ass_slice_handler; // BAS setup seperately? + } + return *this; +} + +PythonType & PythonType::supportMappingType() +{ + if( !mapping_table ) + { + mapping_table = new PyMappingMethods; + memset( mapping_table, 0, sizeof( PyMappingMethods ) ); // ensure new fields are 0 + table->tp_as_mapping = mapping_table; + mapping_table->mp_length = mapping_length_handler; + mapping_table->mp_subscript = mapping_subscript_handler; + mapping_table->mp_ass_subscript = mapping_ass_subscript_handler; // BAS setup seperately? + } + return *this; +} + +PythonType & PythonType::supportNumberType() +{ + if( !number_table ) + { + number_table = new PyNumberMethods; + memset( number_table, 0, sizeof( PyNumberMethods ) ); // ensure new fields are 0 + table->tp_as_number = number_table; + number_table->nb_add = number_add_handler; + number_table->nb_subtract = number_subtract_handler; + number_table->nb_multiply = number_multiply_handler; + number_table->nb_divide = number_divide_handler; + number_table->nb_remainder = number_remainder_handler; + number_table->nb_divmod = number_divmod_handler; + number_table->nb_power = number_power_handler; + number_table->nb_negative = number_negative_handler; + number_table->nb_positive = number_positive_handler; + number_table->nb_absolute = number_absolute_handler; + number_table->nb_nonzero = number_nonzero_handler; + number_table->nb_invert = number_invert_handler; + number_table->nb_lshift = number_lshift_handler; + number_table->nb_rshift = number_rshift_handler; + number_table->nb_and = number_and_handler; + number_table->nb_xor = number_xor_handler; + number_table->nb_or = number_or_handler; + number_table->nb_coerce = 0; + number_table->nb_int = number_int_handler; + number_table->nb_long = number_long_handler; + number_table->nb_float = number_float_handler; + number_table->nb_oct = number_oct_handler; + number_table->nb_hex = number_hex_handler; + } + return *this; +} + +PythonType & PythonType::supportBufferType() +{ + if( !buffer_table ) + { + buffer_table = new PyBufferProcs; + memset( buffer_table, 0, sizeof( PyBufferProcs ) ); // ensure new fields are 0 + table->tp_as_buffer = buffer_table; + buffer_table->bf_getreadbuffer = buffer_getreadbuffer_handler; + buffer_table->bf_getwritebuffer = buffer_getwritebuffer_handler; + buffer_table->bf_getsegcount = buffer_getsegcount_handler; + } + return *this; +} + +// if you define one sequence method you must define +// all of them except the assigns + +PythonType::PythonType( size_t basic_size, int itemsize, const char *default_name ) + : table( new PyTypeObject ) + , sequence_table( NULL ) + , mapping_table( NULL ) + , number_table( NULL ) + , buffer_table( NULL ) +{ + memset( table, 0, sizeof( PyTypeObject ) ); // ensure new fields are 0 + *reinterpret_cast( table ) = py_object_initializer; + table->ob_type = _Type_Type(); + table->ob_size = 0; + table->tp_name = const_cast( default_name ); + table->tp_basicsize = basic_size; + table->tp_itemsize = itemsize; + table->tp_dealloc = ( destructor ) standard_dealloc; + table->tp_print = 0; + table->tp_getattr = 0; + table->tp_setattr = 0; + table->tp_compare = 0; + table->tp_repr = 0; + table->tp_as_number = 0; + table->tp_as_sequence = 0; + table->tp_as_mapping = 0; + table->tp_hash = 0; + table->tp_call = 0; + table->tp_str = 0; + table->tp_getattro = 0; + table->tp_setattro = 0; + table->tp_as_buffer = 0; + table->tp_flags = Py_TPFLAGS_DEFAULT; + table->tp_doc = 0; +#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 0) + // first use in 2.0 + table->tp_traverse = 0L; + table->tp_clear = 0L; +#else + table->tp_xxx5 = 0L; + table->tp_xxx6 = 0L; +#endif +#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 1) + // first defined in 2.1 + table->tp_richcompare = 0L; + table->tp_weaklistoffset = 0L; +#else + table->tp_xxx7 = 0L; + table->tp_xxx8 = 0L; +#endif + +#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 2) + // first defined in 2.3 + table->tp_iter = 0L; + table->tp_iternext = 0L; +#endif + +#ifdef COUNT_ALLOCS + table->tp_alloc = 0; + table->tp_free = 0; + table->tp_maxalloc = 0; + table->tp_next = 0; +#endif +} + +PythonType::~PythonType( ) +{ + delete table; + delete sequence_table; + delete mapping_table; + delete number_table; + delete buffer_table; +} + +PyTypeObject* PythonType::type_object( ) const +{return table;} + +PythonType & PythonType::name( const char* nam ) +{ + table->tp_name = const_cast( nam ); + return *this; +} + +const char *PythonType::getName() const +{ + return table->tp_name; +} + +PythonType & PythonType::doc( const char* d ) +{ + table->tp_doc = const_cast( d ); + return *this; +} + +const char *PythonType::getDoc() const +{ + return table->tp_doc; +} + +PythonType & PythonType::dealloc( void( *f )( PyObject* )) +{ + table->tp_dealloc = f; + return *this; +} + +PythonType & PythonType::supportPrint() +{ + table->tp_print = print_handler; + return *this; +} + +PythonType & PythonType::supportGetattr() +{ + table->tp_getattr = getattr_handler; + return *this; +} + +PythonType & PythonType::supportSetattr() +{ + table->tp_setattr = setattr_handler; + return *this; +} + +PythonType & PythonType::supportGetattro() +{ + table->tp_getattro = getattro_handler; + return *this; +} + +PythonType & PythonType::supportSetattro() +{ + table->tp_setattro = setattro_handler; + return *this; +} + +PythonType & PythonType::supportCompare() +{ + table->tp_compare = compare_handler; + return *this; +} + +#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 1) +PythonType & PythonType::supportRichCompare() +{ + table->tp_richcompare = richcompare_handler; + return *this; +} +#endif + +PythonType & PythonType::supportRepr() +{ + table->tp_repr = repr_handler; + return *this; +} + +PythonType & PythonType::supportStr() +{ + table->tp_str = str_handler; + return *this; +} + +PythonType & PythonType::supportHash() +{ + table->tp_hash = hash_handler; + return *this; +} + +PythonType & PythonType::supportCall() +{ + table->tp_call = call_handler; + return *this; +} + +PythonType & PythonType::supportIter() +{ + table->tp_iter = iter_handler; + table->tp_iternext = iternext_handler; + return *this; +} + +//-------------------------------------------------------------------------------- +// +// Handlers +// +//-------------------------------------------------------------------------------- +extern "C" int print_handler( PyObject *self, FILE *fp, int flags ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return p->print( fp, flags ); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +extern "C" PyObject* getattr_handler( PyObject *self, char *name ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->getattr( name ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" int setattr_handler( PyObject *self, char *name, PyObject *value ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return p->setattr( name, Py::Object( value ) ); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +extern "C" PyObject* getattro_handler( PyObject *self, PyObject *name ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->getattro( Py::Object( name ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" int setattro_handler( PyObject *self, PyObject *name, PyObject *value ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return p->setattro( Py::Object( name ), Py::Object( value ) ); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +extern "C" int compare_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return p->compare( Py::Object( other ) ); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 1) +extern "C" PyObject* richcompare_handler( PyObject *self, PyObject *other, int op ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->rich_compare( Py::Object( other ), op ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} +#endif + +extern "C" PyObject* repr_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->repr() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* str_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->str() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" long hash_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return p->hash(); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +extern "C" PyObject* call_handler( PyObject *self, PyObject *args, PyObject *kw ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + if( kw != NULL ) + return new_reference_to( p->call( Py::Object( args ), Py::Object( kw ) ) ); + else + return new_reference_to( p->call( Py::Object( args ), Py::Object() ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* iter_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->iter() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* iternext_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return p->iternext(); // might be a NULL ptr on end of iteration + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + + +// Sequence methods +extern "C" Py_ssize_t sequence_length_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return p->sequence_length(); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +extern "C" PyObject* sequence_concat_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->sequence_concat( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* sequence_repeat_handler( PyObject *self, Py_ssize_t count ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->sequence_repeat( count ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* sequence_item_handler( PyObject *self, Py_ssize_t index ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->sequence_item( index ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* sequence_slice_handler( PyObject *self, Py_ssize_t first, Py_ssize_t last ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->sequence_slice( first, last ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" int sequence_ass_item_handler( PyObject *self, Py_ssize_t index, PyObject *value ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return p->sequence_ass_item( index, Py::Object( value ) ); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +extern "C" int sequence_ass_slice_handler( PyObject *self, Py_ssize_t first, Py_ssize_t last, PyObject *value ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return p->sequence_ass_slice( first, last, Py::Object( value ) ); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +// Mapping +extern "C" Py_ssize_t mapping_length_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return p->mapping_length(); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +extern "C" PyObject* mapping_subscript_handler( PyObject *self, PyObject *key ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->mapping_subscript( Py::Object( key ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" int mapping_ass_subscript_handler( PyObject *self, PyObject *key, PyObject *value ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return p->mapping_ass_subscript( Py::Object( key ), Py::Object( value ) ); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +// Number +extern "C" int number_nonzero_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return p->number_nonzero(); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +extern "C" PyObject* number_negative_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->number_negative() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* number_positive_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->number_positive() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* number_absolute_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->number_absolute() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* number_invert_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->number_invert() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* number_int_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->number_int() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* number_float_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->number_float() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* number_long_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->number_long() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* number_oct_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->number_oct() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* number_hex_handler( PyObject *self ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->number_hex() ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* number_add_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->number_add( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* number_subtract_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->number_subtract( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* number_multiply_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->number_multiply( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* number_divide_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->number_divide( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* number_remainder_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->number_remainder( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* number_divmod_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->number_divmod( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* number_lshift_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->number_lshift( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* number_rshift_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->number_rshift( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* number_and_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->number_and( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* number_xor_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->number_xor( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* number_or_handler( PyObject *self, PyObject *other ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->number_or( Py::Object( other ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +extern "C" PyObject* number_power_handler( PyObject *self, PyObject *x1, PyObject *x2 ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return new_reference_to( p->number_power( Py::Object( x1 ), Py::Object( x2 ) ) ); + } + catch( Py::Exception & ) + { + return NULL; // indicate error + } +} + +// Buffer +extern "C" Py_ssize_t buffer_getreadbuffer_handler( PyObject *self, Py_ssize_t index, void **pp ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return p->buffer_getreadbuffer( index, pp ); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +extern "C" Py_ssize_t buffer_getwritebuffer_handler( PyObject *self, Py_ssize_t index, void **pp ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return p->buffer_getwritebuffer( index, pp ); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + +extern "C" Py_ssize_t buffer_getsegcount_handler( PyObject *self, Py_ssize_t *count ) +{ + try + { + PythonExtensionBase *p = static_cast( self ); + return p->buffer_getsegcount( count ); + } + catch( Py::Exception & ) + { + return -1; // indicate error + } +} + + +//================================================================================ +// +// Implementation of PythonExtensionBase +// +//================================================================================ +#define missing_method( method ) \ +throw RuntimeError( "Extension object does not support method " #method ); + +PythonExtensionBase::PythonExtensionBase() +{ +} + +PythonExtensionBase::~PythonExtensionBase() +{ + assert( ob_refcnt == 0 ); +} + +int PythonExtensionBase::print( FILE *, int ) +{ missing_method( print ); return -1; } + +int PythonExtensionBase::setattr( const char*, const Py::Object & ) +{ missing_method( setattr ); return -1; } + +Py::Object PythonExtensionBase::getattro( const Py::Object & ) +{ missing_method( getattro ); return Py::Nothing(); } + +int PythonExtensionBase::setattro( const Py::Object &, const Py::Object & ) +{ missing_method( setattro ); return -1; } + +int PythonExtensionBase::compare( const Py::Object & ) +{ missing_method( compare ); return -1; } + +#if PY_MAJOR_VERSION > 2 || (PY_MAJOR_VERSION == 2 && PY_MINOR_VERSION >= 1) +Py::Object PythonExtensionBase::rich_compare( const Py::Object &, int op ) +{ missing_method( rich_compare ); return Py::None(); } +#endif + +Py::Object PythonExtensionBase::repr() +{ missing_method( repr ); return Py::Nothing(); } + +Py::Object PythonExtensionBase::str() +{ missing_method( str ); return Py::Nothing(); } + +long PythonExtensionBase::hash() +{ missing_method( hash ); return -1; } + +Py::Object PythonExtensionBase::call( const Py::Object &, const Py::Object & ) +{ missing_method( call ); return Py::Nothing(); } + +Py::Object PythonExtensionBase::iter() +{ missing_method( iter ); return Py::Nothing(); } + +PyObject* PythonExtensionBase::iternext() +{ missing_method( iternext ); return NULL; } + + +// Sequence methods +int PythonExtensionBase::sequence_length() +{ missing_method( sequence_length ); return -1; } + +Py::Object PythonExtensionBase::sequence_concat( const Py::Object & ) +{ missing_method( sequence_concat ); return Py::Nothing(); } + +Py::Object PythonExtensionBase::sequence_repeat( Py_ssize_t ) +{ missing_method( sequence_repeat ); return Py::Nothing(); } + +Py::Object PythonExtensionBase::sequence_item( Py_ssize_t ) +{ missing_method( sequence_item ); return Py::Nothing(); } + +Py::Object PythonExtensionBase::sequence_slice( Py_ssize_t, Py_ssize_t ) +{ missing_method( sequence_slice ); return Py::Nothing(); } + +int PythonExtensionBase::sequence_ass_item( Py_ssize_t, const Py::Object & ) +{ missing_method( sequence_ass_item ); return -1; } + +int PythonExtensionBase::sequence_ass_slice( Py_ssize_t, Py_ssize_t, const Py::Object & ) +{ missing_method( sequence_ass_slice ); return -1; } + + +// Mapping +int PythonExtensionBase::mapping_length() +{ missing_method( mapping_length ); return -1; } + +Py::Object PythonExtensionBase::mapping_subscript( const Py::Object & ) +{ missing_method( mapping_subscript ); return Py::Nothing(); } + +int PythonExtensionBase::mapping_ass_subscript( const Py::Object &, const Py::Object & ) +{ missing_method( mapping_ass_subscript ); return -1; } + + +// Number +int PythonExtensionBase::number_nonzero() +{ missing_method( number_nonzero ); return -1; } + +Py::Object PythonExtensionBase::number_negative() +{ missing_method( number_negative ); return Py::Nothing(); } + +Py::Object PythonExtensionBase::number_positive() +{ missing_method( number_positive ); return Py::Nothing(); } + +Py::Object PythonExtensionBase::number_absolute() +{ missing_method( number_absolute ); return Py::Nothing(); } + +Py::Object PythonExtensionBase::number_invert() +{ missing_method( number_invert ); return Py::Nothing(); } + +Py::Object PythonExtensionBase::number_int() +{ missing_method( number_int ); return Py::Nothing(); } + +Py::Object PythonExtensionBase::number_float() +{ missing_method( number_float ); return Py::Nothing(); } + +Py::Object PythonExtensionBase::number_long() +{ missing_method( number_long ); return Py::Nothing(); } + +Py::Object PythonExtensionBase::number_oct() +{ missing_method( number_oct ); return Py::Nothing(); } + +Py::Object PythonExtensionBase::number_hex() +{ missing_method( number_hex ); return Py::Nothing(); } + +Py::Object PythonExtensionBase::number_add( const Py::Object & ) +{ missing_method( number_add ); return Py::Nothing(); } + +Py::Object PythonExtensionBase::number_subtract( const Py::Object & ) +{ missing_method( number_subtract ); return Py::Nothing(); } + +Py::Object PythonExtensionBase::number_multiply( const Py::Object & ) +{ missing_method( number_multiply ); return Py::Nothing(); } + +Py::Object PythonExtensionBase::number_divide( const Py::Object & ) +{ missing_method( number_divide ); return Py::Nothing(); } + +Py::Object PythonExtensionBase::number_remainder( const Py::Object & ) +{ missing_method( number_remainder ); return Py::Nothing(); } + +Py::Object PythonExtensionBase::number_divmod( const Py::Object & ) +{ missing_method( number_divmod ); return Py::Nothing(); } + +Py::Object PythonExtensionBase::number_lshift( const Py::Object & ) +{ missing_method( number_lshift ); return Py::Nothing(); } + +Py::Object PythonExtensionBase::number_rshift( const Py::Object & ) +{ missing_method( number_rshift ); return Py::Nothing(); } + +Py::Object PythonExtensionBase::number_and( const Py::Object & ) +{ missing_method( number_and ); return Py::Nothing(); } + +Py::Object PythonExtensionBase::number_xor( const Py::Object & ) +{ missing_method( number_xor ); return Py::Nothing(); } + +Py::Object PythonExtensionBase::number_or( const Py::Object & ) +{ missing_method( number_or ); return Py::Nothing(); } + +Py::Object PythonExtensionBase::number_power( const Py::Object &, const Py::Object & ) +{ missing_method( number_power ); return Py::Nothing(); } + + +// Buffer +Py_ssize_t PythonExtensionBase::buffer_getreadbuffer( Py_ssize_t, void** ) +{ missing_method( buffer_getreadbuffer ); return -1; } + +Py_ssize_t PythonExtensionBase::buffer_getwritebuffer( Py_ssize_t, void** ) +{ missing_method( buffer_getwritebuffer ); return -1; } + +Py_ssize_t PythonExtensionBase::buffer_getsegcount( Py_ssize_t* ) +{ missing_method( buffer_getsegcount ); return -1; } + +//-------------------------------------------------------------------------------- +// +// Method call handlers for +// PythonExtensionBase +// ExtensionModuleBase +// +//-------------------------------------------------------------------------------- + +extern "C" PyObject *method_keyword_call_handler( PyObject *_self_and_name_tuple, PyObject *_args, PyObject *_keywords ) +{ + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + void *self_as_void = PyCObject_AsVoidPtr( self_in_cobject ); + if( self_as_void == NULL ) + return NULL; + + ExtensionModuleBase *self = static_cast( self_as_void ); + + String py_name( self_and_name_tuple[1] ); + std::string name( py_name.as_std_string() ); + + Tuple args( _args ); + if( _keywords == NULL ) + { + Dict keywords; // pass an empty dict + + Object result( self->invoke_method_keyword( name, args, keywords ) ); + return new_reference_to( result.ptr() ); + } + + Dict keywords( _keywords ); + + Object result( self->invoke_method_keyword( name, args, keywords ) ); + return new_reference_to( result.ptr() ); + } + catch( Exception & ) + { + return 0; + } +} + +extern "C" PyObject *method_varargs_call_handler( PyObject *_self_and_name_tuple, PyObject *_args ) +{ + try + { + Tuple self_and_name_tuple( _self_and_name_tuple ); + + PyObject *self_in_cobject = self_and_name_tuple[0].ptr(); + void *self_as_void = PyCObject_AsVoidPtr( self_in_cobject ); + if( self_as_void == NULL ) + return NULL; + + ExtensionModuleBase *self = static_cast( self_as_void ); + + String py_name( self_and_name_tuple[1] ); + std::string name( py_name.as_std_string() ); + + Tuple args( _args ); + + Object result( self->invoke_method_varargs( name, args ) ); + + return new_reference_to( result.ptr() ); + } + catch( Exception & ) + { + return 0; + } +} + +extern "C" void do_not_dealloc( void * ) +{} + + +//-------------------------------------------------------------------------------- +// +// ExtensionExceptionType +// +//-------------------------------------------------------------------------------- +ExtensionExceptionType::ExtensionExceptionType() + : Py::Object() +{ +} + +void ExtensionExceptionType::init( ExtensionModuleBase &module, const std::string& name ) +{ + std::string module_name( module.fullName() ); + module_name += "."; + module_name += name; + + set( PyErr_NewException( const_cast( module_name.c_str() ), NULL, NULL ), true ); +} + +void ExtensionExceptionType::init( ExtensionModuleBase &module, const std::string& name, ExtensionExceptionType &parent) + { + std::string module_name( module.fullName() ); + module_name += "."; + module_name += name; + + set( PyErr_NewException( const_cast( module_name.c_str() ), parent.ptr(), NULL ), true ); +} + +ExtensionExceptionType::~ExtensionExceptionType() +{ +} + +Exception::Exception( ExtensionExceptionType &exception, const std::string& reason ) +{ + PyErr_SetString (exception.ptr(), reason.c_str()); +} + +Exception::Exception( ExtensionExceptionType &exception, Object &reason ) +{ + PyErr_SetObject (exception.ptr(), reason.ptr()); +} + +Exception::Exception( PyObject* exception, Object &reason ) +{ + PyErr_SetObject (exception, reason.ptr()); +} + +} // end of namespace Py diff --git a/CXX/cxxextensions.c b/CXX/cxxextensions.c new file mode 100644 index 000000000000..edae3be6bce9 --- /dev/null +++ b/CXX/cxxextensions.c @@ -0,0 +1,49 @@ +/*---------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//---------------------------------------------------------------------------*/ + +#include "CXX/WrapPython.h" + +#ifdef __cplusplus +extern "C" +{ +#endif + +PyObject py_object_initializer = {PyObject_HEAD_INIT(0)}; + +#ifdef __cplusplus +} +#endif diff --git a/CXX/cxxsupport.cxx b/CXX/cxxsupport.cxx new file mode 100644 index 000000000000..1dfba5a1908b --- /dev/null +++ b/CXX/cxxsupport.cxx @@ -0,0 +1,174 @@ +//----------------------------------------------------------------------------- +// +// Copyright (c) 1998 - 2007, The Regents of the University of California +// Produced at the Lawrence Livermore National Laboratory +// All rights reserved. +// +// This file is part of PyCXX. For details,see http://cxx.sourceforge.net/. The +// full copyright notice is contained in the file COPYRIGHT located at the root +// of the PyCXX distribution. +// +// Redistribution and use in source and binary forms, with or without +// modification, are permitted provided that the following conditions are met: +// +// - Redistributions of source code must retain the above copyright notice, +// this list of conditions and the disclaimer below. +// - Redistributions in binary form must reproduce the above copyright notice, +// this list of conditions and the disclaimer (as noted below) in the +// documentation and/or materials provided with the distribution. +// - Neither the name of the UC/LLNL nor the names of its contributors may be +// used to endorse or promote products derived from this software without +// specific prior written permission. +// +// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE +// ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OF THE UNIVERSITY OF +// CALIFORNIA, THE U.S. DEPARTMENT OF ENERGY OR CONTRIBUTORS BE LIABLE FOR +// ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT +// LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY +// OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH +// DAMAGE. +// +//----------------------------------------------------------------------------- + +#include "CXX/Objects.hxx" +namespace Py { + +Py_UNICODE unicode_null_string[1] = { 0 }; + +Type Object::type () const +{ + return Type (PyObject_Type (p), true); +} + +String Object::str () const +{ + return String (PyObject_Str (p), true); +} + +String Object::repr () const +{ + return String (PyObject_Repr (p), true); +} + +std::string Object::as_string() const +{ + return static_cast(str()); +} + +List Object::dir () const + { + return List (PyObject_Dir (p), true); + } + +bool Object::isType (const Type& t) const +{ + return type ().ptr() == t.ptr(); +} + +Char::operator String() const +{ + return String(ptr()); +} + +// TMM: non-member operaters for iterators - see above +// I've also made a bug fix in respect to the cxx code +// (dereffed the left.seq and right.seq comparison) +bool operator==(const Sequence::iterator& left, const Sequence::iterator& right) +{ + return left.eql( right ); +} + +bool operator!=(const Sequence::iterator& left, const Sequence::iterator& right) +{ + return left.neq( right ); +} + +bool operator< (const Sequence::iterator& left, const Sequence::iterator& right) +{ + return left.lss( right ); +} + +bool operator> (const Sequence::iterator& left, const Sequence::iterator& right) +{ + return left.gtr( right ); +} + +bool operator<=(const Sequence::iterator& left, const Sequence::iterator& right) +{ + return left.leq( right ); +} + +bool operator>=(const Sequence::iterator& left, const Sequence::iterator& right) +{ + return left.geq( right ); +} + +// now for const_iterator +bool operator==(const Sequence::const_iterator& left, const Sequence::const_iterator& right) +{ + return left.eql( right ); +} + +bool operator!=(const Sequence::const_iterator& left, const Sequence::const_iterator& right) +{ + return left.neq( right ); +} + +bool operator< (const Sequence::const_iterator& left, const Sequence::const_iterator& right) +{ + return left.lss( right ); +} + +bool operator> (const Sequence::const_iterator& left, const Sequence::const_iterator& right) +{ + return left.gtr( right ); +} + +bool operator<=(const Sequence::const_iterator& left, const Sequence::const_iterator& right) +{ + return left.leq( right ); +} + +bool operator>=(const Sequence::const_iterator& left, const Sequence::const_iterator& right) +{ + return left.geq( right ); +} + +// For mappings: +bool operator==(const Mapping::iterator& left, const Mapping::iterator& right) +{ + return left.eql( right ); +} + +bool operator!=(const Mapping::iterator& left, const Mapping::iterator& right) +{ + return left.neq( right ); +} + +// now for const_iterator +bool operator==(const Mapping::const_iterator& left, const Mapping::const_iterator& right) +{ + return left.eql( right ); +} + +bool operator!=(const Mapping::const_iterator& left, const Mapping::const_iterator& right) +{ + return left.neq( right ); +} + +// TMM: 31May'01 - Added the #ifndef so I can exclude iostreams. +#ifndef CXX_NO_IOSTREAMS +// output + +std::ostream& operator<< (std::ostream& os, const Object& ob) +{ + return (os << static_cast(ob.str())); +} +#endif + +} // Py From be579ee5100836808f68d332452b95786ba11bee Mon Sep 17 00:00:00 2001 From: John Hunter Date: Sat, 16 Jan 2010 23:07:42 +0000 Subject: [PATCH 0484/1000] rename CXX64 to CXX6 svn path=/trunk/matplotlib/; revision=8088 --- {CXX64 => CXX6}/Config.hxx | 0 {CXX64 => CXX6}/Exception.hxx | 0 {CXX64 => CXX6}/Extensions.hxx | 0 {CXX64 => CXX6}/IndirectPythonInterface.cxx | 0 {CXX64 => CXX6}/IndirectPythonInterface.hxx | 0 {CXX64 => CXX6}/Objects.hxx | 0 {CXX64 => CXX6}/Python2/Config.hxx | 0 {CXX64 => CXX6}/Python2/CxxDebug.hxx | 0 {CXX64 => CXX6}/Python2/Exception.hxx | 0 {CXX64 => CXX6}/Python2/ExtensionModule.hxx | 0 {CXX64 => CXX6}/Python2/ExtensionOldType.hxx | 0 {CXX64 => CXX6}/Python2/ExtensionType.hxx | 0 {CXX64 => CXX6}/Python2/ExtensionTypeBase.hxx | 0 {CXX64 => CXX6}/Python2/Extensions.hxx | 0 {CXX64 => CXX6}/Python2/IndirectPythonInterface.cxx | 0 {CXX64 => CXX6}/Python2/IndirectPythonInterface.hxx | 0 {CXX64 => CXX6}/Python2/Objects.hxx | 0 {CXX64 => CXX6}/Python2/PythonType.hxx | 0 {CXX64 => CXX6}/Python2/cxx_extensions.cxx | 0 {CXX64 => CXX6}/Python2/cxxextensions.c | 0 {CXX64 => CXX6}/Python2/cxxsupport.cxx | 0 {CXX64 => CXX6}/Python3/Config.hxx | 0 {CXX64 => CXX6}/Python3/CxxDebug.hxx | 0 {CXX64 => CXX6}/Python3/Exception.hxx | 0 {CXX64 => CXX6}/Python3/ExtensionModule.hxx | 0 {CXX64 => CXX6}/Python3/ExtensionOldType.hxx | 0 {CXX64 => CXX6}/Python3/ExtensionType.hxx | 0 {CXX64 => CXX6}/Python3/ExtensionTypeBase.hxx | 0 {CXX64 => CXX6}/Python3/Extensions.hxx | 0 {CXX64 => CXX6}/Python3/IndirectPythonInterface.cxx | 0 {CXX64 => CXX6}/Python3/IndirectPythonInterface.hxx | 0 {CXX64 => CXX6}/Python3/Objects.hxx | 0 {CXX64 => CXX6}/Python3/PythonType.hxx | 0 {CXX64 => CXX6}/Python3/cxx_extensions.cxx | 0 {CXX64 => CXX6}/Python3/cxxextensions.c | 0 {CXX64 => CXX6}/Python3/cxxsupport.cxx | 0 {CXX64 => CXX6}/Version.hxx | 0 {CXX64 => CXX6}/WrapPython.h | 0 {CXX64 => CXX6}/cxx_extensions.cxx | 0 {CXX64 => CXX6}/cxxextensions.c | 0 {CXX64 => CXX6}/cxxsupport.cxx | 0 41 files changed, 0 insertions(+), 0 deletions(-) rename {CXX64 => CXX6}/Config.hxx (100%) rename {CXX64 => CXX6}/Exception.hxx (100%) rename {CXX64 => CXX6}/Extensions.hxx (100%) rename {CXX64 => CXX6}/IndirectPythonInterface.cxx (100%) rename {CXX64 => CXX6}/IndirectPythonInterface.hxx (100%) rename {CXX64 => CXX6}/Objects.hxx (100%) rename {CXX64 => CXX6}/Python2/Config.hxx (100%) rename {CXX64 => CXX6}/Python2/CxxDebug.hxx (100%) rename {CXX64 => CXX6}/Python2/Exception.hxx (100%) rename {CXX64 => CXX6}/Python2/ExtensionModule.hxx (100%) rename {CXX64 => CXX6}/Python2/ExtensionOldType.hxx (100%) rename {CXX64 => CXX6}/Python2/ExtensionType.hxx (100%) rename {CXX64 => CXX6}/Python2/ExtensionTypeBase.hxx (100%) rename {CXX64 => CXX6}/Python2/Extensions.hxx (100%) rename {CXX64 => CXX6}/Python2/IndirectPythonInterface.cxx (100%) rename {CXX64 => CXX6}/Python2/IndirectPythonInterface.hxx (100%) rename {CXX64 => CXX6}/Python2/Objects.hxx (100%) rename {CXX64 => CXX6}/Python2/PythonType.hxx (100%) rename {CXX64 => CXX6}/Python2/cxx_extensions.cxx (100%) rename {CXX64 => CXX6}/Python2/cxxextensions.c (100%) rename {CXX64 => CXX6}/Python2/cxxsupport.cxx (100%) rename {CXX64 => CXX6}/Python3/Config.hxx (100%) rename {CXX64 => CXX6}/Python3/CxxDebug.hxx (100%) rename {CXX64 => CXX6}/Python3/Exception.hxx (100%) rename {CXX64 => CXX6}/Python3/ExtensionModule.hxx (100%) rename {CXX64 => CXX6}/Python3/ExtensionOldType.hxx (100%) rename {CXX64 => CXX6}/Python3/ExtensionType.hxx (100%) rename {CXX64 => CXX6}/Python3/ExtensionTypeBase.hxx (100%) rename {CXX64 => CXX6}/Python3/Extensions.hxx (100%) rename {CXX64 => CXX6}/Python3/IndirectPythonInterface.cxx (100%) rename {CXX64 => CXX6}/Python3/IndirectPythonInterface.hxx (100%) rename {CXX64 => CXX6}/Python3/Objects.hxx (100%) rename {CXX64 => CXX6}/Python3/PythonType.hxx (100%) rename {CXX64 => CXX6}/Python3/cxx_extensions.cxx (100%) rename {CXX64 => CXX6}/Python3/cxxextensions.c (100%) rename {CXX64 => CXX6}/Python3/cxxsupport.cxx (100%) rename {CXX64 => CXX6}/Version.hxx (100%) rename {CXX64 => CXX6}/WrapPython.h (100%) rename {CXX64 => CXX6}/cxx_extensions.cxx (100%) rename {CXX64 => CXX6}/cxxextensions.c (100%) rename {CXX64 => CXX6}/cxxsupport.cxx (100%) diff --git a/CXX64/Config.hxx b/CXX6/Config.hxx similarity index 100% rename from CXX64/Config.hxx rename to CXX6/Config.hxx diff --git a/CXX64/Exception.hxx b/CXX6/Exception.hxx similarity index 100% rename from CXX64/Exception.hxx rename to CXX6/Exception.hxx diff --git a/CXX64/Extensions.hxx b/CXX6/Extensions.hxx similarity index 100% rename from CXX64/Extensions.hxx rename to CXX6/Extensions.hxx diff --git a/CXX64/IndirectPythonInterface.cxx b/CXX6/IndirectPythonInterface.cxx similarity index 100% rename from CXX64/IndirectPythonInterface.cxx rename to CXX6/IndirectPythonInterface.cxx diff --git a/CXX64/IndirectPythonInterface.hxx b/CXX6/IndirectPythonInterface.hxx similarity index 100% rename from CXX64/IndirectPythonInterface.hxx rename to CXX6/IndirectPythonInterface.hxx diff --git a/CXX64/Objects.hxx b/CXX6/Objects.hxx similarity index 100% rename from CXX64/Objects.hxx rename to CXX6/Objects.hxx diff --git a/CXX64/Python2/Config.hxx b/CXX6/Python2/Config.hxx similarity index 100% rename from CXX64/Python2/Config.hxx rename to CXX6/Python2/Config.hxx diff --git a/CXX64/Python2/CxxDebug.hxx b/CXX6/Python2/CxxDebug.hxx similarity index 100% rename from CXX64/Python2/CxxDebug.hxx rename to CXX6/Python2/CxxDebug.hxx diff --git a/CXX64/Python2/Exception.hxx b/CXX6/Python2/Exception.hxx similarity index 100% rename from CXX64/Python2/Exception.hxx rename to CXX6/Python2/Exception.hxx diff --git a/CXX64/Python2/ExtensionModule.hxx b/CXX6/Python2/ExtensionModule.hxx similarity index 100% rename from CXX64/Python2/ExtensionModule.hxx rename to CXX6/Python2/ExtensionModule.hxx diff --git a/CXX64/Python2/ExtensionOldType.hxx b/CXX6/Python2/ExtensionOldType.hxx similarity index 100% rename from CXX64/Python2/ExtensionOldType.hxx rename to CXX6/Python2/ExtensionOldType.hxx diff --git a/CXX64/Python2/ExtensionType.hxx b/CXX6/Python2/ExtensionType.hxx similarity index 100% rename from CXX64/Python2/ExtensionType.hxx rename to CXX6/Python2/ExtensionType.hxx diff --git a/CXX64/Python2/ExtensionTypeBase.hxx b/CXX6/Python2/ExtensionTypeBase.hxx similarity index 100% rename from CXX64/Python2/ExtensionTypeBase.hxx rename to CXX6/Python2/ExtensionTypeBase.hxx diff --git a/CXX64/Python2/Extensions.hxx b/CXX6/Python2/Extensions.hxx similarity index 100% rename from CXX64/Python2/Extensions.hxx rename to CXX6/Python2/Extensions.hxx diff --git a/CXX64/Python2/IndirectPythonInterface.cxx b/CXX6/Python2/IndirectPythonInterface.cxx similarity index 100% rename from CXX64/Python2/IndirectPythonInterface.cxx rename to CXX6/Python2/IndirectPythonInterface.cxx diff --git a/CXX64/Python2/IndirectPythonInterface.hxx b/CXX6/Python2/IndirectPythonInterface.hxx similarity index 100% rename from CXX64/Python2/IndirectPythonInterface.hxx rename to CXX6/Python2/IndirectPythonInterface.hxx diff --git a/CXX64/Python2/Objects.hxx b/CXX6/Python2/Objects.hxx similarity index 100% rename from CXX64/Python2/Objects.hxx rename to CXX6/Python2/Objects.hxx diff --git a/CXX64/Python2/PythonType.hxx b/CXX6/Python2/PythonType.hxx similarity index 100% rename from CXX64/Python2/PythonType.hxx rename to CXX6/Python2/PythonType.hxx diff --git a/CXX64/Python2/cxx_extensions.cxx b/CXX6/Python2/cxx_extensions.cxx similarity index 100% rename from CXX64/Python2/cxx_extensions.cxx rename to CXX6/Python2/cxx_extensions.cxx diff --git a/CXX64/Python2/cxxextensions.c b/CXX6/Python2/cxxextensions.c similarity index 100% rename from CXX64/Python2/cxxextensions.c rename to CXX6/Python2/cxxextensions.c diff --git a/CXX64/Python2/cxxsupport.cxx b/CXX6/Python2/cxxsupport.cxx similarity index 100% rename from CXX64/Python2/cxxsupport.cxx rename to CXX6/Python2/cxxsupport.cxx diff --git a/CXX64/Python3/Config.hxx b/CXX6/Python3/Config.hxx similarity index 100% rename from CXX64/Python3/Config.hxx rename to CXX6/Python3/Config.hxx diff --git a/CXX64/Python3/CxxDebug.hxx b/CXX6/Python3/CxxDebug.hxx similarity index 100% rename from CXX64/Python3/CxxDebug.hxx rename to CXX6/Python3/CxxDebug.hxx diff --git a/CXX64/Python3/Exception.hxx b/CXX6/Python3/Exception.hxx similarity index 100% rename from CXX64/Python3/Exception.hxx rename to CXX6/Python3/Exception.hxx diff --git a/CXX64/Python3/ExtensionModule.hxx b/CXX6/Python3/ExtensionModule.hxx similarity index 100% rename from CXX64/Python3/ExtensionModule.hxx rename to CXX6/Python3/ExtensionModule.hxx diff --git a/CXX64/Python3/ExtensionOldType.hxx b/CXX6/Python3/ExtensionOldType.hxx similarity index 100% rename from CXX64/Python3/ExtensionOldType.hxx rename to CXX6/Python3/ExtensionOldType.hxx diff --git a/CXX64/Python3/ExtensionType.hxx b/CXX6/Python3/ExtensionType.hxx similarity index 100% rename from CXX64/Python3/ExtensionType.hxx rename to CXX6/Python3/ExtensionType.hxx diff --git a/CXX64/Python3/ExtensionTypeBase.hxx b/CXX6/Python3/ExtensionTypeBase.hxx similarity index 100% rename from CXX64/Python3/ExtensionTypeBase.hxx rename to CXX6/Python3/ExtensionTypeBase.hxx diff --git a/CXX64/Python3/Extensions.hxx b/CXX6/Python3/Extensions.hxx similarity index 100% rename from CXX64/Python3/Extensions.hxx rename to CXX6/Python3/Extensions.hxx diff --git a/CXX64/Python3/IndirectPythonInterface.cxx b/CXX6/Python3/IndirectPythonInterface.cxx similarity index 100% rename from CXX64/Python3/IndirectPythonInterface.cxx rename to CXX6/Python3/IndirectPythonInterface.cxx diff --git a/CXX64/Python3/IndirectPythonInterface.hxx b/CXX6/Python3/IndirectPythonInterface.hxx similarity index 100% rename from CXX64/Python3/IndirectPythonInterface.hxx rename to CXX6/Python3/IndirectPythonInterface.hxx diff --git a/CXX64/Python3/Objects.hxx b/CXX6/Python3/Objects.hxx similarity index 100% rename from CXX64/Python3/Objects.hxx rename to CXX6/Python3/Objects.hxx diff --git a/CXX64/Python3/PythonType.hxx b/CXX6/Python3/PythonType.hxx similarity index 100% rename from CXX64/Python3/PythonType.hxx rename to CXX6/Python3/PythonType.hxx diff --git a/CXX64/Python3/cxx_extensions.cxx b/CXX6/Python3/cxx_extensions.cxx similarity index 100% rename from CXX64/Python3/cxx_extensions.cxx rename to CXX6/Python3/cxx_extensions.cxx diff --git a/CXX64/Python3/cxxextensions.c b/CXX6/Python3/cxxextensions.c similarity index 100% rename from CXX64/Python3/cxxextensions.c rename to CXX6/Python3/cxxextensions.c diff --git a/CXX64/Python3/cxxsupport.cxx b/CXX6/Python3/cxxsupport.cxx similarity index 100% rename from CXX64/Python3/cxxsupport.cxx rename to CXX6/Python3/cxxsupport.cxx diff --git a/CXX64/Version.hxx b/CXX6/Version.hxx similarity index 100% rename from CXX64/Version.hxx rename to CXX6/Version.hxx diff --git a/CXX64/WrapPython.h b/CXX6/WrapPython.h similarity index 100% rename from CXX64/WrapPython.h rename to CXX6/WrapPython.h diff --git a/CXX64/cxx_extensions.cxx b/CXX6/cxx_extensions.cxx similarity index 100% rename from CXX64/cxx_extensions.cxx rename to CXX6/cxx_extensions.cxx diff --git a/CXX64/cxxextensions.c b/CXX6/cxxextensions.c similarity index 100% rename from CXX64/cxxextensions.c rename to CXX6/cxxextensions.c diff --git a/CXX64/cxxsupport.cxx b/CXX6/cxxsupport.cxx similarity index 100% rename from CXX64/cxxsupport.cxx rename to CXX6/cxxsupport.cxx From 50d2926a3159871a7d62b77eb23dadc8cb62201f Mon Sep 17 00:00:00 2001 From: John Hunter Date: Sat, 16 Jan 2010 23:14:11 +0000 Subject: [PATCH 0485/1000] move CXX to CXX5 svn path=/trunk/matplotlib/; revision=8089 --- {CXX => CXX5}/Config.hxx | 0 {CXX => CXX5}/Exception.hxx | 0 {CXX => CXX5}/Extensions.hxx | 0 {CXX => CXX5}/IndirectPythonInterface.cxx | 0 {CXX => CXX5}/IndirectPythonInterface.hxx | 0 {CXX => CXX5}/Objects.hxx | 0 {CXX => CXX5}/Version.hxx | 0 {CXX => CXX5}/WrapPython.h | 0 {CXX => CXX5}/cxx_extensions.cxx | 0 {CXX => CXX5}/cxxextensions.c | 0 {CXX => CXX5}/cxxsupport.cxx | 0 11 files changed, 0 insertions(+), 0 deletions(-) rename {CXX => CXX5}/Config.hxx (100%) rename {CXX => CXX5}/Exception.hxx (100%) rename {CXX => CXX5}/Extensions.hxx (100%) rename {CXX => CXX5}/IndirectPythonInterface.cxx (100%) rename {CXX => CXX5}/IndirectPythonInterface.hxx (100%) rename {CXX => CXX5}/Objects.hxx (100%) rename {CXX => CXX5}/Version.hxx (100%) rename {CXX => CXX5}/WrapPython.h (100%) rename {CXX => CXX5}/cxx_extensions.cxx (100%) rename {CXX => CXX5}/cxxextensions.c (100%) rename {CXX => CXX5}/cxxsupport.cxx (100%) diff --git a/CXX/Config.hxx b/CXX5/Config.hxx similarity index 100% rename from CXX/Config.hxx rename to CXX5/Config.hxx diff --git a/CXX/Exception.hxx b/CXX5/Exception.hxx similarity index 100% rename from CXX/Exception.hxx rename to CXX5/Exception.hxx diff --git a/CXX/Extensions.hxx b/CXX5/Extensions.hxx similarity index 100% rename from CXX/Extensions.hxx rename to CXX5/Extensions.hxx diff --git a/CXX/IndirectPythonInterface.cxx b/CXX5/IndirectPythonInterface.cxx similarity index 100% rename from CXX/IndirectPythonInterface.cxx rename to CXX5/IndirectPythonInterface.cxx diff --git a/CXX/IndirectPythonInterface.hxx b/CXX5/IndirectPythonInterface.hxx similarity index 100% rename from CXX/IndirectPythonInterface.hxx rename to CXX5/IndirectPythonInterface.hxx diff --git a/CXX/Objects.hxx b/CXX5/Objects.hxx similarity index 100% rename from CXX/Objects.hxx rename to CXX5/Objects.hxx diff --git a/CXX/Version.hxx b/CXX5/Version.hxx similarity index 100% rename from CXX/Version.hxx rename to CXX5/Version.hxx diff --git a/CXX/WrapPython.h b/CXX5/WrapPython.h similarity index 100% rename from CXX/WrapPython.h rename to CXX5/WrapPython.h diff --git a/CXX/cxx_extensions.cxx b/CXX5/cxx_extensions.cxx similarity index 100% rename from CXX/cxx_extensions.cxx rename to CXX5/cxx_extensions.cxx diff --git a/CXX/cxxextensions.c b/CXX5/cxxextensions.c similarity index 100% rename from CXX/cxxextensions.c rename to CXX5/cxxextensions.c diff --git a/CXX/cxxsupport.cxx b/CXX5/cxxsupport.cxx similarity index 100% rename from CXX/cxxsupport.cxx rename to CXX5/cxxsupport.cxx From cbd757c5bc4deed929061134b4afdec43dbdd1cf Mon Sep 17 00:00:00 2001 From: John Hunter Date: Sat, 16 Jan 2010 23:14:50 +0000 Subject: [PATCH 0486/1000] make CXX6 the default again svn path=/trunk/matplotlib/; revision=8090 --- {CXX6 => CXX}/Config.hxx | 0 {CXX6 => CXX}/Exception.hxx | 0 {CXX6 => CXX}/Extensions.hxx | 0 {CXX6 => CXX}/IndirectPythonInterface.cxx | 0 {CXX6 => CXX}/IndirectPythonInterface.hxx | 0 {CXX6 => CXX}/Objects.hxx | 0 {CXX6 => CXX}/Python2/Config.hxx | 0 {CXX6 => CXX}/Python2/CxxDebug.hxx | 0 {CXX6 => CXX}/Python2/Exception.hxx | 0 {CXX6 => CXX}/Python2/ExtensionModule.hxx | 0 {CXX6 => CXX}/Python2/ExtensionOldType.hxx | 0 {CXX6 => CXX}/Python2/ExtensionType.hxx | 0 {CXX6 => CXX}/Python2/ExtensionTypeBase.hxx | 0 {CXX6 => CXX}/Python2/Extensions.hxx | 0 {CXX6 => CXX}/Python2/IndirectPythonInterface.cxx | 0 {CXX6 => CXX}/Python2/IndirectPythonInterface.hxx | 0 {CXX6 => CXX}/Python2/Objects.hxx | 0 {CXX6 => CXX}/Python2/PythonType.hxx | 0 {CXX6 => CXX}/Python2/cxx_extensions.cxx | 0 {CXX6 => CXX}/Python2/cxxextensions.c | 0 {CXX6 => CXX}/Python2/cxxsupport.cxx | 0 {CXX6 => CXX}/Python3/Config.hxx | 0 {CXX6 => CXX}/Python3/CxxDebug.hxx | 0 {CXX6 => CXX}/Python3/Exception.hxx | 0 {CXX6 => CXX}/Python3/ExtensionModule.hxx | 0 {CXX6 => CXX}/Python3/ExtensionOldType.hxx | 0 {CXX6 => CXX}/Python3/ExtensionType.hxx | 0 {CXX6 => CXX}/Python3/ExtensionTypeBase.hxx | 0 {CXX6 => CXX}/Python3/Extensions.hxx | 0 {CXX6 => CXX}/Python3/IndirectPythonInterface.cxx | 0 {CXX6 => CXX}/Python3/IndirectPythonInterface.hxx | 0 {CXX6 => CXX}/Python3/Objects.hxx | 0 {CXX6 => CXX}/Python3/PythonType.hxx | 0 {CXX6 => CXX}/Python3/cxx_extensions.cxx | 0 {CXX6 => CXX}/Python3/cxxextensions.c | 0 {CXX6 => CXX}/Python3/cxxsupport.cxx | 0 {CXX6 => CXX}/Version.hxx | 0 {CXX6 => CXX}/WrapPython.h | 0 {CXX6 => CXX}/cxx_extensions.cxx | 0 {CXX6 => CXX}/cxxextensions.c | 0 {CXX6 => CXX}/cxxsupport.cxx | 0 41 files changed, 0 insertions(+), 0 deletions(-) rename {CXX6 => CXX}/Config.hxx (100%) rename {CXX6 => CXX}/Exception.hxx (100%) rename {CXX6 => CXX}/Extensions.hxx (100%) rename {CXX6 => CXX}/IndirectPythonInterface.cxx (100%) rename {CXX6 => CXX}/IndirectPythonInterface.hxx (100%) rename {CXX6 => CXX}/Objects.hxx (100%) rename {CXX6 => CXX}/Python2/Config.hxx (100%) rename {CXX6 => CXX}/Python2/CxxDebug.hxx (100%) rename {CXX6 => CXX}/Python2/Exception.hxx (100%) rename {CXX6 => CXX}/Python2/ExtensionModule.hxx (100%) rename {CXX6 => CXX}/Python2/ExtensionOldType.hxx (100%) rename {CXX6 => CXX}/Python2/ExtensionType.hxx (100%) rename {CXX6 => CXX}/Python2/ExtensionTypeBase.hxx (100%) rename {CXX6 => CXX}/Python2/Extensions.hxx (100%) rename {CXX6 => CXX}/Python2/IndirectPythonInterface.cxx (100%) rename {CXX6 => CXX}/Python2/IndirectPythonInterface.hxx (100%) rename {CXX6 => CXX}/Python2/Objects.hxx (100%) rename {CXX6 => CXX}/Python2/PythonType.hxx (100%) rename {CXX6 => CXX}/Python2/cxx_extensions.cxx (100%) rename {CXX6 => CXX}/Python2/cxxextensions.c (100%) rename {CXX6 => CXX}/Python2/cxxsupport.cxx (100%) rename {CXX6 => CXX}/Python3/Config.hxx (100%) rename {CXX6 => CXX}/Python3/CxxDebug.hxx (100%) rename {CXX6 => CXX}/Python3/Exception.hxx (100%) rename {CXX6 => CXX}/Python3/ExtensionModule.hxx (100%) rename {CXX6 => CXX}/Python3/ExtensionOldType.hxx (100%) rename {CXX6 => CXX}/Python3/ExtensionType.hxx (100%) rename {CXX6 => CXX}/Python3/ExtensionTypeBase.hxx (100%) rename {CXX6 => CXX}/Python3/Extensions.hxx (100%) rename {CXX6 => CXX}/Python3/IndirectPythonInterface.cxx (100%) rename {CXX6 => CXX}/Python3/IndirectPythonInterface.hxx (100%) rename {CXX6 => CXX}/Python3/Objects.hxx (100%) rename {CXX6 => CXX}/Python3/PythonType.hxx (100%) rename {CXX6 => CXX}/Python3/cxx_extensions.cxx (100%) rename {CXX6 => CXX}/Python3/cxxextensions.c (100%) rename {CXX6 => CXX}/Python3/cxxsupport.cxx (100%) rename {CXX6 => CXX}/Version.hxx (100%) rename {CXX6 => CXX}/WrapPython.h (100%) rename {CXX6 => CXX}/cxx_extensions.cxx (100%) rename {CXX6 => CXX}/cxxextensions.c (100%) rename {CXX6 => CXX}/cxxsupport.cxx (100%) diff --git a/CXX6/Config.hxx b/CXX/Config.hxx similarity index 100% rename from CXX6/Config.hxx rename to CXX/Config.hxx diff --git a/CXX6/Exception.hxx b/CXX/Exception.hxx similarity index 100% rename from CXX6/Exception.hxx rename to CXX/Exception.hxx diff --git a/CXX6/Extensions.hxx b/CXX/Extensions.hxx similarity index 100% rename from CXX6/Extensions.hxx rename to CXX/Extensions.hxx diff --git a/CXX6/IndirectPythonInterface.cxx b/CXX/IndirectPythonInterface.cxx similarity index 100% rename from CXX6/IndirectPythonInterface.cxx rename to CXX/IndirectPythonInterface.cxx diff --git a/CXX6/IndirectPythonInterface.hxx b/CXX/IndirectPythonInterface.hxx similarity index 100% rename from CXX6/IndirectPythonInterface.hxx rename to CXX/IndirectPythonInterface.hxx diff --git a/CXX6/Objects.hxx b/CXX/Objects.hxx similarity index 100% rename from CXX6/Objects.hxx rename to CXX/Objects.hxx diff --git a/CXX6/Python2/Config.hxx b/CXX/Python2/Config.hxx similarity index 100% rename from CXX6/Python2/Config.hxx rename to CXX/Python2/Config.hxx diff --git a/CXX6/Python2/CxxDebug.hxx b/CXX/Python2/CxxDebug.hxx similarity index 100% rename from CXX6/Python2/CxxDebug.hxx rename to CXX/Python2/CxxDebug.hxx diff --git a/CXX6/Python2/Exception.hxx b/CXX/Python2/Exception.hxx similarity index 100% rename from CXX6/Python2/Exception.hxx rename to CXX/Python2/Exception.hxx diff --git a/CXX6/Python2/ExtensionModule.hxx b/CXX/Python2/ExtensionModule.hxx similarity index 100% rename from CXX6/Python2/ExtensionModule.hxx rename to CXX/Python2/ExtensionModule.hxx diff --git a/CXX6/Python2/ExtensionOldType.hxx b/CXX/Python2/ExtensionOldType.hxx similarity index 100% rename from CXX6/Python2/ExtensionOldType.hxx rename to CXX/Python2/ExtensionOldType.hxx diff --git a/CXX6/Python2/ExtensionType.hxx b/CXX/Python2/ExtensionType.hxx similarity index 100% rename from CXX6/Python2/ExtensionType.hxx rename to CXX/Python2/ExtensionType.hxx diff --git a/CXX6/Python2/ExtensionTypeBase.hxx b/CXX/Python2/ExtensionTypeBase.hxx similarity index 100% rename from CXX6/Python2/ExtensionTypeBase.hxx rename to CXX/Python2/ExtensionTypeBase.hxx diff --git a/CXX6/Python2/Extensions.hxx b/CXX/Python2/Extensions.hxx similarity index 100% rename from CXX6/Python2/Extensions.hxx rename to CXX/Python2/Extensions.hxx diff --git a/CXX6/Python2/IndirectPythonInterface.cxx b/CXX/Python2/IndirectPythonInterface.cxx similarity index 100% rename from CXX6/Python2/IndirectPythonInterface.cxx rename to CXX/Python2/IndirectPythonInterface.cxx diff --git a/CXX6/Python2/IndirectPythonInterface.hxx b/CXX/Python2/IndirectPythonInterface.hxx similarity index 100% rename from CXX6/Python2/IndirectPythonInterface.hxx rename to CXX/Python2/IndirectPythonInterface.hxx diff --git a/CXX6/Python2/Objects.hxx b/CXX/Python2/Objects.hxx similarity index 100% rename from CXX6/Python2/Objects.hxx rename to CXX/Python2/Objects.hxx diff --git a/CXX6/Python2/PythonType.hxx b/CXX/Python2/PythonType.hxx similarity index 100% rename from CXX6/Python2/PythonType.hxx rename to CXX/Python2/PythonType.hxx diff --git a/CXX6/Python2/cxx_extensions.cxx b/CXX/Python2/cxx_extensions.cxx similarity index 100% rename from CXX6/Python2/cxx_extensions.cxx rename to CXX/Python2/cxx_extensions.cxx diff --git a/CXX6/Python2/cxxextensions.c b/CXX/Python2/cxxextensions.c similarity index 100% rename from CXX6/Python2/cxxextensions.c rename to CXX/Python2/cxxextensions.c diff --git a/CXX6/Python2/cxxsupport.cxx b/CXX/Python2/cxxsupport.cxx similarity index 100% rename from CXX6/Python2/cxxsupport.cxx rename to CXX/Python2/cxxsupport.cxx diff --git a/CXX6/Python3/Config.hxx b/CXX/Python3/Config.hxx similarity index 100% rename from CXX6/Python3/Config.hxx rename to CXX/Python3/Config.hxx diff --git a/CXX6/Python3/CxxDebug.hxx b/CXX/Python3/CxxDebug.hxx similarity index 100% rename from CXX6/Python3/CxxDebug.hxx rename to CXX/Python3/CxxDebug.hxx diff --git a/CXX6/Python3/Exception.hxx b/CXX/Python3/Exception.hxx similarity index 100% rename from CXX6/Python3/Exception.hxx rename to CXX/Python3/Exception.hxx diff --git a/CXX6/Python3/ExtensionModule.hxx b/CXX/Python3/ExtensionModule.hxx similarity index 100% rename from CXX6/Python3/ExtensionModule.hxx rename to CXX/Python3/ExtensionModule.hxx diff --git a/CXX6/Python3/ExtensionOldType.hxx b/CXX/Python3/ExtensionOldType.hxx similarity index 100% rename from CXX6/Python3/ExtensionOldType.hxx rename to CXX/Python3/ExtensionOldType.hxx diff --git a/CXX6/Python3/ExtensionType.hxx b/CXX/Python3/ExtensionType.hxx similarity index 100% rename from CXX6/Python3/ExtensionType.hxx rename to CXX/Python3/ExtensionType.hxx diff --git a/CXX6/Python3/ExtensionTypeBase.hxx b/CXX/Python3/ExtensionTypeBase.hxx similarity index 100% rename from CXX6/Python3/ExtensionTypeBase.hxx rename to CXX/Python3/ExtensionTypeBase.hxx diff --git a/CXX6/Python3/Extensions.hxx b/CXX/Python3/Extensions.hxx similarity index 100% rename from CXX6/Python3/Extensions.hxx rename to CXX/Python3/Extensions.hxx diff --git a/CXX6/Python3/IndirectPythonInterface.cxx b/CXX/Python3/IndirectPythonInterface.cxx similarity index 100% rename from CXX6/Python3/IndirectPythonInterface.cxx rename to CXX/Python3/IndirectPythonInterface.cxx diff --git a/CXX6/Python3/IndirectPythonInterface.hxx b/CXX/Python3/IndirectPythonInterface.hxx similarity index 100% rename from CXX6/Python3/IndirectPythonInterface.hxx rename to CXX/Python3/IndirectPythonInterface.hxx diff --git a/CXX6/Python3/Objects.hxx b/CXX/Python3/Objects.hxx similarity index 100% rename from CXX6/Python3/Objects.hxx rename to CXX/Python3/Objects.hxx diff --git a/CXX6/Python3/PythonType.hxx b/CXX/Python3/PythonType.hxx similarity index 100% rename from CXX6/Python3/PythonType.hxx rename to CXX/Python3/PythonType.hxx diff --git a/CXX6/Python3/cxx_extensions.cxx b/CXX/Python3/cxx_extensions.cxx similarity index 100% rename from CXX6/Python3/cxx_extensions.cxx rename to CXX/Python3/cxx_extensions.cxx diff --git a/CXX6/Python3/cxxextensions.c b/CXX/Python3/cxxextensions.c similarity index 100% rename from CXX6/Python3/cxxextensions.c rename to CXX/Python3/cxxextensions.c diff --git a/CXX6/Python3/cxxsupport.cxx b/CXX/Python3/cxxsupport.cxx similarity index 100% rename from CXX6/Python3/cxxsupport.cxx rename to CXX/Python3/cxxsupport.cxx diff --git a/CXX6/Version.hxx b/CXX/Version.hxx similarity index 100% rename from CXX6/Version.hxx rename to CXX/Version.hxx diff --git a/CXX6/WrapPython.h b/CXX/WrapPython.h similarity index 100% rename from CXX6/WrapPython.h rename to CXX/WrapPython.h diff --git a/CXX6/cxx_extensions.cxx b/CXX/cxx_extensions.cxx similarity index 100% rename from CXX6/cxx_extensions.cxx rename to CXX/cxx_extensions.cxx diff --git a/CXX6/cxxextensions.c b/CXX/cxxextensions.c similarity index 100% rename from CXX6/cxxextensions.c rename to CXX/cxxextensions.c diff --git a/CXX6/cxxsupport.cxx b/CXX/cxxsupport.cxx similarity index 100% rename from CXX6/cxxsupport.cxx rename to CXX/cxxsupport.cxx From 4a684060ca9fc4b6ecf8db337993a60d0a7cbc70 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Sun, 17 Jan 2010 01:42:30 +0000 Subject: [PATCH 0487/1000] added Goekhan's apply patch to qt editor svn path=/trunk/matplotlib/; revision=8091 --- .../backends/qt4_editor/figureoptions.py | 83 ++++++++++--------- .../backends/qt4_editor/formlayout.py | 42 +++++++--- 2 files changed, 74 insertions(+), 51 deletions(-) diff --git a/lib/matplotlib/backends/qt4_editor/figureoptions.py b/lib/matplotlib/backends/qt4_editor/figureoptions.py index 457e2f4b76d5..edcc588f2d70 100644 --- a/lib/matplotlib/backends/qt4_editor/figureoptions.py +++ b/lib/matplotlib/backends/qt4_editor/figureoptions.py @@ -112,43 +112,46 @@ def figure_edit(axes, parent=None): datalist = [(general, "Axes", "")] if has_curve: datalist.append((curves, "Curves", "")) - result = formlayout.fedit(datalist, title="Figure options", parent=parent, - icon=get_icon('qt4_editor_options.svg')) - if result is None: - return - - if has_curve: - general, curves = result - else: - general, = result - - # Set / General - title, xmin, xmax, xlabel, xscale, ymin, ymax, ylabel, yscale = general - axes.set_xscale(xscale) - axes.set_yscale(yscale) - axes.set_title(title) - axes.set_xlim(xmin, xmax) - axes.set_xlabel(xlabel) - axes.set_ylim(ymin, ymax) - axes.set_ylabel(ylabel) - - if has_curve: - # Set / Curves - for index, curve in enumerate(curves): - line = linedict[curvelabels[index]] - label, linestyle, linewidth, color, \ - marker, markersize, markerfacecolor, markeredgecolor = curve - line.set_label(label) - line.set_linestyle(linestyle) - line.set_linewidth(linewidth) - line.set_color(color) - if marker is not 'none': - line.set_marker(marker) - line.set_markersize(markersize) - line.set_markerfacecolor(markerfacecolor) - line.set_markeredgecolor(markeredgecolor) - - # Redraw - figure = axes.get_figure() - figure.canvas.draw() - + + def apply_callback(data): + """This function will be called to apply changes""" + if has_curve: + general, curves = data + else: + general, = data + + # Set / General + title, xmin, xmax, xlabel, xscale, ymin, ymax, ylabel, yscale = general + axes.set_xscale(xscale) + axes.set_yscale(yscale) + axes.set_title(title) + axes.set_xlim(xmin, xmax) + axes.set_xlabel(xlabel) + axes.set_ylim(ymin, ymax) + axes.set_ylabel(ylabel) + + if has_curve: + # Set / Curves + for index, curve in enumerate(curves): + line = linedict[curvelabels[index]] + label, linestyle, linewidth, color, \ + marker, markersize, markerfacecolor, markeredgecolor = curve + line.set_label(label) + line.set_linestyle(linestyle) + line.set_linewidth(linewidth) + line.set_color(color) + if marker is not 'none': + line.set_marker(marker) + line.set_markersize(markersize) + line.set_markerfacecolor(markerfacecolor) + line.set_markeredgecolor(markeredgecolor) + + # Redraw + figure = axes.get_figure() + figure.canvas.draw() + + data = formlayout.fedit(datalist, title="Figure options", parent=parent, + icon=get_icon('qt4_editor_options.svg'), apply=apply_callback) + if data is not None: + apply_callback(data) + diff --git a/lib/matplotlib/backends/qt4_editor/formlayout.py b/lib/matplotlib/backends/qt4_editor/formlayout.py index ef34562e1be4..0accdbbdade9 100644 --- a/lib/matplotlib/backends/qt4_editor/formlayout.py +++ b/lib/matplotlib/backends/qt4_editor/formlayout.py @@ -33,7 +33,11 @@ OTHER DEALINGS IN THE SOFTWARE. """ -__version__ = '1.0.5' +# History: +# 1.0.7: added support for "Apply" button +# 1.0.6: code cleaning + +__version__ = '1.0.7' __license__ = __doc__ DEBUG = False @@ -67,21 +71,21 @@ def __init__(self, parent=None): QPushButton.__init__(self, parent) self.setFixedSize(20, 20) self.setIconSize(QSize(12, 12)) - self.connect(self, SIGNAL("clicked()"), self.chooseColor) + self.connect(self, SIGNAL("clicked()"), self.choose_color) self._color = QColor() - def chooseColor(self): + def choose_color(self): rgba, valid = QColorDialog.getRgba(self._color.rgba(), self.parentWidget()) if valid: color = QColor.fromRgba(rgba) - self.setColor(color) + self.set_color(color) - def color(self): + def get_color(self): return self._color @pyqtSignature("QColor") - def setColor(self, color): + def set_color(self, color): if color != self._color: self._color = color self.emit(SIGNAL("colorChanged(QColor)"), self._color) @@ -89,7 +93,7 @@ def setColor(self, color): pixmap.fill(color) self.setIcon(QIcon(pixmap)) - color = pyqtProperty("QColor", color, setColor) + color = pyqtProperty("QColor", get_color, set_color) def text_to_qcolor(text): @@ -369,8 +373,10 @@ def get(self): class FormDialog(QDialog): """Form Dialog""" def __init__(self, data, title="", comment="", - icon=None, parent=None): + icon=None, parent=None, apply=None): super(FormDialog, self).__init__(parent) + + self.apply_callback = apply # Form if isinstance(data[0][0], (list, tuple)): @@ -387,6 +393,9 @@ def __init__(self, data, title="", comment="", # Button box bbox = QDialogButtonBox(QDialogButtonBox.Ok | QDialogButtonBox.Cancel) + if self.apply_callback is not None: + apply_btn = bbox.addButton(QDialogButtonBox.Apply) + self.connect(apply_btn, SIGNAL("clicked()"), self.apply) self.connect(bbox, SIGNAL("accepted()"), SLOT("accept()")) self.connect(bbox, SIGNAL("rejected()"), SLOT("reject()")) layout.addWidget(bbox) @@ -406,17 +415,25 @@ def reject(self): self.data = None QDialog.reject(self) + def apply(self): + self.apply_callback(self.formwidget.get()) + def get(self): """Return form result""" return self.data -def fedit(data, title="", comment="", icon=None, parent=None): +def fedit(data, title="", comment="", icon=None, parent=None, apply=None): """ Create form dialog and return result (if Cancel button is pressed, return None) data: datalist, datagroup + title: string + comment: string + icon: QIcon instance + parent: parent QWidget + apply: apply callback (function) datalist: list/tuple of (field_name, field_value) datagroup: list/tuple of (datalist *or* datagroup, title, comment) @@ -440,7 +457,7 @@ def fedit(data, title="", comment="", icon=None, parent=None): if QApplication.startingUp(): QApplication([]) - dialog = FormDialog(data, title, comment, icon, parent) + dialog = FormDialog(data, title, comment, icon, parent, apply) if dialog.exec_(): return dialog.get() @@ -471,8 +488,11 @@ def create_datagroup_example(): #--------- datalist example datalist = create_datalist_example() + def apply_test(data): + print "data:", data print "result:", fedit(datalist, title="Example", - comment="This is just an example.") + comment="This is just an example.", + apply=apply_test) #--------- datagroup example datagroup = create_datagroup_example() From efe110ba63780cb11ddc9cec0837bd2f91aa6a5a Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Fri, 22 Jan 2010 02:18:13 +0000 Subject: [PATCH 0488/1000] Contourf: change method of making bottom bound include zmin. This avoids a problem in colorbar tick labeling when zmin is 0. svn path=/trunk/matplotlib/; revision=8093 --- lib/matplotlib/contour.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index 35878f71a559..3e118a44208f 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -676,8 +676,17 @@ def __init__(self, ax, *args, **kwargs): if self.filled: if self.linewidths is not None: warnings.warn('linewidths is ignored by contourf') + lowers = self._levels[:-1] + if self.zmin == lowers[0]: + # Include minimum values in lowest interval + lowers = lowers.copy() # so we don't change self._levels + if self.logscale: + lowers[0] = 0.99 * self.zmin + else: + lowers[0] -= 1 uppers = self._levels[1:] + for level, level_upper in zip(lowers, uppers): nlist = C.trace(level, level_upper, nchunk = self.nchunk) nseg = len(nlist)//2 @@ -756,14 +765,6 @@ def _autolev(self, z, N): zmin = self.zmin self.locator.set_bounds(zmin, zmax) lev = self.locator() - zmargin = (zmax - zmin) * 0.000001 # so z < (zmax + zmargin) - if zmax >= lev[-1]: - lev[-1] += zmargin - if zmin <= lev[0]: - if self.logscale: - lev[0] = 0.99 * zmin - else: - lev[0] -= zmargin self._auto = True if self.filled: return lev @@ -1141,6 +1142,15 @@ def set_alpha(self, alpha): be removed. Chunking introduces artifacts at the chunk boundaries unless *antialiased* is *False*. + Note: contourf fills intervals that are closed at the top; that + is, for boundaries *z1* and *z2*, the filled region is:: + + z1 < z <= z2 + + There is one exception: if the lowest boundary coincides with + the minimum value of the *z* array, then that minimum value + will be included in the lowest interval. + **Examples:** .. plot:: mpl_examples/pylab_examples/contour_demo.py From 8d811af638005c7d712fdb0df8d517752b2020ea Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Fri, 22 Jan 2010 23:47:14 +0000 Subject: [PATCH 0489/1000] Fix units support for contour and contourf svn path=/trunk/matplotlib/; revision=8094 --- lib/matplotlib/contour.py | 25 +++++++++++++++---------- 1 file changed, 15 insertions(+), 10 deletions(-) diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index 3e118a44208f..16efcb1276a6 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -643,7 +643,7 @@ def __init__(self, ax, *args, **kwargs): if self.levels is None: self.levels = args[0].levels else: - x, y, z = self._contour_args(*args) + x, y, z = self._contour_args(args, kwargs) x0 = ma.minimum(x) x1 = ma.maximum(x) @@ -808,7 +808,7 @@ def _initialize_x_y(self, z): y = y[::-1] return np.meshgrid(x,y) - def _check_xyz(self, args): + def _check_xyz(self, args, kwargs): ''' For functions like contour, check that the dimensions of the input arrays match; if x and y are 1D, convert @@ -817,9 +817,10 @@ def _check_xyz(self, args): Possible change: I think we should make and use an ArgumentError Exception class (here and elsewhere). ''' - # We can strip away the x and y units - x = self.ax.convert_xunits( args[0] ) - y = self.ax.convert_yunits( args[1] ) + x, y = args[:2] + self.ax._process_unit_info(xdata=x, ydata=y, kwargs=kwargs) + x = self.ax.convert_xunits(x) + y = self.ax.convert_yunits(y) x = np.asarray(x, dtype=np.float64) y = np.asarray(y, dtype=np.float64) @@ -840,8 +841,7 @@ def _check_xyz(self, args): return x,y,z - - def _contour_args(self, *args): + def _contour_args(self, args, kwargs): if self.filled: fn = 'contourf' else: fn = 'contour' Nargs = len(args) @@ -849,7 +849,7 @@ def _contour_args(self, *args): z = ma.asarray(args[0], dtype=np.float64) x, y = self._initialize_x_y(z) elif Nargs <=4: - x,y,z = self._check_xyz(args[:3]) + x,y,z = self._check_xyz(args[:3], kwargs) else: raise TypeError("Too many arguments to %s; see help(%s)" % (fn,fn)) z = ma.masked_invalid(z, copy=False) @@ -1103,8 +1103,13 @@ def set_alpha(self, alpha): are included. These added ranges are then mapped to the special colormap values which default to the ends of the colormap range, but can be set via - :meth:`matplotlib.cm.Colormap.set_under` and - :meth:`matplotlib.cm.Colormap.set_over` methods. + :meth:`matplotlib.colors.Colormap.set_under` and + :meth:`matplotlib.colors.Colormap.set_over` methods. + + *xunits*, *yunits*: [ None | registered units ] + Override axis units by specifying an instance of a + :class:`matplotlib.units.ConversionInterface`. + contour-only keyword arguments: From e620bf177d1b37af90a859f7dfe8cc6d0c751d71 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Fri, 22 Jan 2010 23:48:35 +0000 Subject: [PATCH 0490/1000] Add units module to documentation svn path=/trunk/matplotlib/; revision=8095 --- doc/api/index.rst | 1 + doc/api/units_api.rst | 12 ++++++++++++ 2 files changed, 13 insertions(+) create mode 100644 doc/api/units_api.rst diff --git a/doc/api/index.rst b/doc/api/index.rst index 4d9f113ed3bf..36e4be2e59a7 100644 --- a/doc/api/index.rst +++ b/doc/api/index.rst @@ -32,4 +32,5 @@ pyplot_api.rst spine_api.rst ticker_api.rst + units_api.rst index_backend_api.rst diff --git a/doc/api/units_api.rst b/doc/api/units_api.rst new file mode 100644 index 000000000000..e7121c406aee --- /dev/null +++ b/doc/api/units_api.rst @@ -0,0 +1,12 @@ +***************** +matplotlib units +***************** + + +:mod:`matplotlib.units` +======================== + +.. automodule:: matplotlib.units + :members: + :undoc-members: + :show-inheritance: From 06bc628ba045631cc8713112cf788bbcd129ca1d Mon Sep 17 00:00:00 2001 From: Manuel Metz Date: Mon, 25 Jan 2010 20:31:41 +0000 Subject: [PATCH 0491/1000] Fixed a bug in hist with stepfilled and log=True svn path=/trunk/matplotlib/; revision=8097 --- CHANGELOG | 2 ++ lib/matplotlib/axes.py | 2 ++ 2 files changed, 4 insertions(+) diff --git a/CHANGELOG b/CHANGELOG index f2f65ad84684..cb38ae4b6239 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +2010-01-25 Fixed a bug reported by Olle Engdegard, when using + histograms with stepfilled and log=True - MM 2010-01-16 Upgraded CXX to 6.1.1 - JDH diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index 9e9c8a2da8b5..38603ac7a86b 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -7216,6 +7216,8 @@ def hist(self, x, bins=10, range=None, normed=False, weights=None, for m in n: y[1:-1:2], y[2::2] = m, m + if log: + y[y<1e-100]=1e-100 if orientation == 'horizontal': x,y = y,x elif orientation != 'vertical': From ea656bb7d44cd0395b86e33139665435a1ea06ca Mon Sep 17 00:00:00 2001 From: Ryan May Date: Thu, 28 Jan 2010 19:09:20 +0000 Subject: [PATCH 0492/1000] Support setting zorder keyword for ContourSet. svn path=/trunk/matplotlib/; revision=8098 --- lib/matplotlib/contour.py | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index 16efcb1276a6..f08370feb1b3 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -695,10 +695,13 @@ def __init__(self, ax, *args, **kwargs): paths = self._make_paths(segs, kinds) + # Default zorder taken from Collection + zorder = kwargs.get('zorder', 1) col = collections.PathCollection(paths, antialiaseds = (self.antialiased,), edgecolors= 'none', - alpha=self.alpha) + alpha=self.alpha, + zorder=zorder) self.ax.add_collection(col) self.collections.append(col) else: @@ -710,10 +713,14 @@ def __init__(self, ax, *args, **kwargs): nseg = len(nlist)//2 segs = nlist[:nseg] #kinds = nlist[nseg:] + + # Default zorder taken from LineCollection + zorder = kwargs.get('zorder', 2) col = collections.LineCollection(segs, linewidths = width, linestyle = lstyle, - alpha=self.alpha) + alpha=self.alpha, + zorder=zorder) col.set_label('_nolegend_') self.ax.add_collection(col, False) @@ -1228,4 +1235,3 @@ def find_nearest_contour( self, x, y, indices=None, pixel=True ): ymin = lc[imin,1] return (conmin,segmin,imin,xmin,ymin,dmin) - From 75097f910e676a8c4bc69d004bb47e95f691d84c Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Thu, 28 Jan 2010 20:37:46 +0000 Subject: [PATCH 0493/1000] experimental support of Image._image_skew_coordinate svn path=/trunk/matplotlib/; revision=8099 --- examples/api/demo_affine_image.py | 51 +++++++++++++++++++++++++++ lib/matplotlib/image.py | 57 ++++++++++++++++++++++++++++--- 2 files changed, 104 insertions(+), 4 deletions(-) create mode 100644 examples/api/demo_affine_image.py diff --git a/examples/api/demo_affine_image.py b/examples/api/demo_affine_image.py new file mode 100644 index 000000000000..aa65446553d4 --- /dev/null +++ b/examples/api/demo_affine_image.py @@ -0,0 +1,51 @@ +#!/usr/bin/env python + + +""" +For the backends that supports draw_image with optional affine +transform (e.g., ps backend), the image of the output should +have its boundary matches the red rectangles. +""" + +import numpy as np +import matplotlib.cm as cm +import matplotlib.mlab as mlab +import matplotlib.pyplot as plt +import matplotlib.transforms as mtransforms + +def get_image(): + delta = 0.25 + x = y = np.arange(-3.0, 3.0, delta) + X, Y = np.meshgrid(x, y) + Z1 = mlab.bivariate_normal(X, Y, 1.0, 1.0, 0.0, 0.0) + Z2 = mlab.bivariate_normal(X, Y, 1.5, 0.5, 1, 1) + Z = Z2-Z1 # difference of Gaussians + return Z + +def imshow_affine(ax, z, *kl, **kwargs): + im = ax.imshow(z, *kl, **kwargs) + x1, x2, y1, y2 = im.get_extent() + im._image_skew_coordinate = (x2, y1) + return im + + +if 1: + ax = plt.subplot(111) + Z = get_image() + im = imshow_affine(ax, Z, interpolation='nearest', cmap=cm.jet, + origin='lower', extent=[-2, 4, -3, 2]) + + trans_data2 = mtransforms.Affine2D().rotate_deg(30) + ax.transData + im.set_transform(trans_data2) + + # display intended extent of the image + x1, x2, y1, y2 = im.get_extent() + x3, y3 = x2, y1 + + ax.plot([x1, x2, x2, x1, x1], [y1, y1, y2, y2, y1], "r--", lw=3, + transform=trans_data2) + + ax.set_xlim(-3, 5) + ax.set_ylim(-4, 4) + + plt.savefig("demo_affine_image") diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index 8baab049ce52..c2dcb541163a 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -25,6 +25,7 @@ from matplotlib._image import * from matplotlib.transforms import BboxBase +import matplotlib.transforms as mtransforms class _AxesImageBase(martist.Artist, cm.ScalarMappable): zorder = 0 @@ -96,6 +97,12 @@ def __init__(self, ax, self._imcache = None + # this is an expetimental attribute, if True, unsampled image + # will be drawn using the affine transform that are + # appropriately skewed so that the given postition + # corresponds to the actual position in the coordinate. -JJL + self._image_skew_coordinate = None + self.update(kwargs) def get_size(self): @@ -204,6 +211,36 @@ def _get_unsampled_image(self, A, image_extents, viewlim): return im, xmin, ymin, dxintv, dyintv, sx, sy + @staticmethod + def _get_rotate_and_skew_transform(x1, y1, x2, y2, x3, y3): + """ + Retuen a transform that does + (x1, y1) -> (x1, y1) + (x2, y2) -> (x2, y2) + (x2, y1) -> (x3, y3) + + It was intended to derive a skew transform that preserve the + lower-left corner (x1, y1) and top-right corner(x2,y2), but + change the the lower-right-corner(x2, y1) to a new position + (x3, y3). + """ + tr1 = mtransforms.Affine2D() + tr1.translate(-x1, -y1) + x2a, y2a = tr1.transform_point((x2, y2)) + x3a, y3a = tr1.transform_point((x3, y3)) + + inv_mat = 1./(x2a*y3a-y2a*x3a) * np.mat([[y3a, -y2a],[-x3a, x2a]]) + + a, b = (inv_mat * np.mat([[x2a], [x2a]])).flat + c, d = (inv_mat * np.mat([[y2a], [0]])).flat + + tr2 = mtransforms.Affine2D.from_values(a, c, b, d, 0, 0) + + tr = (tr1 + tr2 + mtransforms.Affine2D().translate(x1, y1)).inverted().get_affine() + + return tr + + def _draw_unsampled_image(self, renderer, gc): """ draw unsampled image. The renderer should support a draw_image method @@ -227,11 +264,23 @@ def _draw_unsampled_image(self, renderer, gc): im._url = self.get_url() trans = self.get_transform() #axes.transData - xx1, yy1 = trans.transform_non_affine((xmin, ymin)) - xx2, yy2 = trans.transform_non_affine((xmin+dxintv, ymin+dyintv)) + xy = trans.transform_non_affine([(xmin, ymin), + (xmin+dxintv, ymin+dyintv)]) + xx1, yy1 = xy[0] + xx2, yy2 = xy[1] + + if self._image_skew_coordinate: + # skew the image when required. + x_lrc, y_lrc = self._image_skew_coordinate + xy = trans.transform_non_affine([(x_lrc, y_lrc)]) + xx3, yy3 = xy[0] + + tr_rotate_skew = self._get_rotate_and_skew_transform(xx1, yy1, xx2, yy2, xx3, yy3) + tr = tr_rotate_skew+trans.get_affine() + else: + tr = trans.get_affine() - renderer.draw_image(gc, xx1, yy1, im, xx2-xx1, yy2-yy1, - trans.get_affine()) + renderer.draw_image(gc, xx1, yy1, im, xx2-xx1, yy2-yy1, tr) def _check_unsampled_image(self, renderer): From b6147e3f43c600083d6dd53beec07593e48b2736 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Thu, 28 Jan 2010 21:46:12 +0000 Subject: [PATCH 0494/1000] added drabbable state to legend -- thanks Adam Fraser svn path=/trunk/matplotlib/; revision=8100 --- lib/matplotlib/legend.py | 69 +++++++++++++++++++++++++++++++++++++--- 1 file changed, 64 insertions(+), 5 deletions(-) diff --git a/lib/matplotlib/legend.py b/lib/matplotlib/legend.py index ccccd621f7be..fdca67110c69 100644 --- a/lib/matplotlib/legend.py +++ b/lib/matplotlib/legend.py @@ -38,6 +38,51 @@ from matplotlib.offsetbox import HPacker, VPacker, TextArea, DrawingArea +class DraggableLegend: + """helper code for a draggable legend -- see Legend.draggable""" + + def __init__(self, legend): + self.legend = legend + self.gotLegend = False + + c1 = legend.figure.canvas.mpl_connect('motion_notify_event', self.on_motion) + c2 = legend.figure.canvas.mpl_connect('pick_event', self.on_pick) + c3 = legend.figure.canvas.mpl_connect('button_release_event', self.on_release) + legend.set_picker(self.my_legend_picker) + self.cids = [c1, c2, c3] + + def on_motion(self, evt): + if self.gotLegend: + dx = evt.x - self.mouse_x + dy = evt.y - self.mouse_y + loc_in_canvas = self.legend_x + dx, self.legend_y + dy + loc_in_norm_axes = self.legend.parent.transAxes.inverted().transform_point(loc_in_canvas) + self.legend._loc = tuple(loc_in_norm_axes) + self.legend.figure.canvas.draw() + + def my_legend_picker(self, legend, evt): + return self.legend.legendPatch.contains(evt) + + def on_pick(self, evt): + legend = self.legend + if evt.artist == legend: + bbox = self.legend.get_window_extent() + self.mouse_x = evt.mouseevent.x + self.mouse_y = evt.mouseevent.y + self.legend_x = bbox.xmin + self.legend_y = bbox.ymin + self.gotLegend = 1 + + def on_release(self, event): + if self.gotLegend: + self.gotLegend = False + + def disconnect(self): + 'disconnect the callbacks' + for cid in self.cids: + self.legend.figure.canvas.mpl_disconnect(cid) + + class Legend(Artist): """ Place a legend on the axes at location loc. Labels are a @@ -182,7 +227,7 @@ def __init__(self, parent, handles, labels, self.texts = [] self.legendHandles = [] self._legend_title_box = None - + localdict = locals() for name in propnames: @@ -284,7 +329,7 @@ def __init__(self, parent, handles, labels, # We use FancyBboxPatch to draw a legend frame. The location # and size of the box will be updated during the drawing time. - + self.legendPatch = FancyBboxPatch( xy=(0.0, 0.0), width=1., height=1., facecolor=rcParams["axes.facecolor"], @@ -316,6 +361,7 @@ def __init__(self, parent, handles, labels, self._last_fontsize_points = self._fontsize + self._draggable = None def _set_artist_props(self, a): """ @@ -584,7 +630,7 @@ def _init_legend_box(self, handles, labels): textbox = TextArea(lab, textprops=label_prop, multilinebaseline=True, minimumdescent=True) text_list.append(textbox._text) - + labelboxes.append(textbox) handlebox = DrawingArea(width=self.handlelength*fontsize, @@ -597,7 +643,7 @@ def _init_legend_box(self, handles, labels): handleboxes.append(handlebox) - if len(handleboxes) > 0: + if len(handleboxes) > 0: # We calculate number of lows in each column. The first # (num_largecol) columns will have (nrows+1) rows, and remaing @@ -613,7 +659,7 @@ def _init_legend_box(self, handles, labels): [nrows] * num_smallcol) else: largecol, smallcol = [], [] - + handle_label = safezip(handleboxes, labelboxes) columnbox = [] for i0, di in largecol+smallcol: @@ -889,3 +935,16 @@ def _find_best_position(self, width, height, renderer, consider=None): return ox, oy + def draggable(self): + """ + toggle the draggable state; if on, you can drag the legend on + the canvas. The DraggableLegend helper class is returned + """ + if self._draggable is not None: + self._draggable.disconnect() + self._draggable = None + else: + + self._draggable = DraggableLegend(self) + + return self._draggable From fc40214a298fed4425400793aabcf0f987f5089e Mon Sep 17 00:00:00 2001 From: John Hunter Date: Fri, 29 Jan 2010 15:27:54 +0000 Subject: [PATCH 0495/1000] added state to legend toggle svn path=/trunk/matplotlib/; revision=8101 --- CHANGELOG | 3 +++ lib/matplotlib/legend.py | 32 ++++++++++++++++++++++++-------- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index cb38ae4b6239..de87929dbb9b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2010-01-29 Added draggable method to Legend to allow mouse drag +placement. Thanks Adam Fraser. JDH + 2010-01-25 Fixed a bug reported by Olle Engdegard, when using histograms with stepfilled and log=True - MM diff --git a/lib/matplotlib/legend.py b/lib/matplotlib/legend.py index fdca67110c69..5ceecf56f0e3 100644 --- a/lib/matplotlib/legend.py +++ b/lib/matplotlib/legend.py @@ -935,16 +935,32 @@ def _find_best_position(self, width, height, renderer, consider=None): return ox, oy - def draggable(self): + def draggable(self, state=None): """ - toggle the draggable state; if on, you can drag the legend on - the canvas. The DraggableLegend helper class is returned + Set the draggable state -- if state is + + * None : toggle the current state + + * True : turn draggable on + + * False : turn draggable off + + If draggable is on, you can drag the legend on the canvas with + the mouse. The DraggableLegend helper instance is returned if + draggable is on. """ - if self._draggable is not None: - self._draggable.disconnect() - self._draggable = None + is_draggable = self._draggable is not None + + # if state is None we'll toggle + if state is None: + state = not is_draggable + + if state: + if self._draggable is None: + self._draggable = DraggableLegend(self) else: - - self._draggable = DraggableLegend(self) + if self._draggable is not None: + self._draggable.disconnect() + self._draggable = None return self._draggable From fed9755f54905fedb56d0ac347181a8ec29099cd Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Fri, 29 Jan 2010 16:22:51 +0000 Subject: [PATCH 0496/1000] fix some issues in the bbox after the postscript distiller is run svn path=/trunk/matplotlib/; revision=8102 --- lib/matplotlib/backends/backend_ps.py | 48 +++++++++++++++++++++------ lib/matplotlib/font_manager.py | 1 - 2 files changed, 38 insertions(+), 11 deletions(-) diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py index a1366b3602ee..fa5fdb592617 100644 --- a/lib/matplotlib/backends/backend_ps.py +++ b/lib/matplotlib/backends/backend_ps.py @@ -1383,14 +1383,17 @@ def gs_distill(tmpfile, eps=False, ptype='letter', bbox=None): This yields smaller files without illegal encapsulated postscript operators. The output is low-level, converting text to outlines. """ - paper = '-sPAPERSIZE=%s'% ptype + + paper_option = "-sPAPERSIZE=%s" % ptype + psfile = tmpfile + '.ps' outfile = tmpfile + '.output' dpi = rcParams['ps.distiller.res'] if sys.platform == 'win32': gs_exe = 'gswin32c' else: gs_exe = 'gs' + command = '%s -dBATCH -dNOPAUSE -r%d -sDEVICE=pswrite %s -sOutputFile="%s" \ - "%s" > "%s"'% (gs_exe, dpi, paper, psfile, tmpfile, outfile) + "%s" > "%s"'% (gs_exe, dpi, paper_option, psfile, tmpfile, outfile) verbose.report(command, 'debug') exit_status = os.system(command) fh = file(outfile) @@ -1403,12 +1406,12 @@ def gs_distill(tmpfile, eps=False, ptype='letter', bbox=None): shutil.move(psfile, tmpfile) + # While it is best if above steps preserve the original bounding + # box, it does not seems to be the case. pstoeps not only convert + # the input to eps format, but also restores the original bbox. - # Since the the paper size is set to the figure size for eps - # output (in '_print_figure_tex'), pstoeps call is not required. - - #if eps: - # pstoeps(tmpfile, bbox) + if eps: + pstoeps(tmpfile, bbox) def xpdf_distill(tmpfile, eps=False, ptype='letter', bbox=None): @@ -1421,9 +1424,13 @@ def xpdf_distill(tmpfile, eps=False, ptype='letter', bbox=None): pdffile = tmpfile + '.pdf' psfile = tmpfile + '.ps' outfile = tmpfile + '.output' + + if eps: paper_option = "-dEPSCrop" + else: paper_option = "-sPAPERSIZE=%s" % ptype + command = 'ps2pdf -dAutoFilterColorImages=false \ --sColorImageFilter=FlateEncode -sPAPERSIZE=%s "%s" "%s" > "%s"'% \ -(ptype, tmpfile, pdffile, outfile) +-sColorImageFilter=FlateEncode %s "%s" "%s" > "%s"'% \ +(paper_option, tmpfile, pdffile, outfile) if sys.platform == 'win32': command = command.replace('=', '#') verbose.report(command, 'debug') exit_status = os.system(command) @@ -1445,17 +1452,37 @@ def xpdf_distill(tmpfile, eps=False, ptype='letter', bbox=None): os.remove(outfile) os.remove(tmpfile) shutil.move(psfile, tmpfile) + + + # Similar to the gs_distillier case, ps2pdf does not seem to + # preserve the bbox of the original file (at least w/ gs + # 8.61). Thus, the original bbox need to be resotred. + if eps: pstoeps(tmpfile, bbox) for fname in glob.glob(tmpfile+'.*'): os.remove(fname) +def get_bbox_header(l, b, r, t): + """ + return a postscript header stringfor the given bbox (l, b, r, t) + """ + + bbox_info = '%%%%BoundingBox: %d %d %d %d' % (l, b, npy.ceil(r), npy.ceil(t)) + hires_bbox_info = '%%%%HiResBoundingBox: %.6f %.6f %.6f %.6f' % (l, b, r, t) + + return '\n'.join([bbox_info, hires_bbox_info]) + + +# get_bbox is deprecated. I don't see any reason to use ghostscript to +# find the bounding box, as the required bounding box is alread known. def get_bbox(tmpfile, bbox): """ Use ghostscript's bbox device to find the center of the bounding box. Return an appropriately sized bbox centered around that point. A bit of a hack. """ + outfile = tmpfile + '.output' if sys.platform == 'win32': gs_exe = 'gswin32c' else: gs_exe = 'gs' @@ -1497,7 +1524,7 @@ def pstoeps(tmpfile, bbox): """ Convert the postscript to encapsulated postscript. """ - bbox_info = get_bbox(tmpfile, bbox) + bbox_info = get_bbox_header(*bbox) epsfile = tmpfile + '.eps' epsh = file(epsfile, 'w') @@ -1552,6 +1579,7 @@ def pstoeps(tmpfile, bbox): shutil.move(epsfile, tmpfile) + class FigureManagerPS(FigureManagerBase): pass diff --git a/lib/matplotlib/font_manager.py b/lib/matplotlib/font_manager.py index 5af570179676..192fffd0df2f 100644 --- a/lib/matplotlib/font_manager.py +++ b/lib/matplotlib/font_manager.py @@ -1204,7 +1204,6 @@ def findfont(self, prop, fontext='ttf', directory=None): for font in fontlist: if (directory is not None and os.path.commonprefix([font.fname, directory]) != directory): - print directory, font.fname, os.path.commonprefix([font.fname, directory]) continue # Matching family should have highest priority, so it is multiplied # by 10.0 From 4d46fec80fa25061cb6ae9c488af9fc3f63ca19c Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Fri, 29 Jan 2010 17:33:21 +0000 Subject: [PATCH 0497/1000] refactor draggable legend to support annotation svn path=/trunk/matplotlib/; revision=8103 --- examples/animation/draggable_legend.py | 43 +++++++ lib/matplotlib/legend.py | 92 ++++++-------- lib/matplotlib/offsetbox.py | 167 +++++++++++++++++++++++-- lib/matplotlib/text.py | 37 ++++++ 4 files changed, 274 insertions(+), 65 deletions(-) create mode 100644 examples/animation/draggable_legend.py diff --git a/examples/animation/draggable_legend.py b/examples/animation/draggable_legend.py new file mode 100644 index 000000000000..69d1d46c517f --- /dev/null +++ b/examples/animation/draggable_legend.py @@ -0,0 +1,43 @@ +import matplotlib.pyplot as plt + + +ax = plt.subplot(111) +ax.plot([1,2,3], label="test") + +l = ax.legend() +d1 = l.draggable() + +xy = 1, 2 +txt = ax.annotate("Test", xy, xytext=(-30, 30), + textcoords="offset points", + bbox=dict(boxstyle="round",fc=(0.2, 1, 1)), + arrowprops=dict(arrowstyle="->")) +d2 = txt.draggable() + + +from matplotlib._png import read_png +from matplotlib.cbook import get_sample_data + +from matplotlib.offsetbox import OffsetImage, AnnotationBbox + +fn = get_sample_data("lena.png", asfileobj=False) +arr_lena = read_png(fn) + +imagebox = OffsetImage(arr_lena, zoom=0.2) + +ab = AnnotationBbox(imagebox, xy, + xybox=(120., -80.), + xycoords='data', + boxcoords="offset points", + pad=0.5, + arrowprops=dict(arrowstyle="->", + connectionstyle="angle,angleA=0,angleB=90,rad=3") + ) + + +ax.add_artist(ab) + +d3 = ab.draggable() + + +plt.show() diff --git a/lib/matplotlib/legend.py b/lib/matplotlib/legend.py index 5ceecf56f0e3..6b0284057761 100644 --- a/lib/matplotlib/legend.py +++ b/lib/matplotlib/legend.py @@ -33,54 +33,26 @@ from matplotlib.patches import Patch, Rectangle, Shadow, FancyBboxPatch from matplotlib.collections import LineCollection, RegularPolyCollection, \ CircleCollection -from matplotlib.transforms import Bbox, BboxBase, TransformedBbox, BboxTransformTo +from matplotlib.transforms import Bbox, BboxBase, TransformedBbox, BboxTransformTo, BboxTransformFrom -from matplotlib.offsetbox import HPacker, VPacker, TextArea, DrawingArea +from matplotlib.offsetbox import HPacker, VPacker, TextArea, DrawingArea, DraggableOffsetBox -class DraggableLegend: - """helper code for a draggable legend -- see Legend.draggable""" - +class DraggableLegend(DraggableOffsetBox): def __init__(self, legend): - self.legend = legend - self.gotLegend = False - - c1 = legend.figure.canvas.mpl_connect('motion_notify_event', self.on_motion) - c2 = legend.figure.canvas.mpl_connect('pick_event', self.on_pick) - c3 = legend.figure.canvas.mpl_connect('button_release_event', self.on_release) - legend.set_picker(self.my_legend_picker) - self.cids = [c1, c2, c3] - - def on_motion(self, evt): - if self.gotLegend: - dx = evt.x - self.mouse_x - dy = evt.y - self.mouse_y - loc_in_canvas = self.legend_x + dx, self.legend_y + dy - loc_in_norm_axes = self.legend.parent.transAxes.inverted().transform_point(loc_in_canvas) - self.legend._loc = tuple(loc_in_norm_axes) - self.legend.figure.canvas.draw() - - def my_legend_picker(self, legend, evt): - return self.legend.legendPatch.contains(evt) + self.legend=legend + DraggableOffsetBox.__init__(self, legend, legend._legend_box) - def on_pick(self, evt): - legend = self.legend - if evt.artist == legend: - bbox = self.legend.get_window_extent() - self.mouse_x = evt.mouseevent.x - self.mouse_y = evt.mouseevent.y - self.legend_x = bbox.xmin - self.legend_y = bbox.ymin - self.gotLegend = 1 + def artist_picker(self, legend, evt): + return self.legend.legendPatch.contains(evt) - def on_release(self, event): - if self.gotLegend: - self.gotLegend = False + def finalize_offset(self): + loc_in_canvas = self.get_loc_in_canvas() - def disconnect(self): - 'disconnect the callbacks' - for cid in self.cids: - self.legend.figure.canvas.mpl_disconnect(cid) + bbox = self.legend.get_bbox_to_anchor() + _bbox_transform = BboxTransformFrom(bbox) + self.legend._loc = tuple(_bbox_transform.transform_point(loc_in_canvas)) + class Legend(Artist): @@ -323,7 +295,6 @@ def __init__(self, parent, handles, labels, 'Falling back on "upper right".') loc = 1 - self._loc = loc self._mode = mode self.set_bbox_to_anchor(bbox_to_anchor, bbox_transform) @@ -357,6 +328,8 @@ def __init__(self, parent, handles, labels, # init with null renderer self._init_legend_box(handles, labels) + self._loc = loc + self.set_title(title) self._last_fontsize_points = self._fontsize @@ -373,6 +346,28 @@ def _set_artist_props(self, a): a.set_transform(self.get_transform()) + def _set_loc(self, loc): + # find_offset function will be provided to _legend_box and + # _legend_box will draw itself at the location of the return + # value of the find_offset. + self._loc_real = loc + if loc == 0: + _findoffset = self._findoffset_best + else: + _findoffset = self._findoffset_loc + + #def findoffset(width, height, xdescent, ydescent): + # return _findoffset(width, height, xdescent, ydescent, renderer) + + self._legend_box.set_offset(_findoffset) + + self._loc_real = loc + + def _get_loc(self): + return self._loc_real + + _loc = property(_get_loc, _set_loc) + def _findoffset_best(self, width, height, xdescent, ydescent, renderer): "Helper function to locate the legend at its best position" ox, oy = self._find_best_position(width, height, renderer) @@ -401,19 +396,6 @@ def draw(self, renderer): renderer.open_group('legend') - # find_offset function will be provided to _legend_box and - # _legend_box will draw itself at the location of the return - # value of the find_offset. - if self._loc == 0: - _findoffset = self._findoffset_best - else: - _findoffset = self._findoffset_loc - - def findoffset(width, height, xdescent, ydescent): - return _findoffset(width, height, xdescent, ydescent, renderer) - - self._legend_box.set_offset(findoffset) - fontsize = renderer.points_to_pixels(self._fontsize) # if mode == fill, set the width of the legend_box to the diff --git a/lib/matplotlib/offsetbox.py b/lib/matplotlib/offsetbox.py index f4350e5776da..620dd22ae547 100644 --- a/lib/matplotlib/offsetbox.py +++ b/lib/matplotlib/offsetbox.py @@ -20,7 +20,7 @@ import matplotlib.text as mtext import numpy as np from matplotlib.transforms import Bbox, BboxBase, TransformedBbox, \ - IdentityTransform + IdentityTransform, BboxTransformFrom from matplotlib.font_manager import FontProperties from matplotlib.patches import FancyBboxPatch, FancyArrowPatch @@ -168,14 +168,14 @@ def set_offset(self, xy): """ self._offset = xy - def get_offset(self, width, height, xdescent, ydescent): + def get_offset(self, width, height, xdescent, ydescent, renderer): """ Get the offset accepts extent of the box """ if callable(self._offset): - return self._offset(width, height, xdescent, ydescent) + return self._offset(width, height, xdescent, ydescent, renderer) else: return self._offset @@ -222,7 +222,7 @@ def get_window_extent(self, renderer): get the bounding box in display space. ''' w, h, xd, yd, offsets = self.get_extent_offsets(renderer) - px, py = self.get_offset(w, h, xd, yd) + px, py = self.get_offset(w, h, xd, yd, renderer) return mtransforms.Bbox.from_bounds(px-xd, py-yd, w, h) def draw(self, renderer): @@ -233,7 +233,7 @@ def draw(self, renderer): width, height, xdescent, ydescent, offsets = self.get_extent_offsets(renderer) - px, py = self.get_offset(width, height, xdescent, ydescent) + px, py = self.get_offset(width, height, xdescent, ydescent, renderer) for c, (ox, oy) in zip(self.get_visible_children(), offsets): c.set_offset((px+ox, py+oy)) @@ -946,7 +946,7 @@ def get_window_extent(self, renderer): ''' self._update_offset_func(renderer) w, h, xd, yd = self.get_extent(renderer) - ox, oy = self.get_offset(w, h, xd, yd) + ox, oy = self.get_offset(w, h, xd, yd, renderer) return Bbox.from_bounds(ox-xd, oy-yd, w, h) @@ -996,7 +996,7 @@ def draw(self, renderer): width, height, xdescent, ydescent = self.get_extent(renderer) - px, py = self.get_offset(width, height, xdescent, ydescent) + px, py = self.get_offset(width, height, xdescent, ydescent, renderer) self.get_child().set_offset((px, py)) self.get_child().draw(renderer) @@ -1121,12 +1121,15 @@ def get_zoom(self): # self.offset_transform.translate(xy[0], xy[1]) + def get_offset(self): """ return offset of the container. """ return self._offset + def get_children(self): + return [self.image] def get_window_extent(self, renderer): ''' @@ -1243,9 +1246,9 @@ def __init__(self, offsetbox, xy, def contains(self,event): t,tinfo = self.offsetbox.contains(event) - if self.arrow is not None: - a,ainfo=self.arrow.contains(event) - t = t or a + #if self.arrow_patch is not None: + # a,ainfo=self.arrow_patch.contains(event) + # t = t or a # self.arrow_patch is currently not checked as this can be a line - JJ @@ -1380,6 +1383,150 @@ def draw(self, renderer): +class DraggableBase(object): + """ + helper code for a draggable artist (legend, offsetbox) + The derived class must override following two method. + + def saveoffset(self): + pass + + def update_offset(self, dx, dy): + pass + + *saveoffset* is called when the object is picked for dragging and it is + meant to save reference position of the artist. + + *update_offset* is called during the dragging. dx and dy is the pixel + offset from the point where the mouse drag started. + + Optionally you may override following two methods. + + def artist_picker(self, artist, evt): + return self.ref_artist.contains(evt) + + def finalize_offset(self): + pass + + *artist_picker* is a picker method that will be + used. *finalize_offset* is called when the mouse is released. In + current implementaion of DraggableLegend and DraggableAnnotation, + *update_offset* places the artists simply in display + coordinates. And *finalize_offset* recalculate their position in + the normalized axes coordinate and set a relavant attribute. + + """ + def __init__(self, ref_artist): + self.ref_artist = ref_artist + self.got_artist = False + + self.canvas = self.ref_artist.figure.canvas + c2 = self.canvas.mpl_connect('pick_event', self.on_pick) + c3 = self.canvas.mpl_connect('button_release_event', self.on_release) + + ref_artist.set_picker(self.artist_picker) + self.cids = [c2, c3] + + def on_motion(self, evt): + if self.got_artist: + dx = evt.x - self.mouse_x + dy = evt.y - self.mouse_y + self.update_offset(dx, dy) + + def on_pick(self, evt): + if evt.artist == self.ref_artist: + + self.save_offset() + self.mouse_x = evt.mouseevent.x + self.mouse_y = evt.mouseevent.y + self.got_artist = True + + self._c1 = self.canvas.mpl_connect('motion_notify_event', self.on_motion) + + def on_release(self, event): + if self.got_artist: + self.finalize_offset() + self.got_artist = False + self.canvas.mpl_disconnect(self._c1) + + def disconnect(self): + 'disconnect the callbacks' + for cid in self.cids: + self.canvas.mpl_disconnect(cid) + + def artist_picker(self, artist, evt): + return self.ref_artist.contains(evt) + + def save_offset(self): + pass + + def update_offset(self, dx, dy): + pass + + def finalize_offset(self): + pass + + +class DraggableOffsetBox(DraggableBase): + def __init__(self, ref_artist, offsetbox): + DraggableBase.__init__(self, ref_artist) + self.offsetbox = offsetbox + + def save_offset(self): + offsetbox = self.offsetbox + renderer = offsetbox.figure._cachedRenderer + w, h, xd, yd = offsetbox.get_extent(renderer) + offset = offsetbox.get_offset(w, h, xd, yd, renderer) + self.offsetbox_x, self.offsetbox_y = offset + + def update_offset(self, dx, dy): + loc_in_canvas = self.offsetbox_x + dx, self.offsetbox_y + dy + self.offsetbox.set_offset(loc_in_canvas) + self.offsetbox.figure.canvas.draw() + + def get_loc_in_canvas(self): + + offsetbox=self.offsetbox + renderer = offsetbox.figure._cachedRenderer + w, h, xd, yd = offsetbox.get_extent(renderer) + ox, oy = offsetbox._offset + loc_in_canvas = (ox-xd, oy-yd) + + return loc_in_canvas + + +class DraggableAnnotation(DraggableBase): + def __init__(self, annotation): + DraggableBase.__init__(self, annotation) + self.annotation = annotation + + def save_offset(self): + ann = self.annotation + x, y = ann.xytext + if isinstance(ann.textcoords, tuple): + xcoord, ycoord = ann.textcoords + x1, y1 = ann._get_xy(x, y, xcoord) + x2, y2 = ann._get_xy(x, y, ycoord) + ox0, oy0 = x1, y2 + else: + ox0, oy0 = ann._get_xy(x, y, ann.textcoords) + + self.ox, self.oy = ox0, oy0 + self.annotation.textcoords = "figure pixels" + + def update_offset(self, dx, dy): + ann = self.annotation + ann.xytext = self.ox + dx, self.oy + dy + x, y = ann.xytext + xy = ann._get_xy(x, y, ann.textcoords) + self.canvas.draw() + + def finalize_offset(self): + loc_in_canvas = self.annotation.xytext + self.annotation.textcoords = "axes fraction" + pos_axes_fraction = self.annotation.axes.transAxes.inverted().transform_point(loc_in_canvas) + self.annotation.xytext = tuple(pos_axes_fraction) + if __name__ == "__main__": diff --git a/lib/matplotlib/text.py b/lib/matplotlib/text.py index fc5a7819b0e7..9eb734068b47 100644 --- a/lib/matplotlib/text.py +++ b/lib/matplotlib/text.py @@ -1402,6 +1402,9 @@ def __init__(self, self.textcoords = textcoords self.set_annotation_clip(annotation_clip) + self._draggable = None + + def _get_xy(self, x, y, s): if s=='data': trans = self.axes.transData @@ -1534,6 +1537,36 @@ def _check_xy(self, renderer, xy_pixel): return True + def draggable(self, state=None): + """ + Set the draggable state -- if state is + + * None : toggle the current state + + * True : turn draggable on + + * False : turn draggable off + + If draggable is on, you can drag the annotation on the canvas with + the mouse. The DraggableAnnotation helper instance is returned if + draggable is on. + """ + from matplotlib.offsetbox import DraggableAnnotation + is_draggable = self._draggable is not None + + # if state is None we'll toggle + if state is None: + state = not is_draggable + + if state: + if self._draggable is None: + self._draggable = DraggableAnnotation(self) + else: + if self._draggable is not None: + self._draggable.disconnect() + self._draggable = None + + return self._draggable class Annotation(Text, _AnnotationBase): @@ -1661,6 +1694,7 @@ def __init__(self, s, xy, else: self.arrow_patch = None + def contains(self,event): t,tinfo = Text.contains(self,event) if self.arrow is not None: @@ -1803,6 +1837,9 @@ def draw(self, renderer): Text.draw(self, renderer) + + + docstring.interpd.update(Annotation=Annotation.__init__.__doc__) From ce36f80b0bf8ac53ee34114cfd8b8809b2757f40 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Fri, 29 Jan 2010 17:33:34 +0000 Subject: [PATCH 0498/1000] fix axes_grid for offsetbox api change svn path=/trunk/matplotlib/; revision=8104 --- lib/matplotlib/offsetbox.py | 2 +- lib/mpl_toolkits/axes_grid/inset_locator.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/offsetbox.py b/lib/matplotlib/offsetbox.py index 620dd22ae547..26ce205f4c1e 100644 --- a/lib/matplotlib/offsetbox.py +++ b/lib/matplotlib/offsetbox.py @@ -958,7 +958,7 @@ def _update_offset_func(self, renderer, fontsize=None): if fontsize is None: fontsize = renderer.points_to_pixels(self.prop.get_size_in_points()) - def _offset(w, h, xd, yd, fontsize=fontsize, self=self): + def _offset(w, h, xd, yd, renderer, fontsize=fontsize, self=self): bbox = Bbox.from_bounds(0, 0, w, h) borderpad = self.borderpad*fontsize bbox_to_anchor = self.get_bbox_to_anchor() diff --git a/lib/mpl_toolkits/axes_grid/inset_locator.py b/lib/mpl_toolkits/axes_grid/inset_locator.py index 83ffa436087e..46f5f342f5e1 100644 --- a/lib/mpl_toolkits/axes_grid/inset_locator.py +++ b/lib/mpl_toolkits/axes_grid/inset_locator.py @@ -47,7 +47,7 @@ def __call__(self, ax, renderer): width, height, xdescent, ydescent = self.get_extent(renderer) - px, py = self.get_offset(width, height, 0, 0) + px, py = self.get_offset(width, height, 0, 0, renderer) bbox_canvas = mtrans.Bbox.from_bounds(px, py, width, height) tr = ax.figure.transFigure.inverted() bb = mtrans.TransformedBbox(bbox_canvas, tr) From 927521448c13979cf18bf919327f0165815ca52d Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Fri, 29 Jan 2010 18:03:13 +0000 Subject: [PATCH 0499/1000] draggable legend now optionally blitted svn path=/trunk/matplotlib/; revision=8105 --- examples/animation/draggable_legend.py | 2 +- lib/matplotlib/legend.py | 9 +++--- lib/matplotlib/offsetbox.py | 40 +++++++++++++++++++------- lib/matplotlib/text.py | 4 +-- 4 files changed, 38 insertions(+), 17 deletions(-) diff --git a/examples/animation/draggable_legend.py b/examples/animation/draggable_legend.py index 69d1d46c517f..fca88158b02c 100644 --- a/examples/animation/draggable_legend.py +++ b/examples/animation/draggable_legend.py @@ -37,7 +37,7 @@ ax.add_artist(ab) -d3 = ab.draggable() +d3 = ab.draggable(use_blit=True) plt.show() diff --git a/lib/matplotlib/legend.py b/lib/matplotlib/legend.py index 6b0284057761..335beb148de2 100644 --- a/lib/matplotlib/legend.py +++ b/lib/matplotlib/legend.py @@ -39,9 +39,10 @@ class DraggableLegend(DraggableOffsetBox): - def __init__(self, legend): + def __init__(self, legend, use_blit=False): self.legend=legend - DraggableOffsetBox.__init__(self, legend, legend._legend_box) + DraggableOffsetBox.__init__(self, legend, legend._legend_box, + use_blit=use_blit) def artist_picker(self, legend, evt): return self.legend.legendPatch.contains(evt) @@ -917,7 +918,7 @@ def _find_best_position(self, width, height, renderer, consider=None): return ox, oy - def draggable(self, state=None): + def draggable(self, state=None, use_blit=False): """ Set the draggable state -- if state is @@ -939,7 +940,7 @@ def draggable(self, state=None): if state: if self._draggable is None: - self._draggable = DraggableLegend(self) + self._draggable = DraggableLegend(self, use_blit) else: if self._draggable is not None: self._draggable.disconnect() diff --git a/lib/matplotlib/offsetbox.py b/lib/matplotlib/offsetbox.py index 26ce205f4c1e..a9850f0b06f3 100644 --- a/lib/matplotlib/offsetbox.py +++ b/lib/matplotlib/offsetbox.py @@ -1416,10 +1416,11 @@ def finalize_offset(self): the normalized axes coordinate and set a relavant attribute. """ - def __init__(self, ref_artist): + def __init__(self, ref_artist, use_blit=False): self.ref_artist = ref_artist self.got_artist = False - + self._use_blit = use_blit + self.canvas = self.ref_artist.figure.canvas c2 = self.canvas.mpl_connect('pick_event', self.on_pick) c3 = self.canvas.mpl_connect('button_release_event', self.on_release) @@ -1432,16 +1433,34 @@ def on_motion(self, evt): dx = evt.x - self.mouse_x dy = evt.y - self.mouse_y self.update_offset(dx, dy) + self.canvas.draw() + + def on_motion_blit(self, evt): + if self.got_artist: + dx = evt.x - self.mouse_x + dy = evt.y - self.mouse_y + self.update_offset(dx, dy) + self.canvas.restore_region(self.background) + self.ref_artist.draw(self.ref_artist.figure._cachedRenderer) + self.canvas.blit(self.ref_artist.figure.bbox) def on_pick(self, evt): if evt.artist == self.ref_artist: - self.save_offset() self.mouse_x = evt.mouseevent.x self.mouse_y = evt.mouseevent.y self.got_artist = True - self._c1 = self.canvas.mpl_connect('motion_notify_event', self.on_motion) + if self._use_blit: + self.ref_artist.set_animated(True) + self.canvas.draw() + self.background = self.canvas.copy_from_bbox(self.ref_artist.figure.bbox) + self.ref_artist.draw(self.ref_artist.figure._cachedRenderer) + self.canvas.blit(self.ref_artist.figure.bbox) + self._c1 = self.canvas.mpl_connect('motion_notify_event', self.on_motion_blit) + else: + self._c1 = self.canvas.mpl_connect('motion_notify_event', self.on_motion) + self.save_offset() def on_release(self, event): if self.got_artist: @@ -1449,6 +1468,9 @@ def on_release(self, event): self.got_artist = False self.canvas.mpl_disconnect(self._c1) + if self._use_blit: + self.ref_artist.set_animated(False) + def disconnect(self): 'disconnect the callbacks' for cid in self.cids: @@ -1468,8 +1490,8 @@ def finalize_offset(self): class DraggableOffsetBox(DraggableBase): - def __init__(self, ref_artist, offsetbox): - DraggableBase.__init__(self, ref_artist) + def __init__(self, ref_artist, offsetbox, use_blit=False): + DraggableBase.__init__(self, ref_artist, use_blit=use_blit) self.offsetbox = offsetbox def save_offset(self): @@ -1482,7 +1504,6 @@ def save_offset(self): def update_offset(self, dx, dy): loc_in_canvas = self.offsetbox_x + dx, self.offsetbox_y + dy self.offsetbox.set_offset(loc_in_canvas) - self.offsetbox.figure.canvas.draw() def get_loc_in_canvas(self): @@ -1496,8 +1517,8 @@ def get_loc_in_canvas(self): class DraggableAnnotation(DraggableBase): - def __init__(self, annotation): - DraggableBase.__init__(self, annotation) + def __init__(self, annotation, use_blit=False): + DraggableBase.__init__(self, annotation, use_blit=use_blit) self.annotation = annotation def save_offset(self): @@ -1519,7 +1540,6 @@ def update_offset(self, dx, dy): ann.xytext = self.ox + dx, self.oy + dy x, y = ann.xytext xy = ann._get_xy(x, y, ann.textcoords) - self.canvas.draw() def finalize_offset(self): loc_in_canvas = self.annotation.xytext diff --git a/lib/matplotlib/text.py b/lib/matplotlib/text.py index 9eb734068b47..caab4bb200e7 100644 --- a/lib/matplotlib/text.py +++ b/lib/matplotlib/text.py @@ -1537,7 +1537,7 @@ def _check_xy(self, renderer, xy_pixel): return True - def draggable(self, state=None): + def draggable(self, state=None, use_blit=False): """ Set the draggable state -- if state is @@ -1560,7 +1560,7 @@ def draggable(self, state=None): if state: if self._draggable is None: - self._draggable = DraggableAnnotation(self) + self._draggable = DraggableAnnotation(self, use_blit) else: if self._draggable is not None: self._draggable.disconnect() From 3509b3bb45d98c88b7f1b2cc339b98310c9ec3b9 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Mon, 1 Feb 2010 22:46:30 +0000 Subject: [PATCH 0500/1000] support picking of axes objects outside their bounding box svn path=/trunk/matplotlib/; revision=8106 --- lib/matplotlib/artist.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/artist.py b/lib/matplotlib/artist.py index 380429a0ba9f..423124a76679 100644 --- a/lib/matplotlib/artist.py +++ b/lib/matplotlib/artist.py @@ -320,7 +320,11 @@ def pick(self, mouseevent): for a in self.get_children(): # make sure the event happened in the same axes ax = getattr(a, 'axes', None) - if mouseevent.inaxes==ax: + if mouseevent.inaxes is None or mouseevent.inaxes==ax: + # we need to check if mouseevent.inaxes is None + # because some objects associated with an axes (eg a + # tick label) can be outside the bounding box of the + # axes and inaxes will be None a.pick(mouseevent) def set_picker(self, picker): From 1cf0f14dfde23f36913f9061b5438927ac5f78ba Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Wed, 3 Feb 2010 17:56:03 +0000 Subject: [PATCH 0501/1000] fix axis_artist bug svn path=/trunk/matplotlib/; revision=8107 --- lib/mpl_toolkits/axes_grid/axis_artist.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/lib/mpl_toolkits/axes_grid/axis_artist.py b/lib/mpl_toolkits/axes_grid/axis_artist.py index e5244cafe0cb..1eb9332825cd 100644 --- a/lib/mpl_toolkits/axes_grid/axis_artist.py +++ b/lib/mpl_toolkits/axes_grid/axis_artist.py @@ -226,7 +226,8 @@ def __init__(self, ticksize, tick_out=False, **kwargs): self.set_snap(True) def get_ref_artist(self): - return self._ref_artist.get_ticklines()[0] + #return self._ref_artist.get_ticklines()[0] + return self._ref_artist.majorTicks[0].tick1line def get_color(self): return self.get_attribute_from_ref_artist("color", "k") @@ -630,7 +631,7 @@ def __init__(self, **kwargs): #self._extra_pad = 0 - # attribute coper + # attribute copier def get_ref_artist(self): return self._axis.get_ticklabels()[0] From a8b8c27d7e310a4041548f4cf11d5e9562214d0c Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Wed, 3 Feb 2010 19:41:53 +0000 Subject: [PATCH 0502/1000] make backends registerable svn path=/trunk/matplotlib/; revision=8108 --- lib/matplotlib/backend_bases.py | 54 +++++++++++++++++++++++++-------- lib/matplotlib/tight_bbox.py | 14 ++++++--- 2 files changed, 51 insertions(+), 17 deletions(-) diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index b7189f828e4b..76ebfee0dff4 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -40,6 +40,15 @@ import matplotlib.textpath as textpath from matplotlib.path import Path + + +_backend_d = {} + +def register_backend(format, backend_class): + _backend_d[format] = backend_class + + + class RendererBase: """An abstract base class to handle drawing/rendering operations. @@ -1518,6 +1527,33 @@ def get_supported_filetypes_grouped(self): groupings[name].sort() return groupings + + def _get_print_method(self, format): + method_name = 'print_%s' % format + + # check for registered backends + if format in _backend_d: + backend_class = _backend_d[format] + + def _print_method(*args, **kwargs): + backend = self.switch_backends(backend_class) + print_method = getattr(backend, method_name) + return print_method(*args, **kwargs) + + return _print_method + + if (format not in self.filetypes or + not hasattr(self, method_name)): + formats = self.filetypes.keys() + formats.sort() + raise ValueError( + 'Format "%s" is not supported.\n' + 'Supported formats: ' + '%s.' % (format, ', '.join(formats))) + + return getattr(self, method_name) + + def print_figure(self, filename, dpi=None, facecolor='w', edgecolor='w', orientation='portrait', format=None, **kwargs): """ @@ -1573,16 +1609,8 @@ def print_figure(self, filename, dpi=None, facecolor='w', edgecolor='w', filename = filename.rstrip('.') + '.' + format format = format.lower() - method_name = 'print_%s' % format - if (format not in self.filetypes or - not hasattr(self, method_name)): - formats = self.filetypes.keys() - formats.sort() - raise ValueError( - 'Format "%s" is not supported.\n' - 'Supported formats: ' - '%s.' % (format, ', '.join(formats))) - + print_method = self._get_print_method(format) + if dpi is None: dpi = rcParams['savefig.dpi'] @@ -1609,7 +1637,8 @@ def print_figure(self, filename, dpi=None, facecolor='w', edgecolor='w', # the backend to support file-like object, i'm going # to leave it as it is. However, a better solution # than stringIO seems to be needed. -JJL - result = getattr(self, method_name)( + #result = getattr(self, method_name)( + result = print_method( cStringIO.StringIO(), dpi=dpi, facecolor=facecolor, @@ -1642,7 +1671,8 @@ def print_figure(self, filename, dpi=None, facecolor='w', edgecolor='w', _bbox_inches_restore = None try: - result = getattr(self, method_name)( + #result = getattr(self, method_name)( + result = print_method( filename, dpi=dpi, facecolor=facecolor, diff --git a/lib/matplotlib/tight_bbox.py b/lib/matplotlib/tight_bbox.py index b116c569fe1e..66c2c5658c45 100644 --- a/lib/matplotlib/tight_bbox.py +++ b/lib/matplotlib/tight_bbox.py @@ -6,6 +6,7 @@ from matplotlib.transforms import Bbox, TransformedBbox, Affine2D + def adjust_bbox(fig, format, bbox_inches): """ Temporarily adjust the figure so that only the specified area @@ -46,11 +47,9 @@ def restore_bbox(): fig.transFigure.invalidate() fig.patch.set_bounds(0, 0, 1, 1) - if format in ["png", "raw", "rgba"]: - adjust_bbox_png(fig, bbox_inches) - return restore_bbox - elif format in ["pdf", "eps", "svg", "svgz"]: - adjust_bbox_pdf(fig, bbox_inches) + adjust_bbox_handler = _adjust_bbox_handler_d.get(format) + if adjust_bbox_handler is not None: + adjust_bbox_handler(fig, bbox_inches) return restore_bbox else: warnings.warn("bbox_inches option for %s backend is not implemented yet." % (format)) @@ -125,3 +124,8 @@ def process_figure_for_rasterizing(figure, return bbox_inches, r +_adjust_bbox_handler_d = {} +for format in ["png", "raw", "rgba"]: + _adjust_bbox_handler_d[format] = adjust_bbox_png +for format in ["pdf", "eps", "svg", "svgz"]: + _adjust_bbox_handler_d[format] = adjust_bbox_pdf From 6b1c845c37b0e13358ed9176569917e099a721bc Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Wed, 3 Feb 2010 19:42:00 +0000 Subject: [PATCH 0503/1000] minor refactoring of the ps backend svn path=/trunk/matplotlib/; revision=8109 --- lib/matplotlib/backends/backend_ps.py | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py index fa5fdb592617..fae76e9ece46 100644 --- a/lib/matplotlib/backends/backend_ps.py +++ b/lib/matplotlib/backends/backend_ps.py @@ -387,6 +387,16 @@ def option_scale_image(self): """ return True + def _get_image_h_w_bits_command(self, im): + if im.is_grayscale: + h, w, bits = self._gray(im) + imagecmd = "image" + else: + h, w, bits = self._rgb(im) + imagecmd = "false 3 colorimage" + + return h, w, bits, imagecmd + def draw_image(self, gc, x, y, im, dx=None, dy=None, transform=None): """ Draw the Image instance into the current axes; x is the @@ -400,12 +410,7 @@ def draw_image(self, gc, x, y, im, dx=None, dy=None, transform=None): im.flipud_out() - if im.is_grayscale: - h, w, bits = self._gray(im) - imagecmd = "image" - else: - h, w, bits = self._rgb(im) - imagecmd = "false 3 colorimage" + h, w, bits, imagecmd = self._get_image_h_w_bits_command(im) hexlines = '\n'.join(self._hex_lines(bits)) if dx is None: @@ -924,6 +929,8 @@ def new_figure_manager(num, *args, **kwargs): return manager class FigureCanvasPS(FigureCanvasBase): + _renderer_class = RendererPS + def draw(self): pass @@ -1057,7 +1064,8 @@ def write(self, *kl, **kwargs): # mixed mode rendering _bbox_inches_restore = kwargs.pop("bbox_inches_restore", None) - ps_renderer = RendererPS(width, height, self._pswriter, imagedpi=dpi) + ps_renderer = self._renderer_class(width, height, self._pswriter, + imagedpi=dpi) renderer = MixedModeRenderer(self.figure, width, height, dpi, ps_renderer, bbox_inches_restore=_bbox_inches_restore) @@ -1189,7 +1197,8 @@ def write(self, *kl, **kwargs): # mixed mode rendering _bbox_inches_restore = kwargs.pop("bbox_inches_restore", None) - ps_renderer = RendererPS(width, height, self._pswriter, imagedpi=dpi) + ps_renderer = self._renderer_class(width, height, + self._pswriter, imagedpi=dpi) renderer = MixedModeRenderer(self.figure, width, height, dpi, ps_renderer, bbox_inches_restore=_bbox_inches_restore) From b61448cf2e79af25bffa59cb3b083e5e9dc8ff70 Mon Sep 17 00:00:00 2001 From: Fernando Perez Date: Thu, 4 Feb 2010 04:58:51 +0000 Subject: [PATCH 0504/1000] Make plot_directive use a custom PlotWarning category. svn path=/trunk/matplotlib/; revision=8110 --- CHANGELOG | 3 +++ lib/matplotlib/sphinxext/plot_directive.py | 31 ++++++++++++++++++++-- 2 files changed, 32 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index de87929dbb9b..5cb4988d0561 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2010-02-03 Made plot_directive use a custom PlotWarning category, so that + warnings can be turned into fatal errors easily if desired. - FP + 2010-01-29 Added draggable method to Legend to allow mouse drag placement. Thanks Adam Fraser. JDH diff --git a/lib/matplotlib/sphinxext/plot_directive.py b/lib/matplotlib/sphinxext/plot_directive.py index cb06e024dae9..3cb62f6f3746 100644 --- a/lib/matplotlib/sphinxext/plot_directive.py +++ b/lib/matplotlib/sphinxext/plot_directive.py @@ -44,6 +44,18 @@ The set of file formats to generate can be specified with the `plot_formats` configuration variable. + + +Error handling: + +Any errors generated during the running of the code are emitted as warnings +using the Python `warnings` module, using a custom category called +`PlotWarning`. To turn the warnings into fatal errors that stop the +documentation build, after adjusting your `sys.path` in your `conf.py` Sphinx +configuration file, use:: + + import plot_directive + warnings.simplefilter('error', plot_directive.PlotWarning) """ import sys, os, shutil, imp, warnings, cStringIO, re @@ -76,6 +88,21 @@ from matplotlib import _pylab_helpers from matplotlib.sphinxext import only_directives + +class PlotWarning(Warning): + """Warning category for all warnings generated by this directive. + + By printing our warnings with this category, it becomes possible to turn + them into errors by using in your conf.py:: + + warnings.simplefilter('error', plot_directive.PlotWarning) + + This way, you can ensure that your docs only build if all your examples + actually run successfully. + """ + pass + + # os.path.relpath is new in Python 2.6 if hasattr(os.path, 'relpath'): relpath = os.path.relpath @@ -208,7 +235,7 @@ def run_savefig(plot_path, basename, tmpdir, destdir, formats): figman.canvas.figure.savefig(outpath, dpi=dpi) except: s = cbook.exception_to_str("Exception saving plot %s" % plot_path) - warnings.warn(s) + warnings.warn(s, PlotWarning) return 0 if j > 0: shutil.copyfile(outpath, os.path.join(destdir, outname)) @@ -270,7 +297,7 @@ def render_figures(plot_path, function_name, plot_code, tmpdir, destdir, run_code(plot_path, function_name, plot_code) except: s = cbook.exception_to_str("Exception running plot %s" % plot_path) - warnings.warn(s) + warnings.warn(s, PlotWarning) return 0 num_figs = run_savefig(plot_path, basename, tmpdir, destdir, formats) From d7d06ad3d4db7dbb0eb8c7518faffe7c42b586ec Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Sat, 6 Feb 2010 21:24:21 +0000 Subject: [PATCH 0505/1000] Modified EllipseCollection for closer compatibility with Ellipse patch. svn path=/trunk/matplotlib/; revision=8111 --- CHANGELOG | 2 + doc/api/api_changes.rst | 13 ++++++ lib/matplotlib/collections.py | 82 ++++++++++++++++++----------------- 3 files changed, 57 insertions(+), 40 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 5cb4988d0561..a611c7c5d25b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +2010-02-06 Added 'xy' scaling option to EllipseCollection. - EF + 2010-02-03 Made plot_directive use a custom PlotWarning category, so that warnings can be turned into fatal errors easily if desired. - FP diff --git a/doc/api/api_changes.rst b/doc/api/api_changes.rst index 3df460abc478..bd87619e26c3 100644 --- a/doc/api/api_changes.rst +++ b/doc/api/api_changes.rst @@ -10,6 +10,19 @@ list may help describe what changes may be necessary in your code. Changes beyond 0.99.x ===================== +* The :class:'~matplotlib.collections.EllipseCollection' has been + changed in two ways: + + + There is a new *units* option, 'xy', that scales the ellipse with + the data units. This matches the :class:'~matplotlib.patches.Ellipse` + scaling. + + + The *height* and *width* kwargs have been changed to specify + the height and width, again for consistency with + :class:'~matplotlib.patches.Ellipse`, and to better match + their names; previously they specified the half-height and + half-width. + * There is a new rc parameter ``axes.color_cycle``, and the color cycle is now independent of the rc parameter ``lines.color``. :func:`matplotlib.Axes.set_default_color_cycle` is deprecated. diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index d101b09fd2e2..93100ea3d996 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -918,77 +918,79 @@ class EllipseCollection(Collection): def __init__(self, widths, heights, angles, units='points', **kwargs): """ *widths*: sequence - half-lengths of first axes (e.g., semi-major axis lengths) + lengths of first axes (e.g., major axis lengths) *heights*: sequence - half-lengths of second axes + lengths of second axes *angles*: sequence angles of first axes, degrees CCW from the X-axis - *units*: ['points' | 'inches' | 'dots' | 'width' | 'height' | 'x' | 'y'] + *units*: ['points' | 'inches' | 'dots' | 'width' | 'height' + | 'x' | 'y' | 'xy'] units in which majors and minors are given; 'width' and 'height' refer to the dimensions of the axes, while 'x' and 'y' - refer to the *offsets* data units. + refer to the *offsets* data units. 'xy' differs from all + others in that the angle as plotted varies with the + aspect ratio, and equals the specified angle only when + the aspect ratio is unity. Hence it behaves the same + as the :class:`~matplotlib.patches.Ellipse` with + axes.transData as its transform. Additional kwargs inherited from the base :class:`Collection`: %(Collection)s """ Collection.__init__(self,**kwargs) - self._widths = np.asarray(widths).ravel() - self._heights = np.asarray(heights).ravel() + self._widths = 0.5 * np.asarray(widths).ravel() + self._heights = 0.5 * np.asarray(heights).ravel() self._angles = np.asarray(angles).ravel() *(np.pi/180.0) self._units = units self.set_transform(transforms.IdentityTransform()) self._transforms = [] self._paths = [mpath.Path.unit_circle()] - self._initialized = False - - def _init(self): - def on_dpi_change(fig): - self._transforms = [] - self.figure.callbacks.connect('dpi_changed', on_dpi_change) - self._initialized = True - - def set_transforms(self): - if not self._initialized: - self._init() + def _set_transforms(self): + """ + Calculate transforms immediately before drawing. + """ self._transforms = [] ax = self.axes fig = self.figure - if self._units in ('x', 'y'): - if self._units == 'x': - dx0 = ax.viewLim.width - dx1 = ax.bbox.width - else: - dx0 = ax.viewLim.height - dx1 = ax.bbox.height - sc = dx1/dx0 + + if self._units == 'xy': + sc = 1 + elif self._units == 'x': + sc = ax.bbox.width / ax.viewLim.width + elif self._units == 'y': + sc = ax.bbox.height / ax.viewLim.height + elif self._units == 'inches': + sc = fig.dpi + elif self._units == 'points': + sc = fig.dpi / 72.0 + elif self._units == 'width': + sc = ax.bbox.width + elif self._units == 'height': + sc = ax.bbox.height + elif self._units == 'dots': + sc = 1.0 else: - if self._units == 'inches': - sc = fig.dpi - elif self._units == 'points': - sc = fig.dpi / 72.0 - elif self._units == 'width': - sc = ax.bbox.width - elif self._units == 'height': - sc = ax.bbox.height - elif self._units == 'dots': - sc = 1.0 - else: - raise ValueError('unrecognized units: %s' % self._units) + raise ValueError('unrecognized units: %s' % self._units) _affine = transforms.Affine2D for x, y, a in zip(self._widths, self._heights, self._angles): trans = _affine().scale(x * sc, y * sc).rotate(a) self._transforms.append(trans) + if self._units == 'xy': + m = ax.transData.get_affine().get_matrix().copy() + m[:2, 2:] = 0 + self.set_transform(_affine(m)) + + def draw(self, renderer): - if True: ###not self._transforms: - self.set_transforms() - return Collection.draw(self, renderer) + self._set_transforms() + Collection.draw(self, renderer) class PatchCollection(Collection): """ From 5f64b1a1806d228d8b31af1bd7aa7fd4b0f288a6 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Sat, 6 Feb 2010 22:30:12 +0000 Subject: [PATCH 0506/1000] a minor fix of blocking_input.py svn path=/trunk/matplotlib/; revision=8112 --- lib/matplotlib/blocking_input.py | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/blocking_input.py b/lib/matplotlib/blocking_input.py index 20fc20ca626d..d4ac669b3d62 100644 --- a/lib/matplotlib/blocking_input.py +++ b/lib/matplotlib/blocking_input.py @@ -161,6 +161,10 @@ def key_event(self): ''' event = self.events[-1] + if event.key is None: + # at least in mac os X gtk backend some key returns None. + return + key = event.key.lower() if key in ['backspace', 'delete']: @@ -382,10 +386,6 @@ def button3(self,event): broken contour - once humpty-dumpty is broken, he can't be put back together. In inline mode, this does nothing. """ - # Remove this last event - not too important for clabel use - # since clabel normally doesn't have a maximum number of - # events, but best for cleanliness sake. - BlockingInput.pop(self) if self.inline: pass From da93ccc0c5da5e9725adc9caf55fa584323014db Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Sat, 6 Feb 2010 23:44:28 +0000 Subject: [PATCH 0507/1000] Let setup.cfg customize the base directory for libs and includes svn path=/trunk/matplotlib/; revision=8113 --- setup.cfg.template | 5 +++++ setupext.py | 18 ++++++++++++++---- 2 files changed, 19 insertions(+), 4 deletions(-) diff --git a/setup.cfg.template b/setup.cfg.template index f5f4903fd0ba..6ea8cfe73565 100644 --- a/setup.cfg.template +++ b/setup.cfg.template @@ -4,6 +4,11 @@ [egg_info] tag_svn_revision = 1 +[directories] +# Uncomment to override the default basedir in setupext.py. +# This can be a single directory or a space-delimited list of directories. +#basedirlist = /usr + [status] # To suppress display of the dependencies and their versions # at the top of the build log, uncomment the following line: diff --git a/setupext.py b/setupext.py index 7d9cf7211a32..6a4d6cb8927f 100644 --- a/setupext.py +++ b/setupext.py @@ -119,7 +119,8 @@ 'build_macosx': 'auto', 'build_image': True, 'build_windowing': True, - 'backend': None} + 'backend': None, + 'basedirlist': None} defines = [ ('PY_ARRAY_UNIQUE_SYMBOL', 'MPL_ARRAY_API'), @@ -161,6 +162,15 @@ try: options['backend'] = config.get("rc_options", "backend") except: pass + try: options['basedirlist'] = config.get("directories", "basedirlist") + except: pass + +# For get_base_flags: +if options['basedirlist']: + basedirlist = options['basedirlist'].split() +else: + basedirlist = basedir[sys.platform] +print "basedirlist is:", basedirlist if options['display_status']: def print_line(char='='): @@ -331,10 +341,10 @@ def check_for_libpng(): def add_base_flags(module): incdirs = filter(os.path.exists, - [os.path.join(p, 'include') for p in basedir[sys.platform] ]) + [os.path.join(p, 'include') for p in basedirlist ]) libdirs = filter(os.path.exists, - [os.path.join(p, 'lib') for p in basedir[sys.platform] ]+ - [os.path.join(p, 'lib64') for p in basedir[sys.platform] ] ) + [os.path.join(p, 'lib') for p in basedirlist ]+ + [os.path.join(p, 'lib64') for p in basedirlist ] ) module.include_dirs.extend(incdirs) module.include_dirs.append('.') From f1b44af9d77ba330886dabef96de87d49fda078d Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Sat, 6 Feb 2010 23:52:34 +0000 Subject: [PATCH 0508/1000] add Colorbar.set_ticks and Colorbar.set_ticklabels svn path=/trunk/matplotlib/; revision=8114 --- lib/matplotlib/colorbar.py | 69 ++++++++++++++++++++++++++++++-------- 1 file changed, 55 insertions(+), 14 deletions(-) diff --git a/lib/matplotlib/colorbar.py b/lib/matplotlib/colorbar.py index 3f06ea98c2d5..372fc089457b 100644 --- a/lib/matplotlib/colorbar.py +++ b/lib/matplotlib/colorbar.py @@ -18,6 +18,7 @@ is a thin wrapper over :meth:`~matplotlib.figure.Figure.colorbar`. ''' +import warnings import numpy as np import matplotlib as mpl @@ -207,6 +208,7 @@ def __init__(self, ax, cmap=None, filled=True, ): self.ax = ax + self._patch_ax() if cmap is None: cmap = cm.get_cmap() if norm is None: norm = colors.Normalize() self.alpha = alpha @@ -239,6 +241,13 @@ def __init__(self, ax, cmap=None, # The rest is in a method so we can recalculate when clim changes. self.draw_all() + def _patch_ax(self): + def _warn(*args, **kw): + warnings.warn("Use the colorbar set_ticks() method instead.") + + self.ax.set_xticks = _warn + self.ax.set_yticks = _warn + def draw_all(self): ''' Calculate any free parameters based on the current cmap and norm, @@ -253,6 +262,50 @@ def draw_all(self): self._add_solids(X, Y, C) self._set_label() + def update_ticks(self): + """ + Force the update of the ticks and ticklabels. This must be + called whenever the tick locator and/or tick formatter changes. + """ + ax = self.ax + ticks, ticklabels, offset_string = self._ticker() + if self.orientation == 'vertical': + ax.xaxis.set_ticks([]) + ax.yaxis.set_label_position('right') + ax.yaxis.set_ticks_position('right') + ax.yaxis.set_ticks(ticks) + ax.set_yticklabels(ticklabels) + ax.yaxis.get_major_formatter().set_offset_string(offset_string) + + else: + ax.yaxis.set_ticks([]) + ax.xaxis.set_label_position('bottom') + ax.xaxis.set_ticks(ticks) + ax.set_xticklabels(ticklabels) + ax.xaxis.get_major_formatter().set_offset_string(offset_string) + + def set_ticks(self, ticks, update_ticks=True): + """ + set tick locations. Tick locations are updated immediately unless update_ticks is + *False*. To manually update the ticks, call *update_ticks* method explicitly. + """ + self.locator = ticker.FixedLocator(ticks, nbins=len(ticks)) + if update_ticks: + self.update_ticks() + + def set_ticklabels(self, ticklabels, update_ticks=True): + """ + set tick labels. Tick labels are updated immediately unless update_ticks is + *False*. To manually update the ticks, call *update_ticks* method explicitly. + """ + if isinstance(self.locator, ticker.FixedLocator): + self.formatter = ticker.FixedFormatter(ticklabels) + if update_ticks: + self.update_ticks() + else: + warnings.warn("set_ticks() must have been called.") + + def _config_axes(self, X, Y): ''' Make an axes patch and outline. @@ -275,21 +328,9 @@ def _config_axes(self, X, Y): linewidth=0.01, zorder=-1) ax.add_artist(self.patch) - ticks, ticklabels, offset_string = self._ticker() - if self.orientation == 'vertical': - ax.set_xticks([]) - ax.yaxis.set_label_position('right') - ax.yaxis.set_ticks_position('right') - ax.set_yticks(ticks) - ax.set_yticklabels(ticklabels) - ax.yaxis.get_major_formatter().set_offset_string(offset_string) - else: - ax.set_yticks([]) - ax.xaxis.set_label_position('bottom') - ax.set_xticks(ticks) - ax.set_xticklabels(ticklabels) - ax.xaxis.get_major_formatter().set_offset_string(offset_string) + self.update_ticks() + def _set_label(self): if self.orientation == 'vertical': From 34e32364395c03a6f99bec7ea772b1eef7281a15 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Sat, 6 Feb 2010 23:54:14 +0000 Subject: [PATCH 0509/1000] Added gnu0 platform to setupext.py (Benjamin Drung) svn path=/trunk/matplotlib/; revision=8115 --- CHANGELOG | 4 ++++ setupext.py | 7 +++++-- 2 files changed, 9 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index a611c7c5d25b..63db423151cd 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +2010-02-06 Added setup.cfg "basedirlist" option to override setting + in setupext.py "basedir" dictionary; added "gnu0" + platform requested by Benjamin Drung. - EF + 2010-02-06 Added 'xy' scaling option to EllipseCollection. - EF 2010-02-03 Made plot_directive use a custom PlotWarning category, so that diff --git a/setupext.py b/setupext.py index 6a4d6cb8927f..6d4aa07a8c3a 100644 --- a/setupext.py +++ b/setupext.py @@ -1,8 +1,10 @@ """ Some helper functions for building the C extensions -you may need to edit basedir to point to the default location of your -required libs, eg, png, z, freetype +You may need to use the "basedirlist" option in setup.cfg to point +to the location of your required libs, eg, png, z, freetype, +overriding the settings hard-coded in the "basedir" directory +below. DARWIN @@ -71,6 +73,7 @@ 'gnukfreebsd6' : ['/usr/local', '/usr'], 'gnukfreebsd7' : ['/usr/local', '/usr'], 'gnukfreebsd8' : ['/usr/local', '/usr'], + 'gnu0' : ['/usr'], 'aix5' : ['/usr/local'], } From 472ca7f1bffed8330c2b206266680dbc76a2a916 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 8 Feb 2010 16:00:23 +0000 Subject: [PATCH 0510/1000] Merged revisions 8092,8116 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r8092 | leejjoon | 2010-01-18 19:26:16 -0500 (Mon, 18 Jan 2010) | 1 line update annotate documentation to explain *annotation_clip* parameter ........ r8116 | mdboom | 2010-02-08 10:57:45 -0500 (Mon, 08 Feb 2010) | 1 line Fix for libpng-1.4 compatibility ........ svn path=/trunk/matplotlib/; revision=8117 --- lib/matplotlib/text.py | 8 ++++++++ src/_png.cpp | 4 ++++ 2 files changed, 12 insertions(+) diff --git a/lib/matplotlib/text.py b/lib/matplotlib/text.py index caab4bb200e7..c80d390d0760 100644 --- a/lib/matplotlib/text.py +++ b/lib/matplotlib/text.py @@ -1668,6 +1668,14 @@ def __init__(self, s, xy, # 5 points below the top border xy=(10,-5), xycoords='axes points' + + The *annotation_clip* attribute contols the visibility of the + annotation when it goes outside the axes area. If True, the + annotation will only be drawn when the *xy* is inside the + axes. If False, the annotation will always be drawn regardless + of its position. The default is *None*, which behave as True + only if *xycoords* is"data". + Additional kwargs are Text properties: %(Text)s diff --git a/src/_png.cpp b/src/_png.cpp index dab1de4fd5ba..ec515c136c2d 100644 --- a/src/_png.cpp +++ b/src/_png.cpp @@ -336,7 +336,11 @@ _png_module::read_png(const Py::Tuple& args) { //free the png memory png_read_end(png_ptr, info_ptr); +#ifndef png_infopp_NULL + png_destroy_read_struct(&png_ptr, &info_ptr, NULL); +#else png_destroy_read_struct(&png_ptr, &info_ptr, png_infopp_NULL); +#endif if (close_file) { fclose(fp); } From cf1a112e941f1b96b8098fe739d0cee6ec55649a Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Mon, 8 Feb 2010 16:54:26 +0000 Subject: [PATCH 0511/1000] RendererAgg.draw_image supports affine transform svn path=/trunk/matplotlib/; revision=8118 --- examples/api/demo_affine_image.py | 8 +-- lib/matplotlib/backends/backend_agg.py | 6 +++ src/_backend_agg.cpp | 75 +++++++++++++++++++++----- 3 files changed, 72 insertions(+), 17 deletions(-) diff --git a/examples/api/demo_affine_image.py b/examples/api/demo_affine_image.py index aa65446553d4..641e686ce2a4 100644 --- a/examples/api/demo_affine_image.py +++ b/examples/api/demo_affine_image.py @@ -3,7 +3,7 @@ """ For the backends that supports draw_image with optional affine -transform (e.g., ps backend), the image of the output should +transform (e.g., agg, ps backend), the image of the output should have its boundary matches the red rectangles. """ @@ -33,7 +33,8 @@ def imshow_affine(ax, z, *kl, **kwargs): ax = plt.subplot(111) Z = get_image() im = imshow_affine(ax, Z, interpolation='nearest', cmap=cm.jet, - origin='lower', extent=[-2, 4, -3, 2]) + origin='lower', + extent=[-2, 4, -3, 2], clip_on=True) trans_data2 = mtransforms.Affine2D().rotate_deg(30) + ax.transData im.set_transform(trans_data2) @@ -48,4 +49,5 @@ def imshow_affine(ax, z, *kl, **kwargs): ax.set_xlim(-3, 5) ax.set_ylim(-4, 4) - plt.savefig("demo_affine_image") + plt.show() + #plt.savefig("demo_affine_image") diff --git a/lib/matplotlib/backends/backend_agg.py b/lib/matplotlib/backends/backend_agg.py index aa277d21afd9..34fccf5524c8 100644 --- a/lib/matplotlib/backends/backend_agg.py +++ b/lib/matplotlib/backends/backend_agg.py @@ -261,6 +261,12 @@ def option_image_nocomposite(self): # with the Agg backend return True + def option_scale_image(self): + """ + agg backend support arbitrary scaling of image. + """ + return True + def restore_region(self, region, bbox=None, xy=None): """ restore the saved region. if bbox (instance of BboxBase, or diff --git a/src/_backend_agg.cpp b/src/_backend_agg.cpp index 421c65976dba..8072ae679230 100644 --- a/src/_backend_agg.cpp +++ b/src/_backend_agg.cpp @@ -814,55 +814,99 @@ Py::Object RendererAgg::draw_image(const Py::Tuple& args) { _VERBOSE("RendererAgg::draw_image"); - args.verify_length(4); + args.verify_length(4, 7); // 7 if affine matrix if given GCAgg gc(args[0], dpi); - double x = mpl_round(Py::Float(args[1])); - double y = mpl_round(Py::Float(args[2])); Image *image = static_cast(args[3].ptr()); bool has_clippath = false; + agg::trans_affine affine_trans; + bool has_affine = false; + double x, y, w, h; + + + if (args.size() == 7) { + has_affine = true; + x = Py::Float(args[1]); + y = Py::Float(args[2]); + w = Py::Float(args[4]); + h = Py::Float(args[5]); + affine_trans = py_to_agg_transformation_matrix(args[6].ptr()); + } else { + x = mpl_round(Py::Float(args[1])); + y = mpl_round(Py::Float(args[2])); + } + theRasterizer.reset_clipping(); rendererBase.reset_clipping(true); + set_clipbox(gc.cliprect, theRasterizer); has_clippath = render_clippath(gc.clippath, gc.clippath_trans); Py::Tuple empty; image->flipud_out(empty); pixfmt pixf(*(image->rbufOut)); - if (has_clippath) { + if (has_affine | has_clippath) { agg::trans_affine mtx; - mtx *= agg::trans_affine_translation((int)x, (int)(height-(y+image->rowsOut))); - agg::path_storage rect; + + if (has_affine) { + mtx *= agg::trans_affine_scaling(1, -1); + mtx *= agg::trans_affine_translation(0, image->rowsOut); + mtx *= agg::trans_affine_scaling(w/(image->colsOut), h/(image->rowsOut)); + mtx *= agg::trans_affine_translation(x, y); + mtx *= affine_trans; + mtx *= agg::trans_affine_scaling(1.0, -1.0); + mtx *= agg::trans_affine_translation(0.0, (double) height); + } else { + mtx *= agg::trans_affine_translation((int)x, (int)(height-(y+image->rowsOut))); + } + rect.move_to(0, 0); rect.line_to(image->colsOut, 0); rect.line_to(image->colsOut, image->rowsOut); rect.line_to(0, image->rowsOut); rect.line_to(0, 0); + agg::conv_transform rect2(rect, mtx); agg::trans_affine inv_mtx(mtx); inv_mtx.invert(); + typedef agg::span_allocator color_span_alloc_type; - typedef agg::pixfmt_amask_adaptor pixfmt_amask_type; - typedef agg::renderer_base amask_ren_type; typedef agg::image_accessor_clip image_accessor_type; typedef agg::span_interpolator_linear<> interpolator_type; typedef agg::span_image_filter_rgba_nn image_span_gen_type; - typedef agg::renderer_scanline_aa renderer_type; + color_span_alloc_type sa; image_accessor_type ia(pixf, agg::rgba8(0, 0, 0, 0)); interpolator_type interpolator(inv_mtx); image_span_gen_type image_span_generator(ia, interpolator); - pixfmt_amask_type pfa(pixFmt, alphaMask); - amask_ren_type r(pfa); - renderer_type ri(r, sa, image_span_generator); - theRasterizer.add_path(rect2); - agg::render_scanlines(theRasterizer, slineP8, ri); + + if (has_clippath) { + typedef agg::pixfmt_amask_adaptor pixfmt_amask_type; + typedef agg::renderer_base amask_ren_type; + typedef agg::renderer_scanline_aa renderer_type_alpha; + + pixfmt_amask_type pfa(pixFmt, alphaMask); + amask_ren_type r(pfa); + renderer_type_alpha ri(r, sa, image_span_generator); + + theRasterizer.add_path(rect2); + agg::render_scanlines(theRasterizer, slineP8, ri); + } else { + typedef agg::renderer_base ren_type; + typedef agg::renderer_scanline_aa renderer_type; + ren_type r(pixFmt); + renderer_type ri(r, sa, image_span_generator); + + theRasterizer.add_path(rect2); + agg::render_scanlines(theRasterizer, slineP8, ri); + } + } else { set_clipbox(gc.cliprect, rendererBase); rendererBase.blend_from(pixf, 0, (int)x, (int)(height-(y+image->rowsOut))); @@ -873,6 +917,9 @@ RendererAgg::draw_image(const Py::Tuple& args) { return Py::Object(); } + + + template void RendererAgg::_draw_path(path_t& path, bool has_clippath, const facepair_t& face, const GCAgg& gc) { From 48ff965f42776ddd6043a1e4264450e8f296fd21 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Mon, 8 Feb 2010 16:54:31 +0000 Subject: [PATCH 0512/1000] issue a warning when _image_skew_coordinate is set for backends that do not support an affine transform of images svn path=/trunk/matplotlib/; revision=8119 --- lib/matplotlib/image.py | 3 +++ 1 file changed, 3 insertions(+) diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index c2dcb541163a..77a9ef3754bb 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -305,6 +305,9 @@ def draw(self, renderer, *args, **kwargs): if self._check_unsampled_image(renderer): self._draw_unsampled_image(renderer, gc) else: + if self._image_skew_coordinate is not None: + warnings.warn("Image will not be shown correctly with this backend.") + im = self.make_image(renderer.get_image_magnification()) if im is None: return From 0fbfbbe04c1f27c1afd42449625d09f81e56cdcd Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Mon, 8 Feb 2010 17:11:38 +0000 Subject: [PATCH 0513/1000] update examples/api/demo_affine_image.py svn path=/trunk/matplotlib/; revision=8120 --- examples/api/demo_affine_image.py | 35 +++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/examples/api/demo_affine_image.py b/examples/api/demo_affine_image.py index 641e686ce2a4..f95f0d12a11c 100644 --- a/examples/api/demo_affine_image.py +++ b/examples/api/demo_affine_image.py @@ -30,24 +30,37 @@ def imshow_affine(ax, z, *kl, **kwargs): if 1: - ax = plt.subplot(111) + + # image rotation + + ax1 = plt.subplot(121) Z = get_image() - im = imshow_affine(ax, Z, interpolation='nearest', cmap=cm.jet, - origin='lower', - extent=[-2, 4, -3, 2], clip_on=True) + im1 = imshow_affine(ax1, Z, interpolation='nearest', cmap=cm.jet, + origin='lower', + extent=[-2, 4, -3, 2], clip_on=True) - trans_data2 = mtransforms.Affine2D().rotate_deg(30) + ax.transData - im.set_transform(trans_data2) + trans_data2 = mtransforms.Affine2D().rotate_deg(30) + ax1.transData + im1.set_transform(trans_data2) # display intended extent of the image - x1, x2, y1, y2 = im.get_extent() + x1, x2, y1, y2 = im1.get_extent() x3, y3 = x2, y1 - ax.plot([x1, x2, x2, x1, x1], [y1, y1, y2, y2, y1], "r--", lw=3, - transform=trans_data2) + ax1.plot([x1, x2, x2, x1, x1], [y1, y1, y2, y2, y1], "r--", lw=3, + transform=trans_data2) + + ax1.set_xlim(-3, 5) + ax1.set_ylim(-4, 4) + + + # image skew + + ax2 = plt.subplot(122) + im2 = ax2.imshow(Z, interpolation='nearest', cmap=cm.jet, + origin='lower', + extent=[-2, 4, -3, 2], clip_on=True) + im2._image_skew_coordinate = (3, -2) - ax.set_xlim(-3, 5) - ax.set_ylim(-4, 4) plt.show() #plt.savefig("demo_affine_image") From 69c5a3d2d57b26de86cebe0f41a5e032fd6db50b Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 9 Feb 2010 13:04:44 +0000 Subject: [PATCH 0514/1000] Use a custom encoding containing all of the used glyphs when writing out a Postscript Type 3 font. This resolves a bug when converting Ps output containing non-standard characters (such as the minus sign) to Pdf using ps2pdf/gs 8.7 or later. svn path=/trunk/matplotlib/; revision=8122 --- lib/matplotlib/backends/backend_ps.py | 16 +- ttconv/pprdrv_tt.cpp | 1078 +++++++++++++------------ 2 files changed, 558 insertions(+), 536 deletions(-) diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py index fae76e9ece46..c6535f6889af 100644 --- a/lib/matplotlib/backends/backend_ps.py +++ b/lib/matplotlib/backends/backend_ps.py @@ -396,7 +396,7 @@ def _get_image_h_w_bits_command(self, im): imagecmd = "false 3 colorimage" return h, w, bits, imagecmd - + def draw_image(self, gc, x, y, im, dx=None, dy=None, transform=None): """ Draw the Image instance into the current axes; x is the @@ -1110,6 +1110,14 @@ def write(self, *kl, **kwargs): for c in chars: gind = cmap.get(c) or 0 glyph_ids.append(gind) + + fonttype = rcParams['ps.fonttype'] + + # Can not use more than 255 characters from a + # single font for Type 3 + if len(glyph_ids) > 255: + fonttype = 42 + # The ttf to ps (subsetting) support doesn't work for # OpenType fonts that are Postscript inside (like the # STIX fonts). This will simply turn that off to avoid @@ -1118,7 +1126,7 @@ def write(self, *kl, **kwargs): raise RuntimeError("OpenType CFF fonts can not be saved using the internal Postscript backend at this time.\nConsider using the Cairo backend.") else: fonttype = rcParams['ps.fonttype'] - convert_ttf_to_ps(font_filename, fh, rcParams['ps.fonttype'], glyph_ids) + convert_ttf_to_ps(font_filename, fh, fonttype, glyph_ids) print >>fh, "end" print >>fh, "%%EndProlog" @@ -1394,7 +1402,7 @@ def gs_distill(tmpfile, eps=False, ptype='letter', bbox=None): """ paper_option = "-sPAPERSIZE=%s" % ptype - + psfile = tmpfile + '.ps' outfile = tmpfile + '.output' dpi = rcParams['ps.distiller.res'] @@ -1436,7 +1444,7 @@ def xpdf_distill(tmpfile, eps=False, ptype='letter', bbox=None): if eps: paper_option = "-dEPSCrop" else: paper_option = "-sPAPERSIZE=%s" % ptype - + command = 'ps2pdf -dAutoFilterColorImages=false \ -sColorImageFilter=FlateEncode %s "%s" "%s" > "%s"'% \ (paper_option, tmpfile, pdffile, outfile) diff --git a/ttconv/pprdrv_tt.cpp b/ttconv/pprdrv_tt.cpp index 403fa60ee771..fbbe5716d5a2 100644 --- a/ttconv/pprdrv_tt.cpp +++ b/ttconv/pprdrv_tt.cpp @@ -58,10 +58,10 @@ ULONG getULONG(BYTE *p) ULONG val=0; for(x=0; x<4; x++) - { - val *= 0x100; - val += p[x]; - } + { + val *= 0x100; + val += p[x]; + } return val; } /* end of ftohULONG() */ @@ -75,10 +75,10 @@ USHORT getUSHORT(BYTE *p) USHORT val=0; for(x=0; x<2; x++) - { - val *= 0x100; - val += p[x]; - } + { + val *= 0x100; + val += p[x]; + } return val; } /* end of getUSHORT() */ @@ -120,38 +120,38 @@ BYTE *GetTable(struct TTFONT *font, const char *name) ptr = font->offset_table + 12; x=0; while(TRUE) - { - if( strncmp((const char*)ptr,name,4) == 0 ) - { - ULONG offset,length; - BYTE *table; + { + if( strncmp((const char*)ptr,name,4) == 0 ) + { + ULONG offset,length; + BYTE *table; - offset = getULONG( ptr + 8 ); - length = getULONG( ptr + 12 ); - table = (BYTE*)calloc( sizeof(BYTE), length ); + offset = getULONG( ptr + 8 ); + length = getULONG( ptr + 12 ); + table = (BYTE*)calloc( sizeof(BYTE), length ); - try { + try { #ifdef DEBUG_TRUETYPE - debug("Loading table \"%s\" from offset %d, %d bytes",name,offset,length); + debug("Loading table \"%s\" from offset %d, %d bytes",name,offset,length); #endif - if( fseek( font->file, (long)offset, SEEK_SET ) ) - throw TTException("TrueType font may be corrupt (reason 3)"); + if( fseek( font->file, (long)offset, SEEK_SET ) ) + throw TTException("TrueType font may be corrupt (reason 3)"); - if( fread(table,sizeof(BYTE),length,font->file) != (sizeof(BYTE) * length)) - throw TTException("TrueType font may be corrupt (reason 4)"); - } catch (TTException& ) { - free(table); - throw; - } - return table; - } + if( fread(table,sizeof(BYTE),length,font->file) != (sizeof(BYTE) * length)) + throw TTException("TrueType font may be corrupt (reason 4)"); + } catch (TTException& ) { + free(table); + throw; + } + return table; + } - x++; - ptr += 16; - if(x == font->numTables) - throw TTException("TrueType font is missing table"); - } + x++; + ptr += 16; + if(x == font->numTables) + throw TTException("TrueType font is missing table"); + } } /* end of GetTable() */ @@ -165,12 +165,12 @@ BYTE *GetTable(struct TTFONT *font, const char *name) void Read_name(struct TTFONT *font) { BYTE *table_ptr,*ptr2; - int numrecords; /* Number of strings in this table */ - BYTE *strings; /* pointer to start of string storage */ + int numrecords; /* Number of strings in this table */ + BYTE *strings; /* pointer to start of string storage */ int x; - int platform,encoding; /* Current platform id, encoding id, */ - int language,nameid; /* language id, name id, */ - int offset,length; /* offset and length of string. */ + int platform,encoding; /* Current platform id, encoding id, */ + int language,nameid; /* language id, name id, */ + int offset,length; /* offset and length of string. */ #ifdef DEBUG_TRUETYPE debug("Read_name()"); @@ -192,136 +192,136 @@ void Read_name(struct TTFONT *font) } font->Copyright = font->Trademark = (char*)NULL; - table_ptr = GetTable(font, "name"); /* pointer to table */ + table_ptr = GetTable(font, "name"); /* pointer to table */ try { - numrecords = getUSHORT( table_ptr + 2 ); /* number of names */ - strings = table_ptr + getUSHORT( table_ptr + 4 ); /* start of string storage */ + numrecords = getUSHORT( table_ptr + 2 ); /* number of names */ + strings = table_ptr + getUSHORT( table_ptr + 4 ); /* start of string storage */ ptr2 = table_ptr + 6; for(x=0; x < numrecords; x++,ptr2+=12) - { - platform = getUSHORT(ptr2); - encoding = getUSHORT(ptr2+2); - language = getUSHORT(ptr2+4); - nameid = getUSHORT(ptr2+6); - length = getUSHORT(ptr2+8); - offset = getUSHORT(ptr2+10); + { + platform = getUSHORT(ptr2); + encoding = getUSHORT(ptr2+2); + language = getUSHORT(ptr2+4); + nameid = getUSHORT(ptr2+6); + length = getUSHORT(ptr2+8); + offset = getUSHORT(ptr2+10); #ifdef DEBUG_TRUETYPE - debug("platform %d, encoding %d, language 0x%x, name %d, offset %d, length %d", - platform,encoding,language,nameid,offset,length); + debug("platform %d, encoding %d, language 0x%x, name %d, offset %d, length %d", + platform,encoding,language,nameid,offset,length); #endif - /* Copyright notice */ - if( platform == 1 && nameid == 0 ) - { - font->Copyright = (char*)calloc(sizeof(char),length+1); - strncpy(font->Copyright,(const char*)strings+offset,length); - font->Copyright[length]=(char)NULL; - replace_newlines_with_spaces(font->Copyright); + /* Copyright notice */ + if( platform == 1 && nameid == 0 ) + { + font->Copyright = (char*)calloc(sizeof(char),length+1); + strncpy(font->Copyright,(const char*)strings+offset,length); + font->Copyright[length]=(char)NULL; + replace_newlines_with_spaces(font->Copyright); #ifdef DEBUG_TRUETYPE - debug("font->Copyright=\"%s\"",font->Copyright); + debug("font->Copyright=\"%s\"",font->Copyright); #endif - continue; - } + continue; + } - /* Font Family name */ - if( platform == 1 && nameid == 1 ) - { - free(font->FamilyName); - font->FamilyName = (char*)calloc(sizeof(char),length+1); - strncpy(font->FamilyName,(const char*)strings+offset,length); - font->FamilyName[length]=(char)NULL; - replace_newlines_with_spaces(font->FamilyName); + /* Font Family name */ + if( platform == 1 && nameid == 1 ) + { + free(font->FamilyName); + font->FamilyName = (char*)calloc(sizeof(char),length+1); + strncpy(font->FamilyName,(const char*)strings+offset,length); + font->FamilyName[length]=(char)NULL; + replace_newlines_with_spaces(font->FamilyName); #ifdef DEBUG_TRUETYPE - debug("font->FamilyName=\"%s\"",font->FamilyName); + debug("font->FamilyName=\"%s\"",font->FamilyName); #endif - continue; - } + continue; + } - /* Font Family name */ - if( platform == 1 && nameid == 2 ) - { - free(font->Style); - font->Style = (char*)calloc(sizeof(char),length+1); - strncpy(font->Style,(const char*)strings+offset,length); - font->Style[length]=(char)NULL; - replace_newlines_with_spaces(font->Style); + /* Font Family name */ + if( platform == 1 && nameid == 2 ) + { + free(font->Style); + font->Style = (char*)calloc(sizeof(char),length+1); + strncpy(font->Style,(const char*)strings+offset,length); + font->Style[length]=(char)NULL; + replace_newlines_with_spaces(font->Style); #ifdef DEBUG_TRUETYPE - debug("font->Style=\"%s\"",font->Style); + debug("font->Style=\"%s\"",font->Style); #endif - continue; - } + continue; + } - /* Full Font name */ - if( platform == 1 && nameid == 4 ) - { - free(font->FullName); - font->FullName = (char*)calloc(sizeof(char),length+1); - strncpy(font->FullName,(const char*)strings+offset,length); - font->FullName[length]=(char)NULL; - replace_newlines_with_spaces(font->FullName); + /* Full Font name */ + if( platform == 1 && nameid == 4 ) + { + free(font->FullName); + font->FullName = (char*)calloc(sizeof(char),length+1); + strncpy(font->FullName,(const char*)strings+offset,length); + font->FullName[length]=(char)NULL; + replace_newlines_with_spaces(font->FullName); #ifdef DEBUG_TRUETYPE - debug("font->FullName=\"%s\"",font->FullName); + debug("font->FullName=\"%s\"",font->FullName); #endif - continue; - } + continue; + } - /* Version string */ - if( platform == 1 && nameid == 5 ) - { - free(font->Version); - font->Version = (char*)calloc(sizeof(char),length+1); - strncpy(font->Version,(const char*)strings+offset,length); - font->Version[length]=(char)NULL; - replace_newlines_with_spaces(font->Version); + /* Version string */ + if( platform == 1 && nameid == 5 ) + { + free(font->Version); + font->Version = (char*)calloc(sizeof(char),length+1); + strncpy(font->Version,(const char*)strings+offset,length); + font->Version[length]=(char)NULL; + replace_newlines_with_spaces(font->Version); #ifdef DEBUG_TRUETYPE - debug("font->Version=\"%s\"",font->Version); + debug("font->Version=\"%s\"",font->Version); #endif - continue; - } + continue; + } - /* PostScript name */ - if( platform == 1 && nameid == 6 ) - { - free(font->PostName); - font->PostName = (char*)calloc(sizeof(char),length+1); - strncpy(font->PostName,(const char*)strings+offset,length); - font->PostName[length]=(char)NULL; - replace_newlines_with_spaces(font->PostName); + /* PostScript name */ + if( platform == 1 && nameid == 6 ) + { + free(font->PostName); + font->PostName = (char*)calloc(sizeof(char),length+1); + strncpy(font->PostName,(const char*)strings+offset,length); + font->PostName[length]=(char)NULL; + replace_newlines_with_spaces(font->PostName); #ifdef DEBUG_TRUETYPE - debug("font->PostName=\"%s\"",font->PostName); + debug("font->PostName=\"%s\"",font->PostName); #endif - continue; - } + continue; + } - /* Trademark string */ - if( platform == 1 && nameid == 7 ) - { - font->Trademark = (char*)calloc(sizeof(char),length+1); - strncpy(font->Trademark,(const char*)strings+offset,length); - font->Trademark[length]=(char)NULL; - replace_newlines_with_spaces(font->Trademark); + /* Trademark string */ + if( platform == 1 && nameid == 7 ) + { + font->Trademark = (char*)calloc(sizeof(char),length+1); + strncpy(font->Trademark,(const char*)strings+offset,length); + font->Trademark[length]=(char)NULL; + replace_newlines_with_spaces(font->Trademark); #ifdef DEBUG_TRUETYPE - debug("font->Trademark=\"%s\"",font->Trademark); + debug("font->Trademark=\"%s\"",font->Trademark); #endif - continue; - } + continue; + } - } + } } catch (TTException& ) { free(table_ptr); throw; @@ -346,17 +346,17 @@ void ttfont_header(TTStreamWriter& stream, struct TTFONT *font) ** font manufacturer's revision number for the font. */ if( font->target_type == PS_TYPE_42 ) - { - stream.printf("%%!PS-TrueTypeFont-%d.%d-%d.%d\n", - font->TTVersion.whole, font->TTVersion.fraction, - font->MfrRevision.whole, font->MfrRevision.fraction); - } + { + stream.printf("%%!PS-TrueTypeFont-%d.%d-%d.%d\n", + font->TTVersion.whole, font->TTVersion.fraction, + font->MfrRevision.whole, font->MfrRevision.fraction); + } /* If it is not a Type 42 font, we will use a different format. */ else - { - stream.putline("%!PS-Adobe-3.0 Resource-Font"); - } /* See RBIIp 641 */ + { + stream.putline("%!PS-Adobe-3.0 Resource-Font"); + } /* See RBIIp 641 */ /* We will make the title the name of the font. */ stream.printf("%%%%Title: %s\n",font->FullName); @@ -367,46 +367,46 @@ void ttfont_header(TTStreamWriter& stream, struct TTFONT *font) /* We created this file. */ if( font->target_type == PS_TYPE_42 ) - stream.putline("%%Creator: Converted from TrueType to type 42 by PPR"); + stream.putline("%%Creator: Converted from TrueType to type 42 by PPR"); else - stream.putline("%%Creator: Converted from TrueType by PPR"); + stream.putline("%%Creator: Converted from TrueType by PPR"); /* If VM usage information is available, print it. */ if( font->target_type == PS_TYPE_42 ) - { - VMMin = (int)getULONG( font->post_table + 16 ); - VMMax = (int)getULONG( font->post_table + 20 ); - if( VMMin > 0 && VMMax > 0 ) - stream.printf("%%%%VMUsage: %d %d\n",VMMin,VMMax); - } + { + VMMin = (int)getULONG( font->post_table + 16 ); + VMMax = (int)getULONG( font->post_table + 20 ); + if( VMMin > 0 && VMMax > 0 ) + stream.printf("%%%%VMUsage: %d %d\n",VMMin,VMMax); + } /* Start the dictionary which will eventually */ /* become the font. */ if( font->target_type != PS_TYPE_3 ) - { - stream.putline("15 dict begin"); - } + { + stream.putline("15 dict begin"); + } else - { - stream.putline("25 dict begin"); - - /* Type 3 fonts will need some subroutines here. */ - stream.putline("/_d{bind def}bind def"); - stream.putline("/_m{moveto}_d"); - stream.putline("/_l{lineto}_d"); - stream.putline("/_cl{closepath eofill}_d"); - stream.putline("/_c{curveto}_d"); - stream.putline("/_sc{7 -1 roll{setcachedevice}{pop pop pop pop pop pop}ifelse}_d"); - stream.putline("/_e{exec}_d"); - } + { + stream.putline("25 dict begin"); + + /* Type 3 fonts will need some subroutines here. */ + stream.putline("/_d{bind def}bind def"); + stream.putline("/_m{moveto}_d"); + stream.putline("/_l{lineto}_d"); + stream.putline("/_cl{closepath eofill}_d"); + stream.putline("/_c{curveto}_d"); + stream.putline("/_sc{7 -1 roll{setcachedevice}{pop pop pop pop pop pop}ifelse}_d"); + stream.putline("/_e{exec}_d"); + } stream.printf("/FontName /%s def\n",font->PostName); stream.putline("/PaintType 0 def"); if(font->target_type == PS_TYPE_42) - stream.putline("/FontMatrix[1 0 0 1 0 0]def"); + stream.putline("/FontMatrix[1 0 0 1 0 0]def"); else - stream.putline("/FontMatrix[.001 0 0 .001 0 0]def"); + stream.putline("/FontMatrix[.001 0 0 .001 0 0]def"); stream.printf("/FontBBox[%d %d %d %d]def\n",font->llx,font->lly,font->urx,font->ury); stream.printf("/FontType %d def\n", font->target_type ); @@ -414,11 +414,25 @@ void ttfont_header(TTStreamWriter& stream, struct TTFONT *font) /*------------------------------------------------------------- ** Define the encoding array for this font. -** It seems best to just use "Standard". +** Since we don't really want to deal with converting all of +** the possible font encodings in the wild to a standard PS +** one, we just explicitly create one for each font. -------------------------------------------------------------*/ -void ttfont_encoding(TTStreamWriter& stream) +void ttfont_encoding(TTStreamWriter& stream, struct TTFONT *font, std::vector& glyph_ids, font_type_enum target_type) { - stream.putline("/Encoding StandardEncoding def"); + if (target_type == PS_TYPE_3) { + stream.printf("/Encoding [ "); + + for (std::vector::const_iterator i = glyph_ids.begin(); + i != glyph_ids.end(); ++i) { + const char* name = ttfont_CharStrings_getname(font, *i); + stream.printf("/%s ", name); + } + + stream.printf("] def\n"); + } else { + stream.putline("/Encoding StandardEncoding def"); + } } /* end of ttfont_encoding() */ /*----------------------------------------------------------- @@ -439,13 +453,13 @@ void ttfont_FontInfo(TTStreamWriter& stream, struct TTFONT *font) stream.printf("/FullName (%s) def\n",font->FullName); if( font->Copyright != (char*)NULL || font->Trademark != (char*)NULL ) - { - stream.printf("/Notice (%s", - font->Copyright != (char*)NULL ? font->Copyright : ""); - stream.printf("%s%s) def\n", - font->Trademark != (char*)NULL ? " " : "", - font->Trademark != (char*)NULL ? font->Trademark : ""); - } + { + stream.printf("/Notice (%s", + font->Copyright != (char*)NULL ? font->Copyright : ""); + stream.printf("%s%s) def\n", + font->Trademark != (char*)NULL ? " " : "", + font->Trademark != (char*)NULL ? font->Trademark : ""); + } /* This information is not quite correct. */ stream.printf("/Weight (%s) def\n",font->Style); @@ -494,12 +508,12 @@ void sfnts_pputBYTE(TTStreamWriter& stream, BYTE n) static const char hexdigits[]="0123456789ABCDEF"; if(!in_string) - { - stream.put_char('<'); - string_len=0; - line_len++; - in_string=TRUE; - } + { + stream.put_char('<'); + string_len=0; + line_len++; + in_string=TRUE; + } stream.put_char( hexdigits[ n / 16 ] ); stream.put_char( hexdigits[ n % 16 ] ); @@ -507,10 +521,10 @@ void sfnts_pputBYTE(TTStreamWriter& stream, BYTE n) line_len+=2; if(line_len > 70) - { - stream.put_char('\n'); - line_len=0; - } + { + stream.put_char('\n'); + line_len=0; + } } /* end of sfnts_pputBYTE() */ @@ -553,17 +567,17 @@ void sfnts_pputULONG(TTStreamWriter& stream, ULONG n) void sfnts_end_string(TTStreamWriter& stream) { if(in_string) - { - string_len=0; /* fool sfnts_pputBYTE() */ + { + string_len=0; /* fool sfnts_pputBYTE() */ - #ifdef DEBUG_TRUETYPE_INLINE - puts("\n% dummy byte:\n"); - #endif + #ifdef DEBUG_TRUETYPE_INLINE + puts("\n% dummy byte:\n"); + #endif - sfnts_pputBYTE(stream, 0); /* extra byte for pre-2013 compatibility */ - stream.put_char('>'); - line_len++; - } + sfnts_pputBYTE(stream, 0); /* extra byte for pre-2013 compatibility */ + stream.put_char('>'); + line_len++; + } in_string=FALSE; } /* end of sfnts_end_string() */ @@ -589,7 +603,7 @@ void sfnts_glyf_table(TTStreamWriter& stream, struct TTFONT *font, ULONG oldoffs ULONG off; ULONG length; int c; - ULONG total=0; /* running total of bytes written to table */ + ULONG total=0; /* running total of bytes written to table */ int x; #ifdef DEBUG_TRUETYPE @@ -604,58 +618,58 @@ void sfnts_glyf_table(TTStreamWriter& stream, struct TTFONT *font, ULONG oldoffs /* Copy the glyphs one by one */ for(x=0; x < font->numGlyphs; x++) - { - /* Read the glyph offset from the index-to-location table. */ - if(font->indexToLocFormat == 0) - { - off = getUSHORT( font->loca_table + (x * 2) ); - off *= 2; - length = getUSHORT( font->loca_table + ((x+1) * 2) ); - length *= 2; - length -= off; - } - else - { - off = getULONG( font->loca_table + (x * 4) ); - length = getULONG( font->loca_table + ((x+1) * 4) ); - length -= off; - } - - #ifdef DEBUG_TRUETYPE - debug("glyph length=%d",(int)length); - #endif - - /* Start new string if necessary. */ - sfnts_new_table( stream, (int)length ); - - /* - ** Make sure the glyph is padded out to a - ** two byte boundary. - */ - if( length % 2 ) - throw TTException("TrueType font contains a 'glyf' table without 2 byte padding"); - - /* Copy the bytes of the glyph. */ - while( length-- ) - { - if( (c = fgetc(font->file)) == EOF ) - throw TTException("TrueType font may be corrupt (reason 6)"); - - sfnts_pputBYTE(stream, c); - total++; /* add to running total */ - } - - } + { + /* Read the glyph offset from the index-to-location table. */ + if(font->indexToLocFormat == 0) + { + off = getUSHORT( font->loca_table + (x * 2) ); + off *= 2; + length = getUSHORT( font->loca_table + ((x+1) * 2) ); + length *= 2; + length -= off; + } + else + { + off = getULONG( font->loca_table + (x * 4) ); + length = getULONG( font->loca_table + ((x+1) * 4) ); + length -= off; + } + + #ifdef DEBUG_TRUETYPE + debug("glyph length=%d",(int)length); + #endif + + /* Start new string if necessary. */ + sfnts_new_table( stream, (int)length ); + + /* + ** Make sure the glyph is padded out to a + ** two byte boundary. + */ + if( length % 2 ) + throw TTException("TrueType font contains a 'glyf' table without 2 byte padding"); + + /* Copy the bytes of the glyph. */ + while( length-- ) + { + if( (c = fgetc(font->file)) == EOF ) + throw TTException("TrueType font may be corrupt (reason 6)"); + + sfnts_pputBYTE(stream, c); + total++; /* add to running total */ + } + + } free(font->loca_table); font->loca_table = NULL; /* Pad out to full length from table directory */ while( total < correct_total_length ) - { - sfnts_pputBYTE(stream, 0); - total++; - } + { + sfnts_pputBYTE(stream, 0); + total++; + } } /* end of sfnts_glyf_table() */ @@ -667,32 +681,32 @@ void sfnts_glyf_table(TTStreamWriter& stream, struct TTFONT *font, ULONG oldoffs */ void ttfont_sfnts(TTStreamWriter& stream, struct TTFONT *font) { - static const char *table_names[] = /* The names of all tables */ - { /* which it is worth while */ - "cvt ", /* to include in a Type 42 */ - "fpgm", /* PostScript font. */ - "glyf", - "head", - "hhea", - "hmtx", - "loca", - "maxp", - "prep" - } ; - - struct { /* The location of each of */ - ULONG oldoffset; /* the above tables. */ - ULONG newoffset; - ULONG length; - ULONG checksum; - } tables[9]; - - BYTE *ptr; /* A pointer into the origional table directory. */ - ULONG x,y; /* General use loop countes. */ - int c; /* Input character. */ + static const char *table_names[] = /* The names of all tables */ + { /* which it is worth while */ + "cvt ", /* to include in a Type 42 */ + "fpgm", /* PostScript font. */ + "glyf", + "head", + "hhea", + "hmtx", + "loca", + "maxp", + "prep" + } ; + + struct { /* The location of each of */ + ULONG oldoffset; /* the above tables. */ + ULONG newoffset; + ULONG length; + ULONG checksum; + } tables[9]; + + BYTE *ptr; /* A pointer into the origional table directory. */ + ULONG x,y; /* General use loop countes. */ + int c; /* Input character. */ int diff; ULONG nextoffset; - int count; /* How many `important' tables did we find? */ + int count; /* How many `important' tables did we find? */ ptr = font->offset_table + 12; nextoffset=0; @@ -703,32 +717,32 @@ void ttfont_sfnts(TTStreamWriter& stream, struct TTFONT *font) ** statistics in tables[]. */ for(x=0; x < 9; x++ ) - { - do { - diff = strncmp( (char*)ptr, table_names[x], 4 ); - - if( diff > 0 ) /* If we are past it. */ - { - tables[x].length = 0; - diff = 0; - } - else if( diff < 0 ) /* If we haven't hit it yet. */ - { - ptr += 16; - } - else if( diff == 0 ) /* Here it is! */ - { - tables[x].newoffset = nextoffset; - tables[x].checksum = getULONG( ptr + 4 ); - tables[x].oldoffset = getULONG( ptr + 8 ); - tables[x].length = getULONG( ptr + 12 ); - nextoffset += ( ((tables[x].length + 3) / 4) * 4 ); - count++; - ptr += 16; - } - } while(diff != 0); - - } /* end of for loop which passes over the table directory */ + { + do { + diff = strncmp( (char*)ptr, table_names[x], 4 ); + + if( diff > 0 ) /* If we are past it. */ + { + tables[x].length = 0; + diff = 0; + } + else if( diff < 0 ) /* If we haven't hit it yet. */ + { + ptr += 16; + } + else if( diff == 0 ) /* Here it is! */ + { + tables[x].newoffset = nextoffset; + tables[x].checksum = getULONG( ptr + 4 ); + tables[x].oldoffset = getULONG( ptr + 8 ); + tables[x].length = getULONG( ptr + 12 ); + nextoffset += ( ((tables[x].length + 3) / 4) * 4 ); + count++; + ptr += 16; + } + } while(diff != 0); + + } /* end of for loop which passes over the table directory */ /* Begin the sfnts array. */ sfnts_start(stream); @@ -737,95 +751,95 @@ void ttfont_sfnts(TTStreamWriter& stream, struct TTFONT *font) /* Start by copying the TrueType version number. */ ptr = font->offset_table; for(x=0; x < 4; x++) - { - sfnts_pputBYTE( stream, *(ptr++) ); - } + { + sfnts_pputBYTE( stream, *(ptr++) ); + } /* Now, generate those silly numTables numbers. */ - sfnts_pputUSHORT(stream, count); /* number of tables */ + sfnts_pputUSHORT(stream, count); /* number of tables */ if( count == 9 ) - { - sfnts_pputUSHORT(stream, 7); /* searchRange */ - sfnts_pputUSHORT(stream, 3); /* entrySelector */ - sfnts_pputUSHORT(stream, 81); /* rangeShift */ - } + { + sfnts_pputUSHORT(stream, 7); /* searchRange */ + sfnts_pputUSHORT(stream, 3); /* entrySelector */ + sfnts_pputUSHORT(stream, 81); /* rangeShift */ + } #ifdef DEBUG_TRUETYPE else - { - debug("only %d tables selected",count); - } + { + debug("only %d tables selected",count); + } #endif /* Now, emmit the table directory. */ for(x=0; x < 9; x++) - { - if( tables[x].length == 0 ) /* Skip missing tables */ - continue; + { + if( tables[x].length == 0 ) /* Skip missing tables */ + continue; - /* Name */ - sfnts_pputBYTE( stream, table_names[x][0] ); - sfnts_pputBYTE( stream, table_names[x][1] ); - sfnts_pputBYTE( stream, table_names[x][2] ); - sfnts_pputBYTE( stream, table_names[x][3] ); + /* Name */ + sfnts_pputBYTE( stream, table_names[x][0] ); + sfnts_pputBYTE( stream, table_names[x][1] ); + sfnts_pputBYTE( stream, table_names[x][2] ); + sfnts_pputBYTE( stream, table_names[x][3] ); - /* Checksum */ - sfnts_pputULONG( stream, tables[x].checksum ); + /* Checksum */ + sfnts_pputULONG( stream, tables[x].checksum ); - /* Offset */ - sfnts_pputULONG( stream, tables[x].newoffset + 12 + (count * 16) ); + /* Offset */ + sfnts_pputULONG( stream, tables[x].newoffset + 12 + (count * 16) ); - /* Length */ - sfnts_pputULONG( stream, tables[x].length ); - } + /* Length */ + sfnts_pputULONG( stream, tables[x].length ); + } /* Now, send the tables */ for(x=0; x < 9; x++) - { - if( tables[x].length == 0 ) /* skip tables that aren't there */ - continue; - - #ifdef DEBUG_TRUETYPE - debug("emmiting table '%s'",table_names[x]); - #endif - - /* 'glyf' table gets special treatment */ - if( strcmp(table_names[x],"glyf")==0 ) - { - sfnts_glyf_table(stream,font,tables[x].oldoffset,tables[x].length); - } - else /* Other tables may not exceed */ - { /* 65535 bytes in length. */ - if( tables[x].length > 65535 ) - throw TTException("TrueType font has a table which is too long"); - - /* Start new string if necessary. */ - sfnts_new_table(stream, tables[x].length); - - /* Seek to proper position in the file. */ - fseek( font->file, tables[x].oldoffset, SEEK_SET ); - - /* Copy the bytes of the table. */ - for( y=0; y < tables[x].length; y++ ) - { - if( (c = fgetc(font->file)) == EOF ) - throw TTException("TrueType font may be corrupt (reason 7)"); - - sfnts_pputBYTE(stream, c); - } - } - - /* Padd it out to a four byte boundary. */ - y=tables[x].length; - while( (y % 4) != 0 ) - { - sfnts_pputBYTE(stream, 0); - y++; - #ifdef DEBUG_TRUETYPE_INLINE - puts("\n% pad byte:\n"); - #endif - } - - } /* End of loop for all tables */ + { + if( tables[x].length == 0 ) /* skip tables that aren't there */ + continue; + + #ifdef DEBUG_TRUETYPE + debug("emmiting table '%s'",table_names[x]); + #endif + + /* 'glyf' table gets special treatment */ + if( strcmp(table_names[x],"glyf")==0 ) + { + sfnts_glyf_table(stream,font,tables[x].oldoffset,tables[x].length); + } + else /* Other tables may not exceed */ + { /* 65535 bytes in length. */ + if( tables[x].length > 65535 ) + throw TTException("TrueType font has a table which is too long"); + + /* Start new string if necessary. */ + sfnts_new_table(stream, tables[x].length); + + /* Seek to proper position in the file. */ + fseek( font->file, tables[x].oldoffset, SEEK_SET ); + + /* Copy the bytes of the table. */ + for( y=0; y < tables[x].length; y++ ) + { + if( (c = fgetc(font->file)) == EOF ) + throw TTException("TrueType font may be corrupt (reason 7)"); + + sfnts_pputBYTE(stream, c); + } + } + + /* Padd it out to a four byte boundary. */ + y=tables[x].length; + while( (y % 4) != 0 ) + { + sfnts_pputBYTE(stream, 0); + y++; + #ifdef DEBUG_TRUETYPE_INLINE + puts("\n% pad byte:\n"); + #endif + } + + } /* End of loop for all tables */ /* Close the array. */ sfnts_end_string(stream); @@ -893,32 +907,32 @@ const char *ttfont_CharStrings_getname(struct TTFONT *font, int charindex) GlyphIndex = (int)getUSHORT( font->post_table + 34 + (charindex * 2) ); - if( GlyphIndex <= 257 ) /* If a standard Apple name, */ - { - return Apple_CharStrings[GlyphIndex]; - } - else /* Otherwise, use one */ - { /* of the pascal strings. */ - GlyphIndex -= 258; + if( GlyphIndex <= 257 ) /* If a standard Apple name, */ + { + return Apple_CharStrings[GlyphIndex]; + } + else /* Otherwise, use one */ + { /* of the pascal strings. */ + GlyphIndex -= 258; - /* Set pointer to start of Pascal strings. */ - ptr = (char*)(font->post_table + 34 + (font->numGlyphs * 2)); + /* Set pointer to start of Pascal strings. */ + ptr = (char*)(font->post_table + 34 + (font->numGlyphs * 2)); - len = (ULONG)*(ptr++); /* Step thru the strings */ - while(GlyphIndex--) /* until we get to the one */ - { /* that we want. */ - ptr += len; - len = (ULONG)*(ptr++); - } + len = (ULONG)*(ptr++); /* Step thru the strings */ + while(GlyphIndex--) /* until we get to the one */ + { /* that we want. */ + ptr += len; + len = (ULONG)*(ptr++); + } - if( len >= sizeof(temp) ) - throw TTException("TrueType font file contains a very long PostScript name"); + if( len >= sizeof(temp) ) + throw TTException("TrueType font file contains a very long PostScript name"); - strncpy(temp,ptr,len); /* Copy the pascal string into */ - temp[len]=(char)NULL; /* a buffer and make it ASCIIz. */ + strncpy(temp,ptr,len); /* Copy the pascal string into */ + temp[len]=(char)NULL; /* a buffer and make it ASCIIz. */ - return temp; - } + return temp; + } } /* end of ttfont_CharStrings_getname() */ /* @@ -932,28 +946,28 @@ void ttfont_CharStrings(TTStreamWriter& stream, struct TTFONT *font, std::vector post_format = getFixed( font->post_table ); if( post_format.whole != 2 || post_format.fraction != 0 ) - throw TTException("TrueType fontdoes not have a format 2.0 'post' table"); + throw TTException("TrueType fontdoes not have a format 2.0 'post' table"); /* Emmit the start of the PostScript code to define the dictionary. */ stream.printf("/CharStrings %d dict dup begin\n", glyph_ids.size()); /* Emmit one key-value pair for each glyph. */ for(std::vector::const_iterator i = glyph_ids.begin(); - i != glyph_ids.end(); ++i) - { - if(font->target_type == PS_TYPE_42) /* type 42 */ - { - stream.printf("/%s %d def\n",ttfont_CharStrings_getname(font, *i), *i); - } - else /* type 3 */ - { - stream.printf("/%s{",ttfont_CharStrings_getname(font, *i)); - - tt_type3_charproc(stream, font, *i); - - stream.putline("}_d"); /* "} bind def" */ - } - } + i != glyph_ids.end(); ++i) + { + if(font->target_type == PS_TYPE_42) /* type 42 */ + { + stream.printf("/%s %d def\n",ttfont_CharStrings_getname(font, *i), *i); + } + else /* type 3 */ + { + stream.printf("/%s{",ttfont_CharStrings_getname(font, *i)); + + tt_type3_charproc(stream, font, *i); + + stream.putline("}_d"); /* "} bind def" */ + } + } stream.putline("end readonly def"); } /* end of ttfont_CharStrings() */ @@ -967,27 +981,27 @@ void ttfont_trailer(TTStreamWriter& stream, struct TTFONT *font) /* If we are generating a type 3 font, we need to provide */ /* a BuildGlyph and BuildChar proceedures. */ if( font->target_type == PS_TYPE_3 ) - { - stream.put_char('\n'); + { + stream.put_char('\n'); - stream.putline("/BuildGlyph"); - stream.putline(" {exch begin"); /* start font dictionary */ - stream.putline(" CharStrings exch"); - stream.putline(" 2 copy known not{pop /.notdef}if"); - stream.putline(" true 3 1 roll get exec"); - stream.putline(" end}_d"); + stream.putline("/BuildGlyph"); + stream.putline(" {exch begin"); /* start font dictionary */ + stream.putline(" CharStrings exch"); + stream.putline(" 2 copy known not{pop /.notdef}if"); + stream.putline(" true 3 1 roll get exec"); + stream.putline(" end}_d"); - stream.put_char('\n'); + stream.put_char('\n'); - /* This proceedure is for compatiblity with */ - /* level 1 interpreters. */ - stream.putline("/BuildChar {"); - stream.putline(" 1 index /Encoding get exch get"); - stream.putline(" 1 index /BuildGlyph get exec"); - stream.putline("}_d"); + /* This proceedure is for compatiblity with */ + /* level 1 interpreters. */ + stream.putline("/BuildChar {"); + stream.putline(" 1 index /Encoding get exch get"); + stream.putline(" 1 index /BuildGlyph get exec"); + stream.putline("}_d"); - stream.put_char('\n'); - } + stream.put_char('\n'); + } /* If we are generating a type 42 font, we need to check to see */ /* if this PostScript interpreter understands type 42 fonts. If */ @@ -997,90 +1011,90 @@ void ttfont_trailer(TTStreamWriter& stream, struct TTFONT *font) /* generated by a Macintosh. That is where the TrueType interpreter */ /* setup instructions and part of BuildGlyph came from. */ else if( font->target_type == PS_TYPE_42 ) - { - stream.put_char('\n'); - - /* If we have no "resourcestatus" command, or FontType 42 */ - /* is unknown, leave "true" on the stack. */ - stream.putline("systemdict/resourcestatus known"); - stream.putline(" {42 /FontType resourcestatus"); - stream.putline(" {pop pop false}{true}ifelse}"); - stream.putline(" {true}ifelse"); - - /* If true, execute code to produce an error message if */ - /* we can't find Apple's TrueDict in VM. */ - stream.putline("{/TrueDict where{pop}{(%%[ Error: no TrueType rasterizer ]%%)= flush}ifelse"); - - /* Since we are expected to use Apple's TrueDict TrueType */ - /* reasterizer, change the font type to 3. */ - stream.putline("/FontType 3 def"); - - /* Define a string to hold the state of the Apple */ - /* TrueType interpreter. */ - stream.putline(" /TrueState 271 string def"); - - /* It looks like we get information about the resolution */ - /* of the printer and store it in the TrueState string. */ - stream.putline(" TrueDict begin sfnts save"); - stream.putline(" 72 0 matrix defaultmatrix dtransform dup"); - stream.putline(" mul exch dup mul add sqrt cvi 0 72 matrix"); - stream.putline(" defaultmatrix dtransform dup mul exch dup"); - stream.putline(" mul add sqrt cvi 3 -1 roll restore"); - stream.putline(" TrueState initer end"); - - /* This BuildGlyph procedure will look the name up in the */ - /* CharStrings array, and then check to see if what it gets */ - /* is a procedure. If it is, it executes it, otherwise, it */ - /* lets the TrueType rasterizer loose on it. */ - - /* When this proceedure is executed the stack contains */ - /* the font dictionary and the character name. We */ - /* exchange arguments and move the dictionary to the */ - /* dictionary stack. */ - stream.putline(" /BuildGlyph{exch begin"); - /* stack: charname */ - - /* Put two copies of CharStrings on the stack and consume */ - /* one testing to see if the charname is defined in it, */ - /* leave the answer on the stack. */ - stream.putline(" CharStrings dup 2 index known"); - /* stack: charname CharStrings bool */ - - /* Exchange the CharStrings dictionary and the charname, */ - /* but if the answer was false, replace the character name */ - /* with ".notdef". */ - stream.putline(" {exch}{exch pop /.notdef}ifelse"); - /* stack: CharStrings charname */ - - /* Get the value from the CharStrings dictionary and see */ - /* if it is executable. */ - stream.putline(" get dup xcheck"); - /* stack: CharStrings_entry */ - - /* If is a proceedure. Execute according to RBIIp 277-278. */ - stream.putline(" {currentdict systemdict begin begin exec end end}"); - - /* Is a TrueType character index, let the rasterizer at it. */ - stream.putline(" {TrueDict begin /bander load cvlit exch TrueState render end}"); - - stream.putline(" ifelse"); - - /* Pop the font's dictionary off the stack. */ - stream.putline(" end}bind def"); - - /* This is the level 1 compatibility BuildChar procedure. */ - /* See RBIIp 281. */ - stream.putline(" /BuildChar{"); - stream.putline(" 1 index /Encoding get exch get"); - stream.putline(" 1 index /BuildGlyph get exec"); - stream.putline(" }bind def"); - - /* Here we close the condition which is true */ - /* if the printer has no built-in TrueType */ - /* rasterizer. */ - stream.putline("}if"); - stream.put_char('\n'); - } /* end of if Type 42 not understood. */ + { + stream.put_char('\n'); + + /* If we have no "resourcestatus" command, or FontType 42 */ + /* is unknown, leave "true" on the stack. */ + stream.putline("systemdict/resourcestatus known"); + stream.putline(" {42 /FontType resourcestatus"); + stream.putline(" {pop pop false}{true}ifelse}"); + stream.putline(" {true}ifelse"); + + /* If true, execute code to produce an error message if */ + /* we can't find Apple's TrueDict in VM. */ + stream.putline("{/TrueDict where{pop}{(%%[ Error: no TrueType rasterizer ]%%)= flush}ifelse"); + + /* Since we are expected to use Apple's TrueDict TrueType */ + /* reasterizer, change the font type to 3. */ + stream.putline("/FontType 3 def"); + + /* Define a string to hold the state of the Apple */ + /* TrueType interpreter. */ + stream.putline(" /TrueState 271 string def"); + + /* It looks like we get information about the resolution */ + /* of the printer and store it in the TrueState string. */ + stream.putline(" TrueDict begin sfnts save"); + stream.putline(" 72 0 matrix defaultmatrix dtransform dup"); + stream.putline(" mul exch dup mul add sqrt cvi 0 72 matrix"); + stream.putline(" defaultmatrix dtransform dup mul exch dup"); + stream.putline(" mul add sqrt cvi 3 -1 roll restore"); + stream.putline(" TrueState initer end"); + + /* This BuildGlyph procedure will look the name up in the */ + /* CharStrings array, and then check to see if what it gets */ + /* is a procedure. If it is, it executes it, otherwise, it */ + /* lets the TrueType rasterizer loose on it. */ + + /* When this proceedure is executed the stack contains */ + /* the font dictionary and the character name. We */ + /* exchange arguments and move the dictionary to the */ + /* dictionary stack. */ + stream.putline(" /BuildGlyph{exch begin"); + /* stack: charname */ + + /* Put two copies of CharStrings on the stack and consume */ + /* one testing to see if the charname is defined in it, */ + /* leave the answer on the stack. */ + stream.putline(" CharStrings dup 2 index known"); + /* stack: charname CharStrings bool */ + + /* Exchange the CharStrings dictionary and the charname, */ + /* but if the answer was false, replace the character name */ + /* with ".notdef". */ + stream.putline(" {exch}{exch pop /.notdef}ifelse"); + /* stack: CharStrings charname */ + + /* Get the value from the CharStrings dictionary and see */ + /* if it is executable. */ + stream.putline(" get dup xcheck"); + /* stack: CharStrings_entry */ + + /* If is a proceedure. Execute according to RBIIp 277-278. */ + stream.putline(" {currentdict systemdict begin begin exec end end}"); + + /* Is a TrueType character index, let the rasterizer at it. */ + stream.putline(" {TrueDict begin /bander load cvlit exch TrueState render end}"); + + stream.putline(" ifelse"); + + /* Pop the font's dictionary off the stack. */ + stream.putline(" end}bind def"); + + /* This is the level 1 compatibility BuildChar procedure. */ + /* See RBIIp 281. */ + stream.putline(" /BuildChar{"); + stream.putline(" 1 index /Encoding get exch get"); + stream.putline(" 1 index /BuildGlyph get exec"); + stream.putline(" }bind def"); + + /* Here we close the condition which is true */ + /* if the printer has no built-in TrueType */ + /* rasterizer. */ + stream.putline("}if"); + stream.put_char('\n'); + } /* end of if Type 42 not understood. */ stream.putline("FontName currentdict end definefont pop"); /* stream.putline("%%EOF"); */ @@ -1102,7 +1116,7 @@ void read_font(const char *filename, font_type_enum target_type, std::vector& glyph_ids) + font_type_enum target_type, std::vector& glyph_ids) { struct TTFONT font; @@ -1201,7 +1215,7 @@ void insert_ttfont(const char *filename, TTStreamWriter& stream, ttfont_header(stream, &font); /* Define the encoding. */ - ttfont_encoding(stream); + ttfont_encoding(stream, &font, glyph_ids, target_type); /* Insert FontInfo dictionary. */ ttfont_FontInfo(stream, &font); @@ -1224,10 +1238,10 @@ class StringStreamWriter : public TTStreamWriter { public: void write(const char* a) { - oss << a; + oss << a; } std::string str() { - return oss.str(); + return oss.str(); } }; @@ -1237,11 +1251,11 @@ void get_pdf_charprocs(const char *filename, std::vector& glyph_ids, TTDict read_font(filename, PDF_TYPE_3, glyph_ids, font); for (std::vector::const_iterator i = glyph_ids.begin(); - i != glyph_ids.end(); ++i) { - StringStreamWriter writer; - tt_type3_charproc(writer, &font, *i); - const char* name = ttfont_CharStrings_getname(&font, *i); - dict.add_pair(name, writer.str().c_str()); + i != glyph_ids.end(); ++i) { + StringStreamWriter writer; + tt_type3_charproc(writer, &font, *i); + const char* name = ttfont_CharStrings_getname(&font, *i); + dict.add_pair(name, writer.str().c_str()); } } @@ -1263,7 +1277,7 @@ TTFONT::TTFONT() : TTFONT::~TTFONT() { if (file) - fclose(file); + fclose(file); free(PostName); free(FullName); free(FamilyName); From 22864338e93550fd362f4e6c2ec2208a586c2913 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Wed, 10 Feb 2010 15:56:34 +0000 Subject: [PATCH 0515/1000] added Yannick Copin's sanke demo svn path=/trunk/matplotlib/; revision=8123 --- examples/api/sankey_demo.py | 105 ++++++++++++++++++++++++++++++++++++ 1 file changed, 105 insertions(+) create mode 100644 examples/api/sankey_demo.py diff --git a/examples/api/sankey_demo.py b/examples/api/sankey_demo.py new file mode 100644 index 000000000000..56db3ab8a631 --- /dev/null +++ b/examples/api/sankey_demo.py @@ -0,0 +1,105 @@ +#!/usr/bin/env python +# Time-stamp: <2010-02-10 01:49:08 ycopin> + +import numpy as np +import matplotlib.pyplot as plt +import matplotlib.patches as mpatches +from matplotlib.path import Path + +def sankey(ax, losses, labels=None, + dx=40, dy=10, angle=45, w=3, dip=10, offset=2, **kwargs): + """Draw a Sankey diagram. + + losses: array of losses, should sum up to 100% + labels: loss labels (same length as losses), + or None (use default labels) or '' (no labels) + dx: horizontal elongation + dy: vertical elongation + angle: arrow angle [deg] + w: arrow shoulder + dip: input dip + offset: text offset + **kwargs: propagated to Patch (e.g. fill=False) + + Return (patch,texts).""" + + assert sum(losses)==100, "Input losses don't sum up to 100%" + + def add_loss(loss, last=False): + h = (loss/2+w)*np.tan(angle/180.*np.pi) # Arrow tip height + move,(x,y) = path[-1] # Use last point as reference + if last: # Final loss (horizontal) + path.extend([(Path.LINETO,[x+dx,y]), + (Path.LINETO,[x+dx,y+w]), + (Path.LINETO,[x+dx+h,y-loss/2]), # Tip + (Path.LINETO,[x+dx,y-loss-w]), + (Path.LINETO,[x+dx,y-loss])]) + tips.append(path[-3][1]) + else: # Intermediate loss (vertical) + path.extend([(Path.LINETO,[x+dx/2,y]), + (Path.CURVE3,[x+dx,y]), + (Path.CURVE3,[x+dx,y+dy]), + (Path.LINETO,[x+dx-w,y+dy]), + (Path.LINETO,[x+dx+loss/2,y+dy+h]), # Tip + (Path.LINETO,[x+dx+loss+w,y+dy]), + (Path.LINETO,[x+dx+loss,y+dy]), + (Path.CURVE3,[x+dx+loss,y-loss]), + (Path.CURVE3,[x+dx/2+loss,y-loss])]) + tips.append(path[-5][1]) + + tips = [] # Arrow tip positions + path = [(Path.MOVETO,[0,100])] # 1st point + for i,loss in enumerate(losses): + add_loss(loss, last=(i==(len(losses)-1))) + path.extend([(Path.LINETO,[0,0]), + (Path.LINETO,[dip,50]), # Dip + (Path.CLOSEPOLY,[0,100])]) + codes,verts = zip(*path) + verts = np.array(verts) + + # Path patch + path = Path(verts,codes) + patch = mpatches.PathPatch(path, **kwargs) + ax.add_patch(patch) + + # Labels + if labels=='': # No labels + pass + elif labels is None: # Default labels + labels = [ '%2d%%' % loss for loss in losses ] + else: + assert len(labels)==len(losses) + + texts = [] + for i,label in enumerate(labels): + x,y = tips[i] # Label position + last = (i==(len(losses)-1)) + if last: + t = ax.text(x+offset,y,label, ha='left', va='center') + else: + t = ax.text(x,y+offset,label, ha='center', va='bottom') + texts.append(t) + + # Axes management + ax.set_xlim(verts[:,0].min()-10, verts[:,0].max()+40) + ax.set_ylim(verts[:,1].min()-10, verts[:,1].max()+20) + ax.set_aspect('equal', adjustable='datalim') + ax.set_xticks([]) + ax.set_yticks([]) + + return patch,texts + +if __name__=='__main__': + + losses = [10.,20.,5.,15.,10.,40.] + labels = ['First','Second','Third','Fourth','Fifth','Hurray!'] + labels = [ s+'\n%d%%' % l for l,s in zip(losses,labels) ] + + fig = plt.figure() + ax = fig.add_subplot(1,1,1) + + patch,texts = sankey(ax, losses, labels, fc='g', alpha=0.2) + texts[1].set_color('r') + texts[-1].set_fontweight('bold') + + plt.show() From 30daf2f3826b90aaf3d880df086c9e8166261c76 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Wed, 10 Feb 2010 16:00:15 +0000 Subject: [PATCH 0516/1000] added Yannick Copin's updated sanke demo svn path=/trunk/matplotlib/; revision=8124 --- examples/api/sankey_demo.py | 217 +++++++++++++++++++++++++----------- 1 file changed, 150 insertions(+), 67 deletions(-) diff --git a/examples/api/sankey_demo.py b/examples/api/sankey_demo.py index 56db3ab8a631..c10243e48498 100644 --- a/examples/api/sankey_demo.py +++ b/examples/api/sankey_demo.py @@ -1,105 +1,188 @@ #!/usr/bin/env python -# Time-stamp: <2010-02-10 01:49:08 ycopin> -import numpy as np -import matplotlib.pyplot as plt -import matplotlib.patches as mpatches -from matplotlib.path import Path +__author__ = "Yannick Copin " +__version__ = "Time-stamp: <10/02/2010 16:49 ycopin@lyopc548.in2p3.fr>" -def sankey(ax, losses, labels=None, - dx=40, dy=10, angle=45, w=3, dip=10, offset=2, **kwargs): +import numpy as N + +def sankey(ax, + outputs=[100.], outlabels=None, + inputs=[100.], inlabels='', + dx=40, dy=10, outangle=45, w=3, inangle=30, offset=2, **kwargs): """Draw a Sankey diagram. - losses: array of losses, should sum up to 100% - labels: loss labels (same length as losses), - or None (use default labels) or '' (no labels) + outputs: array of outputs, should sum up to 100% + outlabels: output labels (same length as outputs), + or None (use default labels) or '' (no labels) + inputs and inlabels: similar for inputs dx: horizontal elongation dy: vertical elongation - angle: arrow angle [deg] - w: arrow shoulder - dip: input dip + outangle: output arrow angle [deg] + w: output arrow shoulder + inangle: input dip angle offset: text offset **kwargs: propagated to Patch (e.g. fill=False) - Return (patch,texts).""" + Return (patch,[intexts,outtexts]).""" + + import matplotlib.patches as mpatches + from matplotlib.path import Path + + outs = N.absolute(outputs) + outsigns = N.sign(outputs) + outsigns[-1] = 0 # Last output - assert sum(losses)==100, "Input losses don't sum up to 100%" + ins = N.absolute(inputs) + insigns = N.sign(inputs) + insigns[0] = 0 # First input - def add_loss(loss, last=False): - h = (loss/2+w)*np.tan(angle/180.*np.pi) # Arrow tip height + assert sum(outs)==100, "Outputs don't sum up to 100%" + assert sum(ins)==100, "Inputs don't sum up to 100%" + + def add_output(path, loss, sign=1): + h = (loss/2+w)*N.tan(outangle/180.*N.pi) # Arrow tip height move,(x,y) = path[-1] # Use last point as reference - if last: # Final loss (horizontal) + if sign==0: # Final loss (horizontal) path.extend([(Path.LINETO,[x+dx,y]), (Path.LINETO,[x+dx,y+w]), (Path.LINETO,[x+dx+h,y-loss/2]), # Tip (Path.LINETO,[x+dx,y-loss-w]), (Path.LINETO,[x+dx,y-loss])]) - tips.append(path[-3][1]) + outtips.append((sign,path[-3][1])) else: # Intermediate loss (vertical) - path.extend([(Path.LINETO,[x+dx/2,y]), - (Path.CURVE3,[x+dx,y]), - (Path.CURVE3,[x+dx,y+dy]), - (Path.LINETO,[x+dx-w,y+dy]), - (Path.LINETO,[x+dx+loss/2,y+dy+h]), # Tip - (Path.LINETO,[x+dx+loss+w,y+dy]), - (Path.LINETO,[x+dx+loss,y+dy]), - (Path.CURVE3,[x+dx+loss,y-loss]), - (Path.CURVE3,[x+dx/2+loss,y-loss])]) - tips.append(path[-5][1]) - - tips = [] # Arrow tip positions - path = [(Path.MOVETO,[0,100])] # 1st point - for i,loss in enumerate(losses): - add_loss(loss, last=(i==(len(losses)-1))) - path.extend([(Path.LINETO,[0,0]), - (Path.LINETO,[dip,50]), # Dip - (Path.CLOSEPOLY,[0,100])]) + path.extend([(Path.CURVE4,[x+dx/2,y]), + (Path.CURVE4,[x+dx,y]), + (Path.CURVE4,[x+dx,y+sign*dy]), + (Path.LINETO,[x+dx-w,y+sign*dy]), + (Path.LINETO,[x+dx+loss/2,y+sign*(dy+h)]), # Tip + (Path.LINETO,[x+dx+loss+w,y+sign*dy]), + (Path.LINETO,[x+dx+loss,y+sign*dy]), + (Path.CURVE3,[x+dx+loss,y-sign*loss]), + (Path.CURVE3,[x+dx/2+loss,y-sign*loss])]) + outtips.append((sign,path[-5][1])) + + def add_input(path, gain, sign=1): + h = (gain/2)*N.tan(inangle/180.*N.pi) # Dip depth + move,(x,y) = path[-1] # Use last point as reference + if sign==0: # First gain (horizontal) + path.extend([(Path.LINETO,[x-dx,y]), + (Path.LINETO,[x-dx+h,y+gain/2]), # Dip + (Path.LINETO,[x-dx,y+gain])]) + xd,yd = path[-2][1] # Dip position + indips.append((sign,[xd-h,yd])) + else: # Intermediate gain (vertical) + path.extend([(Path.CURVE4,[x-dx/2,y]), + (Path.CURVE4,[x-dx,y]), + (Path.CURVE4,[x-dx,y+sign*dy]), + (Path.LINETO,[x-dx-gain/2,y+sign*(dy-h)]), # Dip + (Path.LINETO,[x-dx-gain,y+sign*dy]), + (Path.CURVE3,[x-dx-gain,y-sign*gain]), + (Path.CURVE3,[x-dx/2-gain,y-sign*gain])]) + xd,yd = path[-4][1] # Dip position + indips.append((sign,[xd,yd+sign*h])) + + outtips = [] # Output arrow tip dir. and positions + urpath = [(Path.MOVETO,[0,100])] # 1st point of upper right path + lrpath = [(Path.LINETO,[0,0])] # 1st point of lower right path + for loss,sign in zip(outs,outsigns): + add_output(sign>=0 and urpath or lrpath, loss, sign=sign) + + indips = [] # Input arrow tip dir. and positions + llpath = [(Path.LINETO,[0,0])] # 1st point of lower left path + ulpath = [(Path.MOVETO,[0,100])] # 1st point of upper left path + for gain,sign in zip(ins,insigns)[::-1]: + add_input(sign<=0 and llpath or ulpath, gain, sign=sign) + + def revert(path): + """A path is not just revertable by path[::-1] because of Bezier + curves.""" + rpath = [] + nextmove = Path.LINETO + for move,pos in path[::-1]: + rpath.append((nextmove,pos)) + nextmove = move + return rpath + + # Concatenate subpathes in correct order + path = urpath + revert(lrpath) + llpath + revert(ulpath) + codes,verts = zip(*path) - verts = np.array(verts) + verts = N.array(verts) # Path patch path = Path(verts,codes) patch = mpatches.PathPatch(path, **kwargs) ax.add_patch(patch) + if False: # DEBUG + print "urpath", urpath + print "lrpath", revert(lrpath) + print "llpath", llpath + print "ulpath", revert(ulpath) + + xs,ys = zip(*verts) + ax.plot(xs,ys,'go-') + # Labels - if labels=='': # No labels - pass - elif labels is None: # Default labels - labels = [ '%2d%%' % loss for loss in losses ] - else: - assert len(labels)==len(losses) - - texts = [] - for i,label in enumerate(labels): - x,y = tips[i] # Label position - last = (i==(len(losses)-1)) - if last: - t = ax.text(x+offset,y,label, ha='left', va='center') + + def set_labels(labels,values): + """Set or check labels according to values.""" + if labels=='': # No labels + return labels + elif labels is None: # Default labels + return [ '%2d%%' % val for val in values ] else: - t = ax.text(x,y+offset,label, ha='center', va='bottom') - texts.append(t) + assert len(labels)==len(values) + return labels + + def put_labels(labels,positions,output=True): + """Put labels to positions.""" + texts = [] + lbls = output and labels or labels[::-1] + for i,label in enumerate(lbls): + s,(x,y) = positions[i] # Label direction and position + if s==0: + t = ax.text(x+offset,y,label, + ha=output and 'left' or 'right', va='center') + elif s>0: + t = ax.text(x,y+offset,label, ha='center', va='bottom') + else: + t = ax.text(x,y-offset,label, ha='center', va='top') + texts.append(t) + return texts + + outlabels = set_labels(outlabels, outs) + outtexts = put_labels(outlabels, outtips, output=True) + + inlabels = set_labels(inlabels, ins) + intexts = put_labels(inlabels, indips, output=False) # Axes management - ax.set_xlim(verts[:,0].min()-10, verts[:,0].max()+40) - ax.set_ylim(verts[:,1].min()-10, verts[:,1].max()+20) + ax.set_xlim(verts[:,0].min()-dx, verts[:,0].max()+dx) + ax.set_ylim(verts[:,1].min()-dy, verts[:,1].max()+dy) ax.set_aspect('equal', adjustable='datalim') - ax.set_xticks([]) - ax.set_yticks([]) - return patch,texts + return patch,[intexts,outtexts] if __name__=='__main__': - losses = [10.,20.,5.,15.,10.,40.] - labels = ['First','Second','Third','Fourth','Fifth','Hurray!'] - labels = [ s+'\n%d%%' % l for l,s in zip(losses,labels) ] + import matplotlib.pyplot as P + + outputs = [10.,-20.,5.,15.,-10.,40.] + outlabels = ['First','Second','Third','Fourth','Fifth','Hurray!'] + outlabels = [ s+'\n%d%%' % abs(l) for l,s in zip(outputs,outlabels) ] + + inputs = [60.,-25.,15.] - fig = plt.figure() - ax = fig.add_subplot(1,1,1) + fig = P.figure() + ax = fig.add_subplot(1,1,1, xticks=[],yticks=[], + title="Sankey diagram" + ) - patch,texts = sankey(ax, losses, labels, fc='g', alpha=0.2) - texts[1].set_color('r') - texts[-1].set_fontweight('bold') + patch,(intexts,outtexts) = sankey(ax, outputs=outputs, outlabels=outlabels, + inputs=inputs, inlabels=None, + fc='g', alpha=0.2) + outtexts[1].set_color('r') + outtexts[-1].set_fontweight('bold') - plt.show() + P.show() From b62531e8d62f310db5dbfc12eeb4ac8d444b108c Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Fri, 12 Feb 2010 02:21:05 +0000 Subject: [PATCH 0517/1000] Add option to bootstrap confidence intervals for boxplot (Paul Hobson) svn path=/trunk/matplotlib/; revision=8127 --- CHANGELOG | 4 +++ examples/pylab_examples/boxplot_demo3.py | 27 +++++++++++++++ lib/matplotlib/axes.py | 42 ++++++++++++++++++++++-- 3 files changed, 70 insertions(+), 3 deletions(-) create mode 100644 examples/pylab_examples/boxplot_demo3.py diff --git a/CHANGELOG b/CHANGELOG index 63db423151cd..3cfe95d87901 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +2010-02-11 Added 'bootstrap' option to boxplot. This allows bootstrap + estimates of median confidence intervals. Based on an + initial patch by Paul Hobson. - ADS + 2010-02-06 Added setup.cfg "basedirlist" option to override setting in setupext.py "basedir" dictionary; added "gnu0" platform requested by Benjamin Drung. - EF diff --git a/examples/pylab_examples/boxplot_demo3.py b/examples/pylab_examples/boxplot_demo3.py new file mode 100644 index 000000000000..9cf9e795b20c --- /dev/null +++ b/examples/pylab_examples/boxplot_demo3.py @@ -0,0 +1,27 @@ +import matplotlib.pyplot as plt +import matplotlib.transforms as mtransforms +import numpy as np + +np.random.seed(2) +inc = 0.1 +e1 = np.random.uniform(0,1, size=(500,)) +e2 = np.random.uniform(0,1, size=(500,)) +e3 = np.random.uniform(0,1 + inc, size=(500,)) +e4 = np.random.uniform(0,1 + 2*inc, size=(500,)) + +treatments = [e1,e2,e3,e4] + +fig = plt.figure() +ax = fig.add_subplot(111) +pos = np.array(range(len(treatments)))+1 +bp = ax.boxplot( treatments, sym='k+', patch_artist=True, + positions=pos, notch=1, bootstrap=5000 ) +text_transform= mtransforms.blended_transform_factory(ax.transData, + ax.transAxes) +ax.set_xlabel('treatment') +ax.set_ylabel('response') +ax.set_ylim(-0.2, 1.4) +plt.setp(bp['whiskers'], color='k', linestyle='-' ) +plt.setp(bp['fliers'], markersize=3.0) +fig.subplots_adjust(right=0.99,top=0.99) +plt.show() diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index 38603ac7a86b..fd70a9f9964a 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -4881,7 +4881,8 @@ def xywhere(xs, ys, mask): return (l0, caplines, barcols) def boxplot(self, x, notch=0, sym='b+', vert=1, whis=1.5, - positions=None, widths=None, patch_artist=False): + positions=None, widths=None, patch_artist=False, + bootstrap=None): """ call signature:: @@ -4910,6 +4911,16 @@ def boxplot(self, x, notch=0, sym='b+', vert=1, whis=1.5, a function of the inner quartile range. They extend to the most extreme data point within ( ``whis*(75%-25%)`` ) data range. + *bootstrap* (default None) specifies whether to bootstrap the + confidence intervals around the median for notched + boxplots. If bootstrap==None, no bootstrapping is performed, + and notches are calculated using a Gaussian-based asymptotic + approximation (see McGill, R., Tukey, J.W., and Larsen, W.A., + 1978, and Kendall and Stuart, 1967). Otherwise, bootstrap + specifies the number of times to bootstrap the median to + determine it's 95% confidence intervals. Values between 1000 + and 10000 are recommended. + *positions* (default 1,2,...,n) sets the horizontal positions of the boxes. The ticks and limits are automatically set to match the positions. @@ -5021,8 +5032,33 @@ def boxplot(self, x, notch=0, sym='b+', vert=1, whis=1.5, med_x = [box_x_min, box_x_max] # calculate 'notch' plot else: - notch_max = med + 1.57*iq/np.sqrt(row) - notch_min = med - 1.57*iq/np.sqrt(row) + if bootstrap is not None: + # Do a bootstrap estimate of notch locations. + def bootstrapMedian(data, N=5000): + # determine 95% confidence intervals of the median + M = len(data) + percentile = [2.5,97.5] + estimate = np.zeros(N) + for n in range(N): + bsIndex = np.random.random_integers(0,M-1,M) + bsData = data[bsIndex] + estimate[n] = mlab.prctile(bsData, 50) + CI = mlab.prctile(estimate, percentile) + return CI + + # get conf. intervals around median + CI = bootstrapMedian(d, N=bootstrap) + notch_max = CI[1] + notch_min = CI[0] + else: + # Estimate notch locations using Gaussian-based + # asymptotic approximation. + # + # For discussion: McGill, R., Tukey, J.W., + # and Larsen, W.A. (1978) "Variations of + # Boxplots", The American Statistician, 32:12-16. + notch_max = med + 1.57*iq/np.sqrt(row) + notch_min = med - 1.57*iq/np.sqrt(row) # make our notched box vectors box_x = [box_x_min, box_x_max, box_x_max, cap_x_max, box_x_max, box_x_max, box_x_min, box_x_min, cap_x_min, box_x_min, From 5d87d6827bdb1a1f6ef609d7b88af0e5224ea4d7 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Fri, 12 Feb 2010 17:24:56 +0000 Subject: [PATCH 0518/1000] allow numpy 2.x to pass check for numpy >= 1.1 (reported by Nadia Dencheva) svn path=/trunk/matplotlib/; revision=8128 --- lib/matplotlib/__init__.py | 6 ++++-- setupext.py | 8 +++++--- 2 files changed, 9 insertions(+), 5 deletions(-) diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index ffb735a4fb60..40f27fa799f7 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -147,8 +147,10 @@ import numpy nn = numpy.__version__.split('.') if not (int(nn[0]) >= 1 and int(nn[1]) >= 1): - raise ImportError( - 'numpy 1.1 or later is required; you have %s' % numpy.__version__) + if not (int(nn[0]) >= 2): + raise ImportError( + 'numpy 1.1 or later is required; you have %s' % + numpy.__version__) def is_string_like(obj): if hasattr(obj, 'shape'): return 0 diff --git a/setupext.py b/setupext.py index 6d4aa07a8c3a..a540343a6139 100644 --- a/setupext.py +++ b/setupext.py @@ -516,9 +516,11 @@ def check_for_numpy(): return False nn = numpy.__version__.split('.') if not (int(nn[0]) >= 1 and int(nn[1]) >= 1): - print_message( - 'numpy 1.1 or later is required; you have %s' % numpy.__version__) - return False + if not (int(nn[0]) >= 2): + print_message( + 'numpy 1.1 or later is required; you have %s' % + numpy.__version__) + return False module = Extension('test', []) add_numpy_flags(module) add_base_flags(module) From c7e58e3465ba6ae20801b211a3d234325d494ec2 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Mon, 15 Feb 2010 00:19:05 +0000 Subject: [PATCH 0519/1000] replace not-obviously wrong image that is spontaneously failing tests svn path=/trunk/matplotlib/; revision=8129 --- .../test_image/image_interps.png | Bin 70155 -> 70171 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/lib/matplotlib/tests/baseline_images/test_image/image_interps.png b/lib/matplotlib/tests/baseline_images/test_image/image_interps.png index 55dc16080a10ba977e6d41f778e3fdccf768f245..8089aabb1bec5f01da5ad1f6518d3c266603553e 100644 GIT binary patch delta 51058 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 delta 51036 zcmZs@2Rv8*`#w&TBs(EnvPU9&6@~0g_R5~w;izPXC<-AVNmjD=9+kbaN%r3Rf1f_z z@%#TCzt`hEIj?h`<9=TEbzS#;N=(NNPsfhdK$7~lPbAlM9uaz&@?0e%etKSy;5_!7 zjlcWZAzo_4ALx4?W@}#&ThG!e(Ea|EEJsV`1ec6RZOKpVJekcsV%Ao!eCl)04DdP% zDy008+8@d>oh%1TvGN|lgIgP_F`Wm>%OYnONxEU z#PsTHJ=PEt7nv{p{$$V5cW=ydsNCId=)=C*#&nZzrI*W)sis2rpwCFLgZzrs&xG6i zs}*a`^Iad(cco=CV_nYOm0|mulXIDjjI6#=MdAS4>b?6_W~GEH_Nwx(!;VrgmFc}zjyEa;=orb4^|nO z{;MqXGBPdHB8b~X$>Vh_ekExa7v7$p9_ppnZ{CvzAB9EG#X>MwXU09z1veo58?uH*nc~ zu}>|`sW($;2u7M9;1Krg*}0Kjcy2fr4nb;aDuz-5znVy7Xvnz?QsRu%0`rzdxLbLq zjnAV;nTV09D$&u}OTls2kikz%iJ5i@nUWigq=&EBG`55AsTLD57vQg*rNO~Z%I|G$ zJX@m~eD2(NdU~=qu_PT#(9g%m=dRSd9nM|Os{IHCeK>5D@>Q1cmF^P=nqFhS9WB!w z{bKuW975V0D@)6!_QB5@vNbc2qT8FBuCs`P#7>{a&cIiFsvaZ%150s9N#hhDm$cL4 zt zI1MiKeJ17jVv~>@8~bs>Z*Q#rL{{d?RU=G>wAXIq-gBn=>r-CSp)6gwhN73R@w3Ja zR{K4X9`+pf#_5RTYETj!3)D~%C;OuPwZ2zH@+E_GP^!a7F*4uxStDn;+V4p9;lr>G z(!pjBIHhN&N8PD+p6i|-t<^-?<(6GII5^lpSwo_Fl|}LOOB|adPd5nRAs1(7XDLM7 ztaFZG16_89t!7~P8sVGk$k`s!WYCq9rNNP%s8syCXbzIzZ zr08mGrc&Zf*FSRnj-x`msZU_P5zglCc7tYpS!&i3)#7oSde2x=d`WbSyl+UHY-_kJ z4R8(ooo)(ufqh9!OFLIG?!)m*c#awcfSKl(4bcqJ`2e4n=_E#7Qv8lLT7(Y%#PV9S z67k#gV8b3a{&>f?vG^q~?aAIM3aZQ5%^}3sZ@MpP`tJ1Wz|tYs%h}rS$*J-?+BNM= z7LOY=tqs8RI$9~|E_-Zs{8zB%j)#Xprbx0i=W zX++#=w>l-G08SL&-o(tS+`M!N4{xJSL#3&G;&G?A*WY(m&TTj1O(tufvT|}Z?yijR zdafD(@(8UWIE-mhFT}AJ86U*;f6-ZjqYkKX<*)1+d-9t%89WB1UD11+9X#kSYL3R% zE-wrkJbsyLlQ5pCMCAwL4XT8J|APlAe(Tgc{gPkNC6DKnt898ReX4wRwoi`sT6%B@ zsIvf9RNmccBAJ-1dybw%$Qd#=PY^0W#~eZ1zSd{~|Kt53<7J&(1Dn<-i=RKa!8H?S zr+Y!$UvkSI4Du^Y6xqaPM76g+sM7oP$j8Vix!U)@RoX~T?;SdpD&_Yghriy7nlHc} z*)4~4s7Rhz*gW3+(}o^QCX#N*VV12&)8RbZa!hF@P7~wN<6rd!ktu)uDxdG@nXXmUc1^p{7=NR9mu zZUlTpX8mVg3U(Ek%QlcDWC1=B)^>C7hhF2iCW8E8DfjsI{a2KHk4ykvN;jIRx?zc= zjoyp6qc>chsG;L~^drBIMgs8_x+Y-H>TvW7k6S8=R{XNfSh>6O-s)I^MH>mHULkgE z_Z-8c&g7Q@4!?DGN7z0kJ%j8x1$($ZSaUjCDqd(MkXv)=gHfwv>^D0U6bn&$4ujTb zp25Pxf?|^vId-v5xXMAwbNxCNq4;(*!&k?#^7-zMIJ>K3;V>(tsV9nB_!)47F6Hd+(lxb7%1#xYGrsW$qZVc5RHB$mP06Ldg z#ji%H)Lr5pWMLt>C~wqDQB*exhzuMaFSXyR$IIe$zSKzjwZsXn0A?zVDLUD3|b66lu#@v7D zYsorLwM!j;{`|R!;EpaNW>^>-QYrCpaos-V;4s$JwPv;Ygq)pv!Ii3rfk6c9$OqWe z)*nA)fLWYwf0Ar6`XU36dAFDU&+M%HjA4zx_yYw6d{Ux{8IqgTjw<3iS5Sn3!!-TQ zD!GoYQ|!4M(=($gAJfrN7gla=WiQc?kmGvXi^Q)~(y*4{L@F$hw|$&NPL_<#kM}p^ zU;gCje#@eq6oM?}R{R<)w$w38BMqJJ53s(hJo}zm42|(|pCzvCm61W$iUBwX>z^b~ zXTi4 zQ=jePym<$UZYSPEQP13bUw%Wk5xvS6c;x4@e6BK&LjYXQnVEfS3u(j6ko?r=5TYvI zW91-D*i~3oQN)Vp1SLMxbR76_O*stYzhS8G_dXZ zw0q&}Q^9oC+MULbax$Lkea2h2ZaM$FJvg*WPP3kvQt&w|tM)Cgd7%69?n}k9(-TY# z6|s##%jwM_^Qb$6JArx3ZH|KB%^Vf)!$VjvSE7KX?e8y9?zZqu`0-zpuGBl$!-Y5a zl^Sjj8kiq&5lQxa)h8!qR;&fwaDn`30$fFCZ}hR+7et%ucz-79t@smxao;T^$g2{& zVzu8oCBlI&5x{Y7LC%hh4g7Zcv*1@AtD~U@TXQozgT^gbgkk}xM%eSRtQh6+0y_0}7tW^RP(H zMjr*ijT`-kdXSc1s^FvSyEyeD@dAwF)<|6B5oI1lD!xq zG2b}x;GCS#v*rOZ3o4iuVP%zC8up>0hF2GB!4BaomPsMMeB>i+#B7-n}c{LH4I`?0*;GdV70=M1Q_?%E8W_ zZ{5vEE#!>xDarNHH9^Pa>}skfyUTSw8450-9Iud*&oq*%m~4Mt0ZNr)P(}hNNgAHn zm953$kIzG_rH~XrM68ze19B4M0|(!W@Bi5c=NbUj(a-rH$kXt9G?9aP1=4?^$5@bs zF|Due|GXlWmzx2ZS)DUu%dnrQrUBX^rKUy<$FG4P7;f159q6VBaE|%@FXW4Zd2}8^ z=>eqCGeZ%Sd^f$;C-WQV!M=Df1ZwoAbyq6<@A;$v>XrmSCx80|a*WZ_rb$wac%S+2 zals;?S)|U0)S{DlT#FA6#{Sn}pYP(k@gYe8$dSU1dGpfl7~!N#l>77X`&>h-JJ#w3HHCdP}b-~y2M4whzn1&gcL zqGM5CquLY9Iwy0-+7s`SD_^iuGlG5YIMERuyTmTey%=2S!0GBXA4`o&3}B(h^dxV; zZq3jj{ay|;+9jyuwDQ!U=}YPn-prZ{<{8%~TLbBS8oIkIv2~bKh<6|NGDcSO!c`9p z&6#aHQH*Sx!V5t(n8a+8((`N<-D&sUO8AKYEWIG05itQJo~6N}r}F;0ih9NC^73FB zjDDe{fM|tb*tve}%5yP{00@CVif6tL8Z|&(acQCPOjU^I2B$!F=)=ElY;ryqa}M=4 z^c~BP^C;Xv2=ao2{qbIu93r#9&~uE;!%GJJ@FoSM2OyBdSb2C_%%jAEF7dGi%TsKrIJU1e`&t$7UCpn@{44Xw2Ehse%hk;Yc!Fx4k@(c$%KcuL*j!hA z2FA4mItrNks}yBwuk9MICs#2hJP255Hv^FplZ*gV;@S=7f;N1?;0NgcKTn2Rb$wEy z)6~?Q9P^yGonCW#xMV$A%Bw7SvK`HM9Ub4TX)ay1RO1?d3cg2|??+HPJwEm=vL7ay zX^CnXEqlxh5+}dm-<4rg*i7d^=TAK+lmNYl<-Cv)e@+1dwCwuibHeG&M8`|QBLAk$ z4vQX=md1$g2g)hG+mVNbhnpKWD4;8)X$bpg2FD@t@6W_wnhWTjz9RZhJaK4%)Cj#eZtYXtt^$XcepuY14u8&I%47=`=a!0kHF@6D~U*; zI6y1zlM1GoY4E>IywZRx7pD8|5&kc+Ek%^x#|e0ES}04Qd!O|X7T_Mr-O878rQ^8` zox$rE^%!yJ;^$hHFZsamFusSj#{HVEcV8u(-`uEFh6G!(29j@ zZwDA9_cmi5SRvTGyqRk*9hYtU>SW*DC{ZPK?&^Id;d%yL`x_Vb|+*;D* zW6yD?-Twe7qn?7l^K>;%bJ>+E_+A5;m`@9xbg4W8n{#*vfE|jmLnj|(~wK=gX4=q&%%O(kq>G} zb^71Ad~g9K=-NzaWr7+}a1_^Ju;z!`3y`05I1yM0i~w{s$r$0b2+*p1E?tJQ{ps-T zFFHI1-m`Bo0xB!TBCg$Lk2?dS<|AmLpphbU=|XHp;MQq2*Ch5Qv3?{8lZtvQOM%dK z0ne^^Gdw(eqep?~1qH*u;hw>8)tE@?n#hege}J)~YT}Y~%aN_HQ;1s5_&f13AJ@CA zi$#be{Z0vQe+l75e<}^XlnYgUX!gsdT z*pCO~TZPjP<^@CNsmJ?=$E>(s=b2=Hx-p?Vl;5`RB5(^i1%>cg$nTdyy%W_0#iKJ( zzmyjcXffN4yeS2ijslk1f7uKlmV7wR!Z>nk2_=sMzUr6!pUd9{-e3gyv$!8+qwX`2 zJk7KTItGS{fg#{HN^$=`8Acv(Uk;9Je8JHGpw$_>ZiX#jPKJZ4^dUVRTUc0F2xzNIzm^Uqts@H>otH>i=o#96{c1)H zNshcq67W%;W!lIgDk`$d$^-;-5)mk)H*bm5a&&^j`&Pi=+G5}5=P)}H2we(6M{3kG z^xbS@Y5n?OfDc!3>@6)H#$aj;5)jU>z|A5im-29S?IF#w^2ABYfK6L-?$BrHu z&`kN@4Gfi-+-QJ%7Wkj|phJ;gdJb`bgtX#AO!s`Z(;0oTR#m#$&anYvWwQ0v_3Gjp z_a*JiG$L0Z3Yy^ueh!If=(KW3V3EW?jA5g3*51*9%0Z}cbbM7$$ZYbD?t0nNqrMH| z7huy1xclpx_J1MAI*g76m?LCWQ~l=SnLzg46=Wp1gS+A~I6Eyldf!wH43>4RI$8_l zI9hqrX9+8@&tr}Gk)n~KcI)TcVyd%bZCg2x5kH}H>sAhQ+~A3cL8+s<*c+sYflCt^ z>cDNRA!k&dQvA!+tM1RNO6^iQ_`ZCBj@+s0!qwEl+H=ys!_MQ}Oy5d~Mi?1+&?JS@ znkF9qr%u%e7wG)=8GcC|E$2)B!?nUmY$gj7%0PsMf`-C{dBq)%IMo<_eh-Z6Jn-RK zumN9^acG+~g^?9h{{C)f4#cjyNfF(IKV%SjJ|Oyd;oMS-d8t0U?|!ZjoGZX+&vC>X zXRUH8k|7UVC6uhgM8DVOP2sn}O4JBI7KOmlKL150ubEUu>?v4`Qy{T5 z9M`}oX`X5bMlJacr0w`C@xMU}0uC_IA;-MHzSisUc<8}WOUV2Hywkcn?fh!l9Bp5o zFOspF#)0-l)vS2iR3LlJ~hZn9cv>cJW#B<-0Au+==`4Gs;jJHh1)$fC!GZ(kj|o`y9F^Clr4%el z&gW2P5dq624TPC#@PmJgMfKmo2$>A!9q36Kajd{M_T4z|SiZoFA%z;CF4Ho7P$T&x z7m5btF_08F##a|lH{)v>2fhLS0%ybwa2~BC{02LCbaa&HIup7sn{+Jn{fgmNxw^nW zL4^tIKjVW-@X%e5WhOo8^84^z=K(z{Q^=hd0bm^yKn1T6Opw@Z3fh(vA+ql=Io);y}5V(i0+e#S5im4e`s)2R}Z7sxz3w~@zx0}s`Hl$4bFkWtONL06V;{SuXqh(ssY ziol9n)IB?o!Vt6K+W;s%qJa@~3Gq>uAq$P#TE|?40;TCnLC=NGuTW_ z-yZ$E3p2iHKXlX7KbBbuL-U08pZ-&0pTtI(m>~3n@`n2Pe?}WWe0T|?_17-~er|NJ z(k!Oo>nkHAEdXz7>gwleMKIrqxU-|U2nZfbO#5%E)ltwIuX^$kykOLJkvLwLh6?PR zLH8W}5(3B+&8V-Z?^Hzw)BB%&_Q!XU0}+61z6!r^YAHy7-@wPG0@bmLQ4f|VOOSI&ekA&$UhiBP_=C50QDO4kQ2MUFFJ%! zZoLB%y*Y|53UHSK4n5oN5~q|R2UN*2syE@vg-9IEUmu0ajBc_0yPL+n{L~V@x}U$U zj#Ze?w!Z=YG&1AoJ3gFv16N$fiWLE0Fc)lQ}G)*V)OQ-wF!+0OK$YR|G_h+4g)l zdQ?EWujyByH8ChCVq(B z=}vgYS2vx_7}od=2Y2$H3(@+)F$|)kzv8mRrF*Mn%!4W!v;$hPgPr01!=;;#0i}fI zr7fzNK0ezUeNowpn%F%mnhwi^MUwP^4xEG@RCa5kB-Y69I;jd#TVptkCsUN$yXVK~ zFtGhb*WYd!XV(OM_WyxkNa@`iFN}ki7*k#2wcA;C-<<#@g)>Vqlzs_ z4zzQ!z@IvY0dA1RyMHiEeEubAbTq0AQ5P^~yb}#gIi`B2dNf4RY@dSGblLhTh;|sD z-1^d`OZkva6_dp%A;&OZAf$}|hls&`ndl#eK@K7V=LhvEL7-U6RRC8;nE9_#Qlh4(%|L>_pt<(%D$r7FOyc4+4uB=1m(hVRvUy70 zy7MoBUSquK=2p*}x{-9thgA6sxvJICxkZ+oQ;f;f$Hd0xt6t7x?s-yI2Km&ElnPFs z5@7rNz!(BM2It%=&-}^=l{12oFFASoY`j@h@=?HKv5SJ#Ni^bhK2{3zHnM-alFb$Z zY=8b^6l&OlmGpv!038%D1`K@wx)Va6mX!*u=)cokoqoQ07itPQjf=Uhj#4IM{?|9u z&}lqE1p`3f2GIO8qpDQ@@gy{A`xp`EP_%kTm%Z<_{7q2XXr%kjUuyEWFvt|2nO zHo>N%9{pEI13`dolCUX`l*|JtbEss#38ca7=Lcg-|37~d^A5i@Sfj zkMR7+MD_K$U7gi}aaxRU@qw|qf@B?|lI|~s0Y_V|i_GmEpKAyM2G``|cg&gRSFoOq zG_SOriaXOs5c+LGc9_wXZ|i1hLvWDUul{p;ewTwH@!spaKt~)Oh#G2p@Xr^Iz@ZcZ zu2oO){E9VnkC@`znL<(T(T}%J!JDzLvI_neu&?Z(=r1ELj|=+c1r&ARr)-nZ)r5Y| zH3WD4JFcuZ|7ZI9L?UeZMb^Zb2o(51JA>FIptxmm5wawyhpwg)TKsdW;X377LJ<>q z&)r&LHTNQ*MNr?N1C+l9HCvz~cna^}n^V9fn@}kOvIeEIr9j@KL*lZrKAEGPIlAB5 z4_}g_z5-lFqxn|G;(2F4bPUuFrUa3i1ALSw!eoy3YR>M#Y2>x~MGg6kXL&vA+9BHf z1;j?L=eAM<*cdM$c?kw)WtIQ0y<@l|J_%h`&0qvyo&{o$3Sv+UIKYCqJ(h=_&UVDl zdmEL@gWwTdNC4jP4 zp!YYSWdY>`o@4GhLsM$E_dvrdJGCc3kIS+wWvPOuV#y7(iER0LAzdi7&4#$jP4Tb)B&FR;-6 znNK-8W`VhE0GKk62>Z06ZV4FHjdpoeL4}2>2uZkYj2x5MK~xrGEDA|~F~`b{`$djp z4<9<#2jZ4aKErbc^4`*e<~&eVm9Qaq0w44TF7lFE`cJ%4(hgzuqQ;H>D2zP*o0^|b z1P4|yeeeJ0l-fQ+9daPmU=K+TeNe^MfMyyfg9A6B4cdlYFSG~%wf7AjO}5#E@<`BI zX6V)6Bn?dwy~2fQSOcA9WoIu;m+eif$x>$Ofyy&59|G_=tp{=_nN^ah5f3>{=^Vp~ zs~CZ6lHllt&yv1#7|O?lE~>i~9xJGeE8%x&0`84z@I9Fpz=zgupl#hSCIz(Zi8G~@ z6Rec$vXL?nk*MX0`a=6l#%Ezrq{GB;1~D2;&7kGky%(31M6F=t=*SKGhSoYFA|g_y zk&m`H(7-c4TE+)tiO_KHpA17O0;)ivlJRG5E|`X~+a-#W$n|w{awL=n^}#bsaz z@z<|%x+0n|WGL}9#Lz0u46esygL7-(-mj%w;z$F8gwjJu^XI(@eVLYas70%)s@CF! z%eO(OM<*x$f~=j*3_vFP>AlCb0qDC!TS5+@&SHKblMOwE7#OmV)VRVV*{i6YfI|5V zg*e?!DB-m4(W+m4pS9^1oQ3!ROi=GE^x^=c_JYX7UjR2u1nM>s(5)q&-kOy;T;fCr zF)t3yOB8U32}P;1{{k^^1_3<@CY3C(SWZ9S`MMPzTp*T6&D=C&E1_T|umnQN1QrB1t}G}o@TCzi)L#alnov|MI}=<{543{`5a}K?SfXdu&03OqJB`C=h}GbR1g*F*ukn|fjuPs z`~to+aGGFBi5ImCZ-?_uu|S8ufRl6;>?NcTWGGs<7K6f|^-w+om~2-c?aR2KJ*>1I zM4BfM*92G>F4qFS;bEYq)hxA->#f(L0;wsrbWoOuY8wE-rXFRn4H+@;?$GM{-H3?n zaH!a(6%}2n?bf$Qqmxa@G+i67$}+4Fz?jU4H>wB!h=vNWz6u2~z{PuWzuq_CCf%KJ z`vI0U6$Di7tYKs; zH5&!khC`;&=ai))%>geYi?{JG9M8de2piQNqa$Y;(;qM>R@8lFv)hOcxcz6XliG_ zphMv=uLjL8yu2d@I;j?H^KJEkaG6DR0n_+3W)(}p&zWUEzlGODRidS~`>tktKI}}_ zd43Gu>=x_aq}6zLa&moJ9MVba}IVE~O>zrD~~ z03iXq5)*aJ!E1==(?4SRjz>*HKQOonXKbiJpT zz>kZH5;U*8;XriIW<@EGoB4o%`O?=Jvzxun2Zpd(qXjtF%Nd}fcOZxhe0FSqB;3Y( zJol>!g4`Keq+ig`606;AM)}zt5b)=Zq2)vdnk{LcEc41R${P0oewjfdpcj={SG$>;^R_WN5HM3XaQMo#(IpaYU zTcwgcC7~mnPWqFSrraagJsqWhCYNwdKRgWM{(N5q_i-oBpLw>rk*;x2n&Dw1i$sp?O|v_w%IA z6U5)Iylj}qltwUnwlY%6ca(NPLVzd>@*m-b-j_S}t5$Gt`#7N2X` zaV6mll->o%Om&RtyAf)`%dR7SA;JX$kt-wfg>){Z=~mPm+OO_{k#H$XCog$@$>XEV z&SL*Jr^!~?fH()ma5wB85%&9&bD~)$hOv)sk>lfbJjnZK`|zB1La+#KY}hR(tXn;# zu?4rTAvt0d8X5=gJ!Boj8S+MS@islZqQ73f%)2wOpTJvC*jG)WC5i?LTFFF{2s=A_ z^t*SI3dZGbHk=dMkBsSE3tPrl#&7$2eIg@xI1^7wL;d^pt6eTT1qPMRN`%+3*HXkT zZL}Ub>lyzpq3`r4OdASX`IOXRUhiJhGJw1|Qr4chr#JYKnXY8e_1BSeF`{d zhvf-NyKm&tNRmThX!?;VidJah&qu>%Qzb079e*g3DdY@ ze(ob%r;hoREzYAJZlk*LPi=Wjw6il~4#{N>f(5kt@zpA=zY9d;$)?HFsJBaVmop6Y zXw-ZdE&YVZ#545bkn@PQXO6j!@^QScPH^ay@sdT;ZuFiTdzO--!QPj0<8=3=-(puQ zq=y5iJ+8+ZGpqHYdhGw1cK1=avP9+3$S2>t zFJ%8*Ly~*?+lgIuI#NB8-f}N_#)G|)tk0vx%!AsSwJ3i6lz&izboE5#P_=eW7To}1xxzsigF)PN9taig|yo!Tat8{uN?@t~n--ez z>u~5$$E*}uurM+7^z^*oC#e4{ESQ=>Q*~)N^wC32Y6I3Ps>BYK^-z{GrUH47~C`!N?t2JPmFgNpSw1$3S@Ubi}_rz|fS!MNm(X_|v zv!lew_m!LF8#nhiGOBx5-87VM{G91X@uG<;VPw0U-V|JZC_SeY{H9{0C|en~Nxv2L zd1I)b)bDagag*tRb;|f59}ks^XuLytddAizIVH464dl2U>hoYzK0`%VX{pfe?aIiW zm!6oV${Iepf7aDTgTa@_wlnuvDx$g445iiaOZPzs;Zdu#kbx5>ID*aq_9?`~c z??3hUSYfR{8nrT#I8toTbqk8qHedtsLUND=?KY;>(^F-L>2i&ljZodbU8vfeMTjWY z|L~%j>$QAQe2MqF@frA08zOIB`HL{A4~*6%7LQdXXIe_KaBQ5h(~+kUN0mje65M$g z$g<*CJiJt9;{WnIuLvzpOOHJ=5+IrP_0!h9dXFbbi(agsoaJs9+~4R@Rel`nRFShj z=&B)nRKfmrCA34IMQoaf;)*c?G3|pO_qi{UznoI01#*JRz33j6=!>a>nj(m3zRg=-Ig&l);jznj3WdGAj~tEFo8w3JusgDk+V{48kJbe5 zrypq~=OppG5n%jHF{(x17DeLF(0CfEKAx~rRxaeIcrZMH7vbCNy% z$6G{&RINgB8Z@=6_8;9QXKtp(?6A;`3fq6P7hU=NjeoZ2}QD zl;3~vly}nXJ&)hywyr#`X#-)?siOKJjz&ZTT`<&HLXJSqRg*s-tL9;DYQ=7cOdpUGV~i>b_( zRzBsJ54u$^q!ga%aP_;*(A9427T(U)GNKCH*b@g`EqQ{POHLtbUn|*P{wM0AB`2QU zpuT+R5-a{C`<^!!LjL+riDp;$PI<}kJCpQzRyo;E6rA4}>LW**uTze;O}plBgvs~i zJ>U#=47ZrL*ul}9)|0y#FxXVUq@W{me`Ry5&s{{|{6g~Hb6dTdC}KOldhCj)uX8MJ2>D#YpL3Vu~q$;Ldjz#z7q#6nR}O+E6u zG0Oa;bkVpcrHt?sQr>f`<#)_1RS)(Gn^3(|UA7CbWUo^iqOFS1O%nyxp`^b;LN3A> zTRv1V?IsV(#nb$geyfji=V9F%d7A#GiNyaJYmv=huD9r$3!%zKcc*SEE%HuJQ4p=V zHl47p44O7h&Uvt>Z22eAvAdLtF^?L&BhgfOko;FV*%n^vK?FOJm%NjFbq}v9-L%im zmLXKTCZrm7rquY?&U2=ur6+3PD*H&G)<#IX$PS0Sit7EL z$Op#U>vmptw8~Pf1swGCg0#VPL0>S#vXa|V8J>z1+>6KJ>cmpkqj}?1dAa^d&vMVb z4T?>JbWvp)8B0XbPa#UU4v$GBmn8eT_nlaO`+dq3Ga3aoy&sOhEE6RhCIp#UN*#O) ztI68sI*y{P$fN9s*TmjPypMZvpxo*Ic7zE3zNN!Oe-l*!YjR~d#n|&Jx_$}?ytzZB zH_G30>`HFDxv&uUU?}K;Xyyu85l8t>c6OMpU!tzrSuFAe(doBgf6Jt+EL_)5b^aQH zTh$EuCDQ0*{g_L4{ia+PkGUXgK4nf@`|u7MRguv5*&;t>Ebc)ph3-?=5UnDm+zVF9 z3$#mK?^Hv2MjgX>I?398$28L0*EbZgA-({X>Pl zf{t58y;@5{)J<1pgx`3)j_ao*$ZIDTKjuvE%`(~``b0^PXCA92u7v3ln<6fT#JWUK z>$~{S#b(^#Ff7h_$gQ_?ThQ`7U3sxx#o`Up6XoEJ(EGmPT-6Tp34=ZoeqUa%tSJ9& zxXs;39lpa=E7mGF=K5$nx0HWlnqSkf49R2{hyCd;NQ z*Wb{bd%3v3Uqbx{-yczGmh6_0#ex}IeXagRwTuX1<`(@@3(MH|a{+)%(3nOf=7$%zh@s%#HRbNi zNF!D!;>=rOH<&CuR=Dh0R(f79dCre*L|bV2ddVy{FEdHh7e6*(0!_pi>&X-+cC<7ki=Kn^LNO(s=6WW1fSwwqT9w z4>VhRv;!kK5uF}Py5mmfTc@g9EmM8TN}Mh$lt)C{mNuFL zQ6i@#K0l#7*}LXknpi3lqM&-J`uJMl+gr;Q*b8qJKj&yOQMNRRoe%K1_|xUTtK5p- zwM?NJ+V>wS7k;hhukd@+o0nKU=J;`@dV5NUXyEzDlDV#qUzHNxgSqftyXo!2-ww|g zy(hP?d1uWmd8fK^)=T`A=}l_iFIe_`Qr*H<^YXzqmu6(iBZQKfPJom+vHY)oI=@Cz zf^<^QW{^lG#bv+Y*>`!WZ>I%YEVG<^PU|;wf)a5<7TRBbmNfklR2|`Paf@@r+(Cg1 zPWE3Y(KLbiePL^^vjz2AKgtpoS$Ef$#qe|nH1br?*fX5csBScLJ~GKtZyx=mUgLN{ zG4p(h`zQg@PQpg2UqYE4I`GrwQpej~&0;S35uTT7mZD;>Hyo&BfEO8=9?^6NZNFLG z!zelWr9mCGhUM5Z8t3vYDW@>k{ME#*^ee#*3CG?96`^wW^t7U{u}h5Pe}5m%wK&K& zGEBA#`kgmtH` zIp$#s8IkRiDy2C$Q~MNgtDAGZmc7R%x(k1nF&dVH_Qw33qTVnUosK{88WWHA6iSg< zLf9=w2V737ryf@?y)_V9n<5I{Squ(u3!YjG93#6@q5t`~{Y#k2{_X0x!b}0h72O&# z1ve@UU%#aiL(0v|D@`pQ6OFFUoEFoz7mj?ks4;W=_A;h;Y+8CAJ;!W}@Io85mcV#w6UnBsttjuS_}A@@=)h*0fQ*jEXsGi!bp!}e z3?o|C*_dg;!hp6UKF>GTB~D0u80ivve0iSV-6{{pjN=ywej3j+!W}Z0=Vv9FrK-0# zvlHF;4(cIZ4zCBkHx_dgJN{-i?hM_x3|4Vy(Y+n)o9M1!pU^qN{NS;RqQVxLaboHq z>9Da;kLDrCUp7Svk}y91o3{Q)q_lxDsUoA9Wh9qfvG;VS;xV=~UlS?v{oe74hRaD) zOX|9kR)V2r zythhpZDNWoNH71)qq!B4I(Q!RubdMsOqjpSSdQ6D_>5mrs&Zs>DbHSF zWUlG8pHbI~Z(Qxmb;`41w2>cL`)gUUWYo^g@v~zWcgx=KjjL?~QMj+Gs+RKZXmAAw zUA+KJdw9x5e(~qJO8aH$a2~|I%r<^#qWnhry&t2pIY@}vtJeiz5UM2|?dB^VZ4)we zm7_CJfdzmbXaTQ!Ks5#(0difq%+byZ1GjiS0kxN`nQW z69PAoX6ajMA^1prla81SDTTTC9m#^y>_rNJ&Y}q!V^Pi=Dr0W{5%Vtt9JdQResm-- zjj7)EP>5qAxRdaJQqacHdLb#G4@$;?f6zDL0&z+6p}v+cjoHI*z3^9s;GQWVLDIkp zg&5Nl(d>@Y4x6#Hr@F8({M?eo`nb*AGXP}ybruCo82a@p|BQ^{0dr-5(okY+yeZ>qv&2gJm=1}kmfFEnc=SVJdX)K zA;-A?t?m=tSaMlzO!?URvdoCRJ<~b!@p7 zec|ly1+X%DA5ruWtZ~Q2eOe5KHW7FSlAKU%9b?@8$N~Oauur$=moLdfQTkK)k4@zj`R8ynI!Vg8^1j>XDjD(U+x;4j89L%#;rFSM4*NDT`{w({Yf%m5 z&NXdj>Y*JCc21%Uq)q0DdHJh5l|se#h!J%-Z{TC8*ME->6Q;i}HFWrF$I{D@;Y~AN z?lI;URK8hM8Y?Boj8MiBm5>sAJH&dDc3PVpRCI!;ZKgG6%vN$|3T+yL*S%|bkOPIw z6gM&8{cl-#O&Wb;U7^hQ>~K&%>Rw0JhkjS2ZOeLg-dMxL>$#%!O(Olsv+y{!i75Aq zQ!eifx(5XAhE7k8gP+GA(r*3i2-w)U@|UHY_Kd-bG%5udaU_*hFYfIS{&4*8#zB&t zo2Z}oqu8-(X@7geO`pR;TFGcP;zU>fWBLhZf=|b#Cnm=C2a+dESNARJzL7N_m!96P zJ(l+NIOu5$>1|~4*Xzr?d3DbH@kEb1=@k9=Xt2GW1}kZaz2L(7tva~@2b~RewRft1 zmuR7d>0sgvISmH?@frsD9>3yy5iQ+cKd~+Tude$>aLq9=pzakbv7Bp3eTS)cX2qm{ zQ1ZZdmh<_IPndB^luLt@A~^~ja?@nn4x*}&#vc0}>0dBE-+hvM7~Rj8({W~&`);6V zXXbYSTkN_NM{$m`rF`EfdSgq3PB(@olB&XdcuYonYScBX#l>(vL4I*4nb4@yD&vG< zh>&21pWL#kWAjeQtidQ#xvWZIM0mj<7Xk!{NzS!rI*jL6&+qDT!adDgJ=z z(W$+Eiy_oFa!ti@tS^$zfyq_$P5emS@!LQqAF{?AXqC7o+v_e~V8h~#s6!hyyfQmn zFbaP}O3oO2iZ{Zx{ydo7T520=O{n9v;yAj{Q zUIOFmbBeLz$^!E@Pj${AU&EP0C5p(*+(vl>+-Y#U3Ox)6a%CnIoD72BJZe{`FnHIy zj58iadP(s4FWqG1aAVT_s1Zvl5!35dB&8bFU&wjX15GXIhuC^v+--}(1MU+wOItrj zt8W@dFY^ltX6Qvx20Pr^vm4TmI=a%b$X>~ky?T8?f|%2;@K(WKv(Jl$UE2_PLvP`$ zH5HbfOD>`c<=ku^#axJX*z~pSbsT8&{d?aW$%kfF;c1&AMsu&wS6;&EdZ(PFus!|`uwIAYa^3T^$4@bUC%A_VY&T7@&U51Uovr#{Wcrnwh{Z1 zlQf*C;zf3+sp^X(JJsaNEKMt~3Dd7!uhxT^9w#Uv7c!R|vs+FS6Xp!e~}V8jcDymF@??PR%D80Ao_0hW_vE|h^70Hh z!;bEi^N{U@pA<0e<0bc=-fCgW`RE*hS3FpNbYM_u7u!tBhvyrca$aijD*QzgKZlvR zc}h}a|9JG_z|ZHZbFM+0!>706-79JW-Lcnh*Xy2l7>NsK9#INxip7|cUWjQ6S+(78K_Zv!5h#U z5U3{bI$Kswj>uCt!{AIC-S4(qJu_Xm+^mh5>3c9={G^xqkhFoNw!%{}O{lh0b159h zko~#OfibUEJ8p?qPjZHXLUMYwVa;D3q|o2KT@T0b(yaZ3o(EX1y2-w0;Y)2%xNltR z2Q@P~Eof!`7RJ4`kHphR__8H;H6=BvM|dU8z+UaJykp||pEcP`f6G~#_8Y#A@=@MR zZEqIot{YTIUNX|LFL!H`brqLVL831DAhNs&in9^ z1iT%cEoBz!<$ZC?CBRPdtw-evM*i{n4sHS)gkXoO<`xIL-9APMn_bCR!Lj)Xn-Wpd z-m5`ByS=9@>~lrPi;|R(L$xHtUiWbKp$dr;yc3@o=+f^!IqSypu)d}I?`W{8)=u6) zrkhTQ3)}mdfGu*8p%j&#(imr2CbyjMNGkdNkE_29i|TvdKhUAOyFt37ySrOLI+ZSI zfla4$OSg1LNl8hAba%J3gy`Ax{(OJuI@g&$Vc^<(X0NrLxbN2!Ftn@A6?nR}UP#sP zVotndv>MI9_(?`@Qk&mTR8WKRQ)~Yql|uVnfYCL(VGABcI7+w&w>jlj)tWNBy~13& zqjXU{@VetV=|~q_z=_Vv1mS;)HO(U^TZ#kS=Ubq%T?Ul+PJ;#~kjp|2@=7oQ|31El zsyS>y&I@O+wcjJ@#)E*Fj^0{i=${P>sqRNORUUd2ao*k8^D+6^2^SA9o82AWjIXPh zIwmUJ+9qxy@y~SKPGjaj%Bq>v2LQ0rKrlyyB};clai8Jj+v{dI>@Iv@eIE4`m&P}r zHs|e0o_TGO%NpXp?MtmHs5j(>%^a^oslxq}KxsTa1ubDHl}R0vZiLFtN;!$36`=8p zh;l03f9H2XtWtOd8^p@DLn+e2h@62m#B<-M;fw(@9Z-sJ%OWV)nGeI&%?x`*6`1@z6$KF?!m_W9@sn9bCzlX9`TVF+D-tJA zkS!6kcNYgoH$tt|C;?R8(O;pgelXf_);_53a!dPUqGSqat%eXgA&JdcspGb~n!hFq zf?HTzs^78z1Tn+#M9a|aFrO#2dk#Ds99D;%xDQslT!v4{Os!P%`tKDPP(pV8QjuNx z_Bm++n~K)|jK-EVIO7>cR=K{L?)(nCB8aby4t8|q$QF!ZWCKQWY?n-zvFB56oty-m zMdYqBk$$nH;Qbg0GfTm2O+oJnd;?}bVB&zA3@SoM7zjaA59k*%a)hE|z%5_^w1TGm zO>;MV!uk0#X!!Nj>N@{!OZ;Qp_=Swd(;z*$hY%37l9sYAZt30e>AXedg!oyMFoAAU zxDEFVYs{!S(J}vAQm!+9-wDOi&DTG3F>NKxJpV@;0VN0KP?9@Exz+H!Pta}ihfX;~ zJ$=oME77PbD?u#wq0;`Aj}^POD}wA-ezF1k^|bp0N#g(3UP#$L-v8rw8c)h3@bWsH4b_&9E$QY4MU&oV+NG zQl+)zN2$?<1^#N%TpYcKKQd}8vbbirQ?z&@J5|_V%UTPb5rI>rkh+?M5wBDulRU?9 zglKqxm7NN1vFoZ@T|VIP53K7iJCI2bhgf8%&g?#^k8=H5nrz6Ft!t*cH%Pus*(mF3 zdtqD82(jAGp4(o-Y29rZZ*V{OAlJAVJ}=j>S~@nV_O^58!`tl#p8RZR^ z*SljESXgEJVJRrH^NCh><9LJ)B#~82AztK+6n)(Yq3@?<`;5(hroNA#xH<`^`dr=&;1%9yvJ4<$}#`6SgTPZ^#56V6S&4Ng2&4 z%*olSyw;YTI}(OMvv((J<4ZqH6wGp&aYEcP-q{=7iP64Zudnnw`$8$;^`bDFQvZes zW4jSzF#^Dg|JPakL|h>3|oKLxFPQXnV&I%Xp(8$0RrK=tO<7hi9$p71b=b>;dD5wN# z$^kv*!N2Ql$fG|Z%7$LS4Fs8v1~<<+6EGAfD=daTnd>ui&Eys@A(kNTTz z`$>kGU#6qXuQ33yTBe*f)A(^kY{h+VceY5H;z^Z-^eW_>5OagBuC;(&3+Qz&x6Xbu zD(OGYl%XX)xqlej5b)?=5hqa_e~?I(LF3;==Qc3fAv$UDi=$_IsXlf-m19*s`#i&? zm|AV0ywUe3`h@{^8QE%(4Pf+CPpSCu@2u-%lZmdUpy+SAZvu+ciJ9=zEW{5up`G-a zds-@~l|iVsv=)*zUu<~{dFB2XM%Y9p>|obuR?Ak)Xle!*MLfW=qAT0U8A?teGws1B z%iYioBHy}#5}G4~7OE**QS z%3j=#MaE z3*lKH=iuQW*lkx)G{U-7r=0#Bf~S0=P0DBF&w2b4WuQ17vh~XV+Bg+mMia$C+#tL$@aMXpAark+&3jRfoa3)|kp| zZRl3R!c2i+?_=6u>>NsMG8SlKh(;KMPGtb$rWU;Hf!hWhb73GSs4tmb#T-0?|6}2~ zf&jU`?=P$0d!c(r+uefE{FCWbjDAmR_Z_>>Z1x6xaq;f@)3F9X`WLwP^%qn8Dq5qb zT>Oq%oBv-V^5X=x=@(>@jJiZZk?)SEhuc{imZN?sB2j(}^KWlRjNZ{6IZL9Ns=DCZ z*euGeXJk&|iy)Z7>VGu0e>iDjyxyr5j(|kzL+yXSlV4G5ECzZ_T>DTMdq7JTWQg)(wc(5D?wM9sBNNmg9DW&f-Ixg|>gS zsFrhXxfioP6XvpU${zE_M7PT3=7pu#?zaa*G?|pB8KMjRvc;3(&J;=&*_-MW*CQ`8 zRpNs)>RV}@we~A`UFrH()w0)$D`=w1Uo@BPe4VPv%*{o`RNjxrrWpP zfZ*`Z1Dl8f`|+#+>0h2a;u?sxgzmULzdmk`UGL`yL0ricI*+w_qugmL2~TP}T~ub< z81e?M?BI*SSo0v)<+D!)JxGsZ9fLlKL~93iNjJ6+%(1@=S{oaXQ7 z=q74QU-s8>-m{*Cw|3_DCQZhRlr_dF@iw#P)2ZU98N2=t9=}K5YSd6Ui%4#Ko)dW{`_)f5@lv)* zO>l;~a2bq14HrTo;?-lc`J`vi?!k;N2Lrkm?gP-!>j4Y69RKT)dZ$%> z@EsLCrKhju@E`wQ!>AQ_eoLIi|D(U_vO2~5=`AogdS{PQbZhY#c%@pRCfCTPF!|vf zDkFwXwRrPlGAlzvarEi{PuB3;OgM9zynkzhXTBh!5TFz}sT*b1oXJHG}%O)P?r(!GxD!4J5#De!O?o zdiR}`u38VAnUOU89CBuMCdW3HaQCRuC=htae&^Px>vWDJG(7YVrtVz?W{Rq?*&qKTE@W6j5&5tqAwvPhtvWKukk z9-y`1oQ6J3y^S_w<{;`c9Q1Uwaph(UxI_qif1J4dn*V|x2pZ@5KnGQAayI;`IT6iL zk9nfH?{{_iYdBWOImkM5jB_m|Z#!~49j%Wqx2OGajj%9|at!%2V(<>F}3VT?h^halg)pxmk>)j3;}?UgL_> zzI?U!^T)=mOXtE}+fQUudof23V+Lu9x*&84=n>$vJZ6e$lO?e%4FZ)}JMU^-!t?*^ zF^AjrTXfIS?`|c?Us@OU0SJ2<@De5| zaAWSIjAv3nt=7!qmSHF*_qb7CoY)@Bm7wP+Zyjl&9wc~O{8g-pOC|3VY0r>mw4795 zxjTm|c7*N|jBa)sN@r15Tbx=`_)tQ8-1wFDU}vRp#4-2Y>;l(M`DFcy)~q|O0-PHb z1jE(q4J$rk^8c=Wb#((kqlBLQMBplfu z#hOV1TKM%K{Sq{$M=NB56@@SqNq6hdn9?VEjIxP8j3Y^Y!VOGzlY4|UF1;)2(Ayhs z7GNBY))L|`2~|9nytFX@o=_nKs!5&SY&4s=y$YKAIG=q@k*G$F9`5c&ZK>vzlAO@t zJotbp+Ofso`3CQc(7W?dOs#7x22})@F9(5u&jVN%xenu5+N?yECGj_k@4<4Ht6+H|jj?IWC|C_+qk)juAl4!} zE}PR#_?-3%7DDm~rO`%FBhlt$cTBK}yF`n-fi?u`D`ZZWjdv59BSwENt^~(PaYZp6 z!`T?SUHB2-)KR@^h*e8L4oFy4+T!{<=T&2^z0%j3pK^Bv+2*UB^DFpMc~@%Wm2!$k zzk9>OEhYAa+nTJy!*_!AS~Xh*FxRh-z=B4W|82t{c0ei{266|B9fWdF@SA$G3NHzt zRPxMUfTYP|=3&~WC)QE;O+n$NpcQGe+f%UW7m0L~yGXy?35_iRPoYQc0-eVaRx*=k zEB}nmR>mF$+isKj^PoA}QO4#DbCH!_LfiqB`WFw9x8?Ed`9p_yfTzfVraTW)^ULZ; z`86CimZbk`yFXXlXO$drReimG_KSEWCfet*k0_rl#k`#A=JVN1us~*dE3v90cn(T( za&yCiJUy}|5(tD7WzalhkLoHqcad{q`egK0WHW&}c05BcH;ol`PD+Lrcd zY5`Vb=#I`lp1RT(R`SXM*kyx~porDI5sXMrCUV0P4*AAK2y*!bMuBZt7*3owE{U}d_iJZGJ9AC*rtjvHf z>P5#p1=)*0Y^#PXZSQWuk9MS+H8=}V*G4uBYG2i=1wy&!C{Jlei@WefV~OP5yjHS* z7H|AS?FyFkWR}dS&0!R&wll5bgF%=8lm`k6dIgDcKmxWVzTBcc(7Ip z#6N<_+!aRQdq`3+BKhd1S)vc^+Y8y^E}@5BIUrlpNl+Y%%oRI6wA|>%8R^6WF)X?4 zo2QKLC^6Bftb5pvVzjAnk3oWS3DGPCNnLpe5{B2qCxa&tUzDcENu~6-$cF&6p?^ju8G!OsdUwREvr1T zUqGLq+{!j&5pgZ2;OOnHh^N!ULp1F3|DuIHlF)2;Xz<384=6Hb5t~|{&e~}NEM_6_Bf15KYw0MMW zA;6`_BX7$gS#*Oro6n(=^8bRdfUqC2MEb|H@q(}*M)(QFa5h{EAP!ZE{uOjPE9DZi zz`BvQY{GK(DFhNiG);g+yi3B?b9rPMH2u!n6J9X#fI(20(zeYjRhV?T%tA!3F&?gW zd+-Wb-6(!gKI-{vtP5?0SSAxuRJZDM@Itm+%QWVPft57%2#ub6<5ySf83 zHTsa*6`i!uF_pV7Kxu#B@o8-?k>u@LBkWU$ckGhqigQ};#gs@w3BG%o&TUx?=~Lu{ zmaC7_*Jn&cf?E~WFi5u;?(MIivOlFEbktCHJJBkIq2}w6{Qj9hQ1N0!Ay@KMQ%bo^ zQ?OOG@JBJ&wBKl@>Yjb9gkR1nHn<0^u1n&%zX%+bq{5g50mXSoJ2q)-uNyP$ks=m{ z;7(G1c;Sf}tcO;Qw%q5R34eHrKKAr2HS^8b!=Y%%spDvYnbwG>$;F79AmYB9X#EzN zaX|cyQ1jm2H~QOf{QJ>^H+i3g#^OECpQ1G^2o3Ksho`_mI3NtHX%P($&IGa_w(Z8B zCh?gJcZJ;f1DKQy{sAfxh}Z}m2qAEaXq-D+42d_^xv-&ZUVJd?XJSI5(^q&$x^cF6 zh>~?Ig8N6crqn*_Kz4qYddN|&?b2Tr=Z7{i!|rM?De|(pzn5pRqt`sQcVuSyCwuHn z#T8E_pU~bU%yr|$h(vpEf0;lPw?8Y}iN1bwqat=N3p`$4P4zM#$j|OFG10PY(&C89 zQf=|`w1nL)R>Oo*Hs!%Kolztff+zYDGRQ7do^b)dFdi(-{VJ5(osxy%9%Q>u>G&X> z-oi=3`BnNer)qHvr`S4`e8t&fqz&q9!<>E>{BkW6@B;$N)FqJ&H{ep#F!7qhdmhqt zfISNMc%imq8;;K7H~N=ih?|M@U;6OBI-e@VYv*2x>DcL;7lGHt(#tD}6=S{}Vlfh5 zr3_A9;|duUY4NXQn`on6p@)yJOY&oVP9Zb0Fcl7#J6Edx$YV8>vU|4gD7{zI-8+iz zX}2J)6v3r|aIbPCgG3l~i_;B;ioFXpj~u|q->4@qxWd~j9)JKmHQVcr#mAILx zxC~TdK~hpjcy&E3;ZB&>3+E@uV{TC}9H`2NDV>(v))fvg5NtEID1NJ;BYOp<)4f{s zW80`WbPUMlDRC6f?s4DBCr7fumWb85WLBKeVJ~@~w}F;ZD7y$04z?YL0ok+ipC|zP zZ{w^=xt&YztXG?OmJDhhuvepetDg;ZyWDbkBue((NxK- z_RANPKL1h;Xg2>IChq^=R?JuDJ5it}SvdLL2Wh+DL#L2GULmIavvNd&-)3mqG0T0O zMKe#YJYj&dz>-1HZ-rq86gMFzSpd@lDM3W$0nfbk0z2c!jEeOKf+I>SeW16tAeW2O z#fb5z5NhGZ8xoV}`n!yyAfZHF4zYL0@TV&ZDJ(81g`M;}EmVq{S>>L?zMoE?{ zyY#b$fH#ZZ5@U|D+T(yAgN^oSRCQXa|I=C}*Ty`z>WlWF>&ToG&tH6VGoY7LydE-8 z(14fN{^*ZH0a5&{4oIlGpB&*nDu-b8!aejV3ncakc+R6J7^v4*6qt=q3kJfdd!-Kk z+s!Qwige{IVO4|-Kau)`NN|XC9$bz z7h50RhorA06(U0XrCutK|L@^|_PPxMJsjGePO7#+n6D6&Nw?z?;1342XWvZJ{$eU- zCWMA^)_G4^t)pQ2X}1fJ>D;^x)>T?E#O0>RTY^VT089}(b9+i}eTF<9?0ZUE<&aYsR=a?z1>z z|J1430vOE^4!C32NrgF=d}^x>N+QN8a+-Vk+(^jOQ)`X^7TRVM9;Ool;lX}xXd~OU z_xERtKU+u=*q~sNYHAEpviK-`Y}{>n=oyR%AcQ#w3vJReDhgeiQK8OFjcRYZw-{AUk+5)BDKD)G;D@GhMmam zyS~+ne0N?r7`|F=na%o;YR*XA|KDl{QIv%&FYSw6n1LV^U7+k4L`jE>T(rSa`lR%` z?!tp;pMtNIZUiv!;IFa1_PaO1{8u3M^N4~)u<6AY^!$qC?SMj7-Z$M*ePU1KRTPxR zJs`Y1-5L7-DivSjg7Pt7UQ*cO<>C9uHXte9@j~$IF1~0fP4Q9iAmkW5MKU2CenyG0 zH)SS42Oh-J^`|f=*1@Z}`01pqC4PnnM@WQ!^-Cgz0h(sjLqVKkA4nEMa*FSTkDOew zJWY@?5qv)TYT@BA*BxeK&MDOcmV|MjOpHM1*3fJ&EBWtg+{Bi|BqT79Ah76yzJwbZ zjhWkwfTp)t{T2?4k-u_~k$frOQFmPD;>;vAhlvVCMxyfPWHaj~Z*g8f+0I}$(woLW z=LJCh7X!3h(|KFU5uOFQQ&-4CQ84TL_gM?)?R&xW=O(HJ#G)B}M4yA2%=?#?h{@ds za6Kb|fkgF<4+xCM0`CZm z{KGg`J!tsu0|7+aDfxc@I*^-<3awg7WxwZy=X6@(6$I;>+ajBfm{8KjdH7sh9B1ZIeZaGqAc$440R6VEpdGRg28kR39XkL# zl>;GQ9M%84@w;0p+m;h%8-%7sR@HTr4h{~oti_uBv1|iDj}{<>6Rv68yeQ~Y)fC(p zTtSpu-?Rc124r_~Z+IB_&t;@USc--?2^84cwwJ784w4{T!Pzps0GJ+s^tqi@uvlrb zgR2dflGqOC@TUQhr7)1eI$clW%pxXp5dKsT@&N@e+IEXJDL^JICA8;WNyW*_$$2DZ z0I@6xfj&YZ2xwa%#{dBm1Vsyr-xgx^Do8v{!x+8eOtOI1%R$&iFBsXHgAfDP9vCF_ z6}nIW1wNVQ8_05lf%If_-_k?LCRL2>5HVrS0nZ4iJK0acl4;v+zf z(PiL>9@`XjbaZlXL#Ia3t2TgvZW_y9-|OdZ^KpXL#Ro+qUV`AEzS@opdyNJR@XZnA zU_=N0^8a2(WJ|F6^(jkfTV@?_5R*bi%v?i=eh2(DA`?^9?cd4+O!^2%=L&@c&*?PHiAsc>C<@Ps%0| zMAUl7o-aD6=-Bir@)412Ao^(x|9HL$M=V4@V?M4;*-wNHV5THlGk?|tsCCRelxpRD zS+dG(vYT)qgSCjnFRbCBa=W97BuMBky>Ysel<{T``a15+=ldnG!gnXrqD%L`At~ae zYzfo(yke%Q1DN z!PSt8)e5@?mK7kB53#joR-D_tu!)CUXCTyfH+sPo@DNp03?B6r)K@cx$ek@AM6chCZ>2e%^yUz6$0!Bz;b;gE5F+NT>7gQ12B z2(1F|`-ByhSDiUblBJSk<<|Q?oQ4uaGKXW#}@i;qtF>RJ3T(30! zs|1Z`A`VYUK#tWiIYQqC=?CpLlb=1Q%;EU=cHWA3Qd9eJoNC7aBzU##C(yrhTz~vti8vF_^eTo~=PvDMHc;p> z_&og&vW1|7kEPJRhrz%LUIpaJUhPU#aKBbTSk2SByM2;1gjRny)%~-w6+d5n$GcgQ zZ_-=4uTS-aZ%ivkDmXwy^l3?lQ`O;cS{BYv@r_Z}&HKRo z1Cg^^n*PGCM!(snNyM`6qTG<3%kRFja;PG=50OHv?oZiirgXWZ_6c!7O^5(NZT#epJ9t_2o4X|Hn`lFAuqQHWRO(X(m0XjjqZyz_j)x zV;W^ItV-V5?*tYYXL6*;@N5V~@v@sG;XeC7A#lEpy{hXpRoqjIoLn*68D&}_khuje zOm%oH@dxTPa5e;#wjp>{-@iri%LfVCx@@HOLr}?lDXz2hp)<*1B{&Ay_IJ3wf0htA zoR&2BsodZ7s8Ek-FvCF@x?XFUcJ%YhsWcY`^N&#evk)fAC@xOS4J|Xzcszfl)0Gra zK+S`3Jia$}#!palQSWTMlp$+KBXZ8xY|`#cstmta?jd5P=%42F62J%_WGmB>G`00BHnLdO*NC+ArUqAO9Obg6d89vAIo zdJ}8eUfQuOy|XRB{FVVyec^i7eMVA~NFCkm8$%YO#?XFdTU)UYo(wy4rZRBHXZ-V* zR{rXSVjT7*eDR8SQ)BK;?Kno@mge^qiWp#d%?z%{2gjZaj9Aaa$o^$B7MZx$f;%n& z?u%Tt!AN(d3Bu-3Hc9&G_z4e9$*qyje^$k1ow-I`z&}mNu)S$9fwUyypWP7!*i>0W z{H9-rdmQ88jbgEpFug_pxi<_RP0|bYVN|~x7J6($@tB4+S3?j5ayR%K&xN;_AbOYL z@4nez1aJb7G%J(g?mq*jOqAMX07WLJ9lJ_XKzH}X}X+5JLO-z|8O> z`S^3ye)T@%9nG=&8j)7%WVOJ%AJb)BprCY&^J@PjwF$RV%j>fM<4GALfH3F`9y$Z9 z|Mqxx8yrM+cUc#3?y$Y$Q1`#y0~lt;Cq`Uhw3cRdd3r0*CDblhh`TLP>kodOe6tV} zJ7xb%GdW(iYgsBY^E)$z|2o)$;li@I6tI6 zGPnzl+XK3|AY&OEk>F!0_kigPVsATP&ruY)yO5JH&OW`>u%<7s2sV+aHmmfnb;L;M z$np%JihP1qxs8Q`?dUVm)RLMAw zUMX#I=X{>8q%pRVZ~ZYP%MT{f|D=B-f^hbaU4p%`yx`+H@!Pt~(4;q%voHt+n;oPL z5bGtdmYxg6Q6qyfn0MGFC`(`wMw5f_hZL<*purEF6zXw@$d}PavV9<;_a+UWto94D zVR5VmTE9};EYy5Zb172a%_fjfQDoC<5kGFI-Y>1Q4amneBV+8y=nK6(WBa`!j<5GZs%J8U9@J8u7fIds%8)PtJLhrzgJ>hd27^Y+BJ0p`)^-M!Y8)W9P{$?2kk_`ib z7)6e=N4VuaPm8q=r3|||9WjsfFAdq|LskO5CGKO0@>AxoLZDYYp2-EbQ2iEfTSV}R zr!!>}lk>@4PHB8p(s?RozO3MAxhhY(r9oHXVD?-zP{U}@Zx~o*@`8nmShm5T3?U$es_%8jnfCuOlee~UpZ=-90?zvE*o4mW1J+Ob zuKSlCxO1Fk)lU;k=Xk3A3{Y^d+!3_QU#v#>R9Q!OgN_wdA#D;Gm-TLy1~bL-_!QH* zto>reHDUS`hcR0p<~;mPci(g0m42JRedUT!%H){M8{|<=k|XOu)5gYoBtw6=pGA>OVWSHc5X*8eVWODHcTg3 zCDRK&tNy;QUQSzrlIa)0FVpd@V7zxjOhfKhsaAEkTQ zip96>5{3#AZsp}FeFPk5Hl7O`wHHklx-4gyGrHnFt#b6UO5UOTxm^{1a>F)%p1fzY zHWeqZD4+P!6(;WZ-(CUyJp?d8V&Bj<9MuB^G+Yp13T{Ebaf)0}hHkyj6=3;RiY7P6 zRuA?^ZH4;|_3SsT5*>1zn*O(%yo?;j%I@7KEed%4vZkx=C}SGr`gLAL&i@Hp$r)vM zi97uHz|Z0sdu#WQ=3nj1m@n$ZWvYzT(rxR(Bsms)P5+lL%JNaQ&#v6rxxJ6RyT4~f zN5U=pdTc*t^N2dIfFl{_1Zt1TyZjbd)u- zDV;?~`z&7eBU#!)M#-J#NXr*O!tg^H6zI4ubT=%g1tf6I>g^}M5&9!`dl{8hM@eI5 zQ{_)G@<>zeuYpXtT&$6`JIqPqX&z}XjTEU&>7&-h%BC{0t`w`YW_{_iHfs~shBx9N zJ7WgORKmAh-KrZbu`>^wLs2#l?tkw0LS=!NvLggP(J=QjVm)}um>~qiBEuwZ>)2AkQAiyn$>8oNr%6_Sbju$8Qdf}@-&M1)e14Hpj zXL7Sdh4UZQOymd@8%m%=0va%-^n%J6BrvBk`>Y8*IAK*$AwOlfSXG0!)DgQs@t1zJ-^r!VoYk{`9bLP&*7O@OT4jAKAT}yh78EMc9;kb z<0>T~BF`0+VuBQ)%YCyPzHV}-5WcUCz_;f0XpSikH$(38Io&g1)Z}7Io?#NZ)A{=O zw@}z`!T~D0fjXmaZPElerJeAToevZvsp2v7H4VXAb|DF@iwzCR+$t2P;B4ah(m;hF zb1*!Of&pNYZ(lyz?_yHmqyo{2i^3%|UHOx*4ib5{%nuN8Y@Z3a<4RZ^=hHc+Vv9O* z31Q;aZGLcvQ)sXC%1|J42=JdaiBz>lsJ(T{u!R#c^%tre`o<;CuJ8>L9W-RqQ25IG z#;cJYs_x)KgvCUZ%5AJ={N#f{-R`U!eOK$#d<;?7m-mm!7zquEFay*xXGue_*hT8| z=ZKaROkwamvHfxDBB*|_!n$Sfwuds1sw#pBxcMK7#3Xe{-}z_w#L1NYpk(?;IQ&Vq z1oHBM#tvQcPPodvH)3B1MAE35SxYIn+Cx>`iG@013IzKYoEIlc3vJ3i5f#=NlQq74 z8e#SV_{2)%2-3#al=Q7Jmr%V-+5T+i=*OAT5v}gCj%l#9*@?l{imJ{p%?KvO_x{oMIQw60_`K`~ zMaqyAMjkGO@o`kc)J?44lkl`p5|u?Yvd$D=0Pz&`(kt#Sn;rQdO?DP<0c@3GWP z`_z!E3@fGg%-mH=dwG$v!dXO6)X~JQ;hj%-m6lu&Fq;&8GV6xh?4wT<@!nDShl8te zHwtO?yAT8|q=0$l->(FTzND^OoKL6q#@@7Ug&-fV<6gz;3@9LrK4)(AvzId)rYY1` zR@hKb?zb`cq6DIxc}qei09=U@{bNq;Y^Wa!V8c-BTnA*!V-j)3`c9PQyAbOL%iT@0 z?PZh!qOyb~E^UqXnO;oN*4p2dc0-r>D(;oV?iA0l2=iyXKVM}D{hhu(wshDQ6(vj! z6Fdo%=@U_$q*3lvPB!tjW1+!h{QT>!FrVOdj^_mn9{nK_{<>FhowXchb8+NHsuD?? z_I=seL9&eA+rqu*My;1rC(SGi(SC{uF<9s0F8NSGtJ!5{laHE_n=eZo zFjG>c;W?Y!AGfqMT``L|fb;%DCQsSi%>R|y!oh|K%?1U{S&X&P=K_(Yj43h>s=3&` z)Ys~Rg%%#4B6sP}rh{_-)2~``Qu=>^#kNSnSh77-o>8b#-8)I&HXu-(X5RPm92OjX ztq#O->yYc5v@7A}9V?*L{gAt+!E^w0)IJXHhrfTVbgsPpVMsxzQ

    6~nfPm%Rmm2ZKu^t$4ajVRrRkm0X^G1+t^ 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 diff --git a/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_004.png b/lib/matplotlib/tests/baseline_images/test_axes/formatter_ticker_004.png index ebdbc54169ef8a28dbd3348f6aaf31f299e9bb3e..67de2f316d01c695004f59277dfaa6ffd2bd0def 100644 GIT binary patch literal 35201 zcmeFZby!y0*9A&SgMdhfARygcDo7)WbT^_%r=%dEv`CjqNl2%Zgw#uiba!{xT^l^V zbI$Mc`~JW8xjYY#sJ!of_grhuImVb{?srcfOJSjtpu@qzVaZ5KD8a!YQo+F?sH5Hh z{}SiuZ4LfFvU@0_j0(QoP>ln?-_fk4HSFNva15Yt_^)Ca=5TOSa554Pl${gS#$B`{ zO=b?aaRO7n1bppF;Z4oVoUJ*KD<&@HjE;Lsiq8YjLC`_q@KMH&Ji?d)MUG*x@rNXr zHC9A#e;olK)g#2r&rfC1Kfc>{P7>>6OS1Vv-q|tjHkqfEH`wl;9DnLszvWi3vHG2? z-L!}p_v(wunp@B-0QwrjA-H+oF!{`Bok6ykE;(tk0S>pti@x3ExX-baUrkH5XOrN7ku*&cjX zO}@X{9Ua!}@g1fq;_A;{ykH#v?m#0XR5_q-cZ6KXq+I-^{KLQW3Eo6^Y%|d8z-m5m4WQk)YK>H>duOT zltPX{Gc$%D{#F7LHSVt9|C*;8{F$grp{PoyWgsZ|VGy!DdGh3bie#|!v@hZF{;#;- zw93*w&QF+izVGD@W~8OTcc;okC@oTWo^5~Fy^7XB)5e0=SYWcp37QvJ(%x(}wu|jh z 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 literal 33382 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 z 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 HYTfuhhN&0w literal 33337 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 Date: Wed, 9 Sep 2009 20:01:03 +0000 Subject: [PATCH 0227/1000] Some more work on creating a "clean" rcParams environment for running tests. svn path=/trunk/matplotlib/; revision=7729 --- lib/matplotlib/__init__.py | 17 ++++++++++------- lib/matplotlib/font_manager.py | 14 ++------------ test/matplotlibrc | 4 ++-- 3 files changed, 14 insertions(+), 21 deletions(-) diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index 488c73299dce..87a385157a86 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -894,16 +894,20 @@ def test(verbosity=0): from testing.noseclasses import KnownFailure from nose.plugins.manager import PluginManager + # Store the current backend and all rcParams for restoration later backend = rcParams['backend'] + original_params = rcParams.copy() use('Agg') # use Agg backend for these tests - # store the old values before overriding - overrides = 'font.family', 'text.hinting' - stored = dict([(k, rcParams[k]) for k in overrides]) - + # These settings *must* be hardcoded for running the comparison + # tests and are not necessarily the default values as specified in + # rcsetup.py + rcdefaults() # Start with all defaults rcParams['font.family'] = 'Bitstream Vera Sans' rcParams['text.hinting'] = False + + # store the old values before overriding plugins = [] plugins.append( KnownFailure() ) plugins.extend( [plugin() for plugin in nose.plugins.builtin.plugins] ) @@ -914,11 +918,10 @@ def test(verbosity=0): success = nose.run( defaultTest=default_test_modules, config=config, ) - # restore the old rc values - rcParams.update(stored) - # restore the old backend + # restore the old backend and rcParams use(backend) + rcParams.update(original_params) return success test.__test__ = False # nose: this function is not a test diff --git a/lib/matplotlib/font_manager.py b/lib/matplotlib/font_manager.py index 3685ecfc0b8e..1baa90332ee0 100644 --- a/lib/matplotlib/font_manager.py +++ b/lib/matplotlib/font_manager.py @@ -642,8 +642,7 @@ class FontProperties(object): The preferred usage of font sizes is to use the relative values, e.g. 'large', instead of absolute font sizes, e.g. 12. This approach allows all text sizes to be made larger or smaller based - on the font manager's default font size, i.e. by using the - :meth:`FontManager.set_default_size` method. + on the font manager's default font size. This class will also accept a `fontconfig `_ pattern, if it is the only argument @@ -1022,9 +1021,7 @@ def get_default_size(self): """ Return the default font size. """ - if self.default_size is None: - return rcParams['font.size'] - return self.default_size + return rcParams['font.size'] def set_default_weight(self, weight): """ @@ -1032,13 +1029,6 @@ def set_default_weight(self, weight): """ self.__default_weight = weight - def set_default_size(self, size): - """ - Set the default font size in points. The initial value is set - by ``font.size`` in rc. - """ - self.default_size = size - def update_fonts(self, filenames): """ Update the font dictionary with new font files. diff --git a/test/matplotlibrc b/test/matplotlibrc index 59ddf24deed0..fecc7fec20de 100644 --- a/test/matplotlibrc +++ b/test/matplotlibrc @@ -1,3 +1,3 @@ backend : Agg -font.family : sans-serif -font.sans-serif : Bitstream Vera Sans, Lucida Grande, Verdana, Geneva, Lucid, Arial, Helvetica, Avant Garde, sans-serif +font.family : Bitstream Vera Sans +text.hinting : True \ No newline at end of file From 4372fe36d3f74621e86fdcc5e50c39cac4e13a17 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Thu, 10 Sep 2009 08:15:48 +0000 Subject: [PATCH 0228/1000] axes_grid: fix inset_axes bug svn path=/trunk/matplotlib/; revision=7730 --- lib/mpl_toolkits/axes_grid/inset_locator.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/mpl_toolkits/axes_grid/inset_locator.py b/lib/mpl_toolkits/axes_grid/inset_locator.py index 7fb4e41c78b0..83ffa436087e 100644 --- a/lib/mpl_toolkits/axes_grid/inset_locator.py +++ b/lib/mpl_toolkits/axes_grid/inset_locator.py @@ -276,9 +276,14 @@ def inset_axes(parent_axes, width, height, loc=1, inset_axes = axes_class(parent_axes.figure, parent_axes.get_position(), **axes_kwargs) - axes_locator = AnchoredSizeLocator(parent_axes.bbox, + if bbox_to_anchor is None: + bbox_to_anchor = parent_axes.bbox + + axes_locator = AnchoredSizeLocator(bbox_to_anchor, width, height, - loc=loc) + loc=loc, + bbox_transform=bbox_transform, + **kwargs) inset_axes.set_axes_locator(axes_locator) From 122789332c0cdfe113b6412a142ea88f5dace323 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Thu, 10 Sep 2009 22:32:08 +0000 Subject: [PATCH 0229/1000] testing: add test for SF#2856495 svn path=/trunk/matplotlib/; revision=7733 --- lib/matplotlib/__init__.py | 1 + lib/matplotlib/tests/test_backend_svg.py | 30 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+) create mode 100644 lib/matplotlib/tests/test_backend_svg.py diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index 87a385157a86..8e53fe900e49 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -878,6 +878,7 @@ def tk_window_focus(): default_test_modules = [ 'matplotlib.tests.test_agg', + 'matplotlib.tests.test_backend_svg', 'matplotlib.tests.test_basic', 'matplotlib.tests.test_cbook', 'matplotlib.tests.test_transforms', diff --git a/lib/matplotlib/tests/test_backend_svg.py b/lib/matplotlib/tests/test_backend_svg.py new file mode 100644 index 000000000000..f4a16ebfbd37 --- /dev/null +++ b/lib/matplotlib/tests/test_backend_svg.py @@ -0,0 +1,30 @@ +import matplotlib.pyplot as plt +import numpy as np +import cStringIO as StringIO +import xml.parsers.expat +from matplotlib.testing.decorators import knownfailureif + +@knownfailureif(True) +def test_visibility(): + # This is SF 2856495. See + # https://sourceforge.net/tracker/?func=detail&aid=2856495&group_id=80706&atid=560720 + fig=plt.figure() + ax=fig.add_subplot(1,1,1) + + x = np.linspace(0,4*np.pi,50) + y = np.sin(x) + yerr = np.ones_like(y) + + a,b,c=ax.errorbar(x,y,yerr=yerr,fmt='ko') + for artist in b: + artist.set_visible(False) + + fd = StringIO.StringIO() + fig.savefig(fd,format='svg') + + fd.seek(0) + buf = fd.read() + fd.close() + + parser = xml.parsers.expat.ParserCreate() + parser.Parse(buf) # this will raise ExpatError if the svg is invalid From 9a65ca3bbaadbc0afc3369a96bb55b4797d5a585 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Thu, 10 Sep 2009 23:22:40 +0000 Subject: [PATCH 0230/1000] Merged revisions 7727-7728,7734 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7727 | ryanmay | 2009-09-09 14:41:43 -0400 (Wed, 09 Sep 2009) | 1 line Include 'top' keyword argument in docstring for Figure.subplots_adjust(). ........ r7728 | mdboom | 2009-09-09 15:55:52 -0400 (Wed, 09 Sep 2009) | 2 lines Fix some documentation warnings. ........ r7734 | leejjoon | 2009-09-10 19:01:28 -0400 (Thu, 10 Sep 2009) | 1 line fix a bug in Line2D.draw method that produces invalid svg when the line is invisible ........ svn path=/trunk/matplotlib/; revision=7735 --- doc/api/spine_api.rst | 2 +- doc/mpl_toolkits/mplot3d/tutorial.rst | 2 +- doc/users/image_tutorial.rst | 171 ++++++++++++++++++-------- doc/users/index.rst | 1 - doc/users/pyplot_tutorial.rst | 18 +-- lib/matplotlib/axes.py | 14 +-- lib/matplotlib/figure.py | 3 +- lib/matplotlib/lines.py | 5 +- lib/matplotlib/mlab.py | 2 +- 9 files changed, 146 insertions(+), 72 deletions(-) diff --git a/doc/api/spine_api.rst b/doc/api/spine_api.rst index 0ef13e33234b..062b0aabe1ef 100644 --- a/doc/api/spine_api.rst +++ b/doc/api/spine_api.rst @@ -6,7 +6,7 @@ matplotlib spine :mod:`matplotlib.spine` ======================== -.. automodule:: matplotlib.spine +.. automodule:: matplotlib.spines :members: :undoc-members: :show-inheritance: diff --git a/doc/mpl_toolkits/mplot3d/tutorial.rst b/doc/mpl_toolkits/mplot3d/tutorial.rst index fa3deb6e8c91..002bf00a21ff 100644 --- a/doc/mpl_toolkits/mplot3d/tutorial.rst +++ b/doc/mpl_toolkits/mplot3d/tutorial.rst @@ -55,7 +55,7 @@ Filled contour plots Polygon plots ==================== -.. automethod:: add_collection3d +.. automethod:: Axes3D.add_collection3d .. plot:: mpl_examples/mplot3d/polys3d_demo.py diff --git a/doc/users/image_tutorial.rst b/doc/users/image_tutorial.rst index 4340a76a36db..094b4154d3d8 100644 --- a/doc/users/image_tutorial.rst +++ b/doc/users/image_tutorial.rst @@ -10,17 +10,20 @@ Image tutorial Startup commands =================== -At the very least, you'll need to have access to the :func:`~matplotlib.pyplot.imshow` function. There are a couple of ways to do it. The easy way for an interactive environment:: +At the very least, you'll need to have access to the +:func:`~matplotlib.pyplot.imshow` function. There are a couple of +ways to do it. The easy way for an interactive environment:: + + $ipython -pylab - $ipython -pylab - The imshow function is now directly accessible (it's in your `namespace `_). See also :ref:`pyplot-tutorial`. The more expressive, easier to understand later method (use this in your scripts to make it easier for others (including your future self) -to read) is to use the matplotlib API (see :ref:`artist-tutorial`) where you use explicit namespaces and control object creation, etc... +to read) is to use the matplotlib API (see :ref:`artist-tutorial`) +where you use explicit namespaces and control object creation, etc... .. sourcecode:: ipython @@ -28,16 +31,22 @@ to read) is to use the matplotlib API (see :ref:`artist-tutorial`) where you use In [2]: import matplotlib.image as mpimg In [3]: import numpy as np -Examples below will use the latter method, for clarity. In these examples, if you use the -pylab method, you can skip the "mpimg." and "plt." prefixes. +Examples below will use the latter method, for clarity. In these +examples, if you use the -pylab method, you can skip the "mpimg." and +"plt." prefixes. .. _importing_data: Importing image data into Numpy arrays =============================================== -Plotting image data is supported by the Python Image Library (`PIL `_), . Natively, matplotlib only supports PNG images. The commands shown below fall back on PIL if the native read fails. +Plotting image data is supported by the Python Image Library (`PIL +`_), . Natively, matplotlib +only supports PNG images. The commands shown below fall back on PIL +if the native read fails. -The image used in this example is a PNG file, but keep that PIL requirement in mind for your own data. +The image used in this example is a PNG file, but keep that PIL +requirement in mind for your own data. Here's the image we're going to play with: @@ -55,11 +64,11 @@ And here we go... .. sourcecode:: ipython In [4]: img=mpimg.imread('stinkbug.png') - Out[4]: + Out[4]: array([[[ 0.40784314, 0.40784314, 0.40784314], [ 0.40784314, 0.40784314, 0.40784314], [ 0.40784314, 0.40784314, 0.40784314], - ..., + ..., [ 0.42745098, 0.42745098, 0.42745098], [ 0.42745098, 0.42745098, 0.42745098], [ 0.42745098, 0.42745098, 0.42745098]], @@ -67,7 +76,7 @@ And here we go... [[ 0.41176471, 0.41176471, 0.41176471], [ 0.41176471, 0.41176471, 0.41176471], [ 0.41176471, 0.41176471, 0.41176471], - ..., + ..., [ 0.42745098, 0.42745098, 0.42745098], [ 0.42745098, 0.42745098, 0.42745098], [ 0.42745098, 0.42745098, 0.42745098]], @@ -75,16 +84,16 @@ And here we go... [[ 0.41960785, 0.41960785, 0.41960785], [ 0.41568628, 0.41568628, 0.41568628], [ 0.41568628, 0.41568628, 0.41568628], - ..., + ..., [ 0.43137255, 0.43137255, 0.43137255], [ 0.43137255, 0.43137255, 0.43137255], [ 0.43137255, 0.43137255, 0.43137255]], - ..., + ..., [[ 0.43921569, 0.43921569, 0.43921569], [ 0.43529412, 0.43529412, 0.43529412], [ 0.43137255, 0.43137255, 0.43137255], - ..., + ..., [ 0.45490196, 0.45490196, 0.45490196], [ 0.4509804 , 0.4509804 , 0.4509804 ], [ 0.4509804 , 0.4509804 , 0.4509804 ]], @@ -92,7 +101,7 @@ And here we go... [[ 0.44313726, 0.44313726, 0.44313726], [ 0.44313726, 0.44313726, 0.44313726], [ 0.43921569, 0.43921569, 0.43921569], - ..., + ..., [ 0.4509804 , 0.4509804 , 0.4509804 ], [ 0.44705883, 0.44705883, 0.44705883], [ 0.44705883, 0.44705883, 0.44705883]], @@ -100,26 +109,46 @@ And here we go... [[ 0.44313726, 0.44313726, 0.44313726], [ 0.4509804 , 0.4509804 , 0.4509804 ], [ 0.4509804 , 0.4509804 , 0.4509804 ], - ..., + ..., [ 0.44705883, 0.44705883, 0.44705883], [ 0.44705883, 0.44705883, 0.44705883], [ 0.44313726, 0.44313726, 0.44313726]]], dtype=float32) -Note the dtype there - float32. Matplotlib has rescaled the 8 bit data from each channel to floating point data between 0.0 and 1.0. As a side note, the only datatype that PIL can work with is uint8. Matplotlib plotting can handle float32 and uint8, but image reading/writing for any format other than PNG is limited to uint8 data. Why 8 bits? Most displays can only render 8 bits per channel worth of color gradation. Why can they only render 8 bits/channel? Because that's about all the human eye can see. More here (from a photography standpoint): `Luminous Landscape bit depth tutorial `_ - -Each inner list represents a pixel. Here, with an RGB image, there are 3 values. Since it's a black and white image, R, G, and B are all similar. An RGBA (where A is alpha, or transparency), has 4 values per inner list, and a simple luminance image just has one value (and is thus only a 2-D array, not a 3-D array). For RGB and RGBA images, matplotlib supports float32 and uint8 data types. For grayscale, matplotlib supports only float32. If your array data does not meet one of these descriptions, you need to rescale it. +Note the dtype there - float32. Matplotlib has rescaled the 8 bit +data from each channel to floating point data between 0.0 and 1.0. As +a side note, the only datatype that PIL can work with is uint8. +Matplotlib plotting can handle float32 and uint8, but image +reading/writing for any format other than PNG is limited to uint8 +data. Why 8 bits? Most displays can only render 8 bits per channel +worth of color gradation. Why can they only render 8 bits/channel? +Because that's about all the human eye can see. More here (from a +photography standpoint): `Luminous Landscape bit depth tutorial +`_. + +Each inner list represents a pixel. Here, with an RGB image, there +are 3 values. Since it's a black and white image, R, G, and B are all +similar. An RGBA (where A is alpha, or transparency), has 4 values +per inner list, and a simple luminance image just has one value (and +is thus only a 2-D array, not a 3-D array). For RGB and RGBA images, +matplotlib supports float32 and uint8 data types. For grayscale, +matplotlib supports only float32. If your array data does not meet +one of these descriptions, you need to rescale it. .. _plotting_data: Plotting numpy arrays as images =================================== -So, you have your data in a numpy array (either by importing it, or by generating it). Let's render it. In Matplotlib, this is performed using the :func:`~matplotlib.pyplot.imshow` function. Here we'll grab the plot object. This object gives you an easy way to manipulate the plot from the prompt. +So, you have your data in a numpy array (either by importing it, or by +generating it). Let's render it. In Matplotlib, this is performed +using the :func:`~matplotlib.pyplot.imshow` function. Here we'll grab +the plot object. This object gives you an easy way to manipulate the +plot from the prompt. .. sourcecode:: ipython In [5]: imgplot = plt.imshow(img) - + .. plot:: import matplotlib.pyplot as plt @@ -128,23 +157,31 @@ So, you have your data in a numpy array (either by importing it, or by generatin img = mpimg.imread('_static/stinkbug.png') imgplot = plt.imshow(img) -You can also plot any numpy array - just remember that the datatype must be float32 (and range from 0.0 to 1.0) or uint8. +You can also plot any numpy array - just remember that the datatype +must be float32 (and range from 0.0 to 1.0) or uint8. .. _Pseudocolor: - + Applying pseudocolor schemes to image plots ------------------------------------------------- -Pseudocolor can be a useful tool for enhancing contrast and visualizing your data more easily. This is especially useful when making presentations of your data using projectors - their contrast is typically quite poor. +Pseudocolor can be a useful tool for enhancing contrast and +visualizing your data more easily. This is especially useful when +making presentations of your data using projectors - their contrast is +typically quite poor. -Pseudocolor is only relevant to single-channel, grayscale, luminosity images. We currently have an RGB image. Since R, G, and B are all similar (see for yourself above or in your data), we can just pick on channel of our data: +Pseudocolor is only relevant to single-channel, grayscale, luminosity +images. We currently have an RGB image. Since R, G, and B are all +similar (see for yourself above or in your data), we can just pick on +channel of our data: .. sourcecode:: ipython In [6]: lum_img = img[:,:,0] - -This is array slicing. You can read more `here `_ - + +This is array slicing. You can read more `here +`_. + .. sourcecode:: ipython In [7]: imgplot = mpimg.imshow(lum_img) @@ -158,7 +195,11 @@ This is array slicing. You can read more `here `_ - +There are many other colormap schemes available. See a list and +images of the colormaps `here +`_. + .. _Color Bars Color scale reference ------------------------ -It's helpful to have an idea of what value a color represents. We can do that by adding color bars. It's as easy as one line: +It's helpful to have an idea of what value a color represents. We can +do that by adding color bars. It's as easy as one line: .. sourcecode:: ipython + In [10]: plt.colorbar() - + .. plot:: import matplotlib.pyplot as plt @@ -210,15 +255,22 @@ It's helpful to have an idea of what value a color represents. We can do that b imgplot = plt.imshow(lum_img) imgplot.set_cmap('spectral') plt.colorbar() - -This adds a colorbar to your existing figure. This won't automatically change if you change you switch to a different colormap - you have to re-create your plot, and add in the colorbar again. + +This adds a colorbar to your existing figure. This won't +automatically change if you change you switch to a different +colormap - you have to re-create your plot, and add in the colorbar +again. .. _Data ranges Examining a specific data range --------------------------------- -Sometimes you want to enhance the contrast in your image, or expand the contrast in a particular region while sacrificing the detail in colors that don't vary much, or don't matter. A good tool to find interesting regions is the histogram. To create a histogram of our image data, we use the :func:`~matplotlib.pyplot.hist` function. +Sometimes you want to enhance the contrast in your image, or expand +the contrast in a particular region while sacrificing the detail in +colors that don't vary much, or don't matter. A good tool to find +interesting regions is the histogram. To create a histogram of our +image data, we use the :func:`~matplotlib.pyplot.hist` function. .. sourcecode:: ipython @@ -233,7 +285,14 @@ Sometimes you want to enhance the contrast in your image, or expand the contrast lum_img = img[:,:,0] plt.hist(lum_img, range=(0.0,1.0)) -Most often, the "interesting" part of the image is around the peak, and you can get extra contrast by clipping the regions above and/or below the peak. In our histogram, it looks like there's not much useful information in the high end (not many white things in the image). Let's adjust the upper limit, so that we effectively "zoom in on" part of the histogram. We do this by calling the :meth:`~matplotlib.image.Image.set_clim` method of the image plot object. +Most often, the "interesting" part of the image is around the peak, +and you can get extra contrast by clipping the regions above and/or +below the peak. In our histogram, it looks like there's not much +useful information in the high end (not many white things in the +image). Let's adjust the upper limit, so that we effectively "zoom in +on" part of the histogram. We do this by calling the +:meth:`~matplotlib.image.Image.set_clim` method of the image plot +object. .. sourcecode:: ipython @@ -249,8 +308,8 @@ Most often, the "interesting" part of the image is around the peak, and you can img = mpimg.imread('_static/stinkbug.png') lum_img = img[:,:,0] imgplot = plt.imshow(lum_img) - a.set_title('Before') - plt.colorbar(ticks=[0.1,0.3,0.5,0.7], orientation ='horizontal') + a.set_title('Before') + plt.colorbar(ticks=[0.1,0.3,0.5,0.7], orientation ='horizontal') a=fig.add_subplot(1,2,2) imgplot = plt.imshow(lum_img) imgplot.set_clim(0.0,0.7) @@ -260,8 +319,20 @@ Most often, the "interesting" part of the image is around the peak, and you can .. _Interpolation: Array Interpolation schemes ------------------------------------ -Interpolation calculates what the color or value of a pixel "should" be, according to different mathematical schemes. One common place that this happens is when you resize an image. The number of pixels change, but you want the same information. Since pixels are discrete, there's missing space. Interpolation is how you fill that space. This is why your images sometimes come out looking pixelated when you blow them up. The effect is more pronounced when the difference between the original image and the expanded image is greater. Let's take our image and shrink it. We're effectively discarding pixels, only keeping a select few. Now when we plot it, that data gets blown up to the size on your screen. The old pixels aren't there anymore, and the computer has to draw in pixels to fill that space. +--------------------------- + +Interpolation calculates what the color or value of a pixel "should" +be, according to different mathematical schemes. One common place +that this happens is when you resize an image. The number of pixels +change, but you want the same information. Since pixels are discrete, +there's missing space. Interpolation is how you fill that space. +This is why your images sometimes come out looking pixelated when you +blow them up. The effect is more pronounced when the difference +between the original image and the expanded image is greater. Let's +take our image and shrink it. We're effectively discarding pixels, +only keeping a select few. Now when we plot it, that data gets blown +up to the size on your screen. The old pixels aren't there anymore, +and the computer has to draw in pixels to fill that space. .. sourcecode:: ipython @@ -272,7 +343,7 @@ Interpolation calculates what the color or value of a pixel "should" be, accordi In [12]: imgplot = mpimg.imshow(rsizeArr) .. plot:: - + import matplotlib.pyplot as plt import matplotlib.image as mpimg import numpy as np @@ -283,7 +354,8 @@ Interpolation calculates what the color or value of a pixel "should" be, accordi lum_img = rsizeArr[:,:,0] imgplot = plt.imshow(rsizeArr) -Here we have the default interpolation, bilinear, since we did not give :func:`~matplotlib.pyplot.imshow` any interpolation argument. +Here we have the default interpolation, bilinear, since we did not +give :func:`~matplotlib.pyplot.imshow` any interpolation argument. Let's try some others: @@ -302,10 +374,10 @@ Let's try some others: rsizeArr = np.asarray(rsize) lum_img = rsizeArr[:,:,0] imgplot = plt.imshow(rsizeArr) - imgplot.set_interpolation('nearest') - + imgplot.set_interpolation('nearest') + .. sourcecode:: ipython - + In [10]: imgplot.set_interpolation('bicubic') .. plot:: @@ -320,5 +392,6 @@ Let's try some others: lum_img = rsizeArr[:,:,0] imgplot = plt.imshow(rsizeArr) imgplot.set_interpolation('bicubic') - -Bicubic interpolation is often used when blowing up photos - people tend to prefer blurry over pixelated. \ No newline at end of file + +Bicubic interpolation is often used when blowing up photos - people +tend to prefer blurry over pixelated. diff --git a/doc/users/index.rst b/doc/users/index.rst index fdb05bb226de..804930493262 100644 --- a/doc/users/index.rst +++ b/doc/users/index.rst @@ -23,7 +23,6 @@ User's Guide artists.rst legend_guide.rst event_handling.rst - legend.rst transforms_tutorial.rst path_tutorial.rst annotations_guide.rst diff --git a/doc/users/pyplot_tutorial.rst b/doc/users/pyplot_tutorial.rst index defadc8671f5..10cb6d1787e7 100644 --- a/doc/users/pyplot_tutorial.rst +++ b/doc/users/pyplot_tutorial.rst @@ -165,17 +165,17 @@ The :func:`~matplotlib.pyplot.figure` command here is optional because ``figure(1)`` will be created by default, just as a ``subplot(111)`` will be created by default if you don't manually specify an axes. The :func:`~matplotlib.pyplot.subplot` command specifies ``numrows, - numcols, fignum`` where ``fignum`` ranges from 1 to -``numrows*numcols``. The commas in the ``subplot`` command are optional -if ``numrows*numcols<10``. So ``subplot(211)`` is identical to -``subplot(2,1,1)``. You can create an arbitrary number of subplots +numcols, fignum`` where ``fignum`` ranges from 1 to +``numrows*numcols``. The commas in the ``subplot`` command are +optional if ``numrows*numcols<10``. So ``subplot(211)`` is identical +to ``subplot(2,1,1)``. You can create an arbitrary number of subplots and axes. If you want to place an axes manually, ie, not on a rectangular grid, use the :func:`~matplotlib.pyplot.axes` command, which allows you to specify the location as ``axes([left, bottom, width, height])`` where all values are in fractional (0 to 1) coordinates. See :ref:`pylab_examples-axes_demo` for an example of -placing axes manually and :ref:`pylab_examples-line_styles` for an example -with lots-o-subplots. +placing axes manually and :ref:`pylab_examples-line_styles` for an +example with lots-o-subplots. You can create multiple figures by using multiple @@ -267,6 +267,6 @@ these arguments are ``(x,y)`` tuples. In this basic example, both the ``xy`` (arrow tip) and ``xytext`` locations (text location) are in data coordinates. There are a variety of other coordinate systems one can choose -- see -:ref:`annotations-tutorial` and :ref:`plotting-guide-annotation` -for details. More examples can be found -in :ref:`pylab_examples-annotation_demo`. +:ref:`annotations-tutorial` and :ref:`plotting-guide-annotation` for +details. More examples can be found in +:ref:`pylab_examples-annotation_demo`. diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index c261571eac87..162ab2b2020a 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -1360,7 +1360,7 @@ def has_data(self): def add_artist(self, a): ''' - Add any :class:`~matplotlib.artist.Artist` to the axes + Add any :class:`~matplotlib.artist.Artist` to the axes. Returns the artist. ''' @@ -1373,8 +1373,8 @@ def add_artist(self, a): def add_collection(self, collection, autolim=True): ''' - add a :class:`~matplotlib.collections.Collection` instance - to the axes + Add a :class:`~matplotlib.collections.Collection` instance + to the axes. Returns the collection. ''' @@ -3675,15 +3675,15 @@ def acorr(self, x, **kwargs): *maxlags* is a positive integer detailing the number of lags to show. The default value of *None* will return all - :math:`2 \mathrm{len}(x) - 1` lags. + :math:`2 \times \mathrm{len}(x) - 1` lags. The return value is a tuple (*lags*, *c*, *linecol*, *b*) where - - *linecol* is the - :class:`~matplotlib.collections.LineCollection` + - *linecol* is the + :class:`~matplotlib.collections.LineCollection` - - *b* is the *x*-axis. + - *b* is the *x*-axis. .. seealso:: diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index 4c10d47b9cb7..a14e21c4d2b4 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -1078,7 +1078,8 @@ def on_changed(m): def subplots_adjust(self, *args, **kwargs): """ - fig.subplots_adjust(left=None, bottom=None, right=None, wspace=None, hspace=None) + fig.subplots_adjust(left=None, bottom=None, right=None, top=None, + wspace=None, hspace=None) Update the :class:`SubplotParams` with *kwargs* (defaulting to rc where None) and update the subplot locations diff --git a/lib/matplotlib/lines.py b/lib/matplotlib/lines.py index 6a6b540a16da..1e7ac5af7857 100644 --- a/lib/matplotlib/lines.py +++ b/lib/matplotlib/lines.py @@ -499,9 +499,10 @@ def draw(self, renderer): self._transform_path(subslice) if self._transformed_path is None: self._transform_path() - renderer.open_group('line2d', self.get_gid()) - if not self._visible: return + if not self.get_visible(): return + + renderer.open_group('line2d', self.get_gid()) gc = renderer.new_gc() self._set_gc_clip(gc) diff --git a/lib/matplotlib/mlab.py b/lib/matplotlib/mlab.py index 6ad3197d9268..df70303e1e38 100644 --- a/lib/matplotlib/mlab.py +++ b/lib/matplotlib/mlab.py @@ -565,7 +565,7 @@ def cohere_pairs( X, ij, NFFT=256, Fs=2, detrend=detrend_none, example script that shows that this :func:`cohere_pairs` and :func:`cohere` give the same results for a given pair. - .. sealso:: + .. seealso:: :func:`psd` For information about the methods used to compute From 486789708ae5d065efc12a257649ac6aceb315ff Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Thu, 10 Sep 2009 23:52:54 +0000 Subject: [PATCH 0231/1000] testing: remove known failure now that bug is fixed svn path=/trunk/matplotlib/; revision=7736 --- lib/matplotlib/tests/test_backend_svg.py | 1 - 1 file changed, 1 deletion(-) diff --git a/lib/matplotlib/tests/test_backend_svg.py b/lib/matplotlib/tests/test_backend_svg.py index f4a16ebfbd37..c99c480981da 100644 --- a/lib/matplotlib/tests/test_backend_svg.py +++ b/lib/matplotlib/tests/test_backend_svg.py @@ -4,7 +4,6 @@ import xml.parsers.expat from matplotlib.testing.decorators import knownfailureif -@knownfailureif(True) def test_visibility(): # This is SF 2856495. See # https://sourceforge.net/tracker/?func=detail&aid=2856495&group_id=80706&atid=560720 From ac53b07b6ad09e2e13e9b25d3675c90434cb471e Mon Sep 17 00:00:00 2001 From: John Hunter Date: Fri, 11 Sep 2009 01:26:41 +0000 Subject: [PATCH 0232/1000] add test to expose hexbin extent bug #2856228 svn path=/trunk/matplotlib/; revision=7737 --- lib/matplotlib/tests/test_axes.py | 124 +++++++++++++++++------------- 1 file changed, 72 insertions(+), 52 deletions(-) diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 233f8231d30a..31cf3a9e5d2c 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -2,7 +2,7 @@ import matplotlib from matplotlib.testing.decorators import image_comparison, knownfailureif import matplotlib.pyplot as plt -import pylab + @image_comparison(baseline_images=['formatter_ticker_001', 'formatter_ticker_002', @@ -20,8 +20,8 @@ def test_formatter_ticker(): ydata1 = [ (1.5*y - 0.5)*units.km for y in range(10) ] ydata2 = [ (1.75*y - 1.0)*units.km for y in range(10) ] - fig = pylab.figure() - ax = pylab.subplot( 111 ) + fig = plt.figure() + ax = plt.subplot( 111 ) ax.set_xlabel( "x-label 001" ) fig.savefig( 'formatter_ticker_001' ) @@ -49,7 +49,7 @@ def test_basic_annotate(): # Offset Points - fig = pylab.figure() + fig = plt.figure() ax = fig.add_subplot( 111, autoscale_on=False, xlim=(-1,5), ylim=(-3,5) ) line, = ax.plot( t, s, lw=3, color='purple' ) @@ -74,7 +74,7 @@ def test_polar_annotations(): r = np.arange(0.0, 1.0, 0.001 ) theta = 2.0 * 2.0 * np.pi * r - fig = pylab.figure() + fig = plt.figure() ax = fig.add_subplot( 111, polar=True ) line, = ax.plot( theta, r, color='#ee8d18', lw=3 ) @@ -102,7 +102,7 @@ def test_polar_coord_annotations(): from matplotlib.patches import Ellipse el = Ellipse((0,0), 10, 20, facecolor='r', alpha=0.5) - fig = pylab.figure() + fig = plt.figure() ax = fig.add_subplot( 111, aspect='equal' ) ax.add_artist( el ) @@ -134,7 +134,7 @@ def test_fill_units(): value = 10.0 * units.deg day = units.Duration( "ET", 24.0 * 60.0 * 60.0 ) - fig = pylab.figure() + fig = plt.figure() # Top-Left ax1 = fig.add_subplot( 221 ) @@ -166,12 +166,12 @@ def test_fill_units(): @image_comparison(baseline_images=['single_point']) def test_single_point(): - fig = pylab.figure() - pylab.subplot( 211 ) - pylab.plot( [0], [0], 'o' ) + fig = plt.figure() + plt.subplot( 211 ) + plt.plot( [0], [0], 'o' ) - pylab.subplot( 212 ) - pylab.plot( [1], [1], 'o' ) + plt.subplot( 212 ) + plt.plot( [1], [1], 'o' ) fig.savefig( 'single_point' ) @@ -180,12 +180,12 @@ def test_single_date(): time1=[ 721964.0 ] data1=[ -65.54 ] - fig = pylab.figure() - pylab.subplot( 211 ) - pylab.plot_date( time1, data1, 'o', color='r' ) + fig = plt.figure() + plt.subplot( 211 ) + plt.plot_date( time1, data1, 'o', color='r' ) - pylab.subplot( 212 ) - pylab.plot( time1, data1, 'o', color='r' ) + plt.subplot( 212 ) + plt.plot( time1, data1, 'o', color='r' ) fig.savefig( 'single_date' ) @@ -218,33 +218,33 @@ def test_shaped_data(): y2 = np.arange( 10 ) y2.shape = 10, 1 - fig = pylab.figure() - pylab.subplot( 411 ) - pylab.plot( y1 ) - pylab.subplot( 412 ) - pylab.plot( y2 ) + fig = plt.figure() + plt.subplot( 411 ) + plt.plot( y1 ) + plt.subplot( 412 ) + plt.plot( y2 ) - pylab.subplot( 413 ) + plt.subplot( 413 ) from nose.tools import assert_raises - assert_raises(ValueError,pylab.plot, (y1,y2)) + assert_raises(ValueError,plt.plot, (y1,y2)) - pylab.subplot( 414 ) - pylab.plot( xdata[:,1], xdata[1,:], 'o' ) + plt.subplot( 414 ) + plt.plot( xdata[:,1], xdata[1,:], 'o' ) fig.savefig( 'shaped data' ) @image_comparison(baseline_images=['const_xy']) def test_const_xy(): - fig = pylab.figure() + fig = plt.figure() - pylab.subplot( 311 ) - pylab.plot( np.arange(10), np.ones( (10,) ) ) + plt.subplot( 311 ) + plt.plot( np.arange(10), np.ones( (10,) ) ) - pylab.subplot( 312 ) - pylab.plot( np.ones( (10,) ), np.arange(10) ) + plt.subplot( 312 ) + plt.plot( np.ones( (10,) ), np.arange(10) ) - pylab.subplot( 313 ) - pylab.plot( np.ones( (10,) ), np.ones( (10,) ), 'o' ) + plt.subplot( 313 ) + plt.plot( np.ones( (10,) ), np.ones( (10,) ), 'o' ) fig.savefig( 'const_xy' ) @@ -254,24 +254,24 @@ def test_const_xy(): def test_polar_wrap(): D2R = np.pi / 180.0 - fig = pylab.figure() + fig = plt.figure() #NOTE: resolution=1 really should be the default - pylab.subplot( 111, polar=True, resolution=1 ) - pylab.polar( [179*D2R, -179*D2R], [0.2, 0.1], "b.-" ) - pylab.polar( [179*D2R, 181*D2R], [0.2, 0.1], "g.-" ) - pylab.rgrids( [0.05, 0.1, 0.15, 0.2, 0.25, 0.3] ) + plt.subplot( 111, polar=True, resolution=1 ) + plt.polar( [179*D2R, -179*D2R], [0.2, 0.1], "b.-" ) + plt.polar( [179*D2R, 181*D2R], [0.2, 0.1], "g.-" ) + plt.rgrids( [0.05, 0.1, 0.15, 0.2, 0.25, 0.3] ) fig.savefig( 'polar_wrap_180' ) - fig = pylab.figure() + fig = plt.figure() #NOTE: resolution=1 really should be the default - pylab.subplot( 111, polar=True, resolution=1 ) - pylab.polar( [2*D2R, -2*D2R], [0.2, 0.1], "b.-" ) - pylab.polar( [2*D2R, 358*D2R], [0.2, 0.1], "g.-" ) - pylab.polar( [358*D2R, 2*D2R], [0.2, 0.1], "r.-" ) - pylab.rgrids( [0.05, 0.1, 0.15, 0.2, 0.25, 0.3] ) + plt.subplot( 111, polar=True, resolution=1 ) + plt.polar( [2*D2R, -2*D2R], [0.2, 0.1], "b.-" ) + plt.polar( [2*D2R, 358*D2R], [0.2, 0.1], "g.-" ) + plt.polar( [358*D2R, 2*D2R], [0.2, 0.1], "r.-" ) + plt.rgrids( [0.05, 0.1, 0.15, 0.2, 0.25, 0.3] ) fig.savefig( 'polar_wrap_360' ) @@ -289,9 +289,9 @@ def test_polar_units(): y1 = [ 1.0, 2.0, 3.0, 4.0] y2 = [ 4.0, 3.0, 2.0, 1.0 ] - fig = pylab.figure() + fig = plt.figure() - pylab.polar( x2, y1, color = "blue" ) + plt.polar( x2, y1, color = "blue" ) # polar( x2, y1, color = "red", xunits="rad" ) # polar( x2, y2, color = "green" ) @@ -310,11 +310,11 @@ def test_axvspan_epoch(): dt = units.Duration( "ET", units.day.convert( "sec" ) ) - fig = pylab.figure() + fig = plt.figure() - pylab.axvspan( t0, tf, facecolor="blue", alpha=0.25 ) + plt.axvspan( t0, tf, facecolor="blue", alpha=0.25 ) - ax = pylab.gca() + ax = plt.gca() ax.set_xlim( t0 - 5.0*dt, tf + 5.0*dt ) fig.savefig( 'axvspan_epoch' ) @@ -331,11 +331,31 @@ def test_axhspan_epoch(): dt = units.Duration( "ET", units.day.convert( "sec" ) ) - fig = pylab.figure() + fig = plt.figure() - pylab.axhspan( t0, tf, facecolor="blue", alpha=0.25 ) + plt.axhspan( t0, tf, facecolor="blue", alpha=0.25 ) - ax = pylab.gca() + ax = plt.gca() ax.set_ylim( t0 - 5.0*dt, tf + 5.0*dt ) fig.savefig( 'axhspan_epoch' ) + + +@image_comparison(baseline_images=['hexbin_extent']) +def test_hexbin_extent(): + # this test exposes sf bug 2856228 + fig = plt.figure() + + ax = fig.add_subplot(111) + data = np.arange(2000.) + data.shape = 2, 1000 + x, y = data + + ax.hexbin(x, y, extent=[-.4, .4, -.4, .4]) + fig.savefig('hexbin_extent') + + + +if __name__=='__main__': + import nose + nose.runmodule(argv=['-s','--with-doctest'], exit=False) From 1e3eaac0488469c21bde85e86abac109206605b0 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Fri, 11 Sep 2009 01:33:40 +0000 Subject: [PATCH 0233/1000] choose different scaling and extent for hexbin test svn path=/trunk/matplotlib/; revision=7738 --- lib/matplotlib/tests/test_axes.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 31cf3a9e5d2c..5bc867e76069 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -347,11 +347,11 @@ def test_hexbin_extent(): fig = plt.figure() ax = fig.add_subplot(111) - data = np.arange(2000.) + data = np.arange(2000.)/2000. data.shape = 2, 1000 x, y = data - ax.hexbin(x, y, extent=[-.4, .4, -.4, .4]) + ax.hexbin(x, y, extent=[.1, .3, .6, .7]) fig.savefig('hexbin_extent') From b75c2f99919fcd209f828882386bd08c2b7fc2e8 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Fri, 11 Sep 2009 01:52:47 +0000 Subject: [PATCH 0234/1000] make test for sf bug 2856228 a knownfailure svn path=/trunk/matplotlib/; revision=7739 --- lib/matplotlib/tests/test_axes.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 5bc867e76069..2d912c2bd87a 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -341,7 +341,8 @@ def test_axhspan_epoch(): fig.savefig( 'axhspan_epoch' ) -@image_comparison(baseline_images=['hexbin_extent']) +#@image_comparison(baseline_images=['hexbin_extent']) +@knownfailureif(True) def test_hexbin_extent(): # this test exposes sf bug 2856228 fig = plt.figure() From 80250b71ddcea06efe8e3cad478bfd9a3268b0ea Mon Sep 17 00:00:00 2001 From: John Hunter Date: Fri, 11 Sep 2009 02:11:11 +0000 Subject: [PATCH 0235/1000] Merged revisions 7740-7741 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7740 | astraw | 2009-09-10 18:54:27 -0700 (Thu, 10 Sep 2009) | 2 lines bugfix: bounds checking in hexbin with extent specified (SF#2856228) ........ r7741 | jdh2358 | 2009-09-10 19:06:30 -0700 (Thu, 10 Sep 2009) | 1 line minor tweaks to licensing devel doc ........ svn path=/trunk/matplotlib/; revision=7742 --- doc/devel/coding_guide.rst | 139 +++++++++++++++++++------------------ doc/users/credits.rst | 13 +++- lib/matplotlib/axes.py | 16 +++-- 3 files changed, 94 insertions(+), 74 deletions(-) diff --git a/doc/devel/coding_guide.rst b/doc/devel/coding_guide.rst index 1cde77463135..83f8044700b5 100644 --- a/doc/devel/coding_guide.rst +++ b/doc/devel/coding_guide.rst @@ -604,73 +604,6 @@ object:: .. _license-discussion: -Licenses -======== - -Matplotlib only uses BSD compatible code. If you bring in code from -another project make sure it has a PSF, BSD, MIT or compatible license -(see the Open Source Initiative `licenses page -`_ for details on individual -licenses). If it doesn't, you may consider contacting the author and -asking them to relicense it. GPL and LGPL code are not acceptable in -the main code base, though we are considering an alternative way of -distributing L/GPL code through an separate channel, possibly a -toolkit. If you include code, make sure you include a copy of that -code's license in the license directory if the code's license requires -you to distribute the license with it. Non-BSD compatible licenses -are acceptable in matplotlib toolkits (eg basemap), but make sure you -clearly state the licenses you are using. - -Why BSD compatible? -------------------- - -The two dominant license variants in the wild are GPL-style and -BSD-style. There are countless other licenses that place specific -restrictions on code reuse, but there is an important different to be -considered in the GPL and BSD variants. The best known and perhaps -most widely used license is the GPL, which in addition to granting you -full rights to the source code including redistribution, carries with -it an extra obligation. If you use GPL code in your own code, or link -with it, your product must be released under a GPL compatible -license. I.e., you are required to give the source code to other -people and give them the right to redistribute it as well. Many of the -most famous and widely used open source projects are released under -the GPL, including sagemath, linux, gcc and emacs. - -The second major class are the BSD-style licenses (which includes MIT -and the python PSF license). These basically allow you to do whatever -you want with the code: ignore it, include it in your own open source -project, include it in your proprietary product, sell it, -whatever. python itself is released under a BSD compatible license, in -the sense that, quoting from the PSF license page:: - - There is no GPL-like "copyleft" restriction. Distributing - binary-only versions of Python, modified or not, is allowed. There - is no requirement to release any of your source code. You can also - write extension modules for Python and provide them only in binary - form. - -Famous projects released under a BSD-style license in the permissive -sense of the last paragraph are the BSD operating system, python and -TeX. - -There are two primary reasons why early matplotlib developers selected -a BSD compatible license. We wanted to attract as many users and -developers as possible, and many software companies will not use GPL code -in software they plan to distribute, even those that are highly -committed to open source development, such as `enthought -`_, out of legitimate concern that use of the -GPL will "infect" their code base by its viral nature. In effect, they -want to retain the right to release some proprietary code. Companies, -and institutions in general, who use matplotlib often make significant -contributions, since they have the resources to get a job done, even a -boring one, if they need it in their code. Two of the matplotlib -backends (FLTK and WX) were contributed by private companies. - -The other reason is licensing compatibility with the other python -extensions for scientific computing: ipython, numpy, scipy, the -enthought tool suite and python itself are all distributed under BSD -compatible licenses. Testing ======= @@ -784,3 +717,75 @@ Let's say you've added a new module named ``matplotlib.tests.test_whizbang_features``. To add this module to the list of default tests, append its name to ``default_test_modules`` in :file:`lib/matplotlib/__init__.py`. + +Licenses +======== + +Matplotlib only uses BSD compatible code. If you bring in code from +another project make sure it has a PSF, BSD, MIT or compatible license +(see the Open Source Initiative `licenses page +`_ for details on individual +licenses). If it doesn't, you may consider contacting the author and +asking them to relicense it. GPL and LGPL code are not acceptable in +the main code base, though we are considering an alternative way of +distributing L/GPL code through an separate channel, possibly a +toolkit. If you include code, make sure you include a copy of that +code's license in the license directory if the code's license requires +you to distribute the license with it. Non-BSD compatible licenses +are acceptable in matplotlib toolkits (eg basemap), but make sure you +clearly state the licenses you are using. + +Why BSD compatible? +------------------- + +The two dominant license variants in the wild are GPL-style and +BSD-style. There are countless other licenses that place specific +restrictions on code reuse, but there is an important difference to be +considered in the GPL and BSD variants. The best known and perhaps +most widely used license is the GPL, which in addition to granting you +full rights to the source code including redistribution, carries with +it an extra obligation. If you use GPL code in your own code, or link +with it, your product must be released under a GPL compatible +license. I.e., you are required to give the source code to other +people and give them the right to redistribute it as well. Many of the +most famous and widely used open source projects are released under +the GPL, including linux, gcc, emacs and sage. + +The second major class are the BSD-style licenses (which includes MIT +and the python PSF license). These basically allow you to do whatever +you want with the code: ignore it, include it in your own open source +project, include it in your proprietary product, sell it, +whatever. python itself is released under a BSD compatible license, in +the sense that, quoting from the PSF license page:: + + There is no GPL-like "copyleft" restriction. Distributing + binary-only versions of Python, modified or not, is allowed. There + is no requirement to release any of your source code. You can also + write extension modules for Python and provide them only in binary + form. + +Famous projects released under a BSD-style license in the permissive +sense of the last paragraph are the BSD operating system, python and +TeX. + +There are several reasons why early matplotlib developers selected a +BSD compatible license. matplotlib is a python extension, and we +choose a license that was based on the python license (BSD +compatible). Also, we wanted to attract as many users and developers +as possible, and many software companies will not use GPL code in +software they plan to distribute, even those that are highly committed +to open source development, such as `enthought +`_, out of legitimate concern that use of the +GPL will "infect" their code base by its viral nature. In effect, they +want to retain the right to release some proprietary code. Companies +and institutions who use matplotlib often make significant +contributions, because they have the resources to get a job done, even +a boring one. Two of the matplotlib backends (FLTK and WX) were +contributed by private companies. The final reason behind the +licensing choice is compatibility with the other python extensions for +scientific computing: ipython, numpy, scipy, the enthought tool suite +and python itself are all distributed under BSD compatible licenses. +The other reason is licensing compatibility with the other python +extensions for scientific computing: ipython, numpy, scipy, the +enthought tool suite and python itself are all distributed under BSD +compatible licenses. diff --git a/doc/users/credits.rst b/doc/users/credits.rst index 1edbc93401d4..8c9e1be4e33a 100644 --- a/doc/users/credits.rst +++ b/doc/users/credits.rst @@ -18,7 +18,11 @@ Jeremy O'Donoghue Andrew Straw provided much of the log scaling architecture, the fill command, PIL support for imshow, and provided many examples. He - also wrote the support for dropped axis spines. + also wrote the support for dropped axis spines and the `buildbot + `_ unit testing infrastructure + which triggers the JPL/James Evans platform specific builds and + regression test image comparisons from svn matplotlib across + platforms on svn commits. Charles Twardy provided the impetus code for the legend class and has made @@ -116,11 +120,14 @@ Jeffrey Whitaker at `NOAA `_ wrote the :ref:`toolkit_basemap` tookit -Sigve Tjoraand, Ted Drain +Sigve Tjoraand, Ted Drain, James Evans and colleagues at the `JPL `_ collaborated on the QtAgg backend and sponsored development of a number of features including custom unit types, datetime support, scale free - ellipses, broken bar plots and more. + ellipses, broken bar plots and more. The JPL team wrote the unit + testing image comparison `infrastructure + `_ + for regression test image comparisons. James Amundson did the initial work porting the qt backend to qt4 diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index 162ab2b2020a..76a181072f30 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -5587,9 +5587,13 @@ def hexbin(self, x, y, C = None, gridsize = 100, bins = None, for i in xrange(len(x)): if bdist[i]: - lattice1[ix1[i], iy1[i]]+=1 + if ((ix1[i] >= 0) and (ix1[i] < nx1) and + (iy1[i] >= 0) and (iy1[i] < ny1)): + lattice1[ix1[i], iy1[i]]+=1 else: - lattice2[ix2[i], iy2[i]]+=1 + if ((ix2[i] >= 0) and (ix2[i] < nx2) and + (iy2[i] >= 0) and (iy2[i] < ny2)): + lattice2[ix2[i], iy2[i]]+=1 # threshold if mincnt is not None: @@ -5621,9 +5625,13 @@ def hexbin(self, x, y, C = None, gridsize = 100, bins = None, for i in xrange(len(x)): if bdist[i]: - lattice1[ix1[i], iy1[i]].append( C[i] ) + if ((ix1[i] >= 0) and (ix1[i] < nx1) and + (iy1[i] >= 0) and (iy1[i] < ny1)): + lattice1[ix1[i], iy1[i]].append( C[i] ) else: - lattice2[ix2[i], iy2[i]].append( C[i] ) + if ((ix2[i] >= 0) and (ix2[i] < nx2) and + (iy2[i] >= 0) and (iy2[i] < ny2)): + lattice2[ix2[i], iy2[i]].append( C[i] ) for i in xrange(nx1): From 8a7bfd41c9c25bd6e290a252816b989f3422628e Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Fri, 11 Sep 2009 02:30:40 +0000 Subject: [PATCH 0236/1000] testing: add test image for hexbin_extent test, disable known failure svn path=/trunk/matplotlib/; revision=7743 --- .../baseline_images/test_axes/hexbin_extent.png | Bin 0 -> 32215 bytes lib/matplotlib/tests/test_axes.py | 7 +++---- 2 files changed, 3 insertions(+), 4 deletions(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/hexbin_extent.png diff --git a/lib/matplotlib/tests/baseline_images/test_axes/hexbin_extent.png b/lib/matplotlib/tests/baseline_images/test_axes/hexbin_extent.png new file mode 100644 index 0000000000000000000000000000000000000000..59008521f3f5af2fc2bdf143af861d7c8fd50463 GIT binary patch literal 32215 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 v(Cq<#fHd*9PKo~W@!@}O^8eGtUw0|mHXL; Date: Fri, 11 Sep 2009 20:58:27 +0000 Subject: [PATCH 0237/1000] Added a recs_join function to join a single column of multiple record arrays svn path=/trunk/matplotlib/; revision=7746 --- lib/matplotlib/cbook.py | 41 +++++++++++++++++++++++++++++++++++++++++ lib/matplotlib/mlab.py | 27 ++++++++++++++++++++++++++- 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index 165ae6b8388e..94ae109c029b 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -1626,6 +1626,47 @@ def quad2cubic(q0x, q0y, q1x, q1y, q2x, q2y): import matplotlib.mlab as mlab return mlab.quad2cubic(q0x, q0y, q1x, q1y, q2x, q2y) +def align_iterators(func, *iterables): + """ + This generator takes a bunch of iterables that are ordered by func + It sends out ordered tuples (func(row), [rows from all iterators matching func(row)]) + + It is used by mlab.recs_join to join record arrays + """ + class myiter: + def __init__(self, it): + self.it = it + self.key = self.value = None + self.iternext() + + def iternext(self): + try: + self.value = self.it.next() + self.key = func(self.value) + except StopIteration: + self.value = self.key = None + + def __call__(self, key): + retval = None + if key == self.key: + retval = self.value + self.iternext() + elif self.key and key > self.key: + raise ValueError, "Iterator has been left behind" + return retval + + # This can be made more efficient by not computing the minimum key for each iteration + iters = [myiter(it) for it in iterables] + minvals = minkey = True + while 1: + minvals = (filter(None, [it.key for it in iters])) + if minvals: + minkey = min(minvals) + yield (minkey, [it(minkey) for it in iters]) + else: + break + + if __name__=='__main__': assert( allequal([1,1,1]) ) diff --git a/lib/matplotlib/mlab.py b/lib/matplotlib/mlab.py index df70303e1e38..e15c8f8e7058 100644 --- a/lib/matplotlib/mlab.py +++ b/lib/matplotlib/mlab.py @@ -91,6 +91,9 @@ :meth:`rec_join` join two record arrays on sequence of fields +:meth:`recs_join` + a simple join of multiple recarrays using a single column as a key + :meth:`rec_groupby` summarize data by groups (similar to SQL GROUP BY) @@ -139,7 +142,7 @@ """ from __future__ import division -import csv, warnings, copy, os +import csv, warnings, copy, os, operator import numpy as np ma = np.ma @@ -1880,6 +1883,28 @@ def mapped_r2field(name): return newrec +def recs_join(key, name, recs,missing=0.): + """ + *key* is the column name that acts as a key + *name* is the name that we want to join + *missing" is what the missing fields are replaced by + *recarrays* is a list of record arrays to join + + returns a record array with columns [rowkey, name1, name2, ... namen] + + >>> r = recs_join("date", "close", recs=[r0, r1], missing=0.) + + """ + results = [] + def extract(r): + if r is None: return missing + else: return r[name] + + for rowkey, row in cbook.align_iterators(operator.attrgetter(key), *[iter(r) for r in recs]): + results.append([rowkey] + map(extract, row)) + names = ",".join([key] + ["%s%d" % (name, d) for d in range(len(recs))]) + return np.rec.fromrecords(results, names=names) + def csv2rec(fname, comments='#', skiprows=0, checkrows=0, delimiter=',', converterd=None, names=None, missing='', missingd=None, From e86e3255981f69338c23eb5a2f30221054399901 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Fri, 11 Sep 2009 21:02:27 +0000 Subject: [PATCH 0238/1000] some docstring cleanup on recs_join and align_iterators svn path=/trunk/matplotlib/; revision=7747 --- lib/matplotlib/cbook.py | 16 +++++++++------- lib/matplotlib/mlab.py | 23 +++++++++++++++++------ make.osx | 4 +--- 3 files changed, 27 insertions(+), 16 deletions(-) diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index 94ae109c029b..b4b33fb63448 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -390,7 +390,7 @@ def read_cache(self): for url, (fn, x, y) in cache.items(): if not os.path.isabs(fn): cache[url] = (self.in_cache_dir(fn), x, y) - + # If any files are deleted, drop them from the cache for url, (fn, _, _) in cache.items(): if not os.path.exists(fn): @@ -525,7 +525,7 @@ def get_sample_data(self, fname, asfileobj=True): msg = 'file %s not in cache; received %s when trying to retrieve' \ % (fname, error) raise KeyError(msg) - + fname = cached[0] if asfileobj: @@ -1627,11 +1627,13 @@ def quad2cubic(q0x, q0y, q1x, q1y, q2x, q2y): return mlab.quad2cubic(q0x, q0y, q1x, q1y, q2x, q2y) def align_iterators(func, *iterables): - """ - This generator takes a bunch of iterables that are ordered by func - It sends out ordered tuples (func(row), [rows from all iterators matching func(row)]) - - It is used by mlab.recs_join to join record arrays + """ + This generator takes a bunch of iterables that are ordered by func + It sends out ordered tuples: + + (func(row), [rows from all iterators matching func(row)]) + + It is used by :func:`matplotlib.mlab.recs_join` to join record arrays """ class myiter: def __init__(self, it): diff --git a/lib/matplotlib/mlab.py b/lib/matplotlib/mlab.py index e15c8f8e7058..0e1576726a10 100644 --- a/lib/matplotlib/mlab.py +++ b/lib/matplotlib/mlab.py @@ -1884,15 +1884,26 @@ def mapped_r2field(name): return newrec def recs_join(key, name, recs,missing=0.): - """ - *key* is the column name that acts as a key - *name* is the name that we want to join - *missing" is what the missing fields are replaced by - *recarrays* is a list of record arrays to join + """ + Join a sequence of record arrays on key + + *key* + is the column name that acts as a key + + *name* + is the name that we want to join + + *missing" + is what the missing fields are replaced by + + *recarrays* + is a list of record arrays to join returns a record array with columns [rowkey, name1, name2, ... namen] - >>> r = recs_join("date", "close", recs=[r0, r1], missing=0.) + Example:: + + r = recs_join("date", "close", recs=[r0, r1], missing=0.) """ results = [] diff --git a/make.osx b/make.osx index 1485a137fb11..1b45ce8c7ca0 100644 --- a/make.osx +++ b/make.osx @@ -61,7 +61,7 @@ freetype: zlib cd freetype-${FREETYPEVERSION} &&\ export MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} &&\ export CFLAGS=${CFLAGS_DEPS} &&\ - export LDFLAGS=${LDFLAGS_DEPS} &&\ + export LDFLAGS=${LDFLAGS_DEPS} &&\python/svn/bison/scripts/ ./configure --prefix=${PREFIX} &&\ make -j3 install &&\ cp objs/.libs/libfreetype.a . &&\ @@ -76,8 +76,6 @@ mpl_build: export MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} &&\ export CFLAGS=${CFLAGS_DEPS} &&\ export LDFLAGS=${LDFLAGS_DEPS} &&\ - export LD_LIBRARY_PATH=${PREFIX}/lib &&\ - export DYLD_LIBRARY_PATH=${PREFIX}/lib &&\ python setup.py build mpl_install: From cbcc627f167d6172e3742899f3d308ae8f42ebdd Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Fri, 11 Sep 2009 21:04:33 +0000 Subject: [PATCH 0239/1000] Merged revisions 7745 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7745 | efiring | 2009-09-11 10:48:10 -1000 (Fri, 11 Sep 2009) | 2 lines Fix bug in quiver angle kwarg, found when input angle array is not 1-D ........ svn path=/trunk/matplotlib/; revision=7748 --- lib/matplotlib/quiver.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/matplotlib/quiver.py b/lib/matplotlib/quiver.py index 945b2d0b83cb..c309c0415da2 100644 --- a/lib/matplotlib/quiver.py +++ b/lib/matplotlib/quiver.py @@ -512,6 +512,7 @@ def _make_verts(self, U, V): theta = np.angle(uv) else: theta = ma.masked_invalid(self.angles, copy=False).filled(0) + theta = theta.ravel() theta *= (np.pi/180.0) theta.shape = (theta.shape[0], 1) # for broadcasting xy = (X+Y*1j) * np.exp(1j*theta)*self.width From 4e2e1f9ea241fe8ecc89368c35ea821cf1776b3d Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Sun, 13 Sep 2009 05:42:01 +0000 Subject: [PATCH 0240/1000] delete doc/mpl_toolkits/axes_grid/figures svn path=/trunk/matplotlib/; revision=7752 --- doc/mpl_toolkits/axes_grid/figures | 1 - 1 file changed, 1 deletion(-) delete mode 120000 doc/mpl_toolkits/axes_grid/figures diff --git a/doc/mpl_toolkits/axes_grid/figures b/doc/mpl_toolkits/axes_grid/figures deleted file mode 120000 index 69ba136bcc62..000000000000 --- a/doc/mpl_toolkits/axes_grid/figures +++ /dev/null @@ -1 +0,0 @@ -../../../examples/axes_grid/ \ No newline at end of file From a0aa9a86388a860f7d7ea82bf5880e051f6d70e2 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Sun, 13 Sep 2009 05:44:21 +0000 Subject: [PATCH 0241/1000] AxesGrid: add modified version of colorbar svn path=/trunk/matplotlib/; revision=7753 --- CHANGELOG | 3 + .../figures/demo_colorbar_of_inset_axes.py | 49 ++ .../demo_colorbar_with_axes_divider.py | 25 + .../demo_colorbar_with_inset_locator.py | 40 + .../axes_grid/figures/demo_new_colorbar.py | 21 + doc/mpl_toolkits/axes_grid/index.rst | 5 +- .../axes_grid/users/axes_divider.rst | 4 +- .../axes_grid/users/axislines.rst | 4 +- doc/mpl_toolkits/axes_grid/users/overview.rst | 30 +- examples/axes_grid/demo_axes_grid.py | 2 +- examples/axes_grid/demo_axes_grid2.py | 124 +++ .../demo_colorbar_with_inset_locator.py | 44 + lib/mpl_toolkits/axes_grid/axes_divider.py | 25 + lib/mpl_toolkits/axes_grid/axes_grid.py | 26 +- lib/mpl_toolkits/axes_grid/colorbar.py | 816 ++++++++++++++++++ 15 files changed, 1192 insertions(+), 26 deletions(-) create mode 100644 doc/mpl_toolkits/axes_grid/figures/demo_colorbar_of_inset_axes.py create mode 100644 doc/mpl_toolkits/axes_grid/figures/demo_colorbar_with_axes_divider.py create mode 100644 doc/mpl_toolkits/axes_grid/figures/demo_colorbar_with_inset_locator.py create mode 100644 doc/mpl_toolkits/axes_grid/figures/demo_new_colorbar.py create mode 100644 examples/axes_grid/demo_axes_grid2.py create mode 100644 examples/axes_grid/demo_colorbar_with_inset_locator.py create mode 100644 lib/mpl_toolkits/axes_grid/colorbar.py diff --git a/CHANGELOG b/CHANGELOG index a98b596bc463..8631d09c7197 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2009-09-13 AxesGrid : add modified version of colorbar. Add colorbar + location howto. - JJL + 2009-09-07 AxesGrid : implemented axisline style. Added a demo examples/axes_grid/demo_axisline_style.py- JJL diff --git a/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_of_inset_axes.py b/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_of_inset_axes.py new file mode 100644 index 000000000000..e4e708c6685a --- /dev/null +++ b/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_of_inset_axes.py @@ -0,0 +1,49 @@ +import matplotlib.pyplot as plt + +from mpl_toolkits.axes_grid.inset_locator import inset_axes, zoomed_inset_axes +from mpl_toolkits.axes_grid.colorbar import colorbar + +def get_demo_image(): + from matplotlib.cbook import get_sample_data + import numpy as np + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) + + +fig = plt.figure(1, [5,4]) +ax = fig.add_subplot(111) + +Z, extent = get_demo_image() + +ax.set(aspect=1, + xlim=(-15, 15), + ylim=(-20, 5)) + + +axins = zoomed_inset_axes(ax, 2, loc=2) # zoom = 6 +im = axins.imshow(Z, extent=extent, interpolation="nearest", + origin="lower") + +plt.xticks(visible=False) +plt.yticks(visible=False) + + +# colorbar +cax = inset_axes(axins, + width="5%", # width = 10% of parent_bbox width + height="100%", # height : 50% + loc=3, + bbox_to_anchor=(1.05, 0., 1, 1), + bbox_transform=axins.transAxes, + borderpad=0, + ) + + +colorbar(im, cax=cax) #, ticks=[1,2,3]) + + +plt.draw() +plt.show() + diff --git a/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_with_axes_divider.py b/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_with_axes_divider.py new file mode 100644 index 000000000000..3816f013fbdf --- /dev/null +++ b/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_with_axes_divider.py @@ -0,0 +1,25 @@ +import matplotlib.pyplot as plt +from mpl_toolkits.axes_grid.axes_divider import make_axes_locatable + +from mpl_toolkits.axes_grid.colorbar import colorbar +# from matplotlib.pyplot import colorbar + +fig = plt.figure(1, figsize=(6, 3)) +fig.subplots_adjust(wspace=0.5) + +ax1 = fig.add_subplot(121) +im1 = ax1.imshow([[1,2],[3,4]]) + +ax1_divider = make_axes_locatable(ax1) +cax1 = ax1_divider.append_axes("right", size="7%", pad="2%") +cb1 = colorbar(im1, cax=cax1) + +ax2 = fig.add_subplot(122) +im2 = ax2.imshow([[1,2],[3,4]]) + +ax2_divider = make_axes_locatable(ax2) +cax2 = ax2_divider.append_axes("top", size="7%", pad="2%") +cb2 = colorbar(im2, cax=cax2, orientation="horizontal") +cax2.xaxis.set_ticks_position("top") +plt.show() + diff --git a/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_with_inset_locator.py b/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_with_inset_locator.py new file mode 100644 index 000000000000..84db20e5acd5 --- /dev/null +++ b/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_with_inset_locator.py @@ -0,0 +1,40 @@ +import matplotlib.pyplot as plt + +from mpl_toolkits.axes_grid.inset_locator import inset_axes +from mpl_toolkits.axes_grid.colorbar import colorbar + +fig = plt.figure(1, [6, 3]) + +# first subplot +ax1 = fig.add_subplot(121) + +axins1 = inset_axes(ax1, + width="50%", # width = 10% of parent_bbox width + height="5%", # height : 50% + loc=1) + +im1=ax1.imshow([[1,2],[2, 3]]) +colorbar(im1, cax=axins1, orientation="horizontal", ticks=[1,2,3]) +axins1.xaxis.set_ticks_position("bottom") + +# first subplot +ax = fig.add_subplot(122) + +axins = inset_axes(ax, + width="5%", # width = 10% of parent_bbox width + height="50%", # height : 50% + loc=3, + bbox_to_anchor=(1.05, 0., 1, 1), + bbox_transform=ax.transAxes, + borderpad=0, + ) + +# Controlling the placement of the inset axes is basically same as that +# of the legend. you may want to play with the borderpad value and +# the bbox_to_anchor coordinate. + +im=ax.imshow([[1,2],[2, 3]]) +colorbar(im, cax=axins, ticks=[1,2,3]) + +plt.draw() +plt.show() diff --git a/doc/mpl_toolkits/axes_grid/figures/demo_new_colorbar.py b/doc/mpl_toolkits/axes_grid/figures/demo_new_colorbar.py new file mode 100644 index 000000000000..88a722ee2241 --- /dev/null +++ b/doc/mpl_toolkits/axes_grid/figures/demo_new_colorbar.py @@ -0,0 +1,21 @@ +import matplotlib.pyplot as plt + +plt.rcParams["text.usetex"]=False + +fig = plt.figure(1, figsize=(6, 3)) + +ax1 = fig.add_subplot(121) +im1 = ax1.imshow([[1,2],[3,4]]) +cb1 = plt.colorbar(im1) +cb1.ax.set_yticks([1, 3]) +ax1.set_title("Original MPL's colorbar w/\nset_yticks([1,3])", size=10) + +from mpl_toolkits.axes_grid.colorbar import colorbar +ax2 = fig.add_subplot(122) +im2 = ax2.imshow([[1,2],[3,4]]) +cb2 = colorbar(im2) +cb2.ax.set_yticks([1, 3]) +ax2.set_title("AxesGrid's colorbar w/\nset_yticks([1,3])", size=10) + +plt.show() + diff --git a/doc/mpl_toolkits/axes_grid/index.rst b/doc/mpl_toolkits/axes_grid/index.rst index b74b738325c6..d85f34a79915 100644 --- a/doc/mpl_toolkits/axes_grid/index.rst +++ b/doc/mpl_toolkits/axes_grid/index.rst @@ -8,9 +8,11 @@ The matplotlib AxesGrid toolkit is a collection of helper classes to ease displaying multiple images in matplotlib. While the aspect parameter in matplotlib adjust the position of the single axes, AxesGrid toolkit provides a framework to adjust the position of -multiple axes according to their aspects. +multiple axes according to their aspects. +.. image:: ../../_static/demo_axes_grid.png + Documentation ============= @@ -19,4 +21,5 @@ Documentation :maxdepth: 2 users/index.rst + howtos/index.rst api/index.rst diff --git a/doc/mpl_toolkits/axes_grid/users/axes_divider.rst b/doc/mpl_toolkits/axes_grid/users/axes_divider.rst index 50d01827ad71..53e7dcd59172 100644 --- a/doc/mpl_toolkits/axes_grid/users/axes_divider.rst +++ b/doc/mpl_toolkits/axes_grid/users/axes_divider.rst @@ -81,12 +81,12 @@ may consider it as [0:2, 1]. See the example, -.. plot:: mpl_toolkits/axes_grid/figures/simple_axes_divider2.py +.. plot:: mpl_toolkits/axes_grid/examples/simple_axes_divider2.py :include-source: You can adjust the size of the each axes accroding to their x or y data limits (AxesX and AxesY), similar to the axes aspect parameter. -.. plot:: mpl_toolkits/axes_grid/figures/simple_axes_divider3.py +.. plot:: mpl_toolkits/axes_grid/examples/simple_axes_divider3.py :include-source: diff --git a/doc/mpl_toolkits/axes_grid/users/axislines.rst b/doc/mpl_toolkits/axes_grid/users/axislines.rst index 1a882e8c649b..d1137a5620f7 100644 --- a/doc/mpl_toolkits/axes_grid/users/axislines.rst +++ b/doc/mpl_toolkits/axes_grid/users/axislines.rst @@ -29,7 +29,7 @@ In summary, all these changes was to support * a curvelinear grid. * a floating axis -.. plot:: mpl_toolkits/axes_grid/figures/demo_floating_axis.py +.. plot:: mpl_toolkits/axes_grid/examples/demo_floating_axis.py *axes_grid.axislines.Axes* defines a *axis* attribute, which is a @@ -211,7 +211,7 @@ coordinates, or you may use Parasite Axes for convenience.:: ax1.parasites.append(ax2) -.. plot:: mpl_toolkits/axes_grid/figures/demo_curvelinear_grid.py +.. plot:: mpl_toolkits/axes_grid/examples/demo_curvelinear_grid.py diff --git a/doc/mpl_toolkits/axes_grid/users/overview.rst b/doc/mpl_toolkits/axes_grid/users/overview.rst index 62c329896b5e..1b99622499cd 100644 --- a/doc/mpl_toolkits/axes_grid/users/overview.rst +++ b/doc/mpl_toolkits/axes_grid/users/overview.rst @@ -35,7 +35,7 @@ ratio. For example, displaying images of a same size with some fixed padding between them cannot be easily done in matplotlib. AxesGrid is used in such case. -.. plot:: mpl_toolkits/axes_grid/figures/simple_axesgrid.py +.. plot:: mpl_examples/axes_grid/simple_axesgrid.py :include-source: * The postion of each axes is determined at the drawing time (see @@ -49,7 +49,7 @@ used in such case. height. The widths (height) of the axes in the same row (column) are scaled according to their view limits (xlim or ylim). - .. plot:: mpl_toolkits/axes_grid/figures/simple_axesgrid2.py + .. plot:: mpl_toolkits/axes_grid/examples/simple_axesgrid2.py :include-source: * xaxis are shared among axes in a same column. Similarly, yaxis are @@ -137,7 +137,7 @@ attribute. The examples below show what you can do with AxesGrid. -.. plot:: mpl_toolkits/axes_grid/figures/demo_axes_grid.py +.. plot:: mpl_toolkits/axes_grid/examples/demo_axes_grid.py RGB Axes @@ -158,7 +158,7 @@ yaxis of each axes are shared. :: origin="lower", interpolation="nearest") -.. plot:: mpl_toolkits/axes_grid/figures/simple_rgb.py +.. plot:: mpl_toolkits/axes_grid/examples/simple_rgb.py @@ -219,7 +219,7 @@ The "scatter_hist.py" example in mpl can be rewritten using See the full source code below. -.. plot:: mpl_toolkits/axes_grid/figures/scatter_hist.py +.. plot:: mpl_toolkits/axes_grid/examples/scatter_hist.py The scatter_hist using the AxesDivider has some advantage over the @@ -246,7 +246,7 @@ axes. Example 1. twinx ---------------- -.. plot:: mpl_toolkits/axes_grid/figures/parasite_simple.py +.. plot:: mpl_toolkits/axes_grid/examples/parasite_simple.py :include-source: Example 2. twin @@ -257,7 +257,7 @@ x-limit in the host axes, the x-limit of the parasite axes will change accordingly. -.. plot:: mpl_toolkits/axes_grid/figures/parasite_simple2.py +.. plot:: mpl_toolkits/axes_grid/examples/parasite_simple2.py @@ -290,13 +290,13 @@ For example, you can hide right, and top axis by :: ax.axis["top"].set_visible(False) -.. plot:: mpl_toolkits/axes_grid/figures/simple_axisline3.py +.. plot:: mpl_toolkits/axes_grid/examples/simple_axisline3.py SubplotZero gives you two more additional (floating?) axis of x=0 and y=0 (in data coordinate) -.. plot:: mpl_toolkits/axes_grid/figures/simple_axisline2.py +.. plot:: mpl_toolkits/axes_grid/examples/simple_axisline2.py :include-source: @@ -315,7 +315,7 @@ axis. :: r"$\pi$", r"$\frac{3}{2}\pi$", r"$2\pi$"]) -.. plot:: mpl_toolkits/axes_grid/figures/simple_axisline4.py +.. plot:: mpl_toolkits/axes_grid/examples/simple_axisline4.py AxisLine Axes lets you create a custom axis, :: @@ -330,7 +330,7 @@ AxisLine Axes lets you create a custom axis, :: And, you can use it with parasiteAxes. -.. plot:: mpl_toolkits/axes_grid/figures/demo_parasite_axes2.py +.. plot:: mpl_toolkits/axes_grid/examples/demo_parasite_axes2.py AnchoredArtists @@ -343,7 +343,7 @@ limited support for an arbitrary transform. For example, the ellipse in the example below will have width and height in the data coordinate. -.. plot:: mpl_toolkits/axes_grid/figures/simple_anchored_artists.py +.. plot:: mpl_toolkits/axes_grid/examples/simple_anchored_artists.py :include-source: @@ -377,7 +377,7 @@ some factor. For example, :: creates an inset axes whose data scale is half of the parent axes. Here is complete examples. -.. plot:: mpl_toolkits/axes_grid/figures/inset_locator_demo.py +.. plot:: mpl_toolkits/axes_grid/examples/inset_locator_demo.py For example, :func:`zoomed_inset_axes` can be used when you want the inset represents the zoom-up of the small portion in the parent axes. @@ -385,7 +385,7 @@ And :mod:`~mpl_toolkits/axes_grid/inset_locator` provides a helper function :func:`mark_inset` to mark the location of the area represented by the inset axes. -.. plot:: mpl_toolkits/axes_grid/figures/inset_locator_demo2.py +.. plot:: mpl_toolkits/axes_grid/examples/inset_locator_demo2.py :include-source: @@ -395,6 +395,6 @@ Curvelinear Grid You can draw a cuvelinear grid and ticks. Also a floating axis can be created. See :ref:`axislines-manual` for more details. -.. plot:: mpl_toolkits/axes_grid/figures/demo_floating_axis.py +.. plot:: mpl_toolkits/axes_grid/examples/demo_floating_axis.py diff --git a/examples/axes_grid/demo_axes_grid.py b/examples/axes_grid/demo_axes_grid.py index f5c1187b0a7d..ab6d3cc3acf9 100644 --- a/examples/axes_grid/demo_axes_grid.py +++ b/examples/axes_grid/demo_axes_grid.py @@ -44,7 +44,7 @@ def demo_grid_with_single_cbar(fig): Z, extent = get_demo_image() for i in range(4): im = grid[i].imshow(Z, extent=extent, interpolation="nearest") - plt.colorbar(im, cax = grid.cbar_axes[0]) + #plt.colorbar(im, cax = grid.cbar_axes[0]) grid.cbar_axes[0].colorbar(im) # This affects all axes as share_all = True. diff --git a/examples/axes_grid/demo_axes_grid2.py b/examples/axes_grid/demo_axes_grid2.py new file mode 100644 index 000000000000..07933dcad5ac --- /dev/null +++ b/examples/axes_grid/demo_axes_grid2.py @@ -0,0 +1,124 @@ +import matplotlib.pyplot as plt +from mpl_toolkits.axes_grid import ImageGrid +import numpy as np + +def get_demo_image(): + from matplotlib.cbook import get_sample_data + f = get_sample_data("axes_grid/bivariate_normal.npy", asfileobj=False) + z = np.load(f) + # z is a numpy array of 15x15 + return z, (-3,4,-4,3) + + +def add_inner_title(ax, title, loc, size=None, **kwargs): + from matplotlib.offsetbox import AuxTransformBox, AnchoredOffsetbox + from matplotlib.font_manager import FontProperties + from matplotlib.patches import PathPatch + from matplotlib.textpath import TextPath + from matplotlib.transforms import IdentityTransform + if size is None: + size = FontProperties(size=plt.rcParams['legend.fontsize']) + text_path = TextPath((0, 0), title, size=10) + p1 = PathPatch(text_path, ec="w", lw=3, transform=IdentityTransform()) + p2 = PathPatch(text_path, ec="none", fc="k", transform=IdentityTransform()) + + offsetbox = AuxTransformBox(IdentityTransform()) + offsetbox.add_artist(p1) + offsetbox.add_artist(p2) + + ao = AnchoredOffsetbox(loc=loc, child=offsetbox, + pad=0., borderpad=0.5, + frameon=False, **kwargs) + ax.add_artist(ao) + + return ao + +if __name__ == "__main__": + F = plt.figure(1, (6, 6)) + F.clf() + + # prepare images + Z, extent = get_demo_image() + ZS = [Z[i::3,:] for i in range(3)] + extent = extent[0], extent[1]/3., extent[2], extent[3] + + # demo 1 : colorbar at each axes + + grid = ImageGrid(F, 211, # similar to subplot(111) + nrows_ncols = (1, 3), + direction="row", + axes_pad = 0.05, + add_all=True, + label_mode = "1", + share_all = True, + cbar_location="top", + cbar_mode="each", + cbar_size="7%", + cbar_pad="1%", + ) + + + for ax, z in zip(grid, ZS): + im = ax.imshow(z, origin="lower", extent=extent, interpolation="nearest") + ax.cax.colorbar(im) + + for ax, im_title in zip(grid, ["Image 1", "Image 2", "Image 3"]): + t = add_inner_title(ax, im_title, loc=3) + t.patch.set_alpha(0.5) + + for ax, z in zip(grid, ZS): + ax.cax.toggle_label(True) + axis = ax.cax.axis[ax.cax.orientation] + axis.label.set_text("counts s$^{-1}$") + axis.label.set_size(10) + axis.major_ticklabels.set_size(6) + + # changing the colorbar ticks + grid[1].cax.set_xticks([-1, 0, 1]) + grid[2].cax.set_xticks([-1, 0, 1]) + + grid[0].set_xticks([-2, 0]) + grid[0].set_yticks([-2, 0, 2]) + + + # demo 2 : shared colorbar + + grid2 = ImageGrid(F, 212, + nrows_ncols = (1, 3), + direction="row", + axes_pad = 0.05, + add_all=True, + label_mode = "1", + share_all = True, + cbar_location="right", + cbar_mode="single", + cbar_size="10%", + cbar_pad=0.05, + ) + + grid2[0].set_xlabel("X") + grid2[0].set_ylabel("Y") + + vmax, vmin = np.max(ZS), np.min(ZS) + import matplotlib.colors + norm = matplotlib.colors.normalize(vmax=vmax, vmin=vmin) + + for ax, z in zip(grid2, ZS): + im = ax.imshow(z, norm=norm, + origin="lower", extent=extent, + interpolation="nearest") + + # With cbar_mode="single", cax attribute of all axes are identical. + ax.cax.colorbar(im) + ax.cax.toggle_label(True) + + for ax, im_title in zip(grid2, ["(a)", "(b)", "(c)"]): + t = add_inner_title(ax, im_title, loc=2) + t.patch.set_ec("none") + t.patch.set_alpha(0.5) + + grid2[0].set_xticks([-2, 0]) + grid2[0].set_yticks([-2, 0, 2]) + + plt.draw() + plt.show() diff --git a/examples/axes_grid/demo_colorbar_with_inset_locator.py b/examples/axes_grid/demo_colorbar_with_inset_locator.py new file mode 100644 index 000000000000..12cf2cc06622 --- /dev/null +++ b/examples/axes_grid/demo_colorbar_with_inset_locator.py @@ -0,0 +1,44 @@ +import matplotlib.pyplot as plt + +from mpl_toolkits.axes_grid.inset_locator import inset_axes +#from mpl_toolkits.axes_grid.colorbar import colorbar + +fig = plt.figure(1, [6, 3]) + +# first subplot +ax1 = fig.add_subplot(121) + +axins1 = inset_axes(ax1, + width="50%", # width = 10% of parent_bbox width + height="5%", # height : 50% + loc=1) + +locator1=axins1.get_axes_locator() + +im1=ax1.imshow([[1,2],[2, 3]]) +colorbar(im1, cax=axins1, orientation="horizontal", ticks=[1,2,3]) +axins1.xaxis.set_ticks_position("bottom") + +# first subplot +ax = fig.add_subplot(122) + +axins = inset_axes(ax, + width="5%", # width = 10% of parent_bbox width + height="50%", # height : 50% + loc=3, + bbox_to_anchor=(1.05, 0., 1, 1), + bbox_transform=ax.transAxes, + borderpad=0, + ) + + +locator=axins.get_axes_locator() +# Controlling the placement of the inset axes is basically same as that +# of the legend. you may want to play with the borderpad value and +# the bbox_to_anchor coordinate. + +im=ax.imshow([[1,2],[2, 3]]) +colorbar(im, cax=axins) + +plt.draw() +plt.show() diff --git a/lib/mpl_toolkits/axes_grid/axes_divider.py b/lib/mpl_toolkits/axes_grid/axes_divider.py index 5847e97458d5..cabd1f182297 100644 --- a/lib/mpl_toolkits/axes_grid/axes_divider.py +++ b/lib/mpl_toolkits/axes_grid/axes_divider.py @@ -502,6 +502,31 @@ def new_vertical(self, size, pad=None, pack_start=False, **kwargs): return ax + def append_axes(self, position, size, pad=None, **kwargs): + """ + create an axes at the given *position* with the same height + (or width) of the main axes. + + *position* + ["left"|"right"|"bottom"|"top"] + + *size* and *pad* should be axes_grid.axes_size compatible. + """ + + if position == "left": + ax = self.new_horizontal(size, pad, pack_start=True, **kwargs) + elif position == "right": + ax = self.new_horizontal(size, pad, pack_start=False, **kwargs) + elif position == "bottom": + ax = self.new_vertical(size, pad, pack_start=True, **kwargs) + elif position == "top": + ax = self.new_vertical(size, pad, pack_start=False, **kwargs) + else: + raise ValueError("the position must be one of left, right, bottom, or top") + + self._fig.add_axes(ax) + return ax + def get_aspect(self): if self._aspect is None: aspect = self._axes.get_aspect() diff --git a/lib/mpl_toolkits/axes_grid/axes_grid.py b/lib/mpl_toolkits/axes_grid/axes_grid.py index 6f50196de398..7a1dbc7d9d01 100644 --- a/lib/mpl_toolkits/axes_grid/axes_grid.py +++ b/lib/mpl_toolkits/axes_grid/axes_grid.py @@ -2,7 +2,8 @@ import matplotlib.pyplot as plt import matplotlib.axes as maxes -import matplotlib.colorbar as mcolorbar +#import matplotlib.colorbar as mcolorbar +import colorbar as mcolorbar import matplotlib as mpl import matplotlib.patches as mpatches import matplotlib.lines as mlines @@ -10,7 +11,7 @@ from axes_divider import Size, SubplotDivider, LocatableAxes, Divider - +import numpy as np def _tick_only(ax, bottom_on, left_on): bottom_off = not bottom_on @@ -28,7 +29,7 @@ def _tick_only(ax, bottom_on, left_on): ax.axis["left"].label.set_visible(left_off) class Colorbar(mcolorbar.Colorbar): - def _config_axes(self, X, Y): + def _config_axes_deprecated(self, X, Y): ''' Make an axes patch and outline. ''' @@ -431,6 +432,7 @@ def __init__(self, fig, cbar_location="right", cbar_pad=None, cbar_size="5%", + cbar_set_cax=True, axes_class=None, ): """ @@ -456,9 +458,13 @@ def __init__(self, fig, cbar_location "right" [ "right" | "top" ] cbar_pad None cbar_size "5%" + cbar_set_cax True [ True | False ] axes_class None a type object which must be a subclass of :class:`~matplotlib.axes.Axes` ================ ======== ========================================= + + *cbar_set_cax* : if True, each axes in the grid has a cax + attribute that is bind to associated cbar_axes. """ self._nrows, self._ncols = nrows_ncols @@ -568,6 +574,14 @@ def __init__(self, fig, for ax in self.axes_all+self.cbar_axes: fig.add_axes(ax) + if cbar_set_cax: + if self._colorbar_mode == "single": + for ax in self.axes_all: + ax.cax = self.cbar_axes[0] + else: + for ax, cax in zip(self.axes_all, self.cbar_axes): + ax.cax = cax + self.set_label_mode(label_mode) @@ -683,8 +697,8 @@ def _update_locators(self): -if __name__ == "__main__": -#if 0: +#if __name__ == "__main__": +if 0: from axes_divider import get_demo_image F = plt.figure(1, (9, 3.5)) F.clf() @@ -761,3 +775,5 @@ def _update_locators(self): plt.ion() plt.draw() + + diff --git a/lib/mpl_toolkits/axes_grid/colorbar.py b/lib/mpl_toolkits/axes_grid/colorbar.py new file mode 100644 index 000000000000..b1f06799c2d0 --- /dev/null +++ b/lib/mpl_toolkits/axes_grid/colorbar.py @@ -0,0 +1,816 @@ +''' +Colorbar toolkit with two classes and a function: + + :class:`ColorbarBase` + the base class with full colorbar drawing functionality. + It can be used as-is to make a colorbar for a given colormap; + a mappable object (e.g., image) is not needed. + + :class:`Colorbar` + the derived class for use with images or contour plots. + + :func:`make_axes` + a function for resizing an axes and adding a second axes + suitable for a colorbar + +The :meth:`~matplotlib.figure.Figure.colorbar` method uses :func:`make_axes` +and :class:`Colorbar`; the :func:`~matplotlib.pyplot.colorbar` function +is a thin wrapper over :meth:`~matplotlib.figure.Figure.colorbar`. + +''' + +import numpy as np +import matplotlib as mpl +import matplotlib.colors as colors +import matplotlib.cm as cm +from matplotlib import docstring +import matplotlib.ticker as ticker +import matplotlib.cbook as cbook +import matplotlib.collections as collections +import matplotlib.contour as contour +from matplotlib.path import Path +from matplotlib.patches import PathPatch +from matplotlib.transforms import Bbox + + +make_axes_kw_doc = ''' + + ============= ==================================================== + Property Description + ============= ==================================================== + *orientation* vertical or horizontal + *fraction* 0.15; fraction of original axes to use for colorbar + *pad* 0.05 if vertical, 0.15 if horizontal; fraction + of original axes between colorbar and new image axes + *shrink* 1.0; fraction by which to shrink the colorbar + *aspect* 20; ratio of long to short dimensions + ============= ==================================================== + +''' + +colormap_kw_doc = ''' + + =========== ==================================================== + Property Description + =========== ==================================================== + *extend* [ 'neither' | 'both' | 'min' | 'max' ] + If not 'neither', make pointed end(s) for out-of- + range values. These are set for a given colormap + using the colormap set_under and set_over methods. + *spacing* [ 'uniform' | 'proportional' ] + Uniform spacing gives each discrete color the same + space; proportional makes the space proportional to + the data interval. + *ticks* [ None | list of ticks | Locator object ] + If None, ticks are determined automatically from the + input. + *format* [ None | format string | Formatter object ] + If None, the + :class:`~matplotlib.ticker.ScalarFormatter` is used. + If a format string is given, e.g. '%.3f', that is + used. An alternative + :class:`~matplotlib.ticker.Formatter` object may be + given instead. + *drawedges* [ False | True ] If true, draw lines at color + boundaries. + =========== ==================================================== + + The following will probably be useful only in the context of + indexed colors (that is, when the mappable has norm=NoNorm()), + or other unusual circumstances. + + ============ =================================================== + Property Description + ============ =================================================== + *boundaries* None or a sequence + *values* None or a sequence which must be of length 1 less + than the sequence of *boundaries*. For each region + delimited by adjacent entries in *boundaries*, the + color mapped to the corresponding value in values + will be used. + ============ =================================================== + +''' + +colorbar_doc = ''' + +Add a colorbar to a plot. + +Function signatures for the :mod:`~matplotlib.pyplot` interface; all +but the first are also method signatures for the +:meth:`~matplotlib.figure.Figure.colorbar` method:: + + colorbar(**kwargs) + colorbar(mappable, **kwargs) + colorbar(mappable, cax=cax, **kwargs) + colorbar(mappable, ax=ax, **kwargs) + +arguments: + + *mappable* + the :class:`~matplotlib.image.Image`, + :class:`~matplotlib.contour.ContourSet`, etc. to + which the colorbar applies; this argument is mandatory for the + :meth:`~matplotlib.figure.Figure.colorbar` method but optional for the + :func:`~matplotlib.pyplot.colorbar` function, which sets the + default to the current image. + +keyword arguments: + + *cax* + None | axes object into which the colorbar will be drawn + *ax* + None | parent axes object from which space for a new + colorbar axes will be stolen + + +Additional keyword arguments are of two kinds: + + axes properties: +%s + colorbar properties: +%s + +If *mappable* is a :class:`~matplotlib.contours.ContourSet`, its *extend* +kwarg is included automatically. + +Note that the *shrink* kwarg provides a simple way to keep a vertical +colorbar, for example, from being taller than the axes of the mappable +to which the colorbar is attached; but it is a manual method requiring +some trial and error. If the colorbar is too tall (or a horizontal +colorbar is too wide) use a smaller value of *shrink*. + +For more precise control, you can manually specify the positions of +the axes objects in which the mappable and the colorbar are drawn. In +this case, do not use any of the axes properties kwargs. + +returns: + :class:`~matplotlib.colorbar.Colorbar` instance; see also its base class, + :class:`~matplotlib.colorbar.ColorbarBase`. Call the + :meth:`~matplotlib.colorbar.ColorbarBase.set_label` method + to label the colorbar. + + +The transData of the *cax* is adjusted so that the limits in the +longest axis actually corresponds to the limits in colorbar range. On +the other hand, the shortest axis has a data limits of [1,2], whose +unconventional value is to prevent underflow when log scale is used. +''' % (make_axes_kw_doc, colormap_kw_doc) + +docstring.interpd.update(colorbar_doc=colorbar_doc) + + +class CbarAxesLocator(object): + """ + CbarAxesLocator is a axes_locator for colobar axes. It adjust the + position of the axes to make a room for extended ends, i.e., the + extended ends are located outside the axes area. + """ + + def __init__(self, locator=None, extend="neither", orientation="vertical"): + """ + *locator* : the bbox returned from the locator is used as a + initial axes location. If None, axes.bbox is used. + + *extend* : same as in ColorbarBase + *orientation* : same as in ColorbarBase + + """ + self._locator = locator + self.extesion_fraction = 0.05 + self.extend = extend + self.orientation = orientation + + def get_original_position(self, axes, renderer): + """ + get the original position of the axes. + """ + if self._locator is None: + bbox = axes.get_position(original=True) + else: + bbox = self._locator(axes, renderer) + return bbox + + def get_end_vertices(self): + """ + return a tuple of two vertices for the colorbar extended ends. + The first vertives is for min. end, and the second is for + max. end. + """ + # Note that concatenating two vertices needs to make a + # vertices for the frame. + extesion_fraction = self.extesion_fraction + + corx = extesion_fraction*2. + cory = 1./(1. - corx) + x1, y1, w, h = 0, 0, 1, 1 + x2, y2 = x1 + w, y1 + h + dw, dh = w*extesion_fraction, h*extesion_fraction*cory + + if self.extend in ["min", "both"]: + bottom = [(x1, y1), + (x1+w/2., y1-dh), + (x2, y1)] + else: + bottom = [(x1, y1), + (x2, y1)] + + if self.extend in ["max", "both"]: + top = [(x2, y2), + (x1+w/2., y2+dh), + (x1, y2)] + else: + top = [(x2, y2), + (x1, y2)] + + if self.orientation == "horizontal": + bottom = [(y,x) for (x,y) in bottom] + top = [(y,x) for (x,y) in top] + + return bottom, top + + + def get_path_patch(self): + """ + get the path for axes patch + """ + end1, end2 = self.get_end_vertices() + + verts = [] + end1 + end2 + end1[:1] + + return Path(verts) + + + def get_path_ends(self): + """ + get the paths for extended ends + """ + + end1, end2 = self.get_end_vertices() + + return Path(end1), Path(end2) + + + def __call__(self, axes, renderer): + """ + Return the adjusted position of the axes + """ + bbox0 = self.get_original_position(axes, renderer) + bbox = bbox0 + + x1, y1, w, h = bbox.bounds + extesion_fraction = self.extesion_fraction + dw, dh = w*extesion_fraction, h*extesion_fraction + + if self.extend in ["min", "both"]: + if self.orientation == "horizontal": + x1 = x1 + dw + else: + y1 = y1+dh + + if self.extend in ["max", "both"]: + if self.orientation == "horizontal": + w = w-2*dw + else: + h = h-2*dh + + return Bbox.from_bounds(x1, y1, w, h) + + + +class ColorbarBase(cm.ScalarMappable): + ''' + Draw a colorbar in an existing axes. + + This is a base class for the :class:`Colorbar` class, which is the + basis for the :func:`~matplotlib.pyplot.colorbar` method and pylab + function. + + It is also useful by itself for showing a colormap. If the *cmap* + kwarg is given but *boundaries* and *values* are left as None, + then the colormap will be displayed on a 0-1 scale. To show the + under- and over-value colors, specify the *norm* as:: + + colors.Normalize(clip=False) + + To show the colors versus index instead of on the 0-1 scale, + use:: + + norm=colors.NoNorm. + + Useful attributes: + + :attr:`ax` + the Axes instance in which the colorbar is drawn + + :attr:`lines` + a LineCollection if lines were drawn, otherwise None + + :attr:`dividers` + a LineCollection if *drawedges* is True, otherwise None + + Useful public methods are :meth:`set_label` and :meth:`add_lines`. + + ''' + + def __init__(self, ax, cmap=None, + norm=None, + alpha=1.0, + values=None, + boundaries=None, + orientation='vertical', + extend='neither', + spacing='uniform', # uniform or proportional + ticks=None, + format=None, + drawedges=False, + filled=True, + ): + self.ax = ax + + if cmap is None: cmap = cm.get_cmap() + if norm is None: norm = colors.Normalize() + self.alpha = alpha + cm.ScalarMappable.__init__(self, cmap=cmap, norm=norm) + self.values = values + self.boundaries = boundaries + self.extend = extend + self.spacing = spacing + self.orientation = orientation + self.drawedges = drawedges + self.filled = filled + + # artists + self.solids = None + self.lines = None + self.dividers = None + self.extension_patch1 = None + self.extension_patch2 = None + + if orientation == "vertical": + self.cbar_axis = self.ax.yaxis + else: + self.cbar_axis = self.ax.xaxis + + + if format is None: + if isinstance(self.norm, colors.LogNorm): + # change both axis for proper aspect + self.ax.xaxis.set_scale("log") + self.ax.yaxis.set_scale("log") + self.ax._update_transScale() + self.cbar_axis.set_minor_locator(ticker.NullLocator()) + formatter = ticker.LogFormatter() + else: + formatter = None + elif cbook.is_string_like(format): + formatter = ticker.FormatStrFormatter(format) + else: + formatter = format # Assume it is a Formatter + + if formatter is None: + formatter = self.cbar_axis.get_major_formatter() + else: + self.cbar_axis.set_major_formatter(formatter) + + if cbook.iterable(ticks): + self.cbar_axis.set_ticks(ticks) + elif ticks is not None: + self.cbar_axis.set_major_locator(ticks) + else: + self._select_locator(formatter) + + + self._config_axes() + + self.update_artists() + + self.set_label_text('') + + + def _get_colorbar_limits(self): + """ + initial limits for colorbar range. The returne min, max values + will be used to create colorbar solid(?) and etc. + """ + if self.boundaries is not None: + C = self.boundaries + if self.extend in ["min", "both"]: + C = C[1:] + + if self.extend in ["max", "both"]: + C = C[:-1] + return min(C), max(C) + else: + return self.get_clim() + + + def _config_axes(self): + ''' + Adjust the properties of the axes to be adquate for colorbar display. + ''' + ax = self.ax + + axes_locator = CbarAxesLocator(ax.get_axes_locator(), + extend=self.extend, + orientation=self.orientation) + ax.set_axes_locator(axes_locator) + + # overide the get_data_ratio for the aspect works. + def _f(): + return 1. + ax.get_data_ratio = _f + ax.get_data_ratio_log = _f + + ax.set_frame_on(True) + ax.set_navigate(False) + + self.ax.set_autoscalex_on(False) + self.ax.set_autoscaley_on(False) + + if self.orientation == 'horizontal': + ax.xaxis.set_label_position('bottom') + ax.set_yticks([]) + else: + ax.set_xticks([]) + ax.yaxis.set_label_position('right') + ax.yaxis.set_ticks_position('right') + + + + def update_artists(self): + """ + Update the colorbar associated artists, *filled* and + *ends*. Note that *lines* are not updated. This needs to be + called whenever clim of associated image changes. + """ + self._process_values() + self._add_ends() + + X, Y = self._mesh() + if self.filled: + C = self._values[:,np.newaxis] + self._add_solids(X, Y, C) + + ax = self.ax + vmin, vmax = self._get_colorbar_limits() + if self.orientation == 'horizontal': + ax.set_ylim(1, 2) + ax.set_xlim(vmin, vmax) + else: + ax.set_xlim(1, 2) + ax.set_ylim(vmin, vmax) + + + def _add_ends(self): + """ + Create patches from extended ends and add them to the axes. + """ + + del self.extension_patch1 + del self.extension_patch2 + + path1, path2 = self.ax.get_axes_locator().get_path_ends() + fc=mpl.rcParams['axes.facecolor'] + ec=mpl.rcParams['axes.edgecolor'] + linewidths=0.5*mpl.rcParams['axes.linewidth'] + self.extension_patch1 = PathPatch(path1, + fc=fc, ec=ec, lw=linewidths, + zorder=2., + transform=self.ax.transAxes, + clip_on=False) + self.extension_patch2 = PathPatch(path2, + fc=fc, ec=ec, lw=linewidths, + zorder=2., + transform=self.ax.transAxes, + clip_on=False) + self.ax.add_artist(self.extension_patch1) + self.ax.add_artist(self.extension_patch2) + + + + def _set_label_text(self): + """ + set label. + """ + self.cbar_axis.set_label_text(self._label, **self._labelkw) + + def set_label_text(self, label, **kw): + ''' + Label the long axis of the colorbar + ''' + self._label = label + self._labelkw = kw + self._set_label_text() + + + def _edges(self, X, Y): + ''' + Return the separator line segments; helper for _add_solids. + ''' + N = X.shape[0] + # Using the non-array form of these line segments is much + # simpler than making them into arrays. + if self.orientation == 'vertical': + return [zip(X[i], Y[i]) for i in range(1, N-1)] + else: + return [zip(Y[i], X[i]) for i in range(1, N-1)] + + def _add_solids(self, X, Y, C): + ''' + Draw the colors using :meth:`~matplotlib.axes.Axes.pcolor`; + optionally add separators. + ''' + ## Change to pcolorfast after fixing bugs in some backends... + + if self.extend in ["min", "both"]: + cc = self.to_rgba([C[0][0]]) + self.extension_patch1.set_fc(cc[0]) + X, Y, C = X[1:], Y[1:], C[1:] + + if self.extend in ["max", "both"]: + cc = self.to_rgba([C[-1][0]]) + self.extension_patch2.set_fc(cc[0]) + X, Y, C = X[:-1], Y[:-1], C[:-1] + + if self.orientation == 'vertical': + args = (X, Y, C) + else: + args = (np.transpose(Y), np.transpose(X), np.transpose(C)) + kw = {'cmap':self.cmap, 'norm':self.norm, + 'shading':'flat', 'alpha':self.alpha, + } + + del self.solids + del self.dividers + + col = self.ax.pcolor(*args, **kw) + self.solids = col + if self.drawedges: + self.dividers = collections.LineCollection(self._edges(X,Y), + colors=(mpl.rcParams['axes.edgecolor'],), + linewidths=(0.5*mpl.rcParams['axes.linewidth'],), + ) + self.ax.add_collection(self.dividers) + else: + self.dividers = None + + def add_lines(self, levels, colors, linewidths): + ''' + Draw lines on the colorbar. It deletes preexting lines. + ''' + del self.lines + + N = len(levels) + x = np.array([1.0, 2.0]) + X, Y = np.meshgrid(x,levels) + if self.orientation == 'vertical': + xy = [zip(X[i], Y[i]) for i in range(N)] + else: + xy = [zip(Y[i], X[i]) for i in range(N)] + col = collections.LineCollection(xy, linewidths=linewidths, + ) + self.lines = col + col.set_color(colors) + self.ax.add_collection(col) + + + def _select_locator(self, formatter): + ''' + select a suitable locator + ''' + if self.boundaries is None: + if isinstance(self.norm, colors.NoNorm): + nv = len(self._values) + base = 1 + int(nv/10) + locator = ticker.IndexLocator(base=base, offset=0) + elif isinstance(self.norm, colors.BoundaryNorm): + b = self.norm.boundaries + locator = ticker.FixedLocator(b, nbins=10) + elif isinstance(self.norm, colors.LogNorm): + locator = ticker.LogLocator() + else: + locator = ticker.MaxNLocator(nbins=5) + else: + b = self._boundaries[self._inside] + locator = ticker.FixedLocator(b) #, nbins=10) + + self.cbar_axis.set_major_locator(locator) + + + def _process_values(self, b=None): + ''' + Set the :attr:`_boundaries` and :attr:`_values` attributes + based on the input boundaries and values. Input boundaries + can be *self.boundaries* or the argument *b*. + ''' + if b is None: + b = self.boundaries + if b is not None: + self._boundaries = np.asarray(b, dtype=float) + if self.values is None: + self._values = 0.5*(self._boundaries[:-1] + + self._boundaries[1:]) + if isinstance(self.norm, colors.NoNorm): + self._values = (self._values + 0.00001).astype(np.int16) + return + self._values = np.array(self.values) + return + if self.values is not None: + self._values = np.array(self.values) + if self.boundaries is None: + b = np.zeros(len(self.values)+1, 'd') + b[1:-1] = 0.5*(self._values[:-1] - self._values[1:]) + b[0] = 2.0*b[1] - b[2] + b[-1] = 2.0*b[-2] - b[-3] + self._boundaries = b + return + self._boundaries = np.array(self.boundaries) + return + # Neither boundaries nor values are specified; + # make reasonable ones based on cmap and norm. + if isinstance(self.norm, colors.NoNorm): + b = self._uniform_y(self.cmap.N+1) * self.cmap.N - 0.5 + v = np.zeros((len(b)-1,), dtype=np.int16) + v = np.arange(self.cmap.N, dtype=np.int16) + self._boundaries = b + self._values = v + return + elif isinstance(self.norm, colors.BoundaryNorm): + b = np.array(self.norm.boundaries) + v = np.zeros((len(b)-1,), dtype=float) + bi = self.norm.boundaries + v = 0.5*(bi[:-1] + bi[1:]) + self._boundaries = b + self._values = v + return + else: + b = self._uniform_y(self.cmap.N+1) + + self._process_values(b) + + + def _uniform_y(self, N): + ''' + Return colorbar data coordinates for *N* uniformly + spaced boundaries. + ''' + vmin, vmax = self._get_colorbar_limits() + if isinstance(self.norm, colors.LogNorm): + y = np.logspace(np.log10(vmin), np.log10(vmax), N) + else: + y = np.linspace(vmin, vmax, N) + return y + + def _mesh(self): + ''' + Return X,Y, the coordinate arrays for the colorbar pcolormesh. + These are suitable for a vertical colorbar; swapping and + transposition for a horizontal colorbar are done outside + this function. + ''' + x = np.array([1.0, 2.0]) + if self.spacing == 'uniform': + y = self._uniform_y(len(self._boundaries)) + else: + y = self._boundaries + self._y = y + + X, Y = np.meshgrid(x,y) + return X, Y + + + def set_alpha(self, alpha): + """ + set alpha value. + """ + self.alpha = alpha + + +class Colorbar(ColorbarBase): + def __init__(self, ax, mappable, **kw): + mappable.autoscale_None() # Ensure mappable.norm.vmin, vmax + # are set when colorbar is called, + # even if mappable.draw has not yet + # been called. This will not change + # vmin, vmax if they are already set. + self.mappable = mappable + kw['cmap'] = mappable.cmap + kw['norm'] = mappable.norm + kw['alpha'] = mappable.get_alpha() + if isinstance(mappable, contour.ContourSet): + CS = mappable + kw['boundaries'] = CS._levels + kw['values'] = CS.cvalues + kw['extend'] = CS.extend + #kw['ticks'] = CS._levels + kw.setdefault('ticks', ticker.FixedLocator(CS.levels, nbins=10)) + kw['filled'] = CS.filled + ColorbarBase.__init__(self, ax, **kw) + if not CS.filled: + self.add_lines(CS) + else: + ColorbarBase.__init__(self, ax, **kw) + + + def add_lines(self, CS): + ''' + Add the lines from a non-filled + :class:`~matplotlib.contour.ContourSet` to the colorbar. + ''' + if not isinstance(CS, contour.ContourSet) or CS.filled: + raise ValueError('add_lines is only for a ContourSet of lines') + tcolors = [c[0] for c in CS.tcolors] + tlinewidths = [t[0] for t in CS.tlinewidths] + # The following was an attempt to get the colorbar lines + # to follow subsequent changes in the contour lines, + # but more work is needed: specifically, a careful + # look at event sequences, and at how + # to make one object track another automatically. + #tcolors = [col.get_colors()[0] for col in CS.collections] + #tlinewidths = [col.get_linewidth()[0] for lw in CS.collections] + #print 'tlinewidths:', tlinewidths + ColorbarBase.add_lines(self, CS.levels, tcolors, tlinewidths) + + def update_bruteforce(self, mappable): + """ + Update the colorbar artists to reflect the change of the + assocaited mappable. + """ + self.update_artists() + + if isinstance(mappable, contour.ContourSet): + if not mappable.filled: + self.add_lines(mappable) + +@docstring.Substitution(make_axes_kw_doc) +def make_axes(parent, **kw): + ''' + Resize and reposition a parent axes, and return a child + axes suitable for a colorbar:: + + cax, kw = make_axes(parent, **kw) + + Keyword arguments may include the following (with defaults): + + *orientation* + 'vertical' or 'horizontal' + + %s + + All but the first of these are stripped from the input kw set. + + Returns (cax, kw), the child axes and the reduced kw dictionary. + ''' + orientation = kw.setdefault('orientation', 'vertical') + fraction = kw.pop('fraction', 0.15) + shrink = kw.pop('shrink', 1.0) + aspect = kw.pop('aspect', 20) + #pb = transforms.PBox(parent.get_position()) + pb = parent.get_position(original=True).frozen() + if orientation == 'vertical': + pad = kw.pop('pad', 0.05) + x1 = 1.0-fraction + pb1, pbx, pbcb = pb.splitx(x1-pad, x1) + pbcb = pbcb.shrunk(1.0, shrink).anchored('C', pbcb) + anchor = (0.0, 0.5) + panchor = (1.0, 0.5) + else: + pad = kw.pop('pad', 0.15) + pbcb, pbx, pb1 = pb.splity(fraction, fraction+pad) + pbcb = pbcb.shrunk(shrink, 1.0).anchored('C', pbcb) + aspect = 1.0/aspect + anchor = (0.5, 1.0) + panchor = (0.5, 0.0) + parent.set_position(pb1) + parent.set_anchor(panchor) + fig = parent.get_figure() + cax = fig.add_axes(pbcb) + cax.set_aspect(aspect, anchor=anchor, adjustable='box') + return cax, kw + + +def colorbar(mappable, cax=None, ax=None, **kw): + """ + Create a colorbar for a ScalarMappable instance. + + Documentation for the pylab thin wrapper: + %(colorbar_doc)s + """ + import matplotlib.pyplot as plt + if ax is None: + ax = plt.gca() + if cax is None: + cax, kw = make_axes(ax, **kw) + cax.hold(True) + cb = Colorbar(cax, mappable, **kw) + + def on_changed(m): + cb.set_cmap(m.get_cmap()) + cb.set_clim(m.get_clim()) + cb.update_bruteforce(m) + + cbid = mappable.callbacksSM.connect('changed', on_changed) + mappable.set_colorbar(cb, cax) + ax.figure.sca(ax) + return cb From 930838eff2f57aeec4d51e557cc0cbf05975c5b4 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 14 Sep 2009 13:28:43 +0000 Subject: [PATCH 0242/1000] Add symlink for axes_grid examples to SVN svn path=/trunk/matplotlib/; revision=7754 --- doc/mpl_toolkits/axes_grid/examples | 1 + 1 file changed, 1 insertion(+) create mode 120000 doc/mpl_toolkits/axes_grid/examples diff --git a/doc/mpl_toolkits/axes_grid/examples b/doc/mpl_toolkits/axes_grid/examples new file mode 120000 index 000000000000..69ba136bcc62 --- /dev/null +++ b/doc/mpl_toolkits/axes_grid/examples @@ -0,0 +1 @@ +../../../examples/axes_grid/ \ No newline at end of file From 11605bc6ab42a02c8e89ade35ecb62119e86ee55 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 14 Sep 2009 17:02:32 +0000 Subject: [PATCH 0243/1000] Minor documentation fixes. svn path=/trunk/matplotlib/; revision=7755 --- examples/api/watermark_image.py | 1 - lib/matplotlib/axes.py | 1 + lib/matplotlib/pyplot.py | 2 +- 3 files changed, 2 insertions(+), 2 deletions(-) diff --git a/examples/api/watermark_image.py b/examples/api/watermark_image.py index 27f27a23b4fe..7affe16f057f 100644 --- a/examples/api/watermark_image.py +++ b/examples/api/watermark_image.py @@ -3,7 +3,6 @@ """ import numpy as np import matplotlib -matplotlib.use('Agg') import matplotlib.cbook as cbook import matplotlib.image as image import matplotlib.pyplot as plt diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index 76a181072f30..a2915850089e 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -5519,6 +5519,7 @@ def hexbin(self, x, y, C = None, gridsize = 100, bins = None, **Example:** .. plot:: mpl_examples/pylab_examples/hexbin_demo.py + """ if not self._hold: self.cla() diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index 03b3977e1522..8ba3eb44f9ba 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -1596,7 +1596,7 @@ def getname_val(identifier): def autogen_docstring(base): """Autogenerated wrappers will get their docstring from a base function with an addendum.""" - msg = "Additional kwargs: hold = [True|False] overrides default hold state" + msg = "\n\nAdditional kwargs: hold = [True|False] overrides default hold state" addendum = docstring.Appender(msg, '\n\n') return lambda func: addendum(docstring.copy_dedent(base)(func)) From 2edf572c5c5fd3dd15e7b96c9ac202ff07f4224d Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 14 Sep 2009 17:12:19 +0000 Subject: [PATCH 0244/1000] Merged revisions 7751 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7751 | jdh2358 | 2009-09-12 17:11:42 -0400 (Sat, 12 Sep 2009) | 1 line tagging for 99.1 release candiate ........ svn path=/trunk/matplotlib/; revision=7757 --- README.txt | 78 ++++++++++++++++++++++-------------------------------- make.osx | 43 ++++++++++++++++++------------ 2 files changed, 57 insertions(+), 64 deletions(-) diff --git a/README.txt b/README.txt index 1132832f5ce4..318ee55f43c0 100644 --- a/README.txt +++ b/README.txt @@ -1,61 +1,45 @@ -Overview of the matplotlib src tree -=================================== +matplotlib for MacOS X 10.3.9 or later and Python 2.5 and Python 2.6 -This is the source directory for matplotlib, which contains the -following files and directories. +matplotlib is a python 2D plotting library which produces publication +quality figures in a variety of hardcopy formats and interactive +environments across platforms. matplotlib can be used in python +scripts, the python and ipython shell (ala matlab or mathematica), web +application servers, and various graphical user interface toolkits. -* doc - the matplotlib documentation. See doc/users for the user's - documentation and doc/devel for the developers documentation +Home page: -* examples - a bunch of examples using matplotib. See - examples/README.txt for information +Before running matplotlib, you must install numpy. Binary installers +for all these packages are available here: -* setup.cfg.template - used to configure the matplotlib build process. - Copy this file to setup.cfg if you want to override the default - build behavior + . -* matplotlibrc.template - a template file used to generate the - matplotlibrc config file at build time. The matplotlibrc file will - be installed in matplotlib/mpl-data/matplotlibrc +*** Back Ends *** -* lib - the python src code. matplotlib ships several third party - packages here. The subdirectory lib/matplotlib contains the python - src code for matplotlib +You may use TkAgg or WXAgg back ends; Qt and GTK support is not +provided in this package. By default this matplotlib uses TkAgg +because Tcl/Tk is included with MacOS X. -* src - the matplotlib extension code, mostly C++ +If you wish to use WXAgg then: +* Install wxPython from: + . +* Configure a matplotlibrc file, as described below. -* ttconv - some truetype font utilities +For TkAgg you may use Apple's built-in Tcl/Tk or install your own 8.4.x -* license - all the licenses for code included with matplotlib. - matplotlib uses only BSD compatible code +*** Configuring a matplotlibrc file *** -* unit - some unit tests +If you wish to change any matplotlib settings, create a file: + ~/.matplotlib/matplotlibrc -* CHANGELOG - all the significant changes to matplotlib, organized by - release. The top of this file will show you the most recent changes -* API_CHANGES - any change that alters the API is listed here. The - entries are organized by release, with most recent entries first +that contains at least the following information. The values shown are +the defaults in the internal matplotlibrc file; change them as you see +fit: -* MIGRATION.txt - instructions on moving from the 0.91 code to the - 0.98 trunk. - -* SEGFAULTS - some tips for how to diagnose and debug segfaults - -* setup.py - the matplotlib build script - -* setupext.py - some helper code for setup.py to build the matplotlib - extensions - -* boilerplate.py - some code to automatically generate the pyplot - wrappers - -* DEVNOTES - deprecated developer notes. TODO: update and move to the - doc/devel framework - -* FILETYPES - This is a table of the output formats supported by each - backend. TODO: move to doc/users - -* INTERACTIVE - instructions on using matplotlib interactively, eg - from the python shell. TODO: update and move to doc/users. +# the default backend; one of GTK GTKAgg GTKCairo FltkAgg QtAgg TkAgg WXAgg +# Agg Cairo GD GDK Paint PS PDF SVG Template +backend : TkAgg +interactive : False # see http://matplotlib.sourceforge.net/interactive.html +See also + diff --git a/make.osx b/make.osx index 1b45ce8c7ca0..d84c63e7baf4 100644 --- a/make.osx +++ b/make.osx @@ -1,6 +1,7 @@ # build mpl into a local install dir with # PREFIX=/Users/jdhunter/dev make -f make.osx fetch deps mpl_install +MPLVERSION=0.99.1rc1 PYVERSION=2.6 PYTHON=python${PYVERSION} ZLIBVERSION=1.2.3 @@ -11,8 +12,8 @@ MACOSX_DEPLOYMENT_TARGET=10.4 ## You shouldn't need to configure past this point PKG_CONFIG_PATH="${PREFIX}/lib/pkgconfig" -CFLAGS_DEPS="-arch i386 -arch ppc -I${PREFIX}/include -I${PREFIX}/include/freetype2 -isysroot /Developer/SDKs/MacOSX10.4u.sdk" -LDFLAGS_DEPS="-arch i386 -arch ppc -L${PREFIX}/lib -syslibroot,/Developer/SDKs/MacOSX10.4u.sdk" +CFLAGS="-arch i386 -arch ppc -I${PREFIX}/include -I${PREFIX}/include/freetype2 -isysroot /Developer/SDKs/MacOSX10.4u.sdk" +LDFLAGS="-arch i386 -arch ppc -L${PREFIX}/lib -syslibroot,/Developer/SDKs/MacOSX10.4u.sdk" clean: rm -rf zlib-${ZLIBVERSION}.tar.gz libpng-${PNGVERSION}.tar.bz2 \ @@ -34,10 +35,10 @@ zlib: tar xvfz zlib-${ZLIBVERSION}.tar.gz &&\ cd zlib-${ZLIBVERSION} &&\ export MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} &&\ - export CFLAGS=${CFLAGS_DEPS} &&\ - export LDFLAGS=${LDFLAGS_DEPS} &&\ + export CFLAGS=${CFLAGS} &&\ + export LDFLAGS=${LDFLAGS} &&\ ./configure --prefix=${PREFIX}&&\ - MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} CFLAGS=${CFLAGS_DEPS} LDFLAGS=${LDFLAGS_DEPS} make -j3 install&& \ + MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} CFLAGS=${CFLAGS} LDFLAGS=${LDFLAGS} make -j3 install&& \ unset MACOSX_DEPLOYMENT_TARGET png: zlib @@ -46,8 +47,8 @@ png: zlib tar xvfj libpng-${PNGVERSION}.tar.bz2 cd libpng-${PNGVERSION} &&\ export MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} &&\ - export CFLAGS=${CFLAGS_DEPS} &&\ - export LDFLAGS=${LDFLAGS_DEPS} &&\ + export CFLAGS=${CFLAGS} &&\ + export LDFLAGS=${LDFLAGS} &&\ ./configure --disable-dependency-tracking --prefix=${PREFIX} &&\ make -j3 install&&\ cp .libs/libpng.a . &&\ @@ -60,8 +61,8 @@ freetype: zlib tar xvfj freetype-${FREETYPEVERSION}.tar.bz2 &&\ cd freetype-${FREETYPEVERSION} &&\ export MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} &&\ - export CFLAGS=${CFLAGS_DEPS} &&\ - export LDFLAGS=${LDFLAGS_DEPS} &&\python/svn/bison/scripts/ + export CFLAGS=${CFLAGS} &&\ + export LDFLAGS=${LDFLAGS} &&\ ./configure --prefix=${PREFIX} &&\ make -j3 install &&\ cp objs/.libs/libfreetype.a . &&\ @@ -74,15 +75,23 @@ deps: zlib png freetype mpl_build: export PKG_CONFIG_PATH=${PKG_CONFIG_PATH} &&\ export MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} &&\ - export CFLAGS=${CFLAGS_DEPS} &&\ - export LDFLAGS=${LDFLAGS_DEPS} &&\ - python setup.py build + export CFLAGS=${CFLAGS} &&\ + export LDFLAGS=${LDFLAGS} &&\ + ${PYTHON} setup.py build mpl_install: export PKG_CONFIG_PATH=${PKG_CONFIG_PATH} &&\ export MACOSX_DEPLOYMENT_TARGET=${MACOSX_DEPLOYMENT_TARGET} &&\ - export CFLAGS=${CFLAGS_DEPS} &&\ - export LDFLAGS=${LDFLAGS_DEPS} &&\ - export LD_LIBRARY_PATH=${PREFIX}/lib &&\ - export DYLD_LIBRARY_PATH=${PREFIX}/lib &&\ - python setup.py install --prefix=${PREFIX} + export CFLAGS=${CFLAGS} &&\ + export LDFLAGS=${LDFLAGS} &&\ + ${PYTHON} setup.py install --prefix=${PREFIX} + + +binaries: + unset PKG_CONFIG_PATH &&\ + cp release/osx/data/setup.cfg release/osx/data/ReadMe.txt . &&\ + export CFLAGS=${CFLAGS} &&\ + export LDFLAGS=${LDFLAGS} &&\ + /Library/Frameworks/Python.framework/Versions/${PYVERSION}/bin/bdist_mpkg --readme=ReadMe.txt &&\ + hdiutil create -srcdir dist/matplotlib-${MPLVERSION}-py${PYVERSION}-macosx10.5.mpkg dist/matplotlib-${MPLVERSION}-py${PYVERSION}-macosx10.5.dmg &&\ + ${PYTHON} setupegg.py bdist_egg From 30a945e17f6753b9ad96722f551c6d29ef6f7879 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 14 Sep 2009 17:16:41 +0000 Subject: [PATCH 0245/1000] Merged revisions 7756 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7756 | mdboom | 2009-09-14 13:11:06 -0400 (Mon, 14 Sep 2009) | 1 line Minor doc fixes ........ svn path=/trunk/matplotlib/; revision=7758 --- doc/users/image_tutorial.rst | 6 +++--- lib/matplotlib/axes.py | 4 ++-- lib/matplotlib/font_manager.py | 12 ++++++------ lib/matplotlib/mlab.py | 14 ++++++++++++-- 4 files changed, 23 insertions(+), 13 deletions(-) diff --git a/doc/users/image_tutorial.rst b/doc/users/image_tutorial.rst index 094b4154d3d8..07a3a6a02597 100644 --- a/doc/users/image_tutorial.rst +++ b/doc/users/image_tutorial.rst @@ -179,7 +179,7 @@ channel of our data: In [6]: lum_img = img[:,:,0] -This is array slicing. You can read more `here +This is array slicing. You can read more in the `Numpy tutorial `_. .. sourcecode:: ipython @@ -229,8 +229,8 @@ object: imgplot = plt.imshow(lum_img) imgplot.set_cmap('spectral') -There are many other colormap schemes available. See a list and -images of the colormaps `here +There are many other colormap schemes available. See the `list and +images of the colormaps `_. .. _Color Bars diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index a2915850089e..560a1d03e028 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -7399,8 +7399,8 @@ def cohere(self, x, y, NFFT=256, Fs=2, Fc=0, detrend=mlab.detrend_none, window = mlab.window_hanning, noverlap=0, pad_to=None, sides='default', scale_by_freq=None, **kwargs) - cohere the coherence between *x* and *y*. Coherence is the normalized - cross spectral density: + :meth:`cohere` the coherence between *x* and *y*. Coherence + is the normalized cross spectral density: .. math:: diff --git a/lib/matplotlib/font_manager.py b/lib/matplotlib/font_manager.py index 1baa90332ee0..a8ddc9d9cbc4 100644 --- a/lib/matplotlib/font_manager.py +++ b/lib/matplotlib/font_manager.py @@ -12,12 +12,12 @@ font specification `_. Future versions may implement the Level 2 or 2.1 specifications. -Experimental support is included for using `fontconfig -`_ on Unix variant plaforms (Linux, OS X, -Solaris). To enable it, set the constant ``USE_FONTCONFIG`` in this -file to ``True``. Fontconfig has the advantage that it is the -standard way to look up fonts on X11 platforms, so if a font is -installed, it is much more likely to be found. +Experimental support is included for using `fontconfig` on Unix +variant platforms (Linux, OS X, Solaris). To enable it, set the +constant ``USE_FONTCONFIG`` in this file to ``True``. Fontconfig has +the advantage that it is the standard way to look up fonts on X11 +platforms, so if a font is installed, it is much more likely to be +found. """ """ diff --git a/lib/matplotlib/mlab.py b/lib/matplotlib/mlab.py index 0e1576726a10..ab83b3623ac6 100644 --- a/lib/matplotlib/mlab.py +++ b/lib/matplotlib/mlab.py @@ -366,12 +366,16 @@ def psd(x, NFFT=256, Fs=2, detrend=detrend_none, window=window_hanning, *x* Array or sequence containing the data + %(PSD)s + Returns the tuple (*Pxx*, *freqs*). Refs: + Bendat & Piersol -- Random Data: Analysis and Measurement Procedures, John Wiley & Sons (1986) + """ Pxx,freqs = csd(x, x, NFFT, Fs, detrend, window, noverlap, pad_to, sides, scale_by_freq) @@ -394,7 +398,9 @@ def csd(x, y, NFFT=256, Fs=2, detrend=detrend_none, window=window_hanning, *x*, *y* Array or sequence containing the data + %(PSD)s + Returns the tuple (*Pxy*, *freqs*). Refs: @@ -420,7 +426,9 @@ def specgram(x, NFFT=256, Fs=2, detrend=detrend_none, window=window_hanning, If *x* is real (i.e. non-complex) only the spectrum of the positive frequencie is returned. If *x* is complex then the complete spectrum is returned. + %(PSD)s + Returns a tuple (*Pxx*, *freqs*, *t*): - *Pxx*: 2-D array, columns are the periodograms of @@ -463,11 +471,13 @@ def cohere(x, y, NFFT=256, Fs=2, detrend=detrend_none, window=window_hanning, *x*, *y* Array or sequence containing the data + %(PSD)s + The return value is the tuple (*Cxy*, *f*), where *f* are the frequencies of the coherence vector. For cohere, scaling the - individual densities by the sampling frequency has no effect, since - the factors cancel out. + individual densities by the sampling frequency has no effect, + since the factors cancel out. .. seealso:: From bf5a0a4c61bbeda0d8b716bce0cb94174fdf3549 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 14 Sep 2009 19:16:49 +0000 Subject: [PATCH 0246/1000] Improve speed of gallery thumbnail generation using multiprocessing svn path=/trunk/matplotlib/; revision=7759 --- doc/sphinxext/gen_gallery.py | 31 ++++++++++++++++++++----------- 1 file changed, 20 insertions(+), 11 deletions(-) diff --git a/doc/sphinxext/gen_gallery.py b/doc/sphinxext/gen_gallery.py index a3d5a16c0f5e..f097003dbcb7 100644 --- a/doc/sphinxext/gen_gallery.py +++ b/doc/sphinxext/gen_gallery.py @@ -39,15 +39,14 @@ def gen_gallery(app, doctree): 'matplotlib_icon', ]) - print - print "generating gallery: ", data = [] + thumbnails = {} + for subdir in ('api', 'pylab_examples', 'mplot3d', 'widgets', 'axes_grid' ): origdir = os.path.join('build', rootdir, subdir) thumbdir = os.path.join(outdir, rootdir, subdir, 'thumbnails') if not os.path.exists(thumbdir): os.makedirs(thumbdir) - print subdir, for filename in sorted(glob.glob(os.path.join(origdir, '*.png'))): if filename.endswith("hires.png"): @@ -56,16 +55,14 @@ def gen_gallery(app, doctree): path, filename = os.path.split(filename) basename, ext = os.path.splitext(filename) if basename in skips: - sys.stdout.write('[skipping %s]' % basename) - sys.stdout.flush() continue # Create thumbnails based on images in tmpdir, and place # them within the build tree orig_path = str(os.path.join(origdir, filename)) thumb_path = str(os.path.join(thumbdir, filename)) - if out_of_date(orig_path, thumb_path): - image.thumbnail(orig_path, thumb_path, scale=0.3) + if out_of_date(orig_path, thumb_path) or True: + thumbnails[orig_path] = thumb_path m = multiimage.match(basename) if m is None: @@ -77,10 +74,6 @@ def gen_gallery(app, doctree): data.append((subdir, basename, os.path.join(rootdir, subdir, 'thumbnails', filename))) - sys.stdout.write(".") - sys.stdout.flush() - print - link_template = """\ %s """ @@ -99,5 +92,21 @@ def gen_gallery(app, doctree): fh.write(template%'\n'.join(rows)) fh.close() + try: + import multiprocessing + def make_thumbnail(args): + image.thumbnail(args[0], args[1], 0.3) + + app.builder.info("generating thumbnails... ", nonl=True) + pool = multiprocessing.Pool() + pool.map(make_thumbnail, thumbnails.iteritems()) + app.builder.info("done") + + except ImportError: + for key in app.builder.status_iterator( + thumbnails.iterkeys(), "generating thumbnails... ", + length=len(thumbnails)): + image.thumbnail(key, thumbnails[key], 0.3) + def setup(app): app.connect('env-updated', gen_gallery) From 4dd0afc9ee29038dab523d1959d19b08260a43b7 Mon Sep 17 00:00:00 2001 From: Sameer D'Costa Date: Mon, 14 Sep 2009 19:32:27 +0000 Subject: [PATCH 0247/1000] added jointype == "inner" to mlab.recs_join svn path=/trunk/matplotlib/; revision=7760 --- lib/matplotlib/mlab.py | 33 ++++++++++++++++++++++++--------- 1 file changed, 24 insertions(+), 9 deletions(-) diff --git a/lib/matplotlib/mlab.py b/lib/matplotlib/mlab.py index ab83b3623ac6..fb530400c1f7 100644 --- a/lib/matplotlib/mlab.py +++ b/lib/matplotlib/mlab.py @@ -1893,23 +1893,29 @@ def mapped_r2field(name): return newrec -def recs_join(key, name, recs,missing=0.): +def recs_join(key, name, recs, jointype='outer', missing=0.): """ - Join a sequence of record arrays on key + Join a sequence of record arrays on single column key. + + This function only joins a single column of the multiple record arrays *key* is the column name that acts as a key *name* - is the name that we want to join + is the name of the column that we want to join + + *recs* + is a list of record arrays to join + + *jointype* + is a string 'inner' or 'outer' *missing" - is what the missing fields are replaced by + is what any missing field is replaced by - *recarrays* - is a list of record arrays to join - returns a record array with columns [rowkey, name1, name2, ... namen] + returns a record array with columns [rowkey, name1, name2, ... namen]. Example:: @@ -1917,12 +1923,21 @@ def recs_join(key, name, recs,missing=0.): """ results = [] + aligned_iters = cbook.align_iterators(operator.attrgetter(key), *[iter(r) for r in recs]) + def extract(r): if r is None: return missing else: return r[name] - for rowkey, row in cbook.align_iterators(operator.attrgetter(key), *[iter(r) for r in recs]): - results.append([rowkey] + map(extract, row)) + + if jointype == "outer": + for rowkey, row in aligned_iters: + results.append([rowkey] + map(extract, row)) + elif jointype == "inner": + for rowkey, row in aligned_iters: + if None not in row: # throw out any Nones + results.append([rowkey] + map(extract, row)) + names = ",".join([key] + ["%s%d" % (name, d) for d in range(len(recs))]) return np.rec.fromrecords(results, names=names) From 0750e666510a198d9f27e4ba14a70a9dde261d26 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Mon, 14 Sep 2009 21:52:24 +0000 Subject: [PATCH 0248/1000] axes_grid: examples directory reorganization svn path=/trunk/matplotlib/; revision=7761 --- .../demo_colorbar_with_inset_locator.py | 40 ------------------- .../figures}/demo_fixed_size_axes.py | 0 .../axes_grid/figures}/demo_parasite_axes.py | 0 .../axes_grid/figures}/parasite_simple.py | 0 .../figures}/simple_axes_divider1.py | 0 .../figures}/simple_axes_divider2.py | 0 .../figures}/simple_axes_divider3.py | 0 .../axes_grid/figures}/simple_axisline.py | 0 .../axes_grid/figures}/simple_axisline2.py | 0 .../axes_grid/figures}/simple_axisline3.py | 0 .../axes_grid/figures}/simple_rgb.py | 0 .../axes_grid/users/axes_divider.rst | 4 +- doc/mpl_toolkits/axes_grid/users/overview.rst | 8 ++-- .../demo_colorbar_with_inset_locator.py | 8 +--- 14 files changed, 8 insertions(+), 52 deletions(-) delete mode 100644 doc/mpl_toolkits/axes_grid/figures/demo_colorbar_with_inset_locator.py rename {examples/axes_grid => doc/mpl_toolkits/axes_grid/figures}/demo_fixed_size_axes.py (100%) rename {examples/axes_grid => doc/mpl_toolkits/axes_grid/figures}/demo_parasite_axes.py (100%) rename {examples/axes_grid => doc/mpl_toolkits/axes_grid/figures}/parasite_simple.py (100%) rename {examples/axes_grid => doc/mpl_toolkits/axes_grid/figures}/simple_axes_divider1.py (100%) rename {examples/axes_grid => doc/mpl_toolkits/axes_grid/figures}/simple_axes_divider2.py (100%) rename {examples/axes_grid => doc/mpl_toolkits/axes_grid/figures}/simple_axes_divider3.py (100%) rename {examples/axes_grid => doc/mpl_toolkits/axes_grid/figures}/simple_axisline.py (100%) rename {examples/axes_grid => doc/mpl_toolkits/axes_grid/figures}/simple_axisline2.py (100%) rename {examples/axes_grid => doc/mpl_toolkits/axes_grid/figures}/simple_axisline3.py (100%) rename {examples/axes_grid => doc/mpl_toolkits/axes_grid/figures}/simple_rgb.py (100%) diff --git a/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_with_inset_locator.py b/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_with_inset_locator.py deleted file mode 100644 index 84db20e5acd5..000000000000 --- a/doc/mpl_toolkits/axes_grid/figures/demo_colorbar_with_inset_locator.py +++ /dev/null @@ -1,40 +0,0 @@ -import matplotlib.pyplot as plt - -from mpl_toolkits.axes_grid.inset_locator import inset_axes -from mpl_toolkits.axes_grid.colorbar import colorbar - -fig = plt.figure(1, [6, 3]) - -# first subplot -ax1 = fig.add_subplot(121) - -axins1 = inset_axes(ax1, - width="50%", # width = 10% of parent_bbox width - height="5%", # height : 50% - loc=1) - -im1=ax1.imshow([[1,2],[2, 3]]) -colorbar(im1, cax=axins1, orientation="horizontal", ticks=[1,2,3]) -axins1.xaxis.set_ticks_position("bottom") - -# first subplot -ax = fig.add_subplot(122) - -axins = inset_axes(ax, - width="5%", # width = 10% of parent_bbox width - height="50%", # height : 50% - loc=3, - bbox_to_anchor=(1.05, 0., 1, 1), - bbox_transform=ax.transAxes, - borderpad=0, - ) - -# Controlling the placement of the inset axes is basically same as that -# of the legend. you may want to play with the borderpad value and -# the bbox_to_anchor coordinate. - -im=ax.imshow([[1,2],[2, 3]]) -colorbar(im, cax=axins, ticks=[1,2,3]) - -plt.draw() -plt.show() diff --git a/examples/axes_grid/demo_fixed_size_axes.py b/doc/mpl_toolkits/axes_grid/figures/demo_fixed_size_axes.py similarity index 100% rename from examples/axes_grid/demo_fixed_size_axes.py rename to doc/mpl_toolkits/axes_grid/figures/demo_fixed_size_axes.py diff --git a/examples/axes_grid/demo_parasite_axes.py b/doc/mpl_toolkits/axes_grid/figures/demo_parasite_axes.py similarity index 100% rename from examples/axes_grid/demo_parasite_axes.py rename to doc/mpl_toolkits/axes_grid/figures/demo_parasite_axes.py diff --git a/examples/axes_grid/parasite_simple.py b/doc/mpl_toolkits/axes_grid/figures/parasite_simple.py similarity index 100% rename from examples/axes_grid/parasite_simple.py rename to doc/mpl_toolkits/axes_grid/figures/parasite_simple.py diff --git a/examples/axes_grid/simple_axes_divider1.py b/doc/mpl_toolkits/axes_grid/figures/simple_axes_divider1.py similarity index 100% rename from examples/axes_grid/simple_axes_divider1.py rename to doc/mpl_toolkits/axes_grid/figures/simple_axes_divider1.py diff --git a/examples/axes_grid/simple_axes_divider2.py b/doc/mpl_toolkits/axes_grid/figures/simple_axes_divider2.py similarity index 100% rename from examples/axes_grid/simple_axes_divider2.py rename to doc/mpl_toolkits/axes_grid/figures/simple_axes_divider2.py diff --git a/examples/axes_grid/simple_axes_divider3.py b/doc/mpl_toolkits/axes_grid/figures/simple_axes_divider3.py similarity index 100% rename from examples/axes_grid/simple_axes_divider3.py rename to doc/mpl_toolkits/axes_grid/figures/simple_axes_divider3.py diff --git a/examples/axes_grid/simple_axisline.py b/doc/mpl_toolkits/axes_grid/figures/simple_axisline.py similarity index 100% rename from examples/axes_grid/simple_axisline.py rename to doc/mpl_toolkits/axes_grid/figures/simple_axisline.py diff --git a/examples/axes_grid/simple_axisline2.py b/doc/mpl_toolkits/axes_grid/figures/simple_axisline2.py similarity index 100% rename from examples/axes_grid/simple_axisline2.py rename to doc/mpl_toolkits/axes_grid/figures/simple_axisline2.py diff --git a/examples/axes_grid/simple_axisline3.py b/doc/mpl_toolkits/axes_grid/figures/simple_axisline3.py similarity index 100% rename from examples/axes_grid/simple_axisline3.py rename to doc/mpl_toolkits/axes_grid/figures/simple_axisline3.py diff --git a/examples/axes_grid/simple_rgb.py b/doc/mpl_toolkits/axes_grid/figures/simple_rgb.py similarity index 100% rename from examples/axes_grid/simple_rgb.py rename to doc/mpl_toolkits/axes_grid/figures/simple_rgb.py diff --git a/doc/mpl_toolkits/axes_grid/users/axes_divider.rst b/doc/mpl_toolkits/axes_grid/users/axes_divider.rst index 53e7dcd59172..50d01827ad71 100644 --- a/doc/mpl_toolkits/axes_grid/users/axes_divider.rst +++ b/doc/mpl_toolkits/axes_grid/users/axes_divider.rst @@ -81,12 +81,12 @@ may consider it as [0:2, 1]. See the example, -.. plot:: mpl_toolkits/axes_grid/examples/simple_axes_divider2.py +.. plot:: mpl_toolkits/axes_grid/figures/simple_axes_divider2.py :include-source: You can adjust the size of the each axes accroding to their x or y data limits (AxesX and AxesY), similar to the axes aspect parameter. -.. plot:: mpl_toolkits/axes_grid/examples/simple_axes_divider3.py +.. plot:: mpl_toolkits/axes_grid/figures/simple_axes_divider3.py :include-source: diff --git a/doc/mpl_toolkits/axes_grid/users/overview.rst b/doc/mpl_toolkits/axes_grid/users/overview.rst index 1b99622499cd..05b4ca443746 100644 --- a/doc/mpl_toolkits/axes_grid/users/overview.rst +++ b/doc/mpl_toolkits/axes_grid/users/overview.rst @@ -158,7 +158,7 @@ yaxis of each axes are shared. :: origin="lower", interpolation="nearest") -.. plot:: mpl_toolkits/axes_grid/examples/simple_rgb.py +.. plot:: mpl_toolkits/axes_grid/figures/simple_rgb.py @@ -246,7 +246,7 @@ axes. Example 1. twinx ---------------- -.. plot:: mpl_toolkits/axes_grid/examples/parasite_simple.py +.. plot:: mpl_toolkits/axes_grid/figures/parasite_simple.py :include-source: Example 2. twin @@ -290,13 +290,13 @@ For example, you can hide right, and top axis by :: ax.axis["top"].set_visible(False) -.. plot:: mpl_toolkits/axes_grid/examples/simple_axisline3.py +.. plot:: mpl_toolkits/axes_grid/figures/simple_axisline3.py SubplotZero gives you two more additional (floating?) axis of x=0 and y=0 (in data coordinate) -.. plot:: mpl_toolkits/axes_grid/examples/simple_axisline2.py +.. plot:: mpl_toolkits/axes_grid/figures/simple_axisline2.py :include-source: diff --git a/examples/axes_grid/demo_colorbar_with_inset_locator.py b/examples/axes_grid/demo_colorbar_with_inset_locator.py index 12cf2cc06622..84db20e5acd5 100644 --- a/examples/axes_grid/demo_colorbar_with_inset_locator.py +++ b/examples/axes_grid/demo_colorbar_with_inset_locator.py @@ -1,7 +1,7 @@ import matplotlib.pyplot as plt from mpl_toolkits.axes_grid.inset_locator import inset_axes -#from mpl_toolkits.axes_grid.colorbar import colorbar +from mpl_toolkits.axes_grid.colorbar import colorbar fig = plt.figure(1, [6, 3]) @@ -13,8 +13,6 @@ height="5%", # height : 50% loc=1) -locator1=axins1.get_axes_locator() - im1=ax1.imshow([[1,2],[2, 3]]) colorbar(im1, cax=axins1, orientation="horizontal", ticks=[1,2,3]) axins1.xaxis.set_ticks_position("bottom") @@ -31,14 +29,12 @@ borderpad=0, ) - -locator=axins.get_axes_locator() # Controlling the placement of the inset axes is basically same as that # of the legend. you may want to play with the borderpad value and # the bbox_to_anchor coordinate. im=ax.imshow([[1,2],[2, 3]]) -colorbar(im, cax=axins) +colorbar(im, cax=axins, ticks=[1,2,3]) plt.draw() plt.show() From 1877e29ff609073d105305c5deb032d816cbeb2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Tue, 15 Sep 2009 12:37:55 +0000 Subject: [PATCH 0249/1000] Merged revisions 7762 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7762 | jouni | 2009-09-15 15:12:19 +0300 (Ti, 15 Syy 2009) | 1 line Don't fail on AFM files containing floating-point bounding boxes ........ svn path=/trunk/matplotlib/; revision=7763 --- CHANGELOG | 2 ++ lib/matplotlib/afm.py | 3 ++- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/CHANGELOG b/CHANGELOG index 8631d09c7197..fcbb152843fc 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,5 @@ +2009-09-15 Don't fail on AFM files containing floating-point bounding boxes - JKS + 2009-09-13 AxesGrid : add modified version of colorbar. Add colorbar location howto. - JJL diff --git a/lib/matplotlib/afm.py b/lib/matplotlib/afm.py index d1a065345b36..05d2f78d54c9 100644 --- a/lib/matplotlib/afm.py +++ b/lib/matplotlib/afm.py @@ -165,7 +165,8 @@ def _parse_char_metrics(fh): num = _to_int(vals[0].split()[1]) wx = _to_float(vals[1].split()[1]) name = vals[2].split()[1] - bbox = _to_list_of_ints(vals[3][2:]) + bbox = _to_list_of_floats(vals[3][2:]) + bbox = map(int, bbox) # Workaround: If the character name is 'Euro', give it the corresponding # character code, according to WinAnsiEncoding (see PDF Reference). if name == 'Euro': From e46a427fec0dd2b32ffa5c465a4661d838f6ad78 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Tue, 15 Sep 2009 19:28:09 +0000 Subject: [PATCH 0250/1000] implement draw_text and draw_tex method of backend_base using the textpath. svn path=/trunk/matplotlib/; revision=7764 --- CHANGELOG | 4 + lib/matplotlib/backend_bases.py | 98 ++++++++++++++-- lib/matplotlib/backends/backend_svg.py | 152 +++++++++++++++++++++++++ lib/matplotlib/texmanager.py | 2 +- lib/matplotlib/text.py | 1 + lib/matplotlib/textpath.py | 45 ++++++-- 6 files changed, 280 insertions(+), 22 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index fcbb152843fc..c92aaceefc63 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +2009-09-15 Implement draw_text and draw_tex method of backend_base using + the textpath module. Implement draw_tex method of the svg + backend. - JJL + 2009-09-15 Don't fail on AFM files containing floating-point bounding boxes - JKS 2009-09-13 AxesGrid : add modified version of colorbar. Add colorbar diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 8c8de06509ff..f7f861a30f8b 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -30,13 +30,15 @@ import matplotlib.colors as colors import matplotlib.transforms as transforms import matplotlib.widgets as widgets -import matplotlib.path as path +#import matplotlib.path as path from matplotlib import rcParams from matplotlib.transforms import Bbox, TransformedBbox, Affine2D import cStringIO import matplotlib.tight_bbox as tight_bbox +import matplotlib.textpath as textpath +from matplotlib.path import Path class RendererBase: """An abstract base class to handle drawing/rendering operations. @@ -58,6 +60,8 @@ class RendererBase: def __init__(self): self._texmanager = None + self._text2path = textpath.TextToPath() + def open_group(self, s, gid=None): """ Open a grouping element with label *s*. If *gid* is given, use @@ -337,7 +341,9 @@ def option_image_nocomposite(self): return False def draw_tex(self, gc, x, y, s, prop, angle, ismath='TeX!'): - raise NotImplementedError + """ + """ + self._draw_text_as_path(gc, x, y, s, prop, angle, ismath="TeX") def draw_text(self, gc, x, y, s, prop, angle, ismath=False): """ @@ -372,7 +378,84 @@ def draw_text(self, gc, x, y, s, prop, angle, ismath=False): to if 1, and then the actual bounding box will be blotted along with your text. """ - raise NotImplementedError + + self._draw_text_as_path(gc, x, y, s, prop, angle, ismath) + + def _draw_text_as_path(self, gc, x, y, s, prop, angle, ismath): + """ + draw the text by converting them to paths using textpath module. + + *prop* + font property + + *s* + text to be converted + + *usetex* + If True, use matplotlib usetex mode. + + *ismath* + If True, use mathtext parser. If "TeX", use *usetex* mode. + """ + + text2path = self._text2path + color = gc.get_rgb()[:3] + fontsize = self.points_to_pixels(prop.get_size_in_points()) + + if ismath == "TeX": + verts, codes = text2path.get_text_path(prop, s, ismath=False, usetex=True) + else: + verts, codes = text2path.get_text_path(prop, s, ismath=ismath, usetex=False) + + path = Path(verts, codes) + angle = angle/180.*3.141592 + if self.flipy(): + transform = Affine2D().scale(fontsize/text2path.FONT_SCALE, + fontsize/text2path.FONT_SCALE).\ + rotate(angle).translate(x, self.height-y) + else: + transform = Affine2D().scale(fontsize/text2path.FONT_SCALE, + fontsize/text2path.FONT_SCALE).\ + rotate(angle).translate(x, y) + + gc.set_linewidth(0.0) + self.draw_path(gc, path, transform, rgbFace=color) + + + def get_text_width_height_descent(self, s, prop, ismath): + """ + get the width and height, and the offset from the bottom to the + baseline (descent), in display coords of the string s with + :class:`~matplotlib.font_manager.FontProperties` prop + """ + if ismath=='TeX': + # todo: handle props + size = prop.get_size_in_points() + texmanager = self._text2path.get_texmanager() + fontsize = prop.get_size_in_points() + w, h, d = texmanager.get_text_width_height_descent(s, fontsize, + renderer=self) + return w, h, d + + dpi = self.points_to_pixels(72) + fontscale = self._text2path.FONT_SCALE + if ismath: + width, height, descent, glyphs, rects = \ + self._text2path.mathtext_parser.parse(s, dpi, prop) + return width, height, descent + + flags = self._text2path._get_hinting_flag() + font = self._text2path._get_font(prop) + size = prop.get_size_in_points() + font.set_size(size, dpi) + font.set_text(s, 0.0, flags=flags) # the width and height of unrotated string + w, h = font.get_width_height() + d = font.get_descent() + w /= 64.0 # convert from subpixels + h /= 64.0 + d /= 64.0 + return w, h, d + def flipy(self): """ @@ -395,13 +478,6 @@ def get_texmanager(self): self._texmanager = TexManager() return self._texmanager - def get_text_width_height_descent(self, s, prop, ismath): - """ - get the width and height, and the offset from the bottom to the - baseline (descent), in display coords of the string s with - :class:`~matplotlib.font_manager.FontProperties` prop - """ - raise NotImplementedError def new_gc(self): """ @@ -741,7 +817,7 @@ def get_hatch_path(self, density=6.0): """ if self._hatch is None: return None - return path.Path.hatch(self._hatch, density) + return Path.hatch(self._hatch, density) class Event: """ diff --git a/lib/matplotlib/backends/backend_svg.py b/lib/matplotlib/backends/backend_svg.py index 5bf9c0bbebc6..31765c870487 100644 --- a/lib/matplotlib/backends/backend_svg.py +++ b/lib/matplotlib/backends/backend_svg.py @@ -58,6 +58,10 @@ def __init__(self, width, height, svgwriter, basename=None): self._hatchd = {} self._n_gradients = 0 self.mathtext_parser = MathTextParser('SVG') + + RendererBase.__init__(self) + self._glyph_map = dict() + svgwriter.write(svgProlog%(width,height,width,height)) def _draw_svg_element(self, element, details, gc, rgbFace): @@ -405,7 +409,147 @@ def draw_image(self, gc, x, y, im): if url is not None: self._svgwriter.write('') + def _adjust_char_id(self, char_id): + return char_id.replace("%20","_") + + def draw_text_as_path(self, gc, x, y, s, prop, angle, ismath): + """ + draw the text by converting them to paths using textpath module. + + *prop* + font property + + *s* + text to be converted + + *usetex* + If True, use matplotlib usetex mode. + + *ismath* + If True, use mathtext parser. If "TeX", use *usetex* mode. + + + """ + # this method works for normal text, mathtext and usetex mode. + # But currently only utilized by draw_tex method. + + glyph_map=self._glyph_map + + text2path = self._text2path + color = rgb2hex(gc.get_rgb()[:3]) + fontsize = prop.get_size_in_points() + + write = self._svgwriter.write + + if ismath == False: + font = text2path._get_font(prop) + _glyphs = text2path.get_glyphs_with_font(font, s, glyph_map=glyph_map, + return_new_glyphs_only=True) + glyph_info, glyph_map_new, rects = _glyphs + + _flip = Affine2D().scale(1.0, -1.0) + + if glyph_map_new: + write('\n') + for char_id, glyph_path in glyph_map_new.iteritems(): + path = Path(*glyph_path) + path_data = self._convert_path(path, _flip) + path_element = '\n' % (char_id, ''.join(path_data)) + write(path_element) + write('\n') + + glyph_map.update(glyph_map_new) + + svg = [] + clipid = self._get_gc_clip_svg(gc) + if clipid is not None: + svg.append('\n' % clipid) + + svg.append('\n' % (fontsize / text2path.FONT_SCALE)) + + for glyph_id, xposition, yposition, scale in glyph_info: + svg.append('\n') + + svg.append('\n') + if clipid is not None: + svg.append('\n') + svg = ''.join(svg) + + + + else: + if ismath == "TeX": + _glyphs = text2path.get_glyphs_tex(prop, s, glyph_map=glyph_map) + else: + _glyphs = text2path.get_glyphs_mathtext(prop, s, glyph_map=glyph_map) + + glyph_info, glyph_map_new, rects = _glyphs + + # we store the character glyphs w/o flipping. Instead, the + # coordinate will be flipped when this characters are + # used. + if glyph_map_new: + write('\n') + for char_id, glyph_path in glyph_map_new.iteritems(): + char_id = self._adjust_char_id(char_id) + path = Path(*glyph_path) + path_data = self._convert_path(path, None) #_flip) + path_element = '\n' % (char_id, ''.join(path_data)) + write(path_element) + write('\n') + + glyph_map.update(glyph_map_new) + + svg = [] + clipid = self._get_gc_clip_svg(gc) + if clipid is not None: + svg.append('\n' % clipid) + + svg.append('\n' % (fontsize / text2path.FONT_SCALE, + fontsize / text2path.FONT_SCALE)) + + for char_id, xposition, yposition, scale in glyph_info: + char_id = self._adjust_char_id(char_id) + svg.append('\n') + + + for verts, codes in rects: + path = Path(verts, codes) + path_data = self._convert_path(path, None) + path_element = '\n' % (''.join(path_data)) + svg.append(path_element) + + + svg.append('\n') + if clipid is not None: + svg.append('\n') + svg = ''.join(svg) + + write(svg) + + + def draw_tex(self, gc, x, y, s, prop, angle): + self.draw_text_as_path(gc, x, y, s, prop, angle, ismath="TeX") + def draw_text(self, gc, x, y, s, prop, angle, ismath): + if ismath: self._draw_mathtext(gc, x, y, s, prop, angle) return @@ -648,6 +792,14 @@ def get_canvas_width_height(self): return self.width, self.height def get_text_width_height_descent(self, s, prop, ismath): + if ismath == "TeX": + size = prop.get_size_in_points() + texmanager = self._text2path.get_texmanager() + fontsize = prop.get_size_in_points() + w, h, d = texmanager.get_text_width_height_descent(s, fontsize, + renderer=self) + return w, h, d + if ismath: width, height, descent, trash, used_characters = \ self.mathtext_parser.parse(s, 72, prop) diff --git a/lib/matplotlib/texmanager.py b/lib/matplotlib/texmanager.py index bfa08b08fdcc..48c2c7f9733f 100644 --- a/lib/matplotlib/texmanager.py +++ b/lib/matplotlib/texmanager.py @@ -304,7 +304,7 @@ def make_tex_preview(self, tex, fontsize): %s %s \usepackage[active,showbox,tightpage]{preview} -%%\usepackage[papersize={72in,72in}, body={70in,70in}, margin={1in,1in}]{geometry} +\usepackage[papersize={72in,72in}, body={70in,70in}, margin={1in,1in}]{geometry} %% we override the default showbox as it is treated as an error and makes %% the exit status not zero diff --git a/lib/matplotlib/text.py b/lib/matplotlib/text.py index b10cf0f3e97b..5482fc31dd1e 100644 --- a/lib/matplotlib/text.py +++ b/lib/matplotlib/text.py @@ -560,6 +560,7 @@ def draw(self, renderer): renderer.draw_tex(gc, x, y, clean_line, self._fontproperties, angle) + renderer.close_group('text') return for line, wh, x, y in info: diff --git a/lib/matplotlib/textpath.py b/lib/matplotlib/textpath.py index 47ee33c290a8..5ea41e3321a2 100644 --- a/lib/matplotlib/textpath.py +++ b/lib/matplotlib/textpath.py @@ -42,6 +42,8 @@ def _get_font(self, prop): return font + def _get_hinting_flag(self): + return LOAD_NO_HINTING def _get_char_id(self, font, ccode): """ @@ -134,7 +136,8 @@ def get_text_path(self, prop, s, ismath=False, usetex=False): return verts, codes - def get_glyphs_with_font(self, font, s, glyph_map=None): + def get_glyphs_with_font(self, font, s, glyph_map=None, + return_new_glyphs_only=False): """ convert the string *s* to vertices and codes using the provided ttf font. @@ -152,6 +155,11 @@ def get_glyphs_with_font(self, font, s, glyph_map=None): if glyph_map is None: glyph_map = dict() + if return_new_glyphs_only: + glyph_map_new = dict() + else: + glyph_map_new = glyph_map + # I'm not sure if I get kernings right. Needs to be verified. -JJL for c in s: @@ -174,7 +182,7 @@ def get_glyphs_with_font(self, font, s, glyph_map=None): char_id = self._get_char_id(font, ccode) if not char_id in glyph_map: - glyph_map[char_id] = self.glyph_to_path(glyph) + glyph_map_new[char_id] = self.glyph_to_path(glyph) currx += (kern / 64.0) @@ -190,12 +198,13 @@ def get_glyphs_with_font(self, font, s, glyph_map=None): rects = [] - return zip(glyph_ids, xpositions, ypositions, sizes), glyph_map, rects + return zip(glyph_ids, xpositions, ypositions, sizes), glyph_map_new, rects - def get_glyphs_mathtext(self, prop, s): + def get_glyphs_mathtext(self, prop, s, glyph_map=None, + return_new_glyphs_only=False): """ convert the string *s* to vertices and codes by parsing it with mathtext. """ @@ -207,8 +216,14 @@ def get_glyphs_mathtext(self, prop, s): s, self.DPI, prop) - glyph_map = dict() - + if glyph_map is None: + glyph_map = dict() + + if return_new_glyphs_only: + glyph_map_new = dict() + else: + glyph_map_new = glyph_map + xpositions = [] ypositions = [] glyph_ids = [] @@ -223,7 +238,7 @@ def get_glyphs_mathtext(self, prop, s): font.clear() font.set_size(self.FONT_SCALE, self.DPI) glyph = font.load_char(ccode, flags=LOAD_NO_HINTING) - glyph_map[char_id] = self.glyph_to_path(glyph) + glyph_map_new[char_id] = self.glyph_to_path(glyph) xpositions.append(ox) ypositions.append(oy) @@ -253,7 +268,8 @@ def get_texmanager(self): return self._texmanager - def get_glyphs_tex(self, prop, s): + def get_glyphs_tex(self, prop, s, glyph_map=None, + return_new_glyphs_only=False): """ convert the string *s* to vertices and codes using matplotlib's usetex mode. """ @@ -275,8 +291,17 @@ def get_glyphs_tex(self, prop, s): page = iter(dvi).next() dvi.close() + + if glyph_map is None: + glyph_map = dict() + + if return_new_glyphs_only: + glyph_map_new = dict() + else: + glyph_map_new = glyph_map + + glyph_ids, xpositions, ypositions, sizes = [], [], [], [] - glyph_map = dict() # Gather font information and do some setup for combining # characters into strings. @@ -316,7 +341,7 @@ def get_glyphs_tex(self, prop, s): else: glyph0 = font.load_glyph(ng, flags=ft2font_flag) - glyph_map[char_id] = self.glyph_to_path(glyph0) + glyph_map_new[char_id] = self.glyph_to_path(glyph0) glyph_ids.append(char_id) xpositions.append(x1) From 03a3b8e16dfa54c730625318082e08ac2123de30 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 15 Sep 2009 20:04:22 +0000 Subject: [PATCH 0251/1000] Fix multiprocessing of gallery. Change how gallery.html is generated to prevent a full rebuild. svn path=/trunk/matplotlib/; revision=7765 --- doc/sphinxext/gen_gallery.py | 24 +++++++++++++++++------- 1 file changed, 17 insertions(+), 7 deletions(-) diff --git a/doc/sphinxext/gen_gallery.py b/doc/sphinxext/gen_gallery.py index f097003dbcb7..f916c575681c 100644 --- a/doc/sphinxext/gen_gallery.py +++ b/doc/sphinxext/gen_gallery.py @@ -18,6 +18,9 @@ multiimage = re.compile('(.*)_\d\d') +def make_thumbnail(args): + image.thumbnail(args[0], args[1], 0.3) + def out_of_date(original, derived): return (not os.path.exists(derived) or os.stat(derived).st_mtime < os.stat(original).st_mtime) @@ -87,16 +90,23 @@ def gen_gallery(app, doctree): link = 'examples/%s/%s.html'%(subdir, basename) rows.append(link_template%(link, thumbfile, basename)) - fh = file(os.path.join(app.builder.srcdir, '_templates', 'gallery.html'), - 'w') - fh.write(template%'\n'.join(rows)) - fh.close() + # Only write out the file if the contents have actually changed. + # Otherwise, this triggers a full rebuild of the docs + content = template%'\n'.join(rows) + gallery_path = os.path.join(app.builder.srcdir, '_templates', 'gallery.html') + if os.path.exists(gallery_path): + fh = file(gallery_path, 'r') + regenerate = fh.read() != content + fh.close() + else: + regenerate = True + if regenerate: + fh = file(gallery_path, 'w') + fh.write(content) + fh.close() try: import multiprocessing - def make_thumbnail(args): - image.thumbnail(args[0], args[1], 0.3) - app.builder.info("generating thumbnails... ", nonl=True) pool = multiprocessing.Pool() pool.map(make_thumbnail, thumbnails.iteritems()) From b20ed6ef2b7a38769c4f47800c539bb883cb3aa2 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 15 Sep 2009 20:10:35 +0000 Subject: [PATCH 0252/1000] Update plot_directive to support the features Fernando requested. A little bit of refactoring to simplify it -- though hackish problems warrant hackish solutions sometimes ;) svn path=/trunk/matplotlib/; revision=7766 --- doc/conf.py | 2 +- lib/matplotlib/sphinxext/plot_directive.py | 281 +++++++++++++-------- 2 files changed, 178 insertions(+), 105 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index f5e23c3021a3..0fc587dfd32d 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -80,7 +80,7 @@ # Plot directive configuration # ---------------------------- -plot_formats = ['png', 'hires.png', 'pdf'] +plot_formats = [('png', 80), ('hires.png', 200), ('pdf', 50)] # Options for HTML output # ----------------------- diff --git a/lib/matplotlib/sphinxext/plot_directive.py b/lib/matplotlib/sphinxext/plot_directive.py index c82b47d002f6..9b61f2091929 100644 --- a/lib/matplotlib/sphinxext/plot_directive.py +++ b/lib/matplotlib/sphinxext/plot_directive.py @@ -1,27 +1,55 @@ """A special directive for including a matplotlib plot. -Given a path to a .py file, it includes the source code inline, then: +The source code for the plot may be included in one of two ways: -- On HTML, will include a .png with a link to a high-res .png. + 1. A path to a source file as the argument to the directive:: -- On LaTeX, will include a .pdf + .. plot:: path/to/plot.py -This directive supports all of the options of the `image` directive, -except for `target` (since plot will add its own target). + When a path to a source file is given, the content of the + directive may optionally contain a caption for the plot:: -Additionally, if the :include-source: option is provided, the literal -source will be included inline, as well as a link to the source. + .. plot:: path/to/plot.py + + This is the caption for the plot + + Additionally, one my specify the name of a function to call (with + no arguments) immediately after importing the module:: + + .. plot:: path/to/plot.py plot_function1 + + 2. Included as inline content to the directive:: + + .. plot:: + + import matplotlib.pyplot as plt + import matplotlib.image as mpimg + import numpy as np + img = mpimg.imread('_static/stinkbug.png') + imgplot = plt.imshow(img) + +In HTML output, `plot` will include a .png file with a link to a high-res +.png and .pdf. In LaTeX output, it will include a .pdf. + +To customize the size of the plot, this directive supports all of the +options of the `image` directive, except for `target` (since plot will +add its own target). These include `alt`, `height`, `width`, `scale`, +`align` and `class`. + +Additionally, if the `:include-source:` option is provided, the +literal source will be displayed inline in the text, (as well as a +link to the source in HTML). The set of file formats to generate can be specified with the -plot_formats configuration variable. +`plot_formats` configuration variable. """ -import sys, os, glob, shutil, hashlib, imp, warnings, cStringIO -import re +import sys, os, shutil, imp, warnings, cStringIO, re try: from hashlib import md5 except ImportError: from md5 import md5 + from docutils.parsers.rst import directives try: # docutils 0.4 @@ -30,13 +58,12 @@ # docutils 0.5 from docutils.parsers.rst.directives.images import Image align = Image.align -from docutils import nodes import sphinx sphinx_version = sphinx.__version__.split(".") # The split is necessary for sphinx beta versions where the string is # '6b1' -sphinx_version = tuple([int(re.split('[a-z]', x)[0]) +sphinx_version = tuple([int(re.split('[a-z]', x)[0]) for x in sphinx_version[:2]]) import matplotlib @@ -45,12 +72,14 @@ import matplotlib.pyplot as plt import matplotlib.image as image from matplotlib import _pylab_helpers +from matplotlib.sphinxext import only_directives -import only_directives - +# os.path.relpath is new in Python 2.6 if hasattr(os.path, 'relpath'): relpath = os.path.relpath else: + # This code is snagged from Python 2.6 + def relpath(target, base=os.curdir): """ Return a relative path to the target from either the current dir or an optional base dir. @@ -66,46 +95,42 @@ def relpath(target, base=os.curdir): base_list = (os.path.abspath(base)).split(os.sep) target_list = (os.path.abspath(target)).split(os.sep) - # On the windows platform the target may be on a completely different drive from the base. + # On the windows platform the target may be on a completely + # different drive from the base. if os.name in ['nt','dos','os2'] and base_list[0] <> target_list[0]: raise OSError, 'Target is on a different drive to base. Target: '+target_list[0].upper()+', base: '+base_list[0].upper() - # Starting from the filepath root, work out how much of the filepath is - # shared by base and target. + # Starting from the filepath root, work out how much of the + # filepath is shared by base and target. for i in range(min(len(base_list), len(target_list))): if base_list[i] <> target_list[i]: break else: - # If we broke out of the loop, i is pointing to the first differing path elements. - # If we didn't break out of the loop, i is pointing to identical path elements. - # Increment i so that in all cases it points to the first differing path elements. + # If we broke out of the loop, i is pointing to the first + # differing path elements. If we didn't break out of the + # loop, i is pointing to identical path elements. + # Increment i so that in all cases it points to the first + # differing path elements. i+=1 rel_list = [os.pardir] * (len(base_list)-i) + target_list[i:] return os.path.join(*rel_list) -def write_char(s): - sys.stdout.write(s) - sys.stdout.flush() - -options = {'alt': directives.unchanged, - 'height': directives.length_or_unitless, - 'width': directives.length_or_percentage_or_unitless, - 'scale': directives.nonnegative_int, - 'align': align, - 'class': directives.class_option, - 'include-source': directives.flag } - template = """ .. htmlonly:: - [%(links)s] + %(links)s + + .. figure:: %(prefix)s%(tmpdir)s/%(outname)s.png +%(options)s - .. image:: %(prefix)s%(tmpdir)s/%(outname)s.png - %(options)s +%(caption)s .. latexonly:: - .. image:: %(prefix)s%(tmpdir)s/%(outname)s.pdf - %(options)s + .. figure:: %(prefix)s%(tmpdir)s/%(outname)s.pdf +%(options)s + +%(caption)s + """ exception_template = """ @@ -117,60 +142,66 @@ def write_char(s): """ +template_content_indent = ' ' + def out_of_date(original, derived): """ Returns True if derivative is out-of-date wrt original, both of which are full file paths. """ - return (not os.path.exists(derived)) - # or os.stat(derived).st_mtime < os.stat(original).st_mtime) + return (not os.path.exists(derived) or + (os.path.exists(original) and + os.stat(derived).st_mtime < os.stat(original).st_mtime)) -def runfile(fullpath): +def import_file(plot_path, function_name): """ - Import a Python module from a path. + Import a Python module from a path, and run the function given by + name, if function_name is not None. """ # Change the working directory to the directory of the example, so - # it can get at its data files, if any. + # it can get at its data files, if any. Add its path to sys.path + # so it can import any helper modules sitting beside it. pwd = os.getcwd() - path, fname = os.path.split(fullpath) + path, fname = os.path.split(plot_path) sys.path.insert(0, os.path.abspath(path)) stdout = sys.stdout sys.stdout = cStringIO.StringIO() os.chdir(path) try: fd = open(fname) - module = imp.load_module("__main__", fd, fname, ('py', 'r', imp.PY_SOURCE)) + module = imp.load_module( + "__main__", fd, fname, ('py', 'r', imp.PY_SOURCE)) finally: del sys.path[0] os.chdir(pwd) sys.stdout = stdout + fd.close() + + if function_name is not None: + print "function_name", function_name + getattr(module, function_name)() + return module -def makefig(fullpath, code, outdir): +def render_figures(plot_path, function_name, plot_code, outdir, formats): """ - run a pyplot script and save the low and high res PNGs and a PDF in _static + Run a pyplot script and save the low and high res PNGs and a PDF + in outdir. """ - formats = [('png', 80), ('hires.png', 200), ('pdf', 50)] - - fullpath = str(fullpath) # todo, why is unicode breaking this - basedir, fname = os.path.split(fullpath) + plot_path = str(plot_path) # todo, why is unicode breaking this + basedir, fname = os.path.split(plot_path) basename, ext = os.path.splitext(fname) - if str(basename) == "None": - import pdb - pdb.set_trace() - all_exists = True # Look for single-figure output files first for format, dpi in formats: outname = os.path.join(outdir, '%s.%s' % (basename, format)) - if out_of_date(fullpath, outname): + if out_of_date(plot_path, outname): all_exists = False break if all_exists: - write_char('.' * len(formats)) return 1 # Then look for multi-figure output files, assuming @@ -179,8 +210,9 @@ def makefig(fullpath, code, outdir): while True: all_exists = True for format, dpi in formats: - outname = os.path.join(outdir, '%s_%02d.%s' % (basename, i, format)) - if out_of_date(fullpath, outname): + outname = os.path.join( + outdir, '%s_%02d.%s' % (basename, i, format)) + if out_of_date(plot_path, outname): all_exists = False break if all_exists: @@ -189,23 +221,24 @@ def makefig(fullpath, code, outdir): break if i != 0: - write_char('.' * i * len(formats)) return i # We didn't find the files, so build them - plt.close('all') # we need to clear between runs + # Clear any existing figures + plt.close('all') matplotlib.rcdefaults() - # Set a figure size that doesn't overflow typical browser windows + # Set a default figure size that doesn't overflow typical browser + # windows. The script is free to override it if necessary. matplotlib.rcParams['figure.figsize'] = (5.5, 4.5) - if code is not None: - exec(code) + if plot_code is not None: + exec(plot_code) else: try: - runfile(fullpath) + import_file(plot_path, function_name) except: - s = cbook.exception_to_str("Exception running plot %s" % fullpath) + s = cbook.exception_to_str("Exception running plot %s" % plot_path) warnings.warn(s) return 0 @@ -220,38 +253,20 @@ def makefig(fullpath, code, outdir): try: figman.canvas.figure.savefig(outpath, dpi=dpi) except: - s = cbook.exception_to_str("Exception running plot %s" % fullpath) + s = cbook.exception_to_str("Exception running plot %s" % plot_path) warnings.warn(s) return 0 - write_char('*') - return len(fig_managers) -def plot_directive(name, arguments, options, content, lineno, - content_offset, block_text, state, state_machine): - """ - Handle the plot directive. - """ +def _plot_directive(plot_path, basedir, function_name, plot_code, caption, + options, state_machine): formats = setup.config.plot_formats if type(formats) == str: formats = eval(formats) - # The user may provide a filename *or* Python code content, but not both - if len(arguments) == 1: - reference = directives.uri(arguments[0]) - basedir, fname = os.path.split(reference) - basename, ext = os.path.splitext(fname) - basedir = relpath(basedir, setup.app.builder.srcdir) - if len(content): - raise ValueError("plot directive may not specify both a filename and inline content") - content = None - else: - basedir = "inline" - content = '\n'.join(content) - # Since we don't have a filename, use a hash based on the content - reference = basename = md5(content).hexdigest()[-10:] - fname = None + fname = os.path.basename(plot_path) + basename, ext = os.path.splitext(fname) # Get the directory of the rst file, and determine the relative # path from the resulting html file to the plot_directive links @@ -271,8 +286,8 @@ def plot_directive(name, arguments, options, content, lineno, # Prior to Sphinx 0.6, absolute image paths were treated as # relative to the root of the filesystem. 0.6 and after, they are - # treated as relative to the root of the documentation tree. We need - # to support both methods here. + # treated as relative to the root of the documentation tree. We + # need to support both methods here. tmpdir = os.path.join('build', outdir) if sphinx_version < (0, 6): tmpdir = os.path.abspath(tmpdir) @@ -288,23 +303,36 @@ def plot_directive(name, arguments, options, content, lineno, if not os.path.exists(destdir): cbook.mkdirs(destdir) + # Properly indent the caption + caption = '\n'.join(template_content_indent + line.strip() + for line in caption.split('\n')) + # Generate the figures, and return the number of them - num_figs = makefig(reference, content, tmpdir) + num_figs = render_figures(plot_path, function_name, plot_code, tmpdir, + formats) + + # Now start generating the lines of output + lines = [] if options.has_key('include-source'): - if content is None: - content = open(reference, 'r').read() - lines = ['::', ''] + [' %s'%row.rstrip() for row in content.split('\n')] + if plot_code is None: + fd = open(plot_path, 'r') + plot_code = fd.read() + fd.close() + lines.extend(['::', '']) + lines.extend([' %s' % row.rstrip() + for row in plot_code.split('\n')]) + lines.append('') del options['include-source'] else: lines = [] if num_figs > 0: - options = [' :%s: %s' % (key, val) for key, val in - options.items()] + options = ['%s:%s: %s' % (template_content_indent, key, val) + for key, val in options.items()] options = "\n".join(options) - if fname is not None: - shutil.copyfile(reference, os.path.join(destdir, fname)) + if plot_code is None: + shutil.copyfile(plot_path, os.path.join(destdir, fname)) for i in range(num_figs): if num_figs == 1: @@ -315,15 +343,17 @@ def plot_directive(name, arguments, options, content, lineno, # Copy the linked-to files to the destination within the build tree, # and add a link for them links = [] - if fname is not None: + if plot_code is None: links.append('`source code <%(linkdir)s/%(basename)s.py>`__') - for format in formats[1:]: + for format, dpi in formats[1:]: shutil.copyfile(os.path.join(tmpdir, outname + "." + format), os.path.join(destdir, outname + "." + format)) links.append('`%s <%s/%s.%s>`__' % (format, linkdir, outname, format)) - links = ', '.join(links) % locals() + if len(links): + links = '[%s]' % (', '.join(links) % locals()) + else: + links = '' - # Output the resulting reST lines.extend((template % locals()).split('\n')) else: lines.extend((exception_template % locals()).split('\n')) @@ -334,14 +364,57 @@ def plot_directive(name, arguments, options, content, lineno, return [] +def plot_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + """ + Handle the arguments to the plot directive. The real work happens + in _plot_directive. + """ + # The user may provide a filename *or* Python code content, but not both + if len(arguments): + plot_path = directives.uri(arguments[0]) + basedir = relpath(os.path.dirname(plot_path), setup.app.builder.srcdir) + + # If there is content, it will be passed as a caption. + + # Indent to match expansion below. XXX - The number of spaces matches + # that of the 'options' expansion further down. This should be moved + # to common code to prevent them from diverging accidentally. + caption = '\n'.join(content) + + # If the optional function name is provided, use it + if len(arguments) == 2: + function_name = arguments[1] + else: + function_name = None + + return _plot_directive(plot_path, basedir, function_name, None, caption, + options, state_machine) + else: + plot_code = '\n'.join(content) + + # Since we don't have a filename, use a hash based on the content + plot_path = md5(plot_code).hexdigest()[-10:] + + return _plot_directive(plot_path, 'inline', None, plot_code, '', options, + state_machine) + def setup(app): setup.app = app setup.config = app.config setup.confdir = app.confdir - app.add_directive('plot', plot_directive, True, (0, 1, 0), **options) + options = {'alt': directives.unchanged, + 'height': directives.length_or_unitless, + 'width': directives.length_or_percentage_or_unitless, + 'scale': directives.nonnegative_int, + 'align': align, + 'class': directives.class_option, + 'include-source': directives.flag } + + app.add_directive('plot', plot_directive, True, (0, 2, 0), **options) app.add_config_value( 'plot_formats', - ['png', 'hires.png', 'pdf'], + [('png', 80), ('hires.png', 200), ('pdf', 50)], True) From 8e1557916d98c80d921a31c553d8735a8b00c15b Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 16 Sep 2009 14:12:27 +0000 Subject: [PATCH 0253/1000] Minor fixes to plot_directive svn path=/trunk/matplotlib/; revision=7767 --- lib/matplotlib/sphinxext/plot_directive.py | 130 +++++++++++---------- 1 file changed, 71 insertions(+), 59 deletions(-) diff --git a/lib/matplotlib/sphinxext/plot_directive.py b/lib/matplotlib/sphinxext/plot_directive.py index 9b61f2091929..6f4bf7e4e192 100644 --- a/lib/matplotlib/sphinxext/plot_directive.py +++ b/lib/matplotlib/sphinxext/plot_directive.py @@ -153,7 +153,7 @@ def out_of_date(original, derived): (os.path.exists(original) and os.stat(derived).st_mtime < os.stat(original).st_mtime)) -def import_file(plot_path, function_name): +def run_code(plot_path, function_name, plot_code): """ Import a Python module from a path, and run the function given by name, if function_name is not None. @@ -161,29 +161,62 @@ def import_file(plot_path, function_name): # Change the working directory to the directory of the example, so # it can get at its data files, if any. Add its path to sys.path # so it can import any helper modules sitting beside it. - pwd = os.getcwd() - path, fname = os.path.split(plot_path) - sys.path.insert(0, os.path.abspath(path)) - stdout = sys.stdout - sys.stdout = cStringIO.StringIO() - os.chdir(path) - try: - fd = open(fname) - module = imp.load_module( - "__main__", fd, fname, ('py', 'r', imp.PY_SOURCE)) - finally: - del sys.path[0] - os.chdir(pwd) - sys.stdout = stdout - fd.close() - - if function_name is not None: - print "function_name", function_name - getattr(module, function_name)() - - return module - -def render_figures(plot_path, function_name, plot_code, outdir, formats): + if plot_code is not None: + exec(plot_code) + else: + pwd = os.getcwd() + path, fname = os.path.split(plot_path) + sys.path.insert(0, os.path.abspath(path)) + stdout = sys.stdout + sys.stdout = cStringIO.StringIO() + os.chdir(path) + try: + fd = open(fname) + module = imp.load_module( + "__plot__", fd, fname, ('py', 'r', imp.PY_SOURCE)) + finally: + del sys.path[0] + os.chdir(pwd) + sys.stdout = stdout + fd.close() + + if function_name is not None: + getattr(module, function_name)() + +def run_savefig(plot_path, basename, tmpdir, destdir, formats): + """ + Once a plot script has been imported, this function runs savefig + on all of the figures in all of the desired formats. + """ + fig_managers = _pylab_helpers.Gcf.get_all_fig_managers() + for i, figman in enumerate(fig_managers): + for j, (format, dpi) in enumerate(formats): + if len(fig_managers) == 1: + outname = basename + else: + outname = "%s_%02d" % (basename, i) + outname = outname + "." + format + outpath = os.path.join(tmpdir, outname) + try: + figman.canvas.figure.savefig(outpath, dpi=dpi) + except: + s = cbook.exception_to_str("Exception saving plot %s" % plot_path) + warnings.warn(s) + return 0 + if j > 0: + shutil.copyfile(outpath, os.path.join(destdir, outname)) + + return len(fig_managers) + +def clear_state(): + plt.close('all') + matplotlib.rcdefaults() + # Set a default figure size that doesn't overflow typical browser + # windows. The script is free to override it if necessary. + matplotlib.rcParams['figure.figsize'] = (5.5, 4.5) + +def render_figures(plot_path, function_name, plot_code, tmpdir, destdir, + formats): """ Run a pyplot script and save the low and high res PNGs and a PDF in outdir. @@ -196,7 +229,7 @@ def render_figures(plot_path, function_name, plot_code, outdir, formats): # Look for single-figure output files first for format, dpi in formats: - outname = os.path.join(outdir, '%s.%s' % (basename, format)) + outname = os.path.join(tmpdir, '%s.%s' % (basename, format)) if out_of_date(plot_path, outname): all_exists = False break @@ -211,7 +244,7 @@ def render_figures(plot_path, function_name, plot_code, outdir, formats): all_exists = True for format, dpi in formats: outname = os.path.join( - outdir, '%s_%02d.%s' % (basename, i, format)) + tmpdir, '%s_%02d.%s' % (basename, i, format)) if out_of_date(plot_path, outname): all_exists = False break @@ -225,39 +258,20 @@ def render_figures(plot_path, function_name, plot_code, outdir, formats): # We didn't find the files, so build them - # Clear any existing figures - plt.close('all') - matplotlib.rcdefaults() - # Set a default figure size that doesn't overflow typical browser - # windows. The script is free to override it if necessary. - matplotlib.rcParams['figure.figsize'] = (5.5, 4.5) + clear_state() + try: + run_code(plot_path, function_name, plot_code) + except: + s = cbook.exception_to_str("Exception running plot %s" % plot_path) + warnings.warn(s) + return 0 - if plot_code is not None: - exec(plot_code) - else: - try: - import_file(plot_path, function_name) - except: - s = cbook.exception_to_str("Exception running plot %s" % plot_path) - warnings.warn(s) - return 0 + num_figs = run_savefig(plot_path, basename, tmpdir, destdir, formats) - fig_managers = _pylab_helpers.Gcf.get_all_fig_managers() - for i, figman in enumerate(fig_managers): - for format, dpi in formats: - if len(fig_managers) == 1: - outname = basename - else: - outname = "%s_%02d" % (basename, i) - outpath = os.path.join(outdir, '%s.%s' % (outname, format)) - try: - figman.canvas.figure.savefig(outpath, dpi=dpi) - except: - s = cbook.exception_to_str("Exception running plot %s" % plot_path) - warnings.warn(s) - return 0 + if '__plot__' in sys.modules: + del sys.modules['__plot__'] - return len(fig_managers) + return num_figs def _plot_directive(plot_path, basedir, function_name, plot_code, caption, options, state_machine): @@ -309,7 +323,7 @@ def _plot_directive(plot_path, basedir, function_name, plot_code, caption, # Generate the figures, and return the number of them num_figs = render_figures(plot_path, function_name, plot_code, tmpdir, - formats) + destdir, formats) # Now start generating the lines of output lines = [] @@ -346,8 +360,6 @@ def _plot_directive(plot_path, basedir, function_name, plot_code, caption, if plot_code is None: links.append('`source code <%(linkdir)s/%(basename)s.py>`__') for format, dpi in formats[1:]: - shutil.copyfile(os.path.join(tmpdir, outname + "." + format), - os.path.join(destdir, outname + "." + format)) links.append('`%s <%s/%s.%s>`__' % (format, linkdir, outname, format)) if len(links): links = '[%s]' % (', '.join(links) % locals()) From 0eb1054530ff2002d00969bb5b163afe9885ccd8 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 16 Sep 2009 14:12:49 +0000 Subject: [PATCH 0254/1000] Minor fix to gen_gallery to ensure multiprocessing code path works svn path=/trunk/matplotlib/; revision=7768 --- doc/sphinxext/gen_gallery.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/doc/sphinxext/gen_gallery.py b/doc/sphinxext/gen_gallery.py index f916c575681c..d47df8a7f088 100644 --- a/doc/sphinxext/gen_gallery.py +++ b/doc/sphinxext/gen_gallery.py @@ -110,6 +110,8 @@ def gen_gallery(app, doctree): app.builder.info("generating thumbnails... ", nonl=True) pool = multiprocessing.Pool() pool.map(make_thumbnail, thumbnails.iteritems()) + pool.close() + pool.join() app.builder.info("done") except ImportError: From 13bd248de60907e41127f3a9bea42c7ea066ca5b Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 16 Sep 2009 14:13:26 +0000 Subject: [PATCH 0255/1000] Comment out image display so that documentation generation doesn't block. svn path=/trunk/matplotlib/; revision=7769 --- examples/pylab_examples/to_numeric.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/examples/pylab_examples/to_numeric.py b/examples/pylab_examples/to_numeric.py index f771d5328461..67aff0a2731e 100644 --- a/examples/pylab_examples/to_numeric.py +++ b/examples/pylab_examples/to_numeric.py @@ -29,5 +29,5 @@ X.shape = h, w, 3 im = Image.fromstring( "RGB", (w,h), s) -im.show() +# im.show() From 10574279d718255c9f16fd41e3aeb4fb0c33c637 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Wed, 16 Sep 2009 23:42:07 +0000 Subject: [PATCH 0256/1000] Merged revisions 7770 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7770 | efiring | 2009-09-16 13:38:54 -1000 (Wed, 16 Sep 2009) | 2 lines Don't use wxversion with py2exe; fix by Werner Bruhin ........ svn path=/trunk/matplotlib/; revision=7771 --- lib/matplotlib/backends/backend_wx.py | 37 ++++++++++++++------------- 1 file changed, 19 insertions(+), 18 deletions(-) diff --git a/lib/matplotlib/backends/backend_wx.py b/lib/matplotlib/backends/backend_wx.py index 03b4acc7e9ba..e3161ee68482 100644 --- a/lib/matplotlib/backends/backend_wx.py +++ b/lib/matplotlib/backends/backend_wx.py @@ -110,24 +110,25 @@ missingwx = "Matplotlib backend_wx and backend_wxagg require wxPython >=2.8" -try: - import wxversion -except ImportError: - raise ImportError(missingwx) - -# Some early versions of wxversion lack AlreadyImportedError. -# It was added around 2.8.4? -try: - _wx_ensure_failed = wxversion.AlreadyImportedError -except AttributeError: - _wx_ensure_failed = wxversion.VersionError - -try: - wxversion.ensureMinimal('2.8') -except _wx_ensure_failed: - pass -# We don't really want to pass in case of VersionError, but when -# AlreadyImportedError is not available, we have to. +if not hasattr(sys, 'frozen'): # i.e., not py2exe + try: + import wxversion + except ImportError: + raise ImportError(missingwx) + + # Some early versions of wxversion lack AlreadyImportedError. + # It was added around 2.8.4? + try: + _wx_ensure_failed = wxversion.AlreadyImportedError + except AttributeError: + _wx_ensure_failed = wxversion.VersionError + + try: + wxversion.ensureMinimal('2.8') + except _wx_ensure_failed: + pass + # We don't really want to pass in case of VersionError, but when + # AlreadyImportedError is not available, we have to. try: import wx From 33c03753afe78aee15d1330a1912a1448191dcca Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Thu, 17 Sep 2009 14:35:55 +0000 Subject: [PATCH 0257/1000] Merged revisions 7772 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7772 | mdboom | 2009-09-17 10:17:48 -0400 (Thu, 17 Sep 2009) | 2 lines Fix clip path in SVG backend. ........ svn path=/trunk/matplotlib/; revision=7773 --- lib/matplotlib/backends/backend_svg.py | 1 + 1 file changed, 1 insertion(+) diff --git a/lib/matplotlib/backends/backend_svg.py b/lib/matplotlib/backends/backend_svg.py index 31765c870487..b898281ad960 100644 --- a/lib/matplotlib/backends/backend_svg.py +++ b/lib/matplotlib/backends/backend_svg.py @@ -165,6 +165,7 @@ def _get_gc_clip_svg(self, gc): cliprect = gc.get_clip_rectangle() clippath, clippath_trans = gc.get_clip_path() if clippath is not None: + clippath_trans = self._make_flip_transform(clippath_trans) path_data = self._convert_path(clippath, clippath_trans) path = '' % path_data elif cliprect is not None: From 5b2f47efe8a28a3b07bbd6eb299f505c378ae7a0 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Thu, 17 Sep 2009 14:59:04 +0000 Subject: [PATCH 0258/1000] Merged revisions 7774 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7774 | mdboom | 2009-09-17 10:56:00 -0400 (Thu, 17 Sep 2009) | 2 lines Fix bug whereby non-finite values in the path were not being ignored by the view limits finding algorithm. ........ svn path=/trunk/matplotlib/; revision=7775 --- src/_path.cpp | 11 ++++------- 1 file changed, 4 insertions(+), 7 deletions(-) diff --git a/src/_path.cpp b/src/_path.cpp index 1baf9f0f883e..1ef9d6f94a41 100644 --- a/src/_path.cpp +++ b/src/_path.cpp @@ -270,12 +270,14 @@ void get_path_extents(PathIterator& path, const agg::trans_affine& trans, double* xm, double* ym) { typedef agg::conv_transform transformed_path_t; - typedef agg::conv_curve curve_t; + typedef PathNanRemover nan_removed_t; + typedef agg::conv_curve curve_t; double x, y; unsigned code; transformed_path_t tpath(path, trans); - curve_t curved_path(tpath); + nan_removed_t nan_removed(tpath, true, path.has_curves()); + curve_t curved_path(nan_removed); curved_path.rewind(0); @@ -283,11 +285,6 @@ void get_path_extents(PathIterator& path, const agg::trans_affine& trans, { if ((code & agg::path_cmd_end_poly) == agg::path_cmd_end_poly) continue; - /* if (MPL_notisfinite64(x) || MPL_notisfinite64(y)) - continue; - We should not need the above, because the path iterator - should already be filtering out invalid values. - */ if (x < *x0) *x0 = x; if (y < *y0) *y0 = y; if (x > *x1) *x1 = x; From 25ccab8bc1306df4fd07028ab214279d676413a0 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Thu, 17 Sep 2009 20:00:23 +0000 Subject: [PATCH 0259/1000] Add test for non-finite limits svn path=/trunk/matplotlib/; revision=7777 --- .../test_axes/nonfinite_limits.png | Bin 0 -> 15709 bytes lib/matplotlib/tests/test_axes.py | 10 +++++++++- 2 files changed, 9 insertions(+), 1 deletion(-) create mode 100644 lib/matplotlib/tests/baseline_images/test_axes/nonfinite_limits.png diff --git a/lib/matplotlib/tests/baseline_images/test_axes/nonfinite_limits.png b/lib/matplotlib/tests/baseline_images/test_axes/nonfinite_limits.png new file mode 100644 index 0000000000000000000000000000000000000000..5dc1e19eddfc01194a3f6087967c8df09fdf2683 GIT binary patch literal 15709 zcmeHuXH-+La+DxR$r;HR+A)oiv=NYu5|t!5gJA$0 zBpuMNfZKINokQ@?|B%Js@cp;@w+!46gzg^tA0|^S!xll#BZ_}s z)A5dm8s8ptWQ$ctxuyH$z5Uy`b1mw$glJ)bp--`c zj_7(X%O$RkgPkII?~G{UwKR^#YiZuXYcM_jQWg}HedG}p>lN#z;!WA4*423HF9Q!v z_4y@DM>dU}mD9A|9YB!egB7n>fT-!K^e5n()&Kwdf6sx6NS0(#@5S;d5zqO)Z!w}= zJ4>}eC4)|t1s5?0mWTcYuP;1YN!+aB618qI3Y?$K%G1RHuZ!T(9p~zG*ZKSgtFJFE z*g85kTg&bA7Znw~VmX2!N+~#3a z-7ob_d^k#nJq@?l=b~9KC4-ziWGvmeD<8(is@nfPdC|39o-vZ;VfX#O z*=RTI+W5F_-KhmG`w)&3Be7n#Gk%`Z;F?C471-b$830iK%{@?;En2)n!Q* zPmVE{?Cyy7BvNT9RO}PGrSE_L2)kwF$oLWJyScbf)g?TY5hy9K-c?KR;u=}c1w&Jb`If~Lah zaOnjd`q0u^nS3D;OD*jC`6H%V*RA%52O6WIqC(C|id<9(Q&Cn{enQ8VcuZpG!}ucv zD|4sn3TcduXe5#tAZ}2U>8;wDC|`c&(s{|Xw$pMW_nuljJl5DumjwsjAHpQs7>1=~ zl5)4{KdDdsANKGNJJJZId#egXSM`}dD-(Ww3CKjQ?h z;FWxDm*rTKYWxH0;J=ph!*k9w_c>Ks?5#I7)2%DPv{JR>|JA6YNlG>BF)7{zOO0f+0W7MX;@nF*f#|j>XA}hT$ZrFoS_bKx$Lj3?BX|Q z?5QYABAk{_2@3K``0M5y79xcKIl$A3HxZs1D1^!RWl8xSd$Sr;5^ z{5d)@^eLMfc`d`D{cWmYsYS1G#AdA=X=n;R>?Hw1>CmCLH022EL<1j-v37+B(rWNK zEoxfMB_H(_f;#7oC-f63ew(nLsu)<YFO@|6038yx6(`V5~?%e+Z(EP z?ld+Z)o_F@xZ^;)2Zv>UVqN$52sh|XOaHCMOL)S}={Nt&sc(Oq;~oxA(s#8qXK!JJ2o{whA`Ze|%8qf&ls6%8^PdQ*w;*=KY5n{&`lntSX_p z(VxN1yfd#Ia=&W9(UR+6rYWpi^{L9I&NsAH=v-dS9hI1~Vwv1$trKIamI4T2(y>Z3 zAH-ocsbY#s$+ws7lPz|)%%Yb=#g#TjD$Dq~Wp~*97H;#i(%u~gW9!a)gn?fA@BO{$ z`hvmliyv-iimAyIpBe7+v9^~$q++S4u-bm4iAV*B`Y-{dTcAXK#JG5GGfgR&t?wx{ zZdMD6*ql|4<^<^-@*+O(01FaY6A=8?Wj?=dy1tT_kX;*C?t_uKNOJ)9q}W1nrO%u& z?8W6Z9699YEaGNWFydQR!>qt+@G5MxTBzT5uAr0Z1ss&v3y`IRx}}ONZWi-;dOv6P zC6iYnCokgZ0y1CU=}uATx5en6hDj@m@84VbdQrZ=Y-iETu6wAwu4Qy7C}<^3h+}6# zZ@xPJ(?QD&nq&cB%WVB$Gz7N&GBc%aYC3v9*R}Z=|L@cUz1lk=_vg#4g_{rK>Os#n zVo9qJv}{JgpO?QsRJ6D6$kJQ+M8`?owG#fEzq6<)5oC@LquH0HO|~)#sy@@LuX}~n zH}kbsF@cj%v%|?~q(L9%RXa##Mw-D4CfiN62=qAe8;X&CeyO{@(kvnLyneIR^y*@P zaz~mnY$KBfwsE}BLNVWFcVjR(kCycogMd=WPyzSZFHcT~KRn1GAb@V+C>;O7%8(o1 z;fCqvZ z`xPW>G>;bPvH9`YjJLbs^YYh=gpRbj%=&vzPd^^J!Nz-22Kk-?+|N$cQcUzVlm7us z9bLQ)_V}Fl-IaIhr_;>i92?aRV=uzFe{B-t@*2{l50hTJm9D1RV_Mr6JT~MO{5gNn zX;Fs;y8{B2&{pL`sNT#yGvU3vJi3)z$$8@`!{f1sY%1bIABN%)F*ce5$q}SUiQr@V z41y{nq?Wf1{xiyTYwtlDrCE?>H4Mf^E3ejMC}(!F7C2Wv#n3?985#e4BzW|m+;PNC z6$bnf!O2m(=jhrbP`5aCgpqU5IVs+M<$3Qp*IUaph@}P=Iok*ObaZj9Dc{=eOnP27 zwzClJzgbCm^OSRMCpzJGL>C?OZI?ty@B;cuYXuhX7SE&;emv#c-*6@<$l@J}H2Zll zcf09N;12#Qt>viQG1inK|9txP5d<-=pMN8~RN!3lOG;?K*c>HSP-Wf#h3?YkOV^e8 ziFNT$3cx%2UnET{L?n0?;LcIxtm|1_aKz4{p{7(~KuO=zvE+yNee#l-Ov512#8U~e zL0R)B_@~n0s3CW4m#OzmqWGK=-kVnhYpzIs$3b*fpiPBs(8MBk4vnwOmbaQExb}By z>vCMZhA)%AsEy`NB`QV>T4o%;&BFHVzCUKfo9_Nm{^QALN%?RE2ivyB%H9%}!nv1g zb9$~=B=aP!sAS^rB0uB3^&?dweEh=~yl5-GIMsZ2*8C$x!|(7REN$%7a&DH|E%}wU z8+F^EH|PYE8ty&iknxL3IDs^#;gF)vS3CrvAcGM1t6O&qJ{^>wIdl0vH;Xuk=4oJ_ z$Is|m`m`~|+FOgYat1+rW_P-adl{th&Q&h`zhRPPL1-MsJZ7K24BJ`cQ);+I%b{m# z%+Fq$PK}I!J^FAEJbLZ+ZQ%}KD;1Z`_YaRNX2T#T|{IlFm%2*E1OQP=b8 zbP=bzAVZj`$L*DGqKZkf1ltS_uEf_z&+2$eAvR9NjmO)v)727UgGkXqgbPp4;jNPb z#8VW)TOQKMzGgJ>zF?i`W7WT$+zFXV`AXwB4&ugYzVh#Xp&_1AZFOJ%E(CwFNHPPY zC#3$?z$ls{4C8+t5xf;GSm(UzRJjoK=El>>DcHqiOM;>6b(=utD0Wcj5QnNU7J}Tq zn~VSW*YSzyV9giQbo>l4)JX9goDSi&uzA5udYskI@1OWs^C*5-PbR2!mM;>2vV z9I3BG_)SEbT_6Ed>Ez-a3Ka8S_;3BR$g9RjMHQT)LY`4+U3Q!NMu;+WBBhTp?-AuH zTVg~rdR`{a@EgbO{-7hM2i+OEUaF;dTr#yUXZPoqh-2d1aNIv{9=;XnKG!3l9L4X` zxop``;bFMvya)ME$Idb7gkvmHVmF>1U+8<$mYlB2*W? zAZS$9vHa{5mtYX9w|!oEzCSGAU1@3xqxG=em>-X| ze{QQAw5^S%Q4+NV^Td0Ow1^ljO{!9b=Rz#3>Ls~YHs<>C6D^lwh1XIdq%9H|37&Td zGs!g}%zCfF=5m!GH@q0e%@7&1^+l0!tO#k-0cOsEj1UoMF z$s^q7KS~)?h>?=^d3wBte5^Z4on6VKy3v)9>LxW>q>GQ{fIeR^BcoTr_C{$0SCYz; zqdbA+<#4XK96hiS$s_&dXKW(mgP*UTgN*IVQ!eTG7Z6viG{|u_uw?inh@<&|1Ntd6 zNAP@k{5P+f_~(~JbPEN(oUifgCm^_+5SwOo4aDwF1#vQ(yslc)T2bGBwYyOY3Sh}a zjhuz>JKJKUYJ7jMcD$0P3OUI5)>uTIKL^v55AzlXR#XFvVA#E!3C#J`(nw12ri~1VOL41<-B}psM5ssw-=;IK0oC;?xSW~tYE0Nb% zJ2qb!;aI|hKKlmGEUa1u(+&2f73y+4)TIR^=dx4PlL{g*NWudus)T<&KL$pvw(u!^ zWwK^B-8EYY^LmwV6q$xqZCsV38FoDV*RxPbxu1NmDhR-#Qs9fX~KRIL>O<6Pn9*@^C2JcCO8u=`i zk4M+4uzH{GcdkVr)5EG%ps)PgM3;tfx}aMii58G4kFlvk&H#t`;V=2=wvUso>fi-P zaGH=kJf4KatfSBx=t6W=F%J&vyknOb(g^VdS#sT;A(T&XItQUAh4g%*=eN0Zij$r8 zoW@YU-Pae8fk&|I>yr@V>_aN5V`e?sX1?7{l^oz5_gCczp%R?Z^BN#yxDrvCBeO7OZ&sG@_KOSxT5g`@wx@m+{?w?3<#3gtlVy*UTb0tF}Oma1SMjF64sZ+#l?6ILh zKiAoJgtZw0M>Km9Nu@)6j~0=-K%}~Mx;Z{3-c@PkWjH$ol)E$Pbv3MwK!pJl<^gZ{ zMAW!;5^uW6UhTeK2o8|Ggu_U(5t)TSs&AK6N1yeDPTh0(a?F){?myrq+{qKu8gP6N z{qFc0c^bg!KBq-K5`kr7<=+apGL3&A~Z(^e&kl-?|pgh!6q^C8q!TmE-EC``6l)*3%^Nxyq}ZnM~vb= zxi0-LSp1_QEMq?d(cf6OI(ZAV^mw5l$(e!Tc^w1^y@q*Ed>?G(&mV;JIL^(HI7lYZ z>1_DZ?_OgD|LVUtS0|Q5O{c=@rviM_XS|91F7OSQ<878-NCI)1iXYpkK#(~l%!A9` zqtDE`%(vIx;vo9&e+Kdy$D{w@EKoULtXDwZt{Xv_h$aU=4=P8|m-fkQPmh0p2nm;p zXWtu?pyp5X{9DqZ)|_1NFNS>WR~DSPtdkt8;Uxtv?Du_@c>U~6?}^B9$Omr90sN{D zWa5dt>H16U)qao)qSF_1pLh3-HmNYHZlI=v<1_XA1HnzE;o59(^VTJ@f|!b!{ptGU zm||<9Wd>~3sR!4_BVhCz&f9gpn?M)%!vDt+lnK-4=ub!`NV?&}gRYj(~5I#H}X~_Ou;R`DB;U)6*kfom<(= zX*W3<91PDOJKqMFeoq@aaQEA5;eIb-z~I`zZ>Kmd+LEs=Y%hhL5&omvZ_{L^ukFnZ zQTORK&j2S;5~)>he)SDF%I-^cU6~N&*`=8SxX;g{x~c&aLFm#Lsb|uk-n%i=nK8Uy z9V}SE?KhvVP$`#TFdXP7;_tn@p0M;P;UHq8o3%~*-DRxavQ=i2pGVUTeLq;BpxQa0_BGBwi^-G9-@hvfpc}iDGc(VBn0XOry+Js z?K>@_7`VSfv|bq}%m7*-yZ%l+k}2nhN?erx_(cL|9DC^yo`MchA$N_r&);5~Q4jJZ zg&W?vhPFOviX?1YX!2Kj@_FIb4jsR}@WkeOPKLe*6jZbDAlDSUk^y zwEjhP-ME6hjRpxd`+MN@grtul2uq!#_dDsa1}?6o_;W%2E02XxPT|5*aTg&zb+jg!Uit@`_ql`^z)Cg99 z=X{q=8b03hj!018N?{U*@$PR2kZB#2PjAz2hN%RuXQ2VX_8Jema`7ZF>0OK*ggXFx zLc~hiYM@L4fux;T`&)~?58&+Z!GgT#U`rq^cB`ipm64q#b>9ts%CDN(%nH9HRl%}k z?h8u+&gc%gBY5<60OKM&9nDE1 z2tp1&c|vL^Rk3a$yfskVr`4|!WrK_+c3K0ljTv<=fQ90{Oema};B07n6G&bi4jn#*p^o6ZajS9i0h)`XRGroUK#NzLE zI*1DsPM#PTC+|R{s^nB9Y->xAzR<=)ha6GA3D_aqo(+Xaiofe18#y)AQ zqgW+{?H6etP2^UK`|Pcw!JPDOu%Z&?f}++t`ry{^D}T%kmQsfC(L7=&>}`T}EcR3) zhz^)Q{P=S|{6eYv@v9#wY!jt<^erZ0cUF%;;NmjgeFnw%=b@i$FCfUdRkRmio?44T zIa;uJZ31|UW7l0EfJnrW?f7|t+lM3TK zhR)45nH^t2qAM;`yXzXb^@VNnBQ@Q(W(i{a;&5d&i%YqEuHwd^5Y%od+btCRk*;)* zjy2xUshk56>aXVEGEwieGbZ^=NlK8ShwV;7v>-j=3JHVPNX$`YUC-aaj#EP>U$dI9 zH2wnoMfAR*PJ5bibUc(+`z<0=MSRz$@trxB>~tW;CkQvZLeCc}h&-RRJ&KyQy7d_S zg4Py||1;5(z`Z$B>-rETNx);8!tm^*&Llj*7^o%yrxPB_Pdj!E3=E|A<~X^Kf`w{c zcdEXwnO>2l`4Bad$qbNA zW2R;b%mL^UzC(J_Ofo&@G3AL!jliSZ=NOEcPK)$3a7fe0iuM*YqsK z$@qDq(U(e$2nRs5`*GyG9lZ;~6=?Favk*}Y5GBf)XY$jxMVv>f&UyCTLyOz4b2+6b z-e#$A$Ep3T+2-n-8xc~2(CC5Vv_6okq;_@rA1J;ANRqe4ph(;o!XoWSa)V%}#ifBo z?@kGLb*mPYFsb)NhoCB~1&A2DaLU%!mf+EA96gs?>6A7FD?QaZ@>NxWBVdQKa>?Wl zG?Pg2fHWlfuMi3@W^1Ks(Z2`}>{{bP5WCj1FVw7dw=7o1$IaRJC?vn6>L3704YiU2 zVjx9$LE)rg;+&L@%ZQs5(5YrT2$B(`WNY&-yh2VrilfYMSJ*G1T%yw4uuv!zoX0Is5;hA zV1Xz%Gpa(3Xwdo_4*WCOqRQ&~6{UOjDOJZm^&yH3Lb~YdY=>{1g4a=Gj>U_j5%lyg zIK_S4g}2+m7JxQ#bDvkWs}Hdly3&~kF9^YU6+4TmT0Dz58t`q`F}7MM3S5AH0ep{+ z2e8RjtEndlp?K-oHpprJd6sU9K{SG3<~1lkjqQx+IUPq3?~634zsc<0FX*?bJ9`4= z<^p1Tw|-cBJ+T9?Q^sq*V-LTo1!XfNQvy~dHJRdVJMo)U87Q}YTER~SCCKn05UKTB z7+aC>t9Xav+Z`F|=&^oph6PuDexWR03!lv}QZP;pWBW&|O!T*S+XG-Zw$pH8Cy%sY z&=CLDDIcgfnATcAe+yW7Br6>!_ELdWc<(TbgU`=6l<_WODz#Kdat+UU)lq2p=rxsq z;xINq8yovi0nN1Eq5--y{ZlllidSK0oofGz52CA%vHhJPnHn+&paj|&pazM4)!2ux zm!LD@I=ac(1gee$iQaF$&s{AWItM${g{MCO>eDqez#XR~7O@{Y)fv4$QXx3s44fDS z`Uh}O@E0qil(JEgusM48*2B1~lD3Yj2aj^2(p+_!CiRodp8K*5y5pP4FghbqNxbj; zzjhjNR>j!fSC>mzTS|hOK6;AY_ArSXEk9(=&!{@SC;Fnj6v-~!=Z`tG#9Pejpaf99 z&O>XB!o~C8vk%jxJ}9RVf?WP4#`dndOe6sKig_le5aUWTv1eaP--U?YhW^FDbR1|0 z`k~m}HviBt%LgEu9oCB#;fRqVqK6qOkFnK21q^#}R@W0}b=kfrd&p-hfk`gVA1y~5 z1L9E|O`b_2^T_yZIBZVI?YTo@uUH$n&rV{;fhm-cZv;m+{?9F940TG7Xf3R#615a0ti$W8rj#Nd`-cnFfv}vFuTI{Hl zBT@+d6D-);5>ak%!5m`)RC3OO#X5-Ab!v7N2h)4iUSGQK@ZhmK)|~RI8%T30T|Ft$(7C!;HBSb>j?OH-yl&Z`(PvzgN)9|Er{jg4hRWv4rxKZ@ zJsmax-0Kdkx0a1Sf#Iz&$0j-i+h8-dX`h{V@`ZSxS+IZz)LM>{vL8^>S`qLZKBS3g zq7HVzZe`pe&QXdTl&b4h<=yVSVJ~6=l*Hr$b~cQsT3?IEqjD+C1VxA+U!GcT4tur2 zIY2uXv-ND(JBZ`A^M(R<79__)L|344=9nPo2mYeZT>27-cGus420*pqUW?>ZJik%d zeNw)vct1Och7);#NQS{)i$fOmM=9dX32rF2Z1lO2D}lpjqu*K-o~X4?R#_rR2GcSnYa^FNZVI<49#eoSd~wpfST~W z#rB%TCn^ewF#f@>@n9KFP{vQgco9n_sDM)Hg5W)RLa92i>8i>j%VB0*?r3~}_!c#U zw*9V61=5Cz#QT*>d;J|4BlCCNtfZ9W7dg?%+j9?KgfER25 z#Xr_kT6FC0q)G~4KWH5Z1GO8d|Ml~L+uj4ZF1cBCRC@i_ugNF}_~G}vhvDUBaDm88 zEO3$mIH~dPhXlg{_81vMR30R`&wDuaWRJF^P7ab2ttqP({$J{S6xt*+(AiYrgM|6b zWgE(jSj;;&%8Z_t zdIW$U&BpWS!>+(1wZ!}d231rOexe)?`r-2Vf1eppqbCMG^+8#Bmqb~e_3$m0ILSh9 zoqzYl0;Evn&H#4w4YkwFH!<(bMXl(=DMxZ0zEEBir@SZ%mG7DULiBXogn{xB2gWt1 zq(Y2>Z2-Dn8-v%i5g&#UGZR{HLt7`Ii!%W%c6#$toU{bA)bSpKot@RjzIOoNiAmf+ zpVj;O1BcqZ4g1?zfZ(BhWwN{U^$jFoEaR7EGpOF;kyFm=v2LzkVFk_P$J+yv($d#bxZVcVF ziC0PE5p%mttCJjt&chGhz={@!Z!s5@l$6YP0Pv`euiBo?ViGp{vqgHT%3(O{;62pQ zTBYEs9t)e-TMz>_9Xsv0R9?Th_VA!3qy+s?d|x581_dUN<1XF|xwSM>z4}d*FyBv5 zkc&O~s~l{c(MpZnT?qZ3Yrdr)I@P2n8u{`ZI_-DXW+Ily8m0#9^O}2WHj0Pb0ijKb z6E?pI<@C5X2uPtr*BDZ;s)5$>>9@fJ4Xl1(Q1KAEueR7PL%=VU=()+8Af>CVEVn!DFDuZK`HBLvs=m74DA2i?3Rxms^Ais%YcX=O|{ z^ZimHRNgHq3{S;%@lY%wM3!ny=rKaD?*TXjNa`)jJME^!e^U+}D)|{vs-HyuqXw@i zDuTY$oRs7~gU>ECK?BI-F_3e+kt(yblwU@w%>|aa98^O?p%#V^2*VjPy^(~OGmE>o0S}6efcO7*>*nN8R#pSu{}>lAqYTZ^ zmKl(`gh3*C+_6ZrU?S?*choi_ms9?q{_V_}N1A8zg7)m4px$;{)(hGcQoWW&E<+&% znE=}a1=eSzt_<1r^f3Vefqv+a0oNb~VH0R_(fpb0C##fB_lcn{iK(YnmWOpChXXc; z4XV7CSMub887!eRVA){C0=WPC`9s+c{`=7fQXA2x20`Pss|a!nF!^B!=n|ndV-iXj zywVWrzCvpv(2jHEAuXL6u_mCiHfVo$ySG+Q8shj@_4L{QEr3j9M-ddLz*<{^O;Sb8 z&Ul3S$!J2TW<0oMR5hSg{M0uU!%w z82wzps`&2|aT`~98qbvf5BC#__(VYv^NNcvM{ue(UZZ7s1#nc={FP&hn0NUR&~?%a zMP~+n{TEKd-*D7OvYRFZ=3twcF5ShJK;WtJ`qG>ED-fQ!k$%ja$O)Gb*499V)4ER%_GkG0?(< z5{%kmNeIaYcc+NO+AIr_61j1+vC>{nH^W&I6xag9gsRuH0LiPKub9h4+hlsmayOUC zoqDt$zmJh{Hkp71oGf?nwgu}whI*)1Y&-~6dX!sW-A#O&HiH0A%Y$1bI-VmwQ;oE; zKOZRd<{IrGmI=x?CUgQJSi$qVpU}v#X4_#LYqH@b7fzs@&fJix$0(+YWKv}0j zZQi?s<$^WEt=Zp-)Z{(j4LsdAI?8bXke+1(KI_gaC;_lf46l%+sJn&jq-kRugPFKdSH1n zQw_!1#>B0930{d2Z*$A`xAINl0h^V?9CTMTYiU9`%hj+WyI(s>RgB+xaeZ%@Q;%wNK?d$}AsW?ms!B9}|MXB#D)1wQ z7BKV2KGScW_H2znPP(A#Mn`w$I}Sw{AtcLHnrumxnX-<7)3ip7<(%pMot)R%9KCAh z_ZPZGKp$%Br;Md1e6rjML*~*wL9WwPVpgK;2aP1=AjEtNDk!_Rz3zuL&vB~87PTw| zkV#Y0=kHDRB(4^ILpAKvL)r}WBv~jp8bg6@_sv7?f)XR?&`-tM(r9F90?K7<`Q{X`7EQm8%kBPDNszi6ZQ?s~mN@o{&&|-+2>613Cp51Q*pODU zItB(}Ih3QaJN;}cJ!Iq*!BrVT9dG9j>Kumrma5CwI+R5Lu0R(n-yHGFii)}Hw$LR9 zOjd=$bkf#8TmTD6qhVlHz`wNo-m98pq5Af2@;U-xj8udC$)y(%nI9t-V3FHYd zLkBIKMsaZe$Yb>LwzcA&t+2&Gh zeQ%|wowZ|Y^K6-ulnKZ@n#X5=OhS6@2F)rNQ*fcp03@TJvA5C*a!4(Ch_~I)PEIs? zPa8YMrDjCljUAD`_xX_oOVSk=vkHjjFw_U#9s1NVK>|HcU#gVWae<^Sk(*FIJ}`4- zb*i=XBy=Ck?aipe5gM*6dev5{F1an}5GxYnx=|_l_<%Zs9qeX@o$0?~!2(FNLD~I# zP8Bohkzqu@{Gl@6y0X8FVmU#8QtJ9Pqq|d#;GBRS2ID}7e(Qkm)NEhD!y4_GVk7KZ zNd}Qr5sHcnx{*~?G4>fX<(_uVph^@$XuClNH9BXLgD!B7 zx4}MJk`g``Nw8!NRU#6lb-|2!6l<(&=y(CiIfKIlmmEoP z0>Gs#XyC|o?Y^ydyM!3HLoxm6`7zbTr>_$C_lS{jzpx5TZYTy^5;7+~fX;j-R+@zJ z_)V(HwBD6@HWuYl%pq#3CdvguV8}9c0F?A!qB^JsLce?(?e&ZIFI%eg$Xb<+e&$;XNDS*Am84D zT-4mN`lP~L1!=(`=RA{Y-u-2^ea)sVRcGVY)_YG`biqkAt!x&fE)EJ3jS%|H-P!*= zRu{ZR^!^BWZ^wJpWke!sl0)LeEU zuZ-`S{>)~nUY<#$P~dWKN^cwPIOZBx=5||`ISs&71^_zi{{ZCY|N3GsZl4&4ULi%0qbsF}b-4wH z`p^{O1DY$`Mf0tXXgH4x#lZ+PAwt9;68 H_pko~bDc{s literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/test_axes.py b/lib/matplotlib/tests/test_axes.py index 912d3078a489..cc2b38ed4cc8 100644 --- a/lib/matplotlib/tests/test_axes.py +++ b/lib/matplotlib/tests/test_axes.py @@ -354,7 +354,15 @@ def test_hexbin_extent(): ax.hexbin(x, y, extent=[.1, .3, .6, .7]) fig.savefig('hexbin_extent') - +@image_comparison(baseline_images=['nonfinite_limits']) +def test_nonfinite_limits(): + x = np.arange(0., np.e, 0.01) + y = np.log(x) + x[len(x)/2] = np.nan + fig = plt.figure() + ax = fig.add_subplot(111) + ax.plot(x, y) + fig.savefig('nonfinite_limits') if __name__=='__main__': import nose From 5a654815a9442c72af20e3c50ad6220e3abb4811 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Thu, 17 Sep 2009 21:44:44 +0000 Subject: [PATCH 0260/1000] Merged revisions 7776,7778 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7776 | jdh2358 | 2009-09-17 13:06:02 -0400 (Thu, 17 Sep 2009) | 1 line add make.osx to manifest ........ r7778 | leejjoon | 2009-09-17 17:42:03 -0400 (Thu, 17 Sep 2009) | 1 line fix the legend bug that dash-style for LineCollections handle is set incorrectly ........ svn path=/trunk/matplotlib/; revision=7779 --- MANIFEST.in | 2 +- lib/matplotlib/legend.py | 3 ++- 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/MANIFEST.in b/MANIFEST.in index ffe50a0bbbdd..899aff6e51e9 100644 --- a/MANIFEST.in +++ b/MANIFEST.in @@ -1,6 +1,6 @@ include CHANGELOG KNOWN_BUGS INSTALL include INTERACTIVE TODO -include Makefile MANIFEST.in MANIFEST +include Makefile make.osx MANIFEST.in MANIFEST include matplotlibrc.template setup.cfg.template include __init__.py setupext.py setup.py setupegg.py include examples/data/* diff --git a/lib/matplotlib/legend.py b/lib/matplotlib/legend.py index 401ad8785513..1d59f5792cb3 100644 --- a/lib/matplotlib/legend.py +++ b/lib/matplotlib/legend.py @@ -517,7 +517,8 @@ def _init_legend_box(self, handles, labels): color = handle.get_colors()[0] legline.set_color(color) legline.set_linewidth(lw) - legline.set_dashes(dashes) + if dashes[0] is not None: # dashed line + legline.set_dashes(dashes[1]) handle_list.append(legline) elif isinstance(handle, RegularPolyCollection): From 8eb1cb4e3fcee0d95aa78e5d8682fd4bc595bc4f Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Fri, 18 Sep 2009 02:50:37 +0000 Subject: [PATCH 0261/1000] Merged revisions 7780 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7780 | efiring | 2009-09-17 16:48:03 -1000 (Thu, 17 Sep 2009) | 2 lines Fix garbled getp output ........ svn path=/trunk/matplotlib/; revision=7781 --- lib/matplotlib/artist.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/artist.py b/lib/matplotlib/artist.py index c2305e428dd1..23b47a9be5d9 100644 --- a/lib/matplotlib/artist.py +++ b/lib/matplotlib/artist.py @@ -1023,7 +1023,7 @@ def pprint_getters(self): s = s.replace('\n', ' ') if len(s)>50: s = s[:50] + '...' - name = self.aliased_name(name[4:]) + name = self.aliased_name(name) lines.append(' %s = %s' %(name, s)) return lines From b177a14787b2fc806c759900ba7e08cf007c29d8 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Fri, 18 Sep 2009 14:05:51 +0000 Subject: [PATCH 0262/1000] add unit test for sf bug 2861426; empty date plot with year formatter svn path=/trunk/matplotlib/; revision=7782 --- lib/matplotlib/tests/test_dates.py | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/lib/matplotlib/tests/test_dates.py b/lib/matplotlib/tests/test_dates.py index 9f85668fa2d8..d282f545f051 100644 --- a/lib/matplotlib/tests/test_dates.py +++ b/lib/matplotlib/tests/test_dates.py @@ -141,6 +141,20 @@ def test_DateFormatter(): fig.savefig( 'DateFormatter_fractionalSeconds' ) +#@image_comparison(baseline_images=['empty_date_bug']) +@knownfailureif(True) +def empty_date_with_year_formatter(): + # exposes sf bug 2861426: https://sourceforge.net/tracker/?func=detail&aid=2861426&group_id=80706&atid=560720 + import matplotlib.dates as dates + + fig = plt.figure() + ax = fig.add_subplot(111) + + yearFmt = dates.DateFormatter('%Y') + ax.xaxis.set_major_formatter(yearFmt) + + fig.savefig('empty_date_bug') + if __name__=='__main__': import nose nose.runmodule(argv=['-s','--with-doctest'], exit=False) From 931400501f33fe03ee89467b88c79500060d9179 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Fri, 18 Sep 2009 14:28:39 +0000 Subject: [PATCH 0263/1000] add unit test for sf bug 2861426; empty date plot with year formatter; need test in the name svn path=/trunk/matplotlib/; revision=7783 --- lib/matplotlib/tests/test_dates.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/tests/test_dates.py b/lib/matplotlib/tests/test_dates.py index d282f545f051..963290b3c62d 100644 --- a/lib/matplotlib/tests/test_dates.py +++ b/lib/matplotlib/tests/test_dates.py @@ -143,7 +143,7 @@ def test_DateFormatter(): #@image_comparison(baseline_images=['empty_date_bug']) @knownfailureif(True) -def empty_date_with_year_formatter(): +def test_empty_date_with_year_formatter(): # exposes sf bug 2861426: https://sourceforge.net/tracker/?func=detail&aid=2861426&group_id=80706&atid=560720 import matplotlib.dates as dates From 0bb95f85b83f9496aa52f0b4feee8529d08f8bae Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Fri, 18 Sep 2009 15:18:21 +0000 Subject: [PATCH 0264/1000] Merged revisions 7784 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7784 | mdboom | 2009-09-18 11:16:20 -0400 (Fri, 18 Sep 2009) | 2 lines Fix bug where subslicing was cutting polar lines off (because it was treating them as if they were rectilinearly plotted). ........ svn path=/trunk/matplotlib/; revision=7785 --- lib/matplotlib/lines.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/lines.py b/lib/matplotlib/lines.py index 1e7ac5af7857..9ad1ea082fb3 100644 --- a/lib/matplotlib/lines.py +++ b/lib/matplotlib/lines.py @@ -453,7 +453,10 @@ def recache(self): self._y = self._xy[:, 1] # just a view self._subslice = False - if self.axes and len(x) > 100 and self._is_sorted(x): + if (self.axes and len(x) > 100 and self._is_sorted(x) and + self.axes.name == 'rectilinear' and + self.axes.get_xscale() == 'linear' and + self.axes.get_yscale() == 'linear'): self._subslice = True if hasattr(self, '_path'): interpolation_steps = self._path._interpolation_steps From f49deee13a7b99265c853c3fb2b0619835739f47 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Fri, 18 Sep 2009 15:42:37 +0000 Subject: [PATCH 0265/1000] Update this baseline image to reflect correct, not buggy, behavior :) svn path=/trunk/matplotlib/; revision=7786 --- .../baseline_images/test_axes/polar_axes.png | Bin 64582 -> 77912 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/lib/matplotlib/tests/baseline_images/test_axes/polar_axes.png b/lib/matplotlib/tests/baseline_images/test_axes/polar_axes.png index 0f9159be571a7d70389b26d0808950e88d5589d2..bb1d3ca68749007e4355f681821748d751fac9e3 100644 GIT binary patch literal 77912 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 y)+v7=IA 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 F{|8w4vZnw5 literal 64582 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 P{Bdy{r8sEsv- Date: Fri, 18 Sep 2009 16:18:51 +0000 Subject: [PATCH 0266/1000] Add tests for the simplification/clipping infrastructure. svn path=/trunk/matplotlib/; revision=7787 --- .../simplification_clipping_test.py | 72 ------------ examples/tests/backend_driver.py | 1 - lib/matplotlib/__init__.py | 1 + lib/matplotlib/testing/compare.py | 2 +- .../test_simplification/clipping.png | Bin 0 -> 8927 bytes .../test_simplification/clipping_diamond.png | Bin 0 -> 9857 bytes .../test_simplification/overflow.png | Bin 0 -> 6489 bytes .../test_simplification/simplify_curve.png | Bin 0 -> 27918 bytes lib/matplotlib/tests/test_simplification.py | 111 ++++++++++++++++++ 9 files changed, 113 insertions(+), 74 deletions(-) delete mode 100644 examples/pylab_examples/simplification_clipping_test.py create mode 100644 lib/matplotlib/tests/baseline_images/test_simplification/clipping.png create mode 100644 lib/matplotlib/tests/baseline_images/test_simplification/clipping_diamond.png create mode 100644 lib/matplotlib/tests/baseline_images/test_simplification/overflow.png create mode 100644 lib/matplotlib/tests/baseline_images/test_simplification/simplify_curve.png create mode 100644 lib/matplotlib/tests/test_simplification.py diff --git a/examples/pylab_examples/simplification_clipping_test.py b/examples/pylab_examples/simplification_clipping_test.py deleted file mode 100644 index 728ff1abbdfb..000000000000 --- a/examples/pylab_examples/simplification_clipping_test.py +++ /dev/null @@ -1,72 +0,0 @@ -from pylab import * -import numpy as np -from matplotlib import patches, path -nan = np.nan -Path = path.Path - -t = arange(0.0, 2.0, 0.01) -s = sin(2*pi*t) -plot(t, s, linewidth=1.0) - -ylim((-0.20, -0.28)) - -title('Should see four lines extending from bottom to top') - -figure() - -x = np.array([1.0,2.0,3.0,2.0e5]) -y = np.arange(len(x)) -plot(x,y) -xlim(xmin=2,xmax=6) -title("Should be monotonically increasing") - -figure() - -x = np.array([0.0, 1.0, 0.0, -1.0, 0.0]) -y = np.array([1.0, 0.0, -1.0, 0.0, 1.0]) -plot(x, y) -xlim(xmin=-0.6, xmax=0.6) -ylim(ymin=-0.6, ymax=0.6) -title("Diamond shape, with segments visible in all four corners") - -figure() - -np.random.seed(0) -x = np.random.uniform(size=(5000,)) * 50 - -rcParams['path.simplify'] = True -p1 = plot(x,solid_joinstyle='round',linewidth=2.0) - -path = p1[0].get_path() -transform = p1[0].get_transform() -path = transform.transform_path(path) -simplified = list(path.iter_segments(simplify=(800, 600))) - -title("Original length: %d, simplified length: %d" % (len(path.vertices), len(simplified))) - -figure() - -x = np.sin(np.linspace(0, np.pi * 2.0, 1000)) + np.random.uniform(size=(1000,)) * 0.01 - -rcParams['path.simplify'] = True -p1 = plot(x,solid_joinstyle='round',linewidth=2.0) - -path = p1[0].get_path() -transform = p1[0].get_transform() -path = transform.transform_path(path) -simplified = list(path.iter_segments(simplify=(800, 600))) - -title("Original length: %d, simplified length: %d" % (len(path.vertices), len(simplified))) - -figure() -pp1 = patches.PathPatch( - Path([(0, 0), (1, 0), (1, 1), (nan, 1), (0, 0), (2, 0), (2, 2), (0, 0)], - [Path.MOVETO, Path.CURVE3, Path.CURVE3, Path.CURVE3, Path.CURVE3, Path.CURVE3, Path.CURVE3, Path.CLOSEPOLY]), - fc="none") - -gca().add_patch(pp1) -gca().set_xlim((0, 2)) -gca().set_ylim((0, 2)) -title("Should be one line with two curves below it") - -show() diff --git a/examples/tests/backend_driver.py b/examples/tests/backend_driver.py index 79303a1d1562..bb4ca6c9792a 100644 --- a/examples/tests/backend_driver.py +++ b/examples/tests/backend_driver.py @@ -181,7 +181,6 @@ 'shared_axis_across_figures.py', 'shared_axis_demo.py', 'simple_plot.py', - 'simplification_clipping_test.py', 'specgram_demo.py', 'spine_placement_demo.py', 'spy_demos.py', diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index 8e53fe900e49..30d5877f53d7 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -886,6 +886,7 @@ def tk_window_focus(): 'matplotlib.tests.test_dates', 'matplotlib.tests.test_spines', 'matplotlib.tests.test_image', + 'matplotlib.tests.test_simplification', ] def test(verbosity=0): diff --git a/lib/matplotlib/testing/compare.py b/lib/matplotlib/testing/compare.py index 2bb36d692bb4..e4ae8108783e 100644 --- a/lib/matplotlib/testing/compare.py +++ b/lib/matplotlib/testing/compare.py @@ -80,7 +80,7 @@ def compare_images( expected, actual, tol, in_decorator=False ): # img1 = "./baseline/plot.png" # img2 = "./output/plot.png" - # + # # compare_images( img1, img2, 0.001 ): = INPUT VARIABLES diff --git a/lib/matplotlib/tests/baseline_images/test_simplification/clipping.png b/lib/matplotlib/tests/baseline_images/test_simplification/clipping.png new file mode 100644 index 0000000000000000000000000000000000000000..a23e6830efca84cea2f21273bfa0c456db9aa6b5 GIT binary patch literal 8927 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 VUiF1m@M{pnjr-m^()Bw&{x=NT56}Pr literal 0 HcmV?d00001 diff --git a/lib/matplotlib/tests/baseline_images/test_simplification/clipping_diamond.png b/lib/matplotlib/tests/baseline_images/test_simplification/clipping_diamond.png new file mode 100644 index 0000000000000000000000000000000000000000..921e52c370ef456a3e3aa11483d16e10593cc321 GIT binary patch literal 9857 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 Date: Sat, 19 Sep 2009 03:05:24 +0000 Subject: [PATCH 0267/1000] Merged revisions 7788 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7788 | efiring | 2009-09-18 16:53:06 -1000 (Fri, 18 Sep 2009) | 2 lines Fix bug in maxdict when replacing an existing item ........ svn path=/trunk/matplotlib/; revision=7789 --- lib/matplotlib/cbook.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index b4b33fb63448..44ec2b192c8e 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -999,11 +999,12 @@ def __init__(self, maxsize): self.maxsize = maxsize self._killkeys = [] def __setitem__(self, k, v): - if len(self)>=self.maxsize: - del self[self._killkeys[0]] - del self._killkeys[0] + if k not in self: + if len(self)>=self.maxsize: + del self[self._killkeys[0]] + del self._killkeys[0] + self._killkeys.append(k) dict.__setitem__(self, k, v) - self._killkeys.append(k) From 14d4c67428443fb602f3cb583e293db90fdb7584 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Sat, 19 Sep 2009 06:32:38 +0000 Subject: [PATCH 0268/1000] Merged revisions 7790 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7790 | efiring | 2009-09-18 20:28:43 -1000 (Fri, 18 Sep 2009) | 2 lines Fix bug in mlab.demean, with axis = -1 ........ svn path=/trunk/matplotlib/; revision=7791 --- lib/matplotlib/mlab.py | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/matplotlib/mlab.py b/lib/matplotlib/mlab.py index fb530400c1f7..5b6db8f70a19 100644 --- a/lib/matplotlib/mlab.py +++ b/lib/matplotlib/mlab.py @@ -177,11 +177,11 @@ def detrend(x, key=None): def demean(x, axis=0): "Return x minus its mean along the specified axis" x = np.asarray(x) - if axis: - ind = [slice(None)] * axis - ind.append(np.newaxis) - return x - x.mean(axis)[ind] - return x - x.mean(axis) + if axis == 0 or axis is None or x.ndim <= 1: + return x - x.mean(axis) + ind = [slice(None)] * x.ndim + ind[axis] = np.newaxis + return x - x.mean(axis)[ind] def detrend_mean(x): "Return x minus the mean(x)" From 7847c501cdd38eb9d656f45e291fbde73be3a7c5 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Sat, 19 Sep 2009 23:49:24 +0000 Subject: [PATCH 0269/1000] Merged revisions 7792 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7792 | efiring | 2009-09-19 13:46:06 -1000 (Sat, 19 Sep 2009) | 2 lines Fix bug in bar affecting autoscaling with log axis ........ svn path=/trunk/matplotlib/; revision=7793 --- lib/matplotlib/axes.py | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index 560a1d03e028..d057b0efcf6e 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -204,7 +204,7 @@ def _xy_from_xy(self, x, y): bx = self.axes.xaxis.update_units(x) by = self.axes.yaxis.update_units(y) - if self.command!='plot': + if self.command!='plot': # the Line2D class can handle unitized data, with # support for post hoc unit changes etc. Other mpl # artists, eg Polygon which _process_plot_var_args @@ -4179,13 +4179,6 @@ def make_iterable(x): else: raise ValueError, 'invalid orientation: %s' % orientation - - # do not convert to array here as unit info is lost - #left = np.asarray(left) - #height = np.asarray(height) - #width = np.asarray(width) - #bottom = np.asarray(bottom) - if len(linewidth) < nbars: linewidth *= nbars @@ -4300,7 +4293,7 @@ def make_iterable(x): if adjust_xlim: xmin, xmax = self.dataLim.intervalx - xmin = np.amin(width[width!=0]) # filter out the 0 width rects + xmin = np.amin([w for w in width if w > 0]) if xerr is not None: xmin = xmin - np.amax(xerr) xmin = max(xmin*0.9, 1e-100) @@ -4308,7 +4301,7 @@ def make_iterable(x): if adjust_ylim: ymin, ymax = self.dataLim.intervaly - ymin = np.amin(height[height!=0]) # filter out the 0 height rects + ymin = np.amin([h for h in height if h > 0]) if yerr is not None: ymin = ymin - np.amax(yerr) ymin = max(ymin*0.9, 1e-100) From f76a00437214c73fcd52e4a0a2b67f5f46d1af52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Sun, 20 Sep 2009 13:07:15 +0000 Subject: [PATCH 0270/1000] Merged revisions 7794 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7794 | jouni | 2009-09-20 15:30:22 +0300 (Su, 20 Syy 2009) | 1 line Prevent exception in case of missing height and depth information in a TeX font ........ svn path=/trunk/matplotlib/; revision=7795 --- CHANGELOG | 4 ++++ lib/matplotlib/dviread.py | 21 +++++++++++++++++++-- 2 files changed, 23 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index c92aaceefc63..ad3f14bc4ef1 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,7 @@ +2009-09-20 Prevent exception in case of missing height and depth information + in a TeX font - this doesn't make the typesetting right, but prevents + the crash - JKS + 2009-09-15 Implement draw_text and draw_tex method of backend_base using the textpath module. Implement draw_tex method of the svg backend. - JJL diff --git a/lib/matplotlib/dviread.py b/lib/matplotlib/dviread.py index dea194a737cf..8dc59f92c1a7 100644 --- a/lib/matplotlib/dviread.py +++ b/lib/matplotlib/dviread.py @@ -88,8 +88,7 @@ def _output(self): e = 0 # zero depth else: # glyph x,y,font,g,w = elt - h = _mul2012(font._scale, font._tfm.height[g]) - e = _mul2012(font._scale, font._tfm.depth[g]) + h,e = font._height_depth_of(g) minx = min(minx, x) miny = min(miny, y - h) maxx = max(maxx, x + w) @@ -443,6 +442,24 @@ def _width_of(self, char): 'debug') return 0 + def _height_depth_of(self, char): + """ + Height and depth of char in dvi units. For internal use by dviread.py. + """ + + result = [] + for metric,name in ((self._tfm.height, "height"), + (self._tfm.depth, "depth")): + value = metric.get(char, None) + if value is None: + matplotlib.verbose.report( + 'No %s for char %d in font %s' % (name, char, self.texname), + 'debug') + result.append(0) + else: + result.append(_mul2012(value, self._scale)) + return result + class Vf(Dvi): """ A virtual font (\*.vf file) containing subroutines for dvi files. From 8765290268b619563de2d6285cb6157bee784e56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Sun, 20 Sep 2009 13:21:38 +0000 Subject: [PATCH 0271/1000] Merged revisions 7796 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7796 | jouni | 2009-09-20 16:19:25 +0300 (Su, 20 Syy 2009) | 1 line Fix off-by-one error in dviread.Tfm ........ svn path=/trunk/matplotlib/; revision=7797 --- CHANGELOG | 5 ++--- lib/matplotlib/dviread.py | 11 +++++------ 2 files changed, 7 insertions(+), 9 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index ad3f14bc4ef1..2d6753df43c3 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,6 +1,5 @@ -2009-09-20 Prevent exception in case of missing height and depth information - in a TeX font - this doesn't make the typesetting right, but prevents - the crash - JKS +2009-09-20 Fix off-by-one error in dviread.Tfm, and additionally protect + against exceptions in case a dvi font is missing some metrics - JKS 2009-09-15 Implement draw_text and draw_tex method of backend_base using the textpath module. Implement draw_tex method of the svg diff --git a/lib/matplotlib/dviread.py b/lib/matplotlib/dviread.py index 8dc59f92c1a7..5843a3c5894d 100644 --- a/lib/matplotlib/dviread.py +++ b/lib/matplotlib/dviread.py @@ -415,7 +415,7 @@ def __init__(self, scale, tfm, texname, vf): scale, tfm, texname, vf self.size = scale * (72.0 / (72.27 * 2**16)) try: - nchars = max(tfm.width.iterkeys()) + nchars = max(tfm.width.iterkeys()) + 1 except ValueError: nchars = 0 self.widths = [ (1000*tfm.width.get(char, 0)) >> 20 @@ -619,11 +619,10 @@ def __init__(self, filename): widths, heights, depths = \ [ struct.unpack('!%dI' % (len(x)/4), x) for x in (widths, heights, depths) ] - for i in range(ec-bc): - self.width[bc+i] = _fix2comp(widths[ord(char_info[4*i])]) - self.height[bc+i] = _fix2comp(heights[ord(char_info[4*i+1]) >> 4]) - self.depth[bc+i] = _fix2comp(depths[ord(char_info[4*i+1]) & 0xf]) - + for idx, char in enumerate(range(bc, ec+1)): + self.width[char] = _fix2comp(widths[ord(char_info[4*idx])]) + self.height[char] = _fix2comp(heights[ord(char_info[4*idx+1]) >> 4]) + self.depth[char] = _fix2comp(depths[ord(char_info[4*idx+1]) & 0xf]) class PsfontsMap(object): """ From 1ea52fd5c626411555e01e8d19ef75be15fc7897 Mon Sep 17 00:00:00 2001 From: Fernando Perez Date: Sun, 20 Sep 2009 17:03:40 +0000 Subject: [PATCH 0272/1000] Add Sphinx extension to support highlighting IPython console sessions. This was shipped until now in the recent sampledoc tutorial, will update there as well for consistency. This extension was originally authored, I think, by Michael Droetboom. Made some minor fixes and updates for output prompts. svn path=/trunk/matplotlib/; revision=7798 --- CHANGELOG | 3 + .../sphinxext/ipython_console_highlighting.py | 114 ++++++++++++++++++ 2 files changed, 117 insertions(+) create mode 100644 lib/matplotlib/sphinxext/ipython_console_highlighting.py diff --git a/CHANGELOG b/CHANGELOG index 2d6753df43c3..2772f12385cd 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2009-09-20 Add Sphinx extension to highlight IPython console sessions, + originally authored (I think) by Michael Droetboom. - FP + 2009-09-20 Fix off-by-one error in dviread.Tfm, and additionally protect against exceptions in case a dvi font is missing some metrics - JKS diff --git a/lib/matplotlib/sphinxext/ipython_console_highlighting.py b/lib/matplotlib/sphinxext/ipython_console_highlighting.py new file mode 100644 index 000000000000..217b779dda78 --- /dev/null +++ b/lib/matplotlib/sphinxext/ipython_console_highlighting.py @@ -0,0 +1,114 @@ +"""reST directive for syntax-highlighting ipython interactive sessions. + +XXX - See what improvements can be made based on the new (as of Sept 2009) +'pycon' lexer for the python console. At the very least it will give better +highlighted tracebacks. +""" + +#----------------------------------------------------------------------------- +# Needed modules + +# Standard library +import re + +# Third party +from pygments.lexer import Lexer, do_insertions +from pygments.lexers.agile import (PythonConsoleLexer, PythonLexer, + PythonTracebackLexer) +from pygments.token import Comment, Generic + +from sphinx import highlighting + +#----------------------------------------------------------------------------- +# Global constants +line_re = re.compile('.*?\n') + +#----------------------------------------------------------------------------- +# Code begins - classes and functions + +class IPythonConsoleLexer(Lexer): + """ + For IPython console output or doctests, such as: + + .. sourcecode:: ipython + + In [1]: a = 'foo' + + In [2]: a + Out[2]: 'foo' + + In [3]: print a + foo + + In [4]: 1 / 0 + + Notes: + + - Tracebacks are not currently supported. + + - It assumes the default IPython prompts, not customized ones. + """ + + name = 'IPython console session' + aliases = ['ipython'] + mimetypes = ['text/x-ipython-console'] + input_prompt = re.compile("(In \[[0-9]+\]: )|( \.\.\.+:)") + output_prompt = re.compile("(Out\[[0-9]+\]: )|( \.\.\.+:)") + continue_prompt = re.compile(" \.\.\.+:") + tb_start = re.compile("\-+") + + def get_tokens_unprocessed(self, text): + pylexer = PythonLexer(**self.options) + tblexer = PythonTracebackLexer(**self.options) + + curcode = '' + insertions = [] + for match in line_re.finditer(text): + line = match.group() + input_prompt = self.input_prompt.match(line) + continue_prompt = self.continue_prompt.match(line.rstrip()) + output_prompt = self.output_prompt.match(line) + if line.startswith("#"): + insertions.append((len(curcode), + [(0, Comment, line)])) + elif input_prompt is not None: + insertions.append((len(curcode), + [(0, Generic.Prompt, input_prompt.group())])) + curcode += line[input_prompt.end():] + elif continue_prompt is not None: + insertions.append((len(curcode), + [(0, Generic.Prompt, continue_prompt.group())])) + curcode += line[continue_prompt.end():] + elif output_prompt is not None: + # Use the 'error' token for output. We should probably make + # our own token, but error is typicaly in a bright color like + # red, so it works fine for our output prompts. + insertions.append((len(curcode), + [(0, Generic.Error, output_prompt.group())])) + curcode += line[output_prompt.end():] + else: + if curcode: + for item in do_insertions(insertions, + pylexer.get_tokens_unprocessed(curcode)): + yield item + curcode = '' + insertions = [] + yield match.start(), Generic.Output, line + if curcode: + for item in do_insertions(insertions, + pylexer.get_tokens_unprocessed(curcode)): + yield item + + +def setup(app): + """Setup as a sphinx extension.""" + + # This is only a lexer, so adding it below to pygments appears sufficient. + # But if somebody knows that the right API usage should be to do that via + # sphinx, by all means fix it here. At least having this setup.py + # suppresses the sphinx warning we'd get without it. + pass + +#----------------------------------------------------------------------------- +# Register the extension as a valid pygments lexer +highlighting.lexers['ipython'] = IPythonConsoleLexer() From 8c3218bdb6170a4d7001e669c1acaa8b4d0e6008 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jouni=20K=2E=20Sepp=C3=A4nen?= Date: Sun, 20 Sep 2009 19:51:44 +0000 Subject: [PATCH 0273/1000] Merged revisions 7800 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7800 | jouni | 2009-09-20 22:47:46 +0300 (Su, 20 Syy 2009) | 1 line Fix usetex spacing errors in pdf backend. ........ svn path=/trunk/matplotlib/; revision=7801 --- CHANGELOG | 4 +++- lib/matplotlib/backends/backend_pdf.py | 17 +++++++++++++---- 2 files changed, 16 insertions(+), 5 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 2772f12385cd..cc6e733caf8b 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,8 +1,10 @@ +2009-09-20 Fix usetex spacing errors in pdf backend. - JKS + 2009-09-20 Add Sphinx extension to highlight IPython console sessions, originally authored (I think) by Michael Droetboom. - FP 2009-09-20 Fix off-by-one error in dviread.Tfm, and additionally protect - against exceptions in case a dvi font is missing some metrics - JKS + against exceptions in case a dvi font is missing some metrics. - JKS 2009-09-15 Implement draw_text and draw_tex method of backend_base using the textpath module. Implement draw_tex method of the svg diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index 81bde3e5b8c4..9c603c86cfff 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -1479,7 +1479,14 @@ def draw_tex(self, gc, x, y, s, prop, angle): dvi.close() # Gather font information and do some setup for combining - # characters into strings. + # characters into strings. The variable seq will contain a + # sequence of font and text entries. A font entry is a list + # ['font', name, size] where name is a Name object for the + # font. A text entry is ['text', x, y, glyphs, x+w] where x + # and y are the starting coordinates, w is the width, and + # glyphs is a list; in this phase it will always contain just + # one one-character string, but later it may have longer + # strings interspersed with kern amounts. oldfont, seq = None, [] for x1, y1, dvifont, glyph, width in page.text: if dvifont != oldfont: @@ -1499,16 +1506,18 @@ def draw_tex(self, gc, x, y, s, prop, angle): # Find consecutive text strings with constant y coordinate and # combine into a sequence of strings and kerns, or just one # string (if any kerns would be less than 0.1 points). - i, curx = 0, 0 + i, curx, fontsize = 0, 0, None while i < len(seq)-1: elt, next = seq[i:i+2] - if elt[0] == next[0] == 'text' and elt[2] == next[2]: + if elt[0] == 'font': + fontsize = elt[2] + elif elt[0] == next[0] == 'text' and elt[2] == next[2]: offset = elt[4] - next[1] if abs(offset) < 0.1: elt[3][-1] += next[3][0] elt[4] += next[4]-next[1] else: - elt[3] += [offset*1000.0/dvifont.size, next[3][0]] + elt[3] += [offset*1000.0/fontsize, next[3][0]] elt[4] = next[4] del seq[i+1] continue From 635684f23a0167742eaa46de9d99d31512fe8e15 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Sun, 20 Sep 2009 22:10:07 +0000 Subject: [PATCH 0274/1000] some unit cleanup; warn on zero value dates in the formatter svn path=/trunk/matplotlib/; revision=7802 --- lib/matplotlib/__init__.py | 4 ++-- lib/matplotlib/axes.py | 6 ++---- lib/matplotlib/axis.py | 26 +++++++++++++++++++++----- lib/matplotlib/cbook.py | 2 +- lib/matplotlib/dates.py | 9 ++++++--- 5 files changed, 32 insertions(+), 15 deletions(-) diff --git a/lib/matplotlib/__init__.py b/lib/matplotlib/__init__.py index 30d5877f53d7..a8b467f712f1 100644 --- a/lib/matplotlib/__init__.py +++ b/lib/matplotlib/__init__.py @@ -900,7 +900,7 @@ def test(verbosity=0): backend = rcParams['backend'] original_params = rcParams.copy() - use('Agg') # use Agg backend for these tests + use('Agg', warn=False) # use Agg backend for these tests # These settings *must* be hardcoded for running the comparison # tests and are not necessarily the default values as specified in @@ -922,7 +922,7 @@ def test(verbosity=0): ) # restore the old backend and rcParams - use(backend) + use(backend, warn=False) rcParams.update(original_params) return success diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index d057b0efcf6e..755b2940decd 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -2306,16 +2306,14 @@ def xaxis_date(self, tz=None): """ # should be enough to inform the unit conversion interface # dates are comng in - self.xaxis.update_units(datetime.date(2009,1,1)) + self.xaxis.axis_date() def yaxis_date(self, tz=None): """Sets up y-axis ticks and labels that treat the y data as dates. *tz* is the time zone to use in labeling dates. Defaults to rc value. """ - # should be enough to inform the unit conversion interface - # dates are comng in - self.yaxis.update_units(datetime.date(2009,1,1)) + self.yaxis.axis_date() def format_xdata(self, x): """ diff --git a/lib/matplotlib/axis.py b/lib/matplotlib/axis.py index fccd79ae6a66..9f757c3a8d42 100644 --- a/lib/matplotlib/axis.py +++ b/lib/matplotlib/axis.py @@ -987,12 +987,17 @@ def update_units(self, data): converter = munits.registry.get_converter(data) if converter is None: return False + + neednew = self.converter!=converter self.converter = converter default = self.converter.default_units(data, self) #print 'update units: default="%s", units=%s"'%(default, self.units) if default is not None and self.units is None: self.set_units(default) - self._update_axisinfo() + + + if neednew: + self._update_axisinfo() return True def _update_axisinfo(self): @@ -1196,6 +1201,17 @@ def zoom(self, direction): "Zoom in/out on axis; if *direction* is >0 zoom in, else zoom out" self.major.locator.zoom(direction) + + def axis_date(self): + """ + Sets up x-axis ticks and labels that treat the x data as dates. + """ + import datetime + # should be enough to inform the unit conversion interface + # dates are comng in + self.update_units(datetime.date(2009,1,1)) + + class XAxis(Axis): __name__ = 'xaxis' axis_name = 'x' @@ -1442,7 +1458,7 @@ def set_default_intervals(self): if not dataMutated or not viewMutated: if self.converter is not None: info = self.converter.axisinfo(self.units, self) - if info.default_limits is not None: + if info.default_limits is not None: valmin, valmax = info.default_limits xmin = self.converter.convert(valmin, self.units, self) xmax = self.converter.convert(valmax, self.units, self) @@ -1451,7 +1467,7 @@ def set_default_intervals(self): if not viewMutated: self.axes.viewLim.intervalx = xmin, xmax - + class YAxis(Axis): __name__ = 'yaxis' @@ -1707,7 +1723,7 @@ def set_default_intervals(self): if not dataMutated or not viewMutated: if self.converter is not None: info = self.converter.axisinfo(self.units, self) - if info.default_limits is not None: + if info.default_limits is not None: valmin, valmax = info.default_limits ymin = self.converter.convert(valmin, self.units, self) ymax = self.converter.convert(valmax, self.units, self) @@ -1716,4 +1732,4 @@ def set_default_intervals(self): if not viewMutated: self.axes.viewLim.intervaly = ymin, ymax - + diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index 44ec2b192c8e..24d5b09e9124 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -317,7 +317,7 @@ def is_scalar(obj): def is_numlike(obj): 'return true if *obj* looks like a number' try: obj+1 - except TypeError: return False + except: return False else: return True def to_filehandle(fname, flag='rU', return_opened=False): diff --git a/lib/matplotlib/dates.py b/lib/matplotlib/dates.py index 9b8dee42f5ae..6024de51f597 100644 --- a/lib/matplotlib/dates.py +++ b/lib/matplotlib/dates.py @@ -290,6 +290,8 @@ def __init__(self, fmt, tz=None): self.tz = tz def __call__(self, x, pos=0): + if x==0: + raise ValueError('DateFormatter found a value of x=0, which is an illegal date. This usually occurs because you have not informed the axis that it is plotting dates, eg with ax.xaxis_date()') dt = num2date(x, self.tz) return self.strftime(dt, self.fmt) @@ -430,6 +432,7 @@ def __init__(self, locator, tz=None, defaultfmt='%Y-%m-%d'): } def __call__(self, x, pos=0): + scale = float( self._locator._get_unit() ) fmt = self.defaultfmt @@ -1065,10 +1068,10 @@ def axisinfo(unit, axis): majloc = AutoDateLocator(tz=unit) majfmt = AutoDateFormatter(majloc, tz=unit) - datemin = datetime.date(2000, 1, 1) - datemax = datetime.date(2010, 1, 1) + datemin = datetime.date(2000, 1, 1) + datemax = datetime.date(2010, 1, 1) - return units.AxisInfo( majloc=majloc, majfmt=majfmt, label='', + return units.AxisInfo( majloc=majloc, majfmt=majfmt, label='', default_limits=(datemin, datemax)) @staticmethod From ea4abac1f18f00994a309ed2244dbb37122ca613 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 21 Sep 2009 12:06:29 +0000 Subject: [PATCH 0275/1000] Remove old location of ipython_console_highlighting.py svn path=/trunk/matplotlib/; revision=7804 --- doc/sphinxext/ipython_console_highlighting.py | 98 ------------------- 1 file changed, 98 deletions(-) delete mode 100644 doc/sphinxext/ipython_console_highlighting.py diff --git a/doc/sphinxext/ipython_console_highlighting.py b/doc/sphinxext/ipython_console_highlighting.py deleted file mode 100644 index 00f9abd5fa40..000000000000 --- a/doc/sphinxext/ipython_console_highlighting.py +++ /dev/null @@ -1,98 +0,0 @@ -"""reST directive for syntax-highlighting ipython interactive sessions. -""" - -#----------------------------------------------------------------------------- -# Needed modules - -# Standard library -import re - -# Third party -from pygments.lexer import Lexer, do_insertions -from pygments.lexers.agile import (PythonConsoleLexer, PythonLexer, - PythonTracebackLexer) -from pygments.token import Comment, Generic - -from sphinx import highlighting - - -#----------------------------------------------------------------------------- -# Global constants -line_re = re.compile('.*?\n') - -#----------------------------------------------------------------------------- -# Code begins - classes and functions - -class IPythonConsoleLexer(Lexer): - """ - For IPython console output or doctests, such as: - - .. sourcecode:: ipython - - In [1]: a = 'foo' - - In [2]: a - Out[2]: 'foo' - - In [3]: print a - foo - - In [4]: 1 / 0 - - Notes: - - - Tracebacks are not currently supported. - - - It assumes the default IPython prompts, not customized ones. - """ - - name = 'IPython console session' - aliases = ['ipython'] - mimetypes = ['text/x-ipython-console'] - input_prompt = re.compile("(In \[[0-9]+\]: )|( \.\.\.+:)") - output_prompt = re.compile("(Out\[[0-9]+\]: )|( \.\.\.+:)") - continue_prompt = re.compile(" \.\.\.+:") - tb_start = re.compile("\-+") - - def get_tokens_unprocessed(self, text): - pylexer = PythonLexer(**self.options) - tblexer = PythonTracebackLexer(**self.options) - - curcode = '' - insertions = [] - for match in line_re.finditer(text): - line = match.group() - input_prompt = self.input_prompt.match(line) - continue_prompt = self.continue_prompt.match(line.rstrip()) - output_prompt = self.output_prompt.match(line) - if line.startswith("#"): - insertions.append((len(curcode), - [(0, Comment, line)])) - elif input_prompt is not None: - insertions.append((len(curcode), - [(0, Generic.Prompt, input_prompt.group())])) - curcode += line[input_prompt.end():] - elif continue_prompt is not None: - insertions.append((len(curcode), - [(0, Generic.Prompt, continue_prompt.group())])) - curcode += line[continue_prompt.end():] - elif output_prompt is not None: - insertions.append((len(curcode), - [(0, Generic.Output, output_prompt.group())])) - curcode += line[output_prompt.end():] - else: - if curcode: - for item in do_insertions(insertions, - pylexer.get_tokens_unprocessed(curcode)): - yield item - curcode = '' - insertions = [] - yield match.start(), Generic.Output, line - if curcode: - for item in do_insertions(insertions, - pylexer.get_tokens_unprocessed(curcode)): - yield item - -#----------------------------------------------------------------------------- -# Register the extension as a valid pygments lexer -highlighting.lexers['ipython'] = IPythonConsoleLexer() From 10fa94dd63290335fe9c6f7254c9b34825f317b3 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 21 Sep 2009 12:07:15 +0000 Subject: [PATCH 0276/1000] Fix warnings about math_symbol_table.py svn path=/trunk/matplotlib/; revision=7805 --- doc/sphinxext/math_symbol_table.py | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/doc/sphinxext/math_symbol_table.py b/doc/sphinxext/math_symbol_table.py index 2226aa4acf94..6a11ec0d250c 100644 --- a/doc/sphinxext/math_symbol_table.py +++ b/doc/sphinxext/math_symbol_table.py @@ -128,25 +128,14 @@ def get_n(n, l): state_machine.insert_input(lines, "Symbol table") return [] -try: - from docutils.parsers.rst import Directive -except ImportError: - from docutils.parsers.rst.directives import _directives - def math_symbol_table_directive(name, arguments, options, content, lineno, - content_offset, block_text, state, state_machine): - return run(state_machine) - math_symbol_table_directive.arguments = None - math_symbol_table_directive.options = {} - math_symbol_table_directive.content = False - _directives['math_symbol_table'] = math_symbol_table_directive -else: - class math_symbol_table_directive(Directive): - has_content = False - def run(self): - return run(self.state_machine) - from docutils.parsers.rst import directives - directives.register_directive('math_symbol_table', - math_symbol_table_directive) +def math_symbol_table_directive(name, arguments, options, content, lineno, + content_offset, block_text, state, state_machine): + return run(state_machine) + +def setup(app): + app.add_directive( + 'math_symbol_table', math_symbol_table_directive, + False, (0, 1, 0)) if __name__ == "__main__": # Do some verification of the tables From 7455c47e71a6cca8e5f998d5d87716eb38dbe3e6 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 21 Sep 2009 12:07:39 +0000 Subject: [PATCH 0277/1000] Don't crash the plot_directive if the plot itself fails. svn path=/trunk/matplotlib/; revision=7806 --- lib/matplotlib/sphinxext/plot_directive.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/sphinxext/plot_directive.py b/lib/matplotlib/sphinxext/plot_directive.py index 6f4bf7e4e192..c5c7446244e2 100644 --- a/lib/matplotlib/sphinxext/plot_directive.py +++ b/lib/matplotlib/sphinxext/plot_directive.py @@ -170,6 +170,7 @@ def run_code(plot_path, function_name, plot_code): stdout = sys.stdout sys.stdout = cStringIO.StringIO() os.chdir(path) + fd = None try: fd = open(fname) module = imp.load_module( @@ -178,7 +179,8 @@ def run_code(plot_path, function_name, plot_code): del sys.path[0] os.chdir(pwd) sys.stdout = stdout - fd.close() + if fd is not None: + fd.close() if function_name is not None: getattr(module, function_name)() From de8369b075da530776bebbd9d9eb65a84bc7b527 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Mon, 21 Sep 2009 12:11:21 +0000 Subject: [PATCH 0278/1000] Merged revisions 7803 via svnmerge from https://matplotlib.svn.sf.net/svnroot/matplotlib/branches/v0_99_maint ........ r7803 | mdboom | 2009-09-21 07:57:17 -0400 (Mon, 21 Sep 2009) | 1 line Fix 'variable used before defined' errors in backend_pdf.py building the docs ........ svn path=/trunk/matplotlib/; revision=7807 --- lib/matplotlib/backends/backend_pdf.py | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index 9c603c86cfff..bdd98847c986 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -529,19 +529,18 @@ def writeFonts(self): if filename.endswith('.afm'): # from pdf.use14corefonts matplotlib.verbose.report('Writing AFM font', 'debug') - fontdictObject = self._write_afm_font(filename) + fonts[Fx] = self._write_afm_font(filename) elif self.dviFontInfo.has_key(filename): # a Type 1 font from a dvi file; the filename is really the TeX name matplotlib.verbose.report('Writing Type-1 font', 'debug') - fontdictObject = self.embedTeXFont(filename, self.dviFontInfo[filename]) + fonts[Fx] = self.embedTeXFont(filename, self.dviFontInfo[filename]) else: # a normal TrueType font matplotlib.verbose.report('Writing TrueType font', 'debug') realpath, stat_key = get_realpath_and_stat(filename) chars = self.used_characters.get(stat_key) if chars is not None and len(chars[1]): - fontdictObject = self.embedTTF(realpath, chars[1]) - fonts[Fx] = fontdictObject + fonts[Fx] = self.embedTTF(realpath, chars[1]) self.writeObject(self.fontObject, fonts) def _write_afm_font(self, filename): From e5d65c784abf14cf666bea82fba745e65a67aff9 Mon Sep 17 00:00:00 2001 From: Ryan May Date: Mon, 21 Sep 2009 17:09:55 +0000 Subject: [PATCH 0279/1000] Merged revisions 7808 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7808 | ryanmay | 2009-09-21 11:30:11 -0500 (Mon, 21 Sep 2009) | 1 line Correct typo of subtitle() -> suptitle(). ........ svn path=/trunk/matplotlib/; revision=7812 --- CHANGELOG | 2 +- lib/matplotlib/figure.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index cc6e733caf8b..2b4b082f0dbe 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -981,7 +981,7 @@ 2008-06-05 Fix image drawing so there is no extra space to the right or bottom - MGD -2006-06-04 Added a figure title command subtitle as a Figure method +2006-06-04 Added a figure title command suptitle as a Figure method and pyplot command -- see examples/figure_title.py - JDH 2008-06-02 Added support for log to hist with histtype='step' and fixed diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index a14e21c4d2b4..4f7adeed9223 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -300,7 +300,7 @@ def suptitle(self, t, **kwargs): Example:: - fig.subtitle('this is the figure title', fontsize=12) + fig.suptitle('this is the figure title', fontsize=12) """ x = kwargs.pop('x', 0.5) y = kwargs.pop('y', 0.98) From 8663c9de9d89207535998dd5039046533187406c Mon Sep 17 00:00:00 2001 From: James Evans Date: Mon, 21 Sep 2009 23:02:27 +0000 Subject: [PATCH 0280/1000] Fixed a typo in _get_key. Was checking if a key existed in a dictionary in a way that does not work. svn path=/trunk/matplotlib/; revision=7814 --- lib/matplotlib/backends/backend_qt.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/backends/backend_qt.py b/lib/matplotlib/backends/backend_qt.py index 9693e974256e..ba72896aa973 100644 --- a/lib/matplotlib/backends/backend_qt.py +++ b/lib/matplotlib/backends/backend_qt.py @@ -176,7 +176,7 @@ def minumumSizeHint( self ): def _get_key( self, event ): if event.key() < 256: key = event.text().latin1() - elif event.key() in self.keyvald.has_key: + elif event.key() in self.keyvald: key = self.keyvald[ event.key() ] else: key = None From d60327822ba2b22d0d6e32c8d1a61b7fa7466645 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Tue, 22 Sep 2009 14:21:24 +0000 Subject: [PATCH 0281/1000] Fix small build svn path=/trunk/matplotlib/; revision=7815 --- doc/make.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/make.py b/doc/make.py index caf5d0a62dc1..666490a7d076 100755 --- a/doc/make.py +++ b/doc/make.py @@ -30,7 +30,7 @@ def html(): check_build() shutil.copy('../lib/matplotlib/mpl-data/matplotlibrc', '_static/matplotlibrc') if small_docs: - options = "-D plot_formats=\"['png']\"" + options = "-D plot_formats=\"[('png', 80)]\"" else: options = '' if os.system('sphinx-build %s -P -b html -d build/doctrees . build/html' % options): From e0fce961abdd290e809790f5118d6f55e2451802 Mon Sep 17 00:00:00 2001 From: Andrew Straw Date: Wed, 23 Sep 2009 06:24:27 +0000 Subject: [PATCH 0282/1000] testing: fix docstring. add comments. svn path=/trunk/matplotlib/; revision=7816 --- lib/matplotlib/testing/decorators.py | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/lib/matplotlib/testing/decorators.py b/lib/matplotlib/testing/decorators.py index f9877492da92..6363663b8c8a 100644 --- a/lib/matplotlib/testing/decorators.py +++ b/lib/matplotlib/testing/decorators.py @@ -39,8 +39,8 @@ def failer(*args, **kwargs): def image_comparison(baseline_images=None): """ compare images generated by the test with those specified in - *baseline_images*, which must correspond within tolerance *tol*, - else an ImageComparisonFailure exception will be raised. + *baseline_images*, which must correspond else an + ImageComparisonFailure exception will be raised. """ @@ -51,6 +51,11 @@ def decorated_compare_images(*args,**kwargs): result = func(*args,**kwargs) extension = '.png' # TODO: test more backends for fname in baseline_images: + # FIXME: place "actual", or current images, images in + # a more reasonable location than the current + # directory. Also, perhaps put them in sub-directory + # according to the name of the test module like the + # baseline images. actual = fname + extension # compute filename for baseline image From 4f5a5809c574322e0fa56bbcca1f3653c88d745d Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Wed, 23 Sep 2009 17:21:25 +0000 Subject: [PATCH 0283/1000] Fix how ipython_console_highlighting is imported. svn path=/trunk/matplotlib/; revision=7817 --- doc/conf.py | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/doc/conf.py b/doc/conf.py index 0fc587dfd32d..0c7beb0bbf67 100644 --- a/doc/conf.py +++ b/doc/conf.py @@ -18,10 +18,6 @@ # absolute, like shown here. sys.path.append(os.path.abspath('sphinxext')) -# Import support for ipython console session syntax highlighting (lives -# in the sphinxext directory defined above) -import ipython_console_highlighting - # General configuration # --------------------- @@ -30,7 +26,8 @@ extensions = ['matplotlib.sphinxext.mathmpl', 'math_symbol_table', 'sphinx.ext.autodoc', 'matplotlib.sphinxext.only_directives', 'matplotlib.sphinxext.plot_directive', 'inheritance_diagram', - 'gen_gallery', 'gen_rst'] + 'gen_gallery', 'gen_rst', + 'matplotlib.sphinxext.ipython_console_highlighting'] # Add any paths that contain templates here, relative to this directory. templates_path = ['_templates'] From 059c9752ae9134c98ac5e4a5de7a2f786ff5e8cc Mon Sep 17 00:00:00 2001 From: John Hunter Date: Thu, 24 Sep 2009 03:58:25 +0000 Subject: [PATCH 0284/1000] fix a typo in dates test svn path=/trunk/matplotlib/; revision=7820 --- lib/matplotlib/tests/test_dates.py | 4 ++++ make.osx | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/lib/matplotlib/tests/test_dates.py b/lib/matplotlib/tests/test_dates.py index 963290b3c62d..265cf0594492 100644 --- a/lib/matplotlib/tests/test_dates.py +++ b/lib/matplotlib/tests/test_dates.py @@ -145,6 +145,10 @@ def test_DateFormatter(): @knownfailureif(True) def test_empty_date_with_year_formatter(): # exposes sf bug 2861426: https://sourceforge.net/tracker/?func=detail&aid=2861426&group_id=80706&atid=560720 + + # update: I am no loner believe this is a bug, as I commented on + # the tracker. The question is now: what to do with this test + import matplotlib.dates as dates fig = plt.figure() diff --git a/make.osx b/make.osx index d84c63e7baf4..a739ba52e32a 100644 --- a/make.osx +++ b/make.osx @@ -1,7 +1,7 @@ # build mpl into a local install dir with # PREFIX=/Users/jdhunter/dev make -f make.osx fetch deps mpl_install -MPLVERSION=0.99.1rc1 +MPLVERSION=0.99.1 PYVERSION=2.6 PYTHON=python${PYVERSION} ZLIBVERSION=1.2.3 From 8398d9bd2c471108e2322dc889999f39cfb49714 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Thu, 24 Sep 2009 04:02:07 +0000 Subject: [PATCH 0285/1000] Merged revisions 7813,7818-7819 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7813 | jdh2358 | 2009-09-21 12:12:47 -0500 (Mon, 21 Sep 2009) | 1 line tag for 0.99.1 release ........ r7818 | jdh2358 | 2009-09-23 22:00:28 -0500 (Wed, 23 Sep 2009) | 1 line try statically linking in the deps for OSX ........ r7819 | jdh2358 | 2009-09-23 22:57:31 -0500 (Wed, 23 Sep 2009) | 1 line applied a fix for sf bug 2865490; is there something more elegant? ........ svn path=/trunk/matplotlib/; revision=7821 --- CHANGELOG | 3 +++ doc/_templates/indexsidebar.html | 7 +++++-- make.osx | 2 +- src/_backend_agg.cpp | 16 ++++++++++++++++ 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 2b4b082f0dbe..055da2e38162 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +=============================================== +2009-09-21 Tagged for release 0.99.1 + 2009-09-20 Fix usetex spacing errors in pdf backend. - JKS 2009-09-20 Add Sphinx extension to highlight IPython console sessions, diff --git a/doc/_templates/indexsidebar.html b/doc/_templates/indexsidebar.html index ecee5f685362..38547af89b76 100644 --- a/doc/_templates/indexsidebar.html +++ b/doc/_templates/indexsidebar.html @@ -3,8 +3,11 @@

    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 Jqr+!y_+O=uxnKEPuMF|N- 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 I#&iAu0<|*4zW@LL diff --git a/lib/matplotlib/tests/baseline_images/test_axes/single_date.png b/lib/matplotlib/tests/baseline_images/test_axes/single_date.png index 2301954a401b0f1a47b2ea316ddcfa9e31d16f31..97286d5edbcd4583217a238e5d2c1286721452a1 100644 GIT binary patch literal 28625 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 diff --git a/examples/data/logo2.png b/examples/data/logo2.png deleted file mode 100644 index a1adda483eedd2c978f6c587e0ac49ad521be866..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33541 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 -~NuYt84XydnJJQu@E@In+xLl+slF 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 Y;9P6W_Lq_bAmE?0xPn-fh+)A00hb+U761SM diff --git a/examples/data/membrane.dat b/examples/data/membrane.dat deleted file mode 100644 index 68f5e6b219448dac694aacba66b819564ba33467..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 48000 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 To$lVsq)YEPX4&#+{U`qyd@GW` diff --git a/examples/data/msft.csv b/examples/data/msft.csv deleted file mode 100644 index 727b1befe36e..000000000000 --- a/examples/data/msft.csv +++ /dev/null @@ -1,66 +0,0 @@ -Date,Open,High,Low,Close,Volume,Adj. Close* -19-Sep-03,29.76,29.97,29.52,29.96,92433800,29.79 -18-Sep-03,28.49,29.51,28.42,29.50,67268096,29.34 -17-Sep-03,28.76,28.95,28.47,28.50,47221600,28.34 -16-Sep-03,28.41,28.95,28.32,28.90,52060600,28.74 -15-Sep-03,28.37,28.61,28.33,28.36,41432300,28.20 -12-Sep-03,27.48,28.40,27.45,28.34,55777200,28.18 -11-Sep-03,27.66,28.11,27.59,27.84,37813300,27.68 -10-Sep-03,28.03,28.18,27.48,27.55,54763500,27.40 -9-Sep-03,28.65,28.71,28.31,28.37,44315200,28.21 -8-Sep-03,28.39,28.92,28.34,28.84,46105300,28.68 -5-Sep-03,28.23,28.75,28.17,28.38,64024500,28.22 -4-Sep-03,28.10,28.47,27.99,28.43,59840800,28.27 -3-Sep-03,27.42,28.40,27.38,28.30,109437800,28.14 -2-Sep-03,26.70,27.30,26.47,27.26,74168896,27.11 -29-Aug-03,26.46,26.55,26.35,26.52,34503000,26.37 -28-Aug-03,26.50,26.58,26.24,26.51,46211200,26.36 -27-Aug-03,26.51,26.58,26.30,26.42,30633900,26.27 -26-Aug-03,26.31,26.67,25.96,26.57,47546000,26.42 -25-Aug-03,26.31,26.54,26.23,26.50,36132900,26.35 -22-Aug-03,26.78,26.95,26.21,26.22,65846300,26.07 -21-Aug-03,26.65,26.73,26.13,26.24,63802700,26.09 -20-Aug-03,26.30,26.53,26.00,26.45,56739300,26.30 -19-Aug-03,25.85,26.65,25.77,26.62,72952896,26.47 -18-Aug-03,25.56,25.83,25.46,25.70,45817400,25.56 -15-Aug-03,25.61,25.66,25.43,25.54,27607900,25.40 -14-Aug-03,25.66,25.71,25.52,25.63,37338300,25.49 -13-Aug-03,25.79,25.89,25.50,25.60,39636900,25.46 -12-Aug-03,25.71,25.77,25.45,25.73,38208400,25.59 -11-Aug-03,25.61,25.99,25.54,25.61,36433900,25.47 -8-Aug-03,25.88,25.98,25.50,25.58,33241400,25.44 -7-Aug-03,25.72,25.81,25.45,25.71,44258500,25.57 -6-Aug-03,25.54,26.19,25.43,25.65,56294900,25.51 -5-Aug-03,26.31,26.54,25.60,25.66,58825800,25.52 -4-Aug-03,26.15,26.41,25.75,26.18,51825600,26.03 -1-Aug-03,26.33,26.51,26.12,26.17,42649700,26.02 -31-Jul-03,26.60,26.99,26.31,26.41,64504800,26.26 -30-Jul-03,26.46,26.57,26.17,26.23,41240300,26.08 -29-Jul-03,26.88,26.90,26.24,26.47,62391100,26.32 -28-Jul-03,26.94,27.00,26.49,26.61,52658300,26.46 -25-Jul-03,26.28,26.95,26.07,26.89,54173000,26.74 -24-Jul-03,26.78,26.92,25.98,26.00,53556600,25.85 -23-Jul-03,26.42,26.65,26.14,26.45,49828200,26.30 -22-Jul-03,26.28,26.56,26.13,26.38,51791000,26.23 -21-Jul-03,26.87,26.91,26.00,26.04,48480800,25.89 -18-Jul-03,27.11,27.23,26.75,26.89,63388400,26.74 -17-Jul-03,27.14,27.27,26.54,26.69,72805000,26.54 -16-Jul-03,27.56,27.62,27.20,27.52,49838900,27.37 -15-Jul-03,27.47,27.53,27.10,27.27,53567600,27.12 -14-Jul-03,27.63,27.81,27.05,27.40,60464400,27.25 -11-Jul-03,26.95,27.45,26.89,27.31,50377300,27.16 -10-Jul-03,27.25,27.42,26.59,26.91,55350800,26.76 -9-Jul-03,27.56,27.70,27.25,27.47,62300700,27.32 -8-Jul-03,27.26,27.80,27.25,27.70,61896800,27.55 -7-Jul-03,27.02,27.55,26.95,27.42,88960800,27.27 -3-Jul-03,26.69,26.95,26.41,26.50,39440900,26.35 -2-Jul-03,26.50,26.93,26.45,26.88,94069296,26.73 -1-Jul-03,25.59,26.20,25.39,26.15,60926000,26.00 -30-Jun-03,25.94,26.12,25.50,25.64,48073100,25.50 -27-Jun-03,25.95,26.34,25.53,25.63,76040304,25.49 -26-Jun-03,25.39,26.51,25.21,25.75,51758100,25.61 -25-Jun-03,25.64,25.99,25.14,25.26,60483500,25.12 -24-Jun-03,25.65,26.04,25.52,25.70,51820300,25.56 -23-Jun-03,26.14,26.24,25.49,25.78,52584500,25.64 -20-Jun-03,26.34,26.38,26.01,26.33,86048896,26.18 -19-Jun-03,26.09,26.39,26.01,26.07,63626900,25.92 \ No newline at end of file diff --git a/examples/data/msft_nasdaq_d.csv b/examples/data/msft_nasdaq_d.csv deleted file mode 100644 index b6df61104e25..000000000000 --- a/examples/data/msft_nasdaq_d.csv +++ /dev/null @@ -1,2000 +0,0 @@ -"20040406093000",-1,-1,-1,25.951,0 -"20040405093000",25.8,25.98,25.73,25.951,53803929 -"20040402093000",25.47,25.9,25.44,25.85,98051438 -"20040401093000",24.95,25.11,24.85,25.08,69070246 -"20040331093000",25.19,25.2,24.8699,24.93,70546891 -"20040330093000",25.19,25.33,25.03,25.2,59015157 -"20040329093000",25.24,25.4,25,25.31,51888701 -"20040326093000",25.11,25.51,25,25.03,61593457 -"20040325093000",24.6,25.24,24.58,25.19,85689639 -"20040324093000",24.36,24.58,24.18,24.41,97589357 -"20040323093000",24.63,24.66,24.11,24.15,91728989 -"20040322093000",24.53,24.84,24.01,24.5,127820324 -"20040319093000",24.84,24.94,24.56,24.63,86679709 -"20040318093000",25.03,25.03,24.58,24.89,123243243 -"20040317093000",25.25,25.46,25.11,25.13,56265756 -"20040316093000",25.27,25.37,25.0999,25.18,65454169 -"20040315093000",25.33,25.43,25.06,25.16,68841599 -"20040312093000",25.38,25.51,25.23,25.38,64143859 -"20040311093000",25.2,25.78,25.07,25.09,90594370 -"20040310093000",25.66,25.8,25.35,25.37,75170933 -"20040309093000",25.8,25.97,25.54,25.73,81131386 -"20040308093000",26.31,26.35,25.81,25.83,69399003 -"20040305093000",26.23,26.6,26.2,26.35,59852306 -"20040304093000",26.37,26.42,26.21,26.37,44030373 -"20040303093000",26.35,26.55,26.22,26.37,55002830 -"20040302093000",26.63,26.69,26.35,26.37,66346629 -"20040301093000",26.65,26.72,26.5,26.7,52154834 -"20040227093000",26.48,26.62,26.35,26.53,58282185 -"20040226093000",26.63,26.65,26.41,26.5,66605896 -"20040225093000",26.89,26.99,26.61,26.7,64495129 -"20040224093000",26.6,26.95,26.55,26.88,55437308 -"20040223093000",26.75,26.76,26.4799,26.61,50274762 -"20040220093000",26.65,26.795,26.5,26.57,57835228 -"20040219093000",26.9,26.98,26.43,26.46,62151119 -"20040218093000",26.92,27.11,26.74,26.77,50342324 -"20040217093000",26.7,27.1,26.59,26.99,43486350 -"20040213093000",26.98,27.06,26.5,26.59,67550717 -"20040212093000",27.09,27.15,26.93,26.95,44792237 -"20040211093000",26.95,27.23,26.85,27.15,51515284 -"20040210093000",26.86,27.15,26.82,27.02,37843404 -"20040209093000",27.18,27.229,26.85,26.9,48110933 -"20040206093000",27,27.19,26.93,27.08,47216232 -"20040205093000",27.06,27.17,26.83,26.96,55565357 -"20040204093000",27.15,27.43,27.01,27.01,60938651 -"20040203093000",27.42,27.55,27.18,27.29,48206749 -"20040202093000",27.63,27.8,27.24,27.4,63305411 -"20040130093000",27.85,27.9,27.55,27.65,40531805 -"20040129093000",27.78,27.95,27.57,27.91,63750367 -"20040128093000",28.28,28.44,27.47,27.71,71251148 -"20040127093000",28.6,28.72,28.22,28.25,63227109 -"20040126093000",28.49,28.83,28.32,28.8,58316839 -"20040123093000",28.27,28.76,28.22,28.48,127268328 -"20040122093000",28.37,28.44,27.94,28.01,79830106 -"20040121093000",28.13,28.3,27.85,28.3,53641475 -"20040120093000",27.99,28.2,27.93,28.1,63096877 -"20040116093000",27.74,27.88,27.53,27.81,64008119 -"20040115093000",27.55,27.72,27.42,27.54,58526359 -"20040114093000",27.51,27.73,27.47,27.7,43940830 -"20040113093000",27.54,27.64,27.26,27.43,51558311 -"20040112093000",27.67,27.73,27.35,27.57,55860375 -"20040109093000",28.03,28.061,27.59,27.66,67144616 -"20040108093000",28.39,28.48,28,28.16,58818964 -"20040107093000",28.17,28.31,28.01,28.21,54330541 -"20040106093000",28.19,28.28,28.07,28.24,46958281 -"20040105093000",27.73,28.18,27.72,28.14,67341841 -"20040102093000",27.58,27.77,27.33,27.45,44487643 -"20031231093000",27.42,27.55,27.23,27.37,42251891 -"20031230093000",27.41,27.55,27.4,27.52,34407446 -"20031229093000",27.21,27.53,27.16,27.46,40436735 -"20031226093000",27.05,27.25,27,27.21,12076814 -"20031224093000",27.14,27.16,27,27.04,19924190 -"20031223093000",27.17,27.34,27.01,27.15,39615407 -"20031222093000",27.16,27.43,26.97,27.18,43931366 -"20031219093000",27.49,27.55,27.19,27.36,76923606 -"20031218093000",27.1,27.45,27.05,27.4,61190617 -"20031217093000",27.04,27.08,26.85,27.04,53753584 -"20031216093000",26.83,27.16,26.77,27.06,73984242 -"20031215093000",27.05,27.1,26.68,26.74,88870946 -"20031212093000",26.69,26.81,26.5,26.65,69212563 -"20031211093000",26.59,26.77,26.28,26.61,79332407 -"20031210093000",26.45,26.63,26.38,26.59,82868113 -"20031209093000",26.44,26.61,26.25,26.38,103563951 -"20031208093000",26.12,26.34,25.81,26.24,90611833 -"20031205093000",25.96,26.48,25.919,25.98,96622995 -"20031204093000",25.72,26.23,25.66,26.2,87238064 -"20031203093000",25.82,26.07,25.62,25.67,93121525 -"20031202093000",25.95,26.09,25.61,25.66,85121710 -"20031201093000",25.9,26.21,25.5,25.84,102442206 -"20031128093000",25.5,25.75,25.4,25.71,33404276 -"20031126093000",25.61,25.63,25.32,25.45,69767066 -"20031125093000",25.87,25.95,25.38,25.4,85997502 -"20031124093000",25.33,25.81,25.28,25.73,100276357 -"20031121093000",25.33,25.38,25.08,25.11,70823445 -"20031120093000",25.17,25.631,25.08,25.1,107168833 -"20031119093000",25.29,25.54,25.17,25.35,78862796 -"20031118093000",25.33,25.84,25.12,25.15,110110627 -"20031117093000",25.39,25.44,24.95,25.15,103808559 -"20031114093000",25.7,26.02,25.44,25.5,83171113 -"20031113093000",25.86,25.93,25.45,25.69,79154370 -"20031112093000",25.85,26.14,25.6,25.98,76231280 -"20031111093000",26.01,26.076,25.67,25.8,64999504 -"20031110093000",26.12,26.23,26,26.001,54596151 -"20031107093000",26.38,26.49,26.03,26.1,57862061 -"20031106093000",26.26,26.3,26,26.23,68225794 -"20031105093000",26.15,26.32,26,26.1,61569647 -"20031104093000",26.59,26.62,26.01,26.07,84035771 -"20031103093000",26.35,26.75,26.29,26.68,57790227 -"20031031093000",26.37,26.44,26.11,26.14,69659088 -"20031030093000",27.01,27.04,25.91,26.12,99139273 -"20031029093000",27.16,27.25,26.66,26.74,73595062 -"20031028093000",27.09,27.22,26.88,27.2,72144561 -"20031027093000",26.91,27.1,26.82,26.91,65641718 -"20031024093000",27.27,27.4,26.42,26.61,210918193 -"20031023093000",28.72,29.08,28.7,28.91,69346691 -"20031022093000",29.03,29.21,28.8,28.89,48852064 -"20031021093000",29.35,29.43,29.17,29.353,44176165 -"20031020093000",28.95,29.37,28.8,29.35,38831483 -"20031017093000",29.28,29.29,28.8,28.93,51135991 -"20031016093000",28.91,29.31,28.8,29.23,42270253 -"20031015093000",29.2,29.26,28.7,29.07,58358102 -"20031014093000",28.66,28.77,28.48,28.68,35191311 -"20031013093000",28.98,29.1,28.5,28.78,39342697 -"20031010093000",28.91,29.2,28.67,28.91,37611609 -"20031009093000",29.22,29.3496,28.8,28.94,62736808 -"20031008093000",29.36,29.36,28.68,28.82,47001129 -"20031007093000",29.01,29.372,28.92,29.14,52374444 -"20031006093000",29.15,29.3,28.91,29.19,34057031 -"20031003093000",29.16,29.46,28.93,29.08,57309125 -"20031002093000",28.45,28.75,28.19,28.5,38393640 -"20031001093000",28.03,28.63,27.81,28.52,59194078 -"20030930093000",28.59,28.61,27.75,27.8,63403292 -"20030929093000",28.41,28.91,28.1,28.83,47384602 -"20030926093000",28.27,28.78,28.14,28.19,49867950 -"20030925093000",28.47,28.9597,28.22,28.24,56263206 -"20030924093000",29.61,29.7,28.419,28.46,66476631 -"20030923093000",29.12,29.71,28.88,29.6,58359896 -"20030922093000",29.39,30,28.81,29.07,65714021 -"20030919093000",29.76,29.97,29.52,29.96,92380218 -"20030918093000",28.49,29.51,28.42,29.5,67278172 -"20030917093000",28.76,28.95,28.47,28.5,47232034 -"20030916093000",28.41,28.95,28.32,28.9,52369785 -"20030915093000",28.37,28.61,28.33,28.36,41446549 -"20030912093000",27.48,28.4,26.7,28.34,55787533 -"20030911093000",27.66,28.11,27.59,27.84,37958093 -"20030910093000",28.03,28.18,27.48,27.55,54770213 -"20030909093000",28.645,28.71,28.314,28.37,44455559 -"20030908093000",28.39,28.92,28.34,28.84,46161767 -"20030905093000",28.23,28.75,28.17,28.38,64049179 -"20030904093000",28.1,28.47,27.99,28.43,60199009 -"20030903093000",27.42,28.4,27.38,28.3,109502844 -"20030902093000",26.7,27.3,26.47,27.26,74314623 -"20030829093000",26.46,26.551,26.35,26.52,34776119 -"20030828093000",26.5,26.58,26.24,26.51,46220735 -"20030827093000",26.51,26.58,26.3,26.42,30638514 -"20030826093000",26.31,26.67,25.96,26.57,47557325 -"20030825093000",26.31,26.54,26.23,26.5,36157255 -"20030822093000",26.78,26.95,26.21,26.22,65864451 -"20030821093000",26.65,26.73,26.13,26.24,63920667 -"20030820093000",26.3,26.53,26,26.45,56805847 -"20030819093000",25.85,26.65,25.77,26.62,73001390 -"20030818093000",25.56,25.83,25.46,25.7,45970005 -"20030815093000",25.61,25.66,25.43,25.54,27613331 -"20030814093000",25.66,25.71,25.52,25.63,37416724 -"20030813093000",25.79,25.89,25.5,25.6,39689032 -"20030812093000",25.71,25.77,25.45,25.73,38219342 -"20030811093000",25.61,25.99,25.54,25.61,36438082 -"20030808093000",25.88,25.98,25.5,25.58,33329526 -"20030807093000",25.72,25.81,25.45,25.71,44295184 -"20030806093000",25.54,26.19,25.43,25.65,56301022 -"20030805093000",26.31,26.54,25.6,25.66,58918339 -"20030804093000",26.15,26.41,25.75,26.18,51837768 -"20030801093000",26.33,26.51,26.12,26.17,43200258 -"20030731093000",26.6,26.99,26.31,26.41,64532271 -"20030730093000",26.46,26.57,26.17,26.23,41252147 -"20030729093000",26.88,26.9,26.24,26.47,62427090 -"20030728093000",26.94,27,26.49,26.61,52711820 -"20030725093000",26.28,26.95,26.07,26.89,54185086 -"20030724093000",26.78,26.92,25.98,26,53573421 -"20030723093000",26.42,26.65,26.14,26.45,49831938 -"20030722093000",26.28,26.56,26.1311,26.38,51802602 -"20030721093000",26.87,26.91,26,26.04,49061777 -"20030718093000",27.11,27.23,26.75,26.89,63403704 -"20030717093000",27.14,27.27,26.54,26.69,73663317 -"20030716093000",27.56,27.62,27.2,27.52,50506829 -"20030715093000",27.47,27.53,27.1,27.27,53649884 -"20030714093000",27.63,27.81,27.05,27.4,60470938 -"20030711093000",26.95,27.45,26.89,27.309,50386814 -"20030710093000",27.25,27.45,26.59,26.91,55496602 -"20030709093000",27.56,27.7,27.248,27.47,62413894 -"20030708093000",27.26,27.8,27.249,27.7,61963586 -"20030707093000",27.02,27.551,26.95,27.42,89248289 -"20030703093000",26.7,26.95,26.41,26.45,39441210 -"20030702093000",26.5,26.93,26.45,26.88,95165555 -"20030701093000",25.59,26.201,25.39,26.15,61030761 -"20030630093000",25.94,26.12,25.5,25.64,53109054 -"20030627093000",25.95,26.34,25.53,25.63,76061812 -"20030626093000",25.39,26.51,25.21,25.75,51735860 -"20030625093000",25.64,25.987,25.139,25.26,60580527 -"20030624093000",25.65,26.04,25.52,25.7,51939104 -"20030623093000",26.14,26.24,25.49,25.78,53001295 -"20030620093000",26.344,26.38,26.01,26.33,86918549 -"20030619093000",26.09,26.39,26.01,26.07,63712208 -"20030618093000",25.98,26.43,25.71,26.07,89966720 -"20030617093000",25.64,26.14,25.53,25.959,122234258 -"20030616093000",24.8,25.42,24.669,25.39,70139491 -"20030613093000",25.2,25.25,24.49,24.65,55157665 -"20030612093000",24.97,25.14,24.74,24.99,66204796 -"20030611093000",24.669,24.96,24.422,24.88,75791784 -"20030610093000",23.94,24.75,23.85,24.68,80734302 -"20030609093000",23.72,23.982,23.5999,23.75,73629370 -"20030606093000",24.44,24.56,23.65,23.67,121172563 -"20030605093000",24.47,24.52,24.009,24.09,116136863 -"20030604093000",24.99,25.22,24.74,24.87,83566075 -"20030603093000",24.75,24.92,24.57,24.88,61069552 -"20030602093000",24.98,25.03,24.57,24.639,66328680 -"20030530093000",24.73,24.91,24.51,24.61,85397900 -"20030529093000",24.47,24.67,24.23,24.4,75491901 -"20030528093000",24.78,24.871,24.3,24.41,91524308 -"20030527093000",24.25,24.89,24.219,24.79,68514305 -"20030523093000",24.2,24.54,24.03,24.22,77053076 -"20030522093000",24.2,24.27,24.04,24.16,93413313 -"20030521093000",24.63,24.71,23.89,24.03,109343442 -"20030520093000",24.86,25,24.5,24.63,52775368 -"20030519093000",25.4,25.54,24.74,24.8,55447137 -"20030516093000",25.88,26.05,25.41,25.57,60488391 -"20030515093000",25.85,26.01,25.57,25.79,45696020 -"20030514093000",26.08,26.18,25.546,25.63,45131526 -"20030513093000",26.04,26.2,25.89,25.99,44620696 -"20030512093000",26.15,26.47,26.06,26.21,54013255 -"20030509093000",25.9,26.5,25.89,26.35,59018279 -"20030508093000",25.75,26.148,25.71,25.75,46541276 -"20030507093000",26.11,26.35,25.84,25.99,49234538 -"20030506093000",25.86,26.501,25.82,26.38,54468151 -"20030505093000",26.25,26.39,25.84,25.86,50537557 -"20030502093000",25.65,26.29,25.57,26.13,52815510 -"20030501093000",25.54,25.95,25.34,25.71,42214792 -"20030430093000",25.73,25.88,25.25,25.56,55690962 -"20030429093000",25.95,26.25,25.68,25.809,66022742 -"20030428093000",25.39,25.94,25.32,25.74,56393943 -"20030425093000",25.33,25.644,25.17,25.21,53778322 -"20030424093000",25.48,25.72,25.32,25.49,51884817 -"20030423093000",25.75,25.99,25.47,25.72,55821379 -"20030422093000",25.06,25.8,25.03,25.74,58986853 -"20030421093000",25.61,25.61,25.08,25.21,41678747 -"20030417093000",24.77,25.54,24.74,25.5,58519227 -"20030416093000",25.6,25.74,24.6,24.91,86373961 -"20030415093000",24.68,24.79,24.1,24.61,64340820 -"20030414093000",24.27,24.88,24,24.75,51950191 -"20030411093000",24.89,25.18,23.95,24.2,71742754 -"20030410093000",24.719,24.79,24.28,24.59,51638640 -"20030409093000",25.61,25.67,24.54,24.57,76927109 -"20030408093000",25.31,25.835,25.2,25.58,54145573 -"20030407093000",26.23,26.43,25.17,25.171,65658301 -"20030404093000",25.76,25.8,24.93,25.09,55755448 -"20030403093000",25.99,26.09,25.6,25.73,57710342 -"20030402093000",25.1,26,25.1,25.72,68328205 -"20030401093000",24.46,24.7,24.25,24.35,49803234 -"20030331093000",24.25,24.71,24.01,24.21,71461181 -"20030328093000",24.67,25.1,24.6,24.67,39582173 -"20030327093000",24.94,25.26,24.599,25.04,60045257 -"20030326093000",25.46,25.62,25.24,25.25,51687898 -"20030325093000",25.6,25.751,25.03,25.49,63608930 -"20030324093000",25.55,25.935,25.1899,25.29,61250394 -"20030321093000",26.79,26.9,26.03,26.57,85826301 -"20030320093000",26.02,26.52,25.67,26.25,72006425 -"20030319093000",25.98,26.43,25.74,26.32,73828591 -"20030318093000",25.89,26.04,25.5,26.04,78377645 -"20030317093000",24.52,25.95,24.33,25.93,101197122 -"20030314093000",24.68,24.961,24.26,24.86,75701349 -"20030313093000",23.72,24.74,23.44,24.67,81041416 -"20030312093000",22.818,23.44,22.55,23.39,72568874 -"20030311093000",23.06,23.2679,22.76,22.79,54268389 -"20030310093000",23.31,23.46,22.89,22.95,48721361 -"20030307093000",22.95,23.79,22.9,23.56,66167680 -"20030306093000",23.17,23.5,23.13,23.27,51553414 -"20030305093000",23.07,23.55,23.05,23.44,55631397 -"20030304093000",23.58,23.66,23.06,23.07,56803900 -"20030303093000",24.02,24.12,23.4068,23.54,50841129 -"20030228093000",23.74,24.07,23.559,23.7,56737928 -"20030227093000",23.9,24.21,23.3,23.58,75639266 -"20030226093000",24.079,24.47,23.58,23.6,57314562 -"20030225093000",23.54,24.27,23.38,24.19,68473109 -"20030224093000",24.44,24.5,23.84,24.07,62548553 -"20030221093000",24.29,24.8,23.7,24.61,57081029 -"20030220093000",24.77,24.87,24.1,24.15,51027895 -"20030219093000",24.82,24.88,24.17,24.53,47130583 -"20030218093000",24.62,24.99,24.4,24.96,57543713 -"20030214093000",23.625,24.25,23.385,24.15,90770856 -"20030213093000",23.205,23.56,23.0655,23.495,73839528 -"20030212093000",23.275,23.55,23.134,23.22,71576300 -"20030211093000",23.65,23.835,23,23.22,84596680 -"20030210093000",23.4,23.76,23.27,23.69,74333418 -"20030207093000",23.94,23.975,23.205,23.29,75852114 -"20030206093000",23.43,23.81,23.28,23.71,83617960 -"20030205093000",23.915,24.265,23.33,23.48,101376734 -"20030204093000",23.9,23.97,23.44,23.66,82124484 -"20030203093000",23.965,24.55,23.73,24.28,80820526 -"20030131093000",23.725,24.177,23.515,23.73,107182966 -"20030130093000",25.08,25.085,24.095,24.12,88387876 -"20030129093000",24.365,25.0245,23.965,24.955,107226456 -"20030128093000",24.845,24.85,24.2805,24.41,86413978 -"20030127093000",24.66,25.3,24.205,24.585,115186478 -"20030124093000",26.015,26.025,24.8505,24.925,103436814 -"20030123093000",25.975,26.27,25.73,26.14,71629620 -"20030122093000",25.795,26.2,25.455,25.5,87486264 -"20030121093000",25.935,26.075,25.645,25.665,86413486 -"20030117093000",26.47,26.5,25.655,25.73,156119200 -"20030116093000",28.16,28.325,27.555,27.675,83405140 -"20030115093000",28.5,28.66,28.095,28.135,59999384 -"20030114093000",28.16,28.5,28.095,28.485,54441838 -"20030113093000",28.2625,28.375,27.889,28.195,61040604 -"20030110093000",27.55,28.15,27.45,27.96,67985474 -"20030109093000",27.36,27.96,27.265,27.905,62048642 -"20030108093000",27.685,27.775,27.055,27.12,64749146 -"20030107093000",27.46,28.005,27.34,27.9,81113928 -"20030106093000",27.01,27.615,26.9,27.385,59691684 -"20030103093000",26.795,26.9,26.44,26.895,55744224 -"20030102093000",26.15,26.875,25.855,26.86,67208216 -"20021231093000",26.37,26.495,25.63,25.85,58385956 -"20021230093000",26.505,26.62,26.135,26.375,48298450 -"20021227093000",26.64,27,26.45,26.485,41013688 -"20021226093000",27.015,27.345,26.585,26.695,37341460 -"20021224093000",26.7705,27.115,26.76,26.9105,18427844 -"20021223093000",26.525,27.14,26.45,27,48904018 -"20021220093000",26.745,26.86,26.475,26.52,98535408 -"20021219093000",26.625,27.375,26.44,26.555,82925616 -"20021218093000",26.92,27.2,26.395,26.765,62897932 -"20021217093000",27.21,27.495,26.89,27.18,49820892 -"20021216093000",26.5,27.275,26.335,27.24,60273208 -"20021213093000",26.84,26.875,26.245,26.25,65405618 -"20021212093000",27.5,27.53,26.845,27.085,55394146 -"20021211093000",26.925,27.5095,26.7915,27.33,69323784 -"20021210093000",26.78,27.24,26.74,27.005,63924442 -"20021209093000",27.5,27.61,26.755,26.765,64040988 -"20021206093000",27.435,27.87,27.11,27.735,71820280 -"20021205093000",28.475,28.545,27.65,27.67,69034046 -"20021204093000",28.065,28.72,27.91,28.27,84090988 -"20021203093000",28.6405,28.675,28.205,28.355,58650318 -"20021202093000",29.325,29.48,28.505,28.845,63904216 -"20021129093000",29.215,29.315,28.8,28.84,28466796 -"20021127093000",28.8,29.307,28.7,29.04,55334804 -"20021126093000",28.82,29.125,28.39,28.45,69180644 -"20021125093000",29.03,29.32,28.7855,29.115,61738074 -"20021122093000",28.725,29.15,28.525,29.11,70139728 -"20021121093000",28.49,29,28.39,28.92,83128144 -"20021120093000",27.505,28.45,27.465,28.31,76738650 -"20021119093000",27.775,27.9,27.155,27.415,76558560 -"20021118093000",28.475,28.5185,27.87,27.925,58236538 -"20021115093000",28.335,28.46,27.835,28.35,78480722 -"20021114093000",27.995,28.5,27.935,28.495,78519768 -"20021113093000",27.12,27.965,27.055,27.685,107992828 -"20021112093000",27.05,27.715,26.95,27.255,81898940 -"20021111093000",27.535,27.55,26.91,26.93,58479334 -"20021108093000",28,28.275,27.505,27.55,66088754 -"20021107093000",28.1,28.31,27.75,28.045,73840362 -"20021106093000",28.495,28.552,27.765,28.5,115817030 -"20021105093000",27.89,28.4,27.79,28.34,76831422 -"20021104093000",28.375,28.625,27.76,28.045,140207228 -"20021101093000",26.215,26.62,25.95,26.5,105682436 -"20021031093000",26.595,27.035,26.425,26.735,106194640 -"20021030093000",26.1,26.695,25.815,26.555,94625004 -"20021029093000",26.075,26.245,25.425,26.035,90809122 -"20021028093000",26.7,26.75,25.755,26,80081818 -"20021025093000",25.625,26.4,25.58,26.34,75604510 -"20021024093000",26.66,26.685,25.45,25.615,96088000 -"20021023093000",25.715,26.63,25.5,26.595,111183962 -"20021022093000",25.715,25.965,25.515,25.835,87367430 -"20021021093000",25.985,26.495,25.68,26.255,112638800 -"20021018093000",26.3,26.6,25.57,26.575,153310760 -"20021017093000",26.14,26.25,25.025,25.375,183771030 -"20021016093000",25.195,25.63,25.14,25.205,95686356 -"20021015093000",25.6325,26.185,25.325,26.145,133729336 -"20021014093000",24.125,24.665,23.92,24.65,76551010 -"20021011093000",23.68,24.45,23.505,24.435,109088928 -"20021010093000",22,23.31,21.625,23.19,118830614 -"20021009093000",22.1135,22.725,21.905,21.995,123626070 -"20021008093000",22.375,22.99,22.065,22.48,116046636 -"20021007093000",21.905,22.53,21.845,22.06,90274004 -"20021004093000",22.695,22.785,21.845,21.885,107475586 -"20021003093000",22.65,23.297,22.3,22.4,105567092 -"20021002093000",23.05,23.408,22.58,22.805,103758332 -"20021001093000",22.125,23.125,21.595,23.115,110976456 -"20020930093000",22.435,22.52,21.5585,21.845,115849066 -"20020927093000",23.02,23.55,22.595,22.625,81222772 -"20020926093000",23.555,23.75,22.975,23.105,101115546 -"20020925093000",23.2,23.483,22.525,23.255,107405112 -"20020924093000",22.415,23.24,22.315,22.82,103789188 -"20020923093000",23.3,23.355,22.405,22.62,90025730 -"20020920093000",23.855,24,23.65,23.74,130785394 -"20020919093000",23.34,23.91,23.295,23.5865,77905338 -"20020918093000",23.36,24.12,23.33,23.875,84261030 -"20020917093000",24.335,24.4535,23.605,23.645,73707242 -"20020916093000",23.8,24.065,23.525,23.89,50320084 -"20020913093000",23.45,24.13,23.425,23.955,59695926 -"20020912093000",24.075,24.15,23.51,23.595,63976426 -"20020911110000",25.14,25.55,24.265,24.28,78213394 -"20020910093000",24.27,24.91,24.175,24.895,84133970 -"20020909093000",23.625,24.475,23.315,24.345,81844806 -"20020906093000",23.875,24.1395,23.735,23.91,70303318 -"20020905093000",23.75,23.76,22.94,22.955,90939744 -"20020904093000",23.725,24.3,23.575,24.05,80445182 -"20020903093000",24.26,24.26,23.5,23.51,74629474 -"20020830093000",25.07,25.24,24.5,24.56,58547076 -"20020829093000",24.445,25.5,24.26,25.29,94530678 -"20020828093000",25.24,25.33,24.65,24.69,69290570 -"20020827093000",26.17,26.225,25.325,25.42,65639262 -"20020826093000",26.25,26.325,25.59,26.05,55826724 -"20020823093000",26.33,26.425,25.92,26.11,58197160 -"20020822093000",26.43,26.725,26.3,26.615,72736384 -"20020821093000",25.78,26.19,25.575,26.14,81397866 -"20020820093000",25.69,25.85,25.375,25.52,70827940 -"20020819093000",25.02,26.025,24.925,25.995,79959898 -"20020816093000",24.715,25.115,24.46,24.995,69480666 -"20020815093000",24.98,25.37,24.375,24.885,99017036 -"20020814093000",23.625,24.95,23.605,24.855,97624276 -"20020813093000",23.995,24.85,23.46,23.525,100507942 -"20020812093000",23.805,24.375,23.8,24.235,57071304 -"20020809093000",24.075,24.575,23.83,24.06,69319848 -"20020808093000",23.555,24.5025,23.205,24.455,89001030 -"20020807093000",23.5,23.65,22.58,23.545,86685090 -"20020806093000",22.45,23.625,22.375,22.83,88996052 -"20020805093000",22.145,22.585,21.905,21.995,79442490 -"20020802093000",22.755,22.925,21.9,22.205,86261194 -"20020801093000",23.79,24.045,22.75,22.875,92222218 -"20020731093000",23.805,24,23.18,23.975,94116780 -"20020730093000",23.775,24.415,23.665,24.05,122988458 -"20020729093000",23.425,24.15,23.275,24.125,112379358 -"20020726093000",21.87,22.705,21.84,22.675,124122814 -"20020725093000",22.725,22.8575,21.22,21.41,163940526 -"20020724093000",20.875,23.18,20.705,23.115,203412788 -"20020723093000",23.155,23.4025,21.48495,21.50495,168061600 -"20020722093000",24.475,24.995,22.95,23.145,180678824 -"20020719093000",24.935,25.445,24.406,24.78,112572000 -"20020718093000",26.03,26.37,25.33,25.555,91493800 -"20020717093000",26.26,26.65,25.585,26,98062200 -"20020716093000",25.655,26.4,25.32,25.625,97267000 -"20020715093000",25.695,25.93,24,25.89,136966600 -"20020712093000",26.685,26.865,25.74,25.93,95786200 -"20020711093000",26.02,26.5375,25.625,26.45,129628600 -"20020710093000",26.845,27.1,26.065,26.12,90686600 -"20020709093000",26.655,27.365,26.485,26.605,85286800 -"20020708093000",27.205,27.465,26.2945,26.46,63216000 -"20020705093000",26.545,27.45,26.525,27.45,35673600 -"20020703093000",25.62,26.26,25.225,26.225,80959600 -"20020702093000",26.19,26.46,25.665,25.72,82822800 -"20020701093000",27.06,27.195,26.29,26.34,66654000 -"20020628093000",27.275,27.895,27,27.06,90210000 -"20020627093000",27.3015,27.47,26.43,27.46,95816400 -"20020626093000",25.52995,27.195,25.525,27.065,112187000 -"20020625093000",27.35,27.5,26.4,26.475,84059000 -"20020624093000",26.045,27.32,25.925,27.08,104562000 -"20020621093000",26.7,27.275,26.14,26.14,116844800 -"20020620093000",27.185,27.55,26.95,27.05,86432600 -"20020619093000",27.735,27.971,27.16,27.18,81679000 -"20020618093000",27.765,28.145,27.675,27.995,77931800 -"20020617093000",27.83,28.22,27.685,27.84,94580400 -"20020614093000",26.575,27.775,26.5,27.625,109433600 -"20020613093000",27.42,27.74,27.1,27.11,79931000 -"20020612093000",26.29,27.89,26.25,27.77,136476800 -"20020611093000",26.62,27.09,26.21,26.285,74375000 -"20020610093000",25.825,26.65,25.73,26.41,71838800 -"20020607093000",24.945,26.3,24.93,25.99,97839800 -"20020606093000",25.75,26.07,25,25.925,78987400 -"20020605093000",25.215,25.875,25.165,25.83,66978600 -"20020604093000",24.75,25.615,24.62,24.99,88057200 -"20020603093000",25.495,25.82,24.585,24.685,88448600 -"20020531093000",26.45,26.71,25.44,25.505,66475000 -"20020530093000",25.82,26.68,25.715,26.32,63522600 -"20020529093000",25.825,26.36,25.775,26.025,45399800 -"20020528093000",26.795,26.845,25.875,26.16,49602400 -"20020524093000",27.07,27.26,26.52,26.63,36015600 -"20020523093000",26.85,27.42,26.505,27.41,51433800 -"20020522093000",25.935,26.86,25.925,26.835,54170800 -"20020521093000",26.975,27.3,26.065,26.095,63128200 -"20020520093000",27.75,27.775,26.75,27.005,52121800 -"20020517093000",28.105,28.2,27.635,28.015,54647000 -"20020516093000",27.355,28.02,27.325,27.87,53417600 -"20020515093000",27.245,28.22,26.93,27.375,70460400 -"20020514093000",27.2,27.55,26.9935,27.495,64877000 -"20020513093000",25.225,26.455,24.875,26.345,64821800 -"20020510093000",26.265,26.338,24.998,25.025,64522400 -"20020509093000",27.2,27.5,25.95,26.06,83300000 -"20020508093000",25.635,27.485,25.61,27.485,101262000 -"20020507093000",24.59,25.145,24.1765,24.735,88535000 -"20020506093000",24.72,25.27,24.185,24.31,66315400 -"20020503093000",25.63,25.84,24.755,24.78,71649600 -"20020502093000",26.32,27.035,25.575,25.605,79011600 -"20020501093000",26.08,26.595,25.33,26.375,76423200 -"20020430093000",26.05,26.65,25.96,26.13,77394000 -"20020429093000",25.735,26.455,25.72,26.12,70330400 -"20020426093000",27.035,27.225,25.73,25.75,62785400 -"20020425093000",26.45,27.225,26.4445,26.865,57293200 -"20020424093000",26.925,27.215,26.5,26.51,61235200 -"20020423093000",27.85,27.91,26.65,26.995,68472600 -"20020422093000",28.26,28.35,27.5,27.795,51480000 -"20020419093000",28.72,28.99,28.43,28.6,104631800 -"20020418093000",28.395,28.655,27.92,28.185,77057200 -"20020417093000",28.975,29.14,28.21,28.315,55162800 -"20020416093000",28.2,29.05,28.18,28.905,52041000 -"20020415093000",28,28.385,27.7,27.845,47393800 -"20020412093000",27.575,28.13,27.43,27.965,52297600 -"20020411093000",27.945,28.225,27.25,27.395,58171000 -"20020410093000",27.56,28.555,27.53,28.15,75637800 -"20020409093000",28.665,28.7155,27.4,27.435,63424200 -"20020408093000",27.15,28.656,27.13,28.61,73392000 -"20020405093000",28.445,28.65,27.92,27.935,50176200 -"20020404093000",27.99,28.485,27.714,28.225,61769400 -"20020403093000",28.7225,28.805,27.75,28.165,76969000 -"20020402093000",29.45,29.5495,28.555,28.725,77037800 -"20020401093000",29.915,30.2,29.6,30.19,47010200 -"20020328093000",29.975,30.325,29.83,30.155,44393000 -"20020327093000",29.4,29.94,29.295,29.72,47322200 -"20020326093000",29.55,30.46,29.155,29.54,69403400 -"20020325093000",30.24,30.39,29.575,29.615,47942400 -"20020322093000",30.525,30.57,30.11,30.215,41341400 -"20020321093000",30.105,30.7995,29.915,30.68,46169600 -"20020320093000",30.7,31.01,30.05,30.05,55508600 -"20020319093000",31.09,31.5,30.75,31.115,36376400 -"20020318093000",31.37,31.495,30.6,31.07,44854600 -"20020315093000",30.5,31.255,30.485,31.245,69094000 -"20020314093000",31.07,31.12,30.525,30.61,51828400 -"20020313093000",31.04,31.51,30.975,31.05,44388000 -"20020312093000",31.26,31.4,30.835,31.27,66417800 -"20020311093000",31.755,32.5,31.5,32.17,43718200 -"20020308093000",31.815,32.35,31.585,31.975,57703800 -"20020307093000",31.835,31.9445,30.93,31.36,58081000 -"20020306093000",31.455,31.85,31.095,31.815,50160800 -"20020305093000",31.5,31.94,31.17,31.54,55926800 -"20020304093000",30.62,31.75,30.4395,31.595,74464400 -"20020301093000",29.525,30.71,29.425,30.685,62457600 -"20020228093000",29.39,29.85,29.07,29.17,68067000 -"20020227093000",29.5375,30.075,28.9995,29.195,65755400 -"20020226093000",29.551,30,28.95,29.275,63279000 -"20020225093000",28.97,29.945,28.945,29.54,51832400 -"20020222093000",29.025,29.3755,28.575,28.995,71348200 -"20020221093000",29.86,30.135,29.005,29.025,59449400 -"20020220093000",29.7,30.18,29.4,29.95,50498200 -"20020219093000",29.955,30.07,29.3045,29.415,52265200 -"20020215093000",30.85,31.03,30.1,30.115,50184400 -"20020214093000",31,31.495,30.66,30.8,57267600 -"20020213093000",30.13,30.94,29.975,30.875,54175200 -"20020212093000",30.245,30.425,30.01,30.07,44975200 -"20020211093000",30.005,30.62,29.795,30.565,50900400 -"20020208093000",30.06,30.33,29.415,30.325,61285200 -"20020207093000",30.15,30.805,29.875,29.9,63327800 -"20020206093000",30.805,30.945,30.125,30.225,66126200 -"20020205093000",30.4,31.115,30.25,30.575,66772800 -"20020204093000",31.2,31.345,30.375,30.56,70310400 -"20020201093000",32.075,32.2505,31.235,31.33,63462800 -"20020131093000",31.53,31.905,31.06,31.855,69572800 -"20020130093000",31.225,31.45,30.665,31.425,66104200 -"20020129093000",31.95,32.25,30.995,31.16,58669400 -"20020128093000",32.115,32.2,31.455,31.91,41623400 -"20020125093000",32.095,32.425,31.755,31.9,48981600 -"20020124093000",32.05,32.59,31.9,32.33,83959400 -"20020123093000",32.025,32.355,31.62,31.87,80408600 -"20020122093000",33.305,33.315,32.125,32.275,76840800 -"20020118093000",33.55,33.925,32.71,33.05,107271600 -"20020117093000",34.265,35.0005,34.2,34.93,80371200 -"20020116093000",34.425,34.92,33.925,33.935,61959000 -"20020115093000",34.33,34.81,34.25,34.775,60720200 -"20020114093000",34.15,34.52,33.87,34.235,50999800 -"20020111093000",34.76,35.16,34.05,34.305,72994600 -"20020110093000",34.24,34.9,34.065,34.64,50329000 -"20020109093000",34.86,35.31,34.235,34.345,76309000 -"20020108093000",34.345,34.93,34,34.685,47736600 -"20020107093000",34.875,35.01,34.175,34.28,58508800 -"20020104093000",34.625,34.955,34.335,34.45,52733600 -"20020103093000",33.555,34.625,33.545,34.615,67692400 -"20020102093000",33.325,33.555,32.755,33.52,48124800 -"20011231093000",33.92,34.24,33.125,33.135,43058200 -"20011228093000",34.115,34.425,33.85,33.925,28789000 -"20011227093000",33.99,34.355,33.63,33.925,32429000 -"20011226093000",33.71,34.535,33.695,33.84,29331800 -"20011224093000",33.86,34.015,33.6,33.625,11701600 -"20011221093000",34.005,34.365,33.5,33.77,84324600 -"20011220093000",34.575,34.7,33.313,33.38,78593000 -"20011219093000",34.31,34.9455,34.225,34.745,56996200 -"20011218093000",34.46,34.7,34.3045,34.635,47261200 -"20011217093000",33.585,34.555,33.58,34.49,57080600 -"20011214093000",33.01,33.975,32.965,33.72,43003800 -"20011213093000",33.565,34.19,33.0395,33.135,53234000 -"20011212093000",33.58,33.99,33.125,33.975,47884200 -"20011211093000",33.83,34.0695,33.535,33.66,54334000 -"20011210093000",33.76,34.225,33.43,33.53,38367400 -"20011207093000",34.1,34.42,33.275,33.915,42332400 -"20011206093000",33.99,34.5,33.775,34.27,56033600 -"20011205093000",33.245,34.085,33.19,34.05,74251200 -"20011204093000",32.5,33.04,32.05,33,51012600 -"20011203093000",31.915,32.615,31.9,32.385,47213600 -"20011130093000",32.33,32.54,31.965,32.105,48238400 -"20011129093000",31.56,32.45,31.4795,32.42,54042600 -"20011128093000",31.585,32.06,31.365,31.4,54593600 -"20011127093000",32.395,32.5385,31.375,31.87,90811200 -"20011126093000",32.495,32.855,32.2,32.57,41992400 -"20011123093000",32.19,32.405,31.81,32.355,15767200 -"20011121093000",32.18,32.3,31.7445,32.015,50788200 -"20011120093000",33.225,33.9,32.515,32.7,65934800 -"20011119093000",33.125,33.485,32.8525,33.27,56007600 -"20011116093000",33.15,33.3095,32.475,32.875,59262600 -"20011115093000",33.05,33.525,32.725,33.06,77944400 -"20011114093000",34.115,34.17,32.895,32.975,88634600 -"20011113093000",33.4,33.975,33.3,33.91,60175400 -"20011112093000",32.35,33.22,31.825,32.895,57754800 -"20011109093000",32.17,32.825,31.955,32.605,48017200 -"20011108093000",32.23,33.03,31.83,32.21,74239800 -"20011107093000",32.11,32.525,32.015,32.125,58910200 -"20011106093000",31.35,32.47,31.08,32.39,68621000 -"20011105093000",30.93,32.015,30.875,31.635,66367400 -"20011102093000",30.965,31.5105,30.255,30.7,83368800 -"20011101093000",30.04,31.1295,29.8,30.92,109690400 -"20011031093000",29.65,30.365,29.05,29.075,64736400 -"20011030093000",29.46,29.7745,29.095,29.44,57395600 -"20011029093000",31.05,31.1,29.77,29.82,55139000 -"20011026093000",31.16,31.815,31.04,31.1,64514200 -"20011025093000",30.305,31.3,29.785,31.28,75324600 -"20011024093000",30.25,30.81,29.81,30.66,79166800 -"20011023093000",30.235,30.72,29.7,30.215,80328000 -"20011022093000",28.95,30.09,28.735,30.08,72327400 -"20011019093000",28.7,29.005,27.815,28.95,91231800 -"20011018093000",28.17,28.79,27.75,28.4,78524600 -"20011017093000",29.56,29.65,27.99,28.015,73730400 -"20011016093000",28.935,29.455,28.605,29.225,66221800 -"20011015093000",27.95,29.25,27.75,29.03,68458400 -"20011012093000",27.85,28.32,27.275,28.19,63370000 -"20011011093000",27.8835,28.42,27.2995,28.16,83783600 -"20011010093000",26.8,27.875,26.5,27.755,86370000 -"20011009093000",28.75,28.7855,27.095,27.28,99485000 -"20011008093000",28.4,29.325,28.37,29.025,60611600 -"20011005093000",28.08,29,27.47,28.87,80875200 -"20011004093000",28.46,29.2005,28.105,28.22,101782400 -"20011003093000",26.24,28.465,26.2,28.125,97478200 -"20011002093000",25.8195,26.775,25.78,26.5,80863200 -"20011001093000",25.47,26.25,25.205,25.875,70035800 -"20010928093000",24.81,25.795,24.49,25.585,116647800 -"20010927093000",25.05,25.34,24,24.97,81194200 -"20010926093000",25.755,25.9,24.775,25.135,58531200 -"20010925093000",26.135,26.5,25.08,25.65,84952800 -"20010924093000",25.325,26.225,24.935,26.005,85568800 -"20010921093000",23.96,25.3,23.75,24.855,184985200 -"20010920093000",26.175,26.305,25.335,25.38,118076400 -"20010919093000",27.23,27.56,25.3,26.935,126951600 -"20010918093000",26.705,27.5,26.585,27.16,83249800 -"20010917093000",27.01,27.55,26.4,26.455,128096200 -"20010910093000",27.46,28.975,27.35,28.79,84474800 -"20010907093000",28.055,28.68,27.6595,27.7,89888400 -"20010906093000",28.28,29.195,27.95,28.01,112447000 -"20010905093000",28.09,29.195,27.645,28.87,89476800 -"20010904093000",28.595,29.54,28.035,28.05,67189600 -"20010831093000",28.425,29.03,28.15,28.525,57977200 -"20010830093000",29.52,29.83,28.26,28.47,97685600 -"20010829093000",30.525,30.65,29.77,30.125,48173600 -"20010828093000",31.17,31.475,30.29,30.37,47425000 -"20010827093000",30.95,31.68,30.785,31.155,44563000 -"20010824093000",29.8,31.14,29.615,31.025,63407000 -"20010823093000",30.335,30.765,29.5,29.5,52023400 -"20010822093000",30.565,30.575,29.54,30.33,78144800 -"20010821093000",31.35,31.6,30.356,30.39,47120600 -"20010820093000",30.83,31.375,30.55,31.35,48372200 -"20010817093000",31.89,32.065,30.75,30.94,52236600 -"20010816093000",31.42,32.355,31.35,32.31,43917600 -"20010815093000",32.355,32.525,31.6,31.6,39505200 -"20010814093000",32.875,33.045,32.225,32.345,36481600 -"20010813093000",32.62,32.995,32.375,32.855,32675600 -"20010810093000",32.385,32.93,31.45,32.76,51757000 -"20010809093000",32.49,32.775,32.15,32.505,45537800 -"20010808093000",33.255,33.62,32.245,32.415,55004000 -"20010807093000",33.02,33.525,32.995,33.175,31349800 -"20010806093000",33.265,33.56,32.84,33.065,27833400 -"20010803093000",33.65,33.68,33,33.445,43260600 -"20010802093000",33.605,33.77,33.13,33.725,54199600 -"20010801093000",33.4,33.405,32.88,33.235,55679400 -"20010731093000",33.005,33.695,32.925,33.095,59033200 -"20010730093000",32.825,33.44,32.77,32.9,42196800 -"20010727093000",33.025,33.125,32.525,32.735,65405200 -"20010726093000",33.56,33.66,32.75,33.305,78047200 -"20010725093000",33.13,33.76,32.68,33.67,74105000 -"20010724093000",33.5,33.995,32.85,33.16,67543600 -"20010723093000",34.62,34.63,33.35,33.545,80002400 -"20010720093000",34.015,34.7,33.9,34.59,124210200 -"20010719093000",35.61,36.5,35.57,36.255,76871800 -"20010718093000",35.3,35.75,34.935,35.285,57598400 -"20010717093000",35.33,36.005,35.07,35.91,63252400 -"20010716093000",35.725,36.08,35.075,35.59,55990800 -"20010713093000",35.7,36,35.47,35.67,58938400 -"20010712093000",35.35,36.025,35.165,35.8,128125800 -"20010711093000",32.105,33.375,32.1,33.25,74713800 -"20010710093000",32.95,33.125,32.175,32.24,66567200 -"20010709093000",33.1,33.455,32.52,32.845,66479600 -"20010706093000",34.15,34.2,32.835,33.03,67565200 -"20010705093000",35.11,35.36,34.22,34.255,49268400 -"20010703093000",35.15,35.4,34.965,35.225,28038000 -"20010702093000",36.025,36.575,35.075,35.3,72820800 -"20010629093000",36.3,36.705,35.68,36.3,94465400 -"20010628093000",35.775,38.075,35.125,36.355,129054000 -"20010627093000",34.93,35.765,34.68,35.58,69205800 -"20010626093000",33.91,35.105,33.85,35.04,63077800 -"20010625093000",34.55,34.905,33.885,34.425,49218800 -"20010622093000",35,35.305,34.29,34.415,51092200 -"20010621093000",34.575,35.275,34.46,34.92,69612200 -"20010620093000",33.57,34.795,33.55,34.705,64111600 -"20010619093000",34.105,34.425,33.425,33.66,63469000 -"20010618093000",33.975,33.98,33.005,33.44,56889600 -"20010615093000",33.755,34.15,33.2,33.995,108492400 -"20010614093000",35.11,35.275,34.2,34.65,72040400 -"20010613093000",36.025,36.15,35.32,35.345,55335600 -"20010612093000",35.51,36.205,35.405,36.035,66716000 -"20010611093000",36.425,36.425,35.755,36.06,47347600 -"20010608093000",36.85,36.875,36.025,36.595,51867400 -"20010607093000",36.06,36.865,36.04,36.825,66981000 -"20010606093000",36.445,36.74,35.775,36.18,80052000 -"20010605093000",35.38,36.54,35.25,36.3,89456200 -"20010604093000",35.275,35.51,34.9,35.4,43758200 -"20010601093000",34.8,35.35,34.35,35.17,57588200 -"20010531093000",34.745,35.19,34.2,34.59,70687800 -"20010530093000",34.78,35.29,34.325,34.595,86463400 -"20010529093000",35.4,35.875,35.025,35.17,71212400 -"20010525093000",35.83,35.95,35.18,35.455,52757200 -"20010524093000",34.97,35.89,34.635,35.86,80789800 -"20010523093000",35.195,35.8,34.75,34.85,93664800 -"20010522093000",34.725,35.175,34.57,35.14,83461000 -"20010521093000",34.025,34.995,33.875,34.395,103508200 -"20010518093000",33.845,34.6,33.625,34.045,90867200 -"20010517093000",34.55,35.07,33.775,34.08,107002000 -"20010516093000",33.85,34.94,33.665,34.58,91899800 -"20010515093000",34.37,34.65,34,34.135,61389600 -"20010514093000",34.565,34.6,34.15,34.36,45010600 -"20010511093000",34.98,35,34.325,34.7,51129800 -"20010510093000",35.565,35.62,34.98,35,64341800 -"20010509093000",35.62,35.65,34.93,35.2,76677000 -"20010508093000",35.875,36.05,35.375,36.03,75086200 -"20010507093000",35.415,36.075,35.35,35.675,109360200 -"20010504093000",34,35.525,33.98,35.375,119556800 -"20010503093000",34.625,35.09,34.07,34.265,66273600 -"20010502093000",35.5,35.575,34.675,34.88,92864400 -"20010501093000",33.83,35.15,33.8,35.09,83723400 -"20010430093000",34.265,34.53,33.84,33.875,74368200 -"20010427093000",34.765,34.84,33.105,33.565,127400000 -"20010426093000",35.035,35.5,34.125,34.565,118741000 -"20010425093000",33.785,34.895,33.625,34.845,76747200 -"20010424093000",34.1,34.965,33.57,33.775,89180600 -"20010423093000",34.055,34.235,33.45,34.125,92172200 -"20010420093000",35.15,35.55,34.25,34.5,192956000 -"20010419093000",32.905,34.5,32.875,34.01,160024000 -"20010418093000",31.695,33.155,31.5,32.715,156746400 -"20010417093000",30.26,31.055,30.02,30.74,85308000 -"20010416093000",30.7,30.79,30.06,30.395,65858000 -"20010412093000",29.78,31.155,29.675,31.09,87523800 -"20010411093000",30.325,30.75,29.85,30.5,109879800 -"20010410093000",28.975,30.045,28.89,29.84,109211000 -"20010409093000",28.285,28.71,27.83,28.575,56295600 -"20010406093000",28.19,28.595,27.53,28.09,92624200 -"20010405093000",26.875,28.6875,26.75,28.375,113459600 -"20010404093000",26.6875,27.5,25.53125,25.96875,104069800 -"20010403093000",27.65625,27.78125,26.375,26.6875,94192800 -"20010402093000",27.40625,28.46875,27.3125,27.90625,75924400 -"20010330093000",27.875,28.09375,26.9375,27.34375,91344200 -"20010329093000",27.6875,28.59375,27.28125,27.6875,86987400 -"20010328093000",28.6875,28.96875,27.6875,27.75,78704200 -"20010327093000",28.03125,29.28125,27.9375,29.125,95144400 -"20010326093000",28.5625,28.75,27.78125,28.03125,63118800 -"20010323093000",27.46875,28.5,27.1875,28.28125,99520200 -"20010322093000",25.28125,27.03125,25.25,27,126372200 -"20010321093000",26.125,26.625,24.875,24.96875,125052600 -"20010320093000",27.28125,28.0625,26.3125,26.34375,91825600 -"20010319093000",27.25,27.75,26.5625,27.15625,61036400 -"20010316093000",26.25,27.5625,26.23435,27.21875,112851600 -"20010315093000",27.65625,28.03125,26.75,26.84375,71638400 -"20010314093000",26.25,27.625,26.09375,27,90686600 -"20010313093000",26.09375,27.375,26,27.09375,91042400 -"20010312093000",27.34375,27.5,25.8125,25.96875,114377400 -"20010309093000",28.96875,29.09375,27.4375,28.34375,103794400 -"20010308093000",30.15625,30.29685,29.21875,29.625,54626000 -"20010307093000",29.9375,30.5625,29.65625,30.34375,59744600 -"20010306093000",29.3125,30,29.1875,29.71875,66781800 -"20010305093000",28.625,29.3125,28.28125,28.71875,49384000 -"20010302093000",28.75,29.0625,28.21875,28.34375,79800800 -"20010301093000",29.28125,29.75,28.125,29.67185,81781600 -"20010228093000",29.78125,30.03125,29.09375,29.5,84608800 -"20010227093000",29.6875,30.59375,29.3281,29.6875,99155400 -"20010226093000",28.8125,29.96875,28.6875,29.75,87936800 -"20010223093000",27.21875,28.75,27.15625,28.375,92620800 -"20010222093000",28.15625,28.40625,26.9375,27.59375,100828400 -"20010221093000",27.625,29.03125,27.59375,28.125,63947200 -"20010220093000",28.6875,29.125,27.6875,27.9375,60731400 -"20010216093000",28.5,29.125,28.0625,28.59375,66958400 -"20010215093000",29.5,30.09375,28.9375,29.40625,65627800 -"20010214093000",28.8125,29.5,28.1875,29.1875,61728400 -"20010213093000",29.8125,30.53125,29.0625,29.09375,73957000 -"20010212093000",29.40625,29.71875,28.59375,29.375,70263600 -"20010209093000",30.65625,30.78125,29.25,29.5625,100579600 -"20010208093000",31.875,32.25,31,31.125,88041200 -"20010207093000",31,32.53125,30.90625,32.34375,126061800 -"20010206093000",31.03125,31.90625,30.84375,31.28125,96442000 -"20010205093000",30.375,31.03125,30.125,30.96875,56092600 -"20010202093000",31.25,31.6875,30.375,30.40625,71117000 -"20010201093000",30.40625,31.3125,30.1875,31.15625,71796800 -"20010131093000",31.5,31.875,30.5,30.53125,81898800 -"20010130093000",32.25,32.375,31.4375,31.6875,57276800 -"20010129093000",31.78125,32.3125,31.5625,32.25,84983800 -"20010126093000",30.5,32.15625,30.46875,32,93080000 -"20010125093000",31.375,32,30.78125,30.90625,85687400 -"20010124093000",30.5,31.71875,30.375,31.46875,110455000 -"20010123093000",29.875,30.46875,29.46875,30.28125,70297000 -"20010122093000",30.375,30.5,29.5,30.0625,76673200 -"20010119093000",30,30.71875,29.4375,30.5,209348800 -"20010118093000",26.84375,28.09375,26.3125,27.8125,109801400 -"20010117093000",26.8125,27.4375,26.28125,26.46875,72850200 -"20010116093000",26.6875,26.75,25.5625,26.28125,68462400 -"20010112093000",27.4375,27.5,26.25,26.75,73712800 -"20010111093000",26.5,27.875,26.15625,27.5,101862200 -"20010110093000",25.5,26.90625,25.375,26.4375,90243400 -"20010109093000",25,26.3125,24.875,25.90625,114965400 -"20010108093000",24.46875,24.875,23.34375,24.46875,79784600 -"20010105093000",24.25,24.9375,23.78125,24.5,93416400 -"20010104093000",23.90625,25.25,23.4375,24.1875,112398400 -"20010103093000",21.59375,24.4375,21.5625,23.96875,135964000 -"20010102093000",22.0625,22.5,21.4375,21.6406,82413600 -"20001229093000",21.96875,22.90625,21.3125,21.6875,100072000 -"20001228093000",22.5625,23.125,21.9375,22.28125,77620600 -"20001227093000",23.0625,23.40625,22.5,23.21875,69003800 -"20001226093000",23.4375,24.28125,22.9375,23.4375,66942200 -"20001222093000",22.375,23.5625,22.375,23.21875,110185800 -"20001221093000",20.375,22.5625,20.125,21.71875,163177600 -"20001220093000",21.40625,22,20.6875,20.75,149037600 -"20001219093000",23.71875,24,22.25,22.375,120377000 -"20001218093000",24.5,25,23.5,23.90625,107187400 -"20001215093000",25.5156,26,23.875,24.59375,326615000 -"20001214093000",28.96875,29.35935,27.6875,27.75,71202800 -"20001213093000",30.25,30.25,28.40625,28.625,98360400 -"20001212093000",28.90625,30,28.375,29.1875,63106000 -"20001211093000",27.75,29.375,27.5,29.03125,95576200 -"20001208093000",27.3125,27.9375,26.71875,27.21875,120939800 -"20001207093000",26.71875,27,26.125,26.5625,145308200 -"20001206093000",30,30.03125,28.03125,28.34375,90560800 -"20001205093000",29.59375,30.25,29.125,29.9375,101734400 -"20001204093000",28.625,29.5,27.59375,28.1875,80407200 -"20001201093000",29.03125,30.3125,28.03125,28.3125,109810200 -"20001130093000",31,31.03125,28.5,28.6875,197206400 -"20001129093000",33.40625,33.5625,31.625,32.53125,98283400 -"20001128093000",34.6875,34.875,33.40625,33.5,127446200 -"20001127093000",35.71875,36.125,35.3125,35.34375,85307600 -"20001124093000",34.5,35.21875,34.25,34.96875,34439200 -"20001122093000",33.03125,34.75,33,34.125,76344200 -"20001121093000",33.6875,34.625,33.6875,33.875,59487600 -"20001120093000",34.0625,34.25,32.78125,33.59375,80157200 -"20001117093000",34.71875,35,33.8906,34.53125,106525600 -"20001116093000",34.71875,35.75,34.46875,34.46875,92128600 -"20001115093000",34.53125,35.4375,34.34375,35.03125,60422200 -"20001114093000",34,34.90625,33.65625,34.40625,84218600 -"20001113093000",33.34375,34.0625,32.2031,33.21875,83370400 -"20001110093000",34.96875,35.15625,33.40625,33.6875,93744400 -"20001109093000",34.25,35.65625,34.21875,35.4375,91058600 -"20001108093000",35.5625,36.1875,34,34.71875,206149400 -"20001107093000",34.875,35.9375,34.75,35.25,104345400 -"20001106093000",34.34375,35.0625,34.125,34.75,74851400 -"20001103093000",34.625,34.8125,34.03125,34.125,68711000 -"20001102093000",35.1875,35.42185,34.8125,35.15625,77985200 -"20001101093000",34.25,35.03125,34.21875,34.8125,81313400 -"20001031093000",34.5,34.75,34,34.4375,104474000 -"20001030093000",33.75,35.0625,33.6875,34.53125,110057600 -"20001027093000",32.34375,34.59375,32.3125,33.84375,124292600 -"20001026093000",30.5,32.53125,30.40625,32.21875,114832400 -"20001025093000",30.96875,31.71875,30.21875,30.625,167603800 -"20001024093000",31.3125,31.46875,30.09375,30.75,94427400 -"20001023093000",32.3125,33.125,30.34375,31.0625,185170400 -"20001020093000",30.65625,33.0625,30.5625,32.59375,160378600 -"20001019093000",29.21875,31.09375,29,30.9375,257015200 -"20001018093000",24.8125,26.625,24.21875,25.875,110537400 -"20001017093000",25.9375,26.21875,25.125,25.21875,81276600 -"20001016093000",26.75,26.90625,24.78125,25.1875,119759000 -"20001013093000",26.9375,27.4375,26.0625,26.84375,104522400 -"20001012093000",28.15625,28.4375,26.90625,27.21875,90224600 -"20001011093000",27,28.46875,27,27.875,101208400 -"20001010093000",26.96875,27.78125,26.90625,27.28125,62066200 -"20001009093000",27.8125,27.875,26.5,27.09375,58323600 -"20001006093000",27.90625,28.375,27.375,27.78125,61795200 -"20001005093000",27.75,28.625,27.625,27.625,81099400 -"20001004093000",28.1875,28.28125,27.25,27.71875,136540000 -"20001003093000",29.78125,29.90625,28.25,28.28125,85374000 -"20001002093000",30.25,30.40625,29.125,29.5625,58562400 -"20000929093000",30.5,30.65625,29.3125,30.125,74053600 -"20000928093000",30.40625,30.9375,30.3125,30.65625,52360400 -"20000927093000",31.71875,31.78125,29.90625,30.3125,106155600 -"20000926093000",30.46875,32.9375,30.21875,31.34375,155704800 -"20000925093000",31.625,31.75,30.21875,30.625,53479200 -"20000922093000",30.5625,31.75,30.46875,31.625,84476600 -"20000921093000",32,32.5625,31.78125,32.09375,48877200 -"20000920093000",32.4375,32.5,31.59375,32.125,67791400 -"20000919093000",31.8125,32.875,31.6875,32.5,79311400 -"20000918093000",32.125,32.3125,31.09375,31.5,69037800 -"20000915093000",32.71875,32.8125,31.65625,32.09375,99915200 -"20000914093000",34.34375,34.375,32.84375,32.9375,78503000 -"20000913093000",33.75,34.375,33.59375,34.15625,40744800 -"20000912093000",34.375,34.65625,33.8125,34.0625,46781200 -"20000911093000",34.5625,34.84375,34.03125,34.40625,48495200 -"20000908093000",35.1875,35.4375,34.59375,34.65625,56709600 -"20000907093000",35,36.03125,34.71875,34.96875,111720000 -"20000906093000",35.03125,35.34375,34.65625,34.71875,62960800 -"20000905093000",35,35.34375,34.90625,35.09375,50755200 -"20000901093000",35,35.3125,34.84375,35.09375,37629800 -"20000831093000",35.4375,35.65625,34.84375,34.90625,72575400 -"20000830093000",35.34375,35.46875,34.84375,35,53498800 -"20000829093000",35.59375,36.375,35.4375,35.46875,59400200 -"20000828093000",35.09375,36.0625,35.0625,35.65625,56421600 -"20000825093000",35.34375,35.84375,35.28125,35.3125,52729400 -"20000824093000",35.3125,35.59375,34.96875,35.5625,42405400 -"20000823093000",35.40625,35.5625,35.1875,35.375,36726800 -"20000822093000",35.40625,36.21875,35.3125,35.625,54428200 -"20000821093000",35.34375,35.40625,35,35.3125,34119800 -"20000818093000",35.5625,35.71875,35.1875,35.5,54438800 -"20000817093000",35.5625,36,35.28125,35.78125,36112800 -"20000816093000",35.9375,36.125,35.28125,35.5,44976200 -"20000815093000",36,36.5,35.75,35.8125,40714200 -"20000814093000",36.15625,36.6875,35.6875,36.125,53427000 -"20000811093000",36.21875,36.34375,35.8125,36.21875,35629600 -"20000810093000",36.90625,37.03125,35.875,36.3125,48986000 -"20000809093000",36.875,37.4375,36.5625,37.15625,63945600 -"20000808093000",35.03125,37.34375,35,37.0625,138038800 -"20000807093000",35.09375,35.5625,34.875,35,52741800 -"20000804093000",34.71875,34.9375,34.09375,34.5625,38107400 -"20000803093000",34.09375,35.1875,34.0625,35.125,54543400 -"20000802093000",34.28125,35.21875,34.25,34.6875,48269200 -"20000801093000",34.96875,35.03125,34.09375,34.375,47163600 -"20000731093000",35.09375,35.5625,34.625,34.90625,70283800 -"20000728093000",35.46875,35.90625,34.8125,34.84375,75650000 -"20000727093000",33.9375,35.0625,33.75,34.78125,74337600 -"20000726093000",34.53125,34.75,33.625,33.90625,85404600 -"20000725093000",35.40625,35.5,34.1875,34.5,64188600 -"20000724093000",36.03125,36.0625,35,35.25,56165600 -"20000721093000",37.375,37.5,35.9375,36.15625,56100600 -"20000720093000",36.71875,37.625,36.5625,37.40625,54690600 -"20000719093000",38.03125,38.75,36.40625,36.5625,139924600 -"20000718093000",38.8125,39.75,38.71875,39.21875,70617200 -"20000717093000",39.125,39.78125,38.75,39.09375,53992800 -"20000714093000",39.75,39.875,39.21875,39.46875,51180600 -"20000713093000",39.40625,40,38.6875,39.96875,80843200 -"20000712093000",39.125,40.5,38.59375,40.15625,58370200 -"20000711093000",39.40625,40.25,39.25,39.5625,37164800 -"20000710093000",40.34375,40.65625,39.6875,39.75,52689800 -"20000707093000",40.625,41.4375,40.28125,41,54153200 -"20000706093000",39.4375,40.84375,39.25,40.46875,47873200 -"20000705093000",39.9375,39.9375,39.125,39.25,34824400 -"20000703093000",39.84375,40.03125,39.6875,39.96875,15734800 -"20000630093000",38.53125,40,38.34375,40,52356400 -"20000629093000",39.125,39.46875,38.53125,38.59375,38449000 -"20000628093000",39.5,40.03125,39.3125,39.46875,37459200 -"20000627093000",39.625,40.0625,39.1875,39.40625,31071200 -"20000626093000",38.75,40.0625,38.75,39.75,48287000 -"20000623093000",39.96875,40.03125,38.5,38.875,49811600 -"20000622093000",40.6875,41,39.65625,39.9375,87315200 -"20000621093000",38.5,41.09375,38.46875,40.34375,160399600 -"20000620093000",36.9375,37.625,36.875,37.46875,62275000 -"20000619093000",36.28125,36.90625,36,36.84375,46604800 -"20000616093000",36.3125,36.5625,35.75,36.28125,68710600 -"20000615093000",35.40625,36.34375,35.3125,36.1875,65592600 -"20000614093000",34.90625,35.5,34.75,35.25,79992400 -"20000613093000",33.375,34,33.0625,33.9375,44289200 -"20000612093000",34.5,34.5,33.1875,33.46875,49260600 -"20000609093000",34.8125,34.84375,34.15625,34.40625,35560200 -"20000608093000",35.78125,36.0625,34.125,34.40625,94765600 -"20000607093000",34.625,35.375,33.5625,35.25,76311600 -"20000606093000",34.09375,34.9375,33.90625,34.8125,99019000 -"20000605093000",33.0156,34.1875,33,33.4375,64400000 -"20000602093000",33,33.375,32.5,33.15625,80463200 -"20000601093000",32.1875,33,31.90625,32.28125,94507200 -"20000531093000",31.8125,31.84375,31.03125,31.28125,54968200 -"20000530093000",31.21875,32.0625,31,31.6875,68536400 -"20000526093000",31.03125,31.46875,30.1875,30.71875,55822000 -"20000525093000",32.28125,32.375,30.5625,30.75,94348800 -"20000524093000",31.5625,33.28125,31.5,32.78125,85482400 -"20000523093000",31.9375,32.78125,31.53125,31.625,57962600 -"20000522093000",32.5625,32.625,31.21875,32.09375,69962800 -"20000519093000",32.6875,32.96875,32.25,32.53125,66578000 -"20000518093000",34.03125,34.03125,32.9375,33.09375,53640400 -"20000517093000",34.4375,34.5625,33.625,33.84375,53242000 -"20000516093000",34.78125,35.3125,34.53125,34.75,48410600 -"20000515093000",34.5,34.71875,34,34.6875,33899600 -"20000512093000",34.21875,34.875,34.125,34.40625,37886000 -"20000511093000",33.3125,34.0625,32.875,33.9375,58390800 -"20000510093000",33.875,33.9375,32.875,33.09375,67740000 -"20000509093000",35.09375,35.21875,33.75,33.90625,60778400 -"20000508093000",35.46875,35.6875,34.84375,34.90625,36187600 -"20000505093000",35.125,35.90625,34.9375,35.5625,36402200 -"20000504093000",35.15625,35.625,34.65625,35.28125,43317200 -"20000503093000",35.1875,35.40625,34.40625,35.28125,55354800 -"20000502093000",36.40625,36.75,34.75,34.9375,97716200 -"20000501093000",36.4375,37,35.84375,36.71875,107811000 -"20000428093000",35.375,35.5,34.125,34.875,78082600 -"20000427093000",33.71875,34.96875,33.6875,34.90625,77669800 -"20000426093000",35,35.5625,33.6875,34,107091400 -"20000425093000",34.375,34.75,33.8125,34.6875,159517400 -"20000424093000",33.625,34,32.5,33.3125,313681800 -"20000420093000",39.3125,39.9375,38.75,39.46875,52261800 -"20000419093000",40.71875,40.75,39.0625,39.34375,53715400 -"20000418093000",38.25,40.96875,37.9375,40.28125,91802000 -"20000417093000",37.125,38,36.5,37.8125,119773000 -"20000414093000",39.5625,39.75,36.625,37.0625,151221400 -"20000413093000",40.4375,41.125,39.5,39.625,94316200 -"20000412093000",41.0625,41.125,39.375,39.6875,153017800 -"20000411093000",42.5625,43.03125,41.75,41.9375,71961800 -"20000410093000",44.3125,44.3125,43,43.03125,60685400 -"20000407093000",43.5,44.6875,42.5,44.5625,82628200 -"20000406093000",43.9375,44,42.625,43,66421400 -"20000405093000",44.125,44.25,42.9375,43.1875,82888200 -"20000404093000",45.78125,46,42.46875,44.28125,181246600 -"20000403093000",47.21875,48.34375,45,45.4375,232158600 -"20000331093000",53,54.125,52.0625,53.125,64281400 -"20000330093000",53.09375,54.3125,51.25,51.71875,64178400 -"20000329093000",52.59375,54.46875,52.5625,53.59375,64365200 -"20000328093000",51.8125,53.71875,51.1875,52.15625,81114400 -"20000327093000",53.875,54.125,51.96875,52.03125,111434000 -"20000324093000",56.3125,57.5,54.78125,55.84375,112196800 -"20000323093000",53.40625,56.4375,53.3125,55.9375,148223800 -"20000322093000",51.40625,52.8125,50.5625,51.625,93976000 -"20000321093000",48.375,51.5625,48.25,51.375,81648800 -"20000320093000",49.375,49.875,48.25,48.6875,47773000 -"20000317093000",47.625,49.75,47.25,49.6875,81161600 -"20000316093000",47.96875,48.34375,46.625,47.6875,77300800 -"20000315093000",47.28125,48.3125,46.84375,47.6875,53208000 -"20000314093000",49.3125,49.625,47.5625,47.5625,73489200 -"20000313093000",48.8125,50.125,48.75,49,61831800 -"20000310093000",49.78125,51.25,49.75,50.5,85589000 -"20000309093000",47.65625,50,47.5,50,88198800 -"20000308093000",46.90625,48.09375,45.5,47.78125,94290000 -"20000307093000",48.0625,48.75,45.96875,46.4375,135061000 -"20000306093000",48,48.6875,45.04685,45.5,93609600 -"20000303093000",47.375,49.4375,46.9375,48.0625,101437400 -"20000302093000",45.90625,47.6875,45.5625,46.6875,106932600 -"20000301093000",44.8125,47.1875,44.46875,45.21875,106889800 -"20000229093000",45.875,45.875,44.4375,44.6875,58438200 -"20000228093000",45.125,46.0625,44.0625,45.78125,76131800 -"20000225093000",47.34375,47.34375,45.25,45.65625,65301400 -"20000224093000",47.125,47.9375,46,47.34375,69734000 -"20000223093000",46.75,47.875,46.03125,47.125,75847200 -"20000222093000",47.5625,48.5625,46.40625,46.90625,66296200 -"20000218093000",50,50.03125,47.4375,47.6875,79063000 -"20000217093000",49.25,49.84375,48.5625,49.8125,80344200 -"20000216093000",49.625,50.09375,48.5625,48.8125,65202600 -"20000215093000",49.875,50,48.1875,49.28125,71027600 -"20000214093000",50.60935,50.875,49.53125,49.8125,81028600 -"20000211093000",52.4375,52.4375,49.5625,49.96875,115559000 -"20000210093000",51.9375,53.28125,51.25,53,54528600 -"20000209093000",54.71875,54.71875,51.9375,52,55092800 -"20000208093000",53.21875,55,53.21875,54.96875,56231600 -"20000207093000",53.40625,53.4375,52.125,53.3125,40007800 -"20000204093000",52.1875,54,52.0625,53.28125,55365400 -"20000203093000",51.03125,52.09375,50.0625,51.8125,49186000 -"20000202093000",51.21875,51.96875,50.25,50.40625,49915600 -"20000201093000",49.25,51.625,48.84375,51.46875,70196600 -"20000131093000",48.8125,49.09375,47.4375,48.9375,73194200 -"20000128093000",49.0625,50.125,48.625,49.125,58227600 -"20000127093000",49.9375,50.59375,48.625,49.375,63654800 -"20000126093000",51.21875,51.75,49.5625,49.6875,49365000 -"20000125093000",50.5,51.9375,49.78125,51.40625,59827800 -"20000124093000",51.8906,52.84375,50.40625,50.625,63601400 -"20000121093000",53.5,53.625,51.625,51.875,68416200 -"20000120093000",53.53125,54.84375,52.9375,53,56349800 -"20000119093000",55.25,55.75,53,53.5,97566200 -"20000118093000",55.90625,58.25,55.875,57.65625,81484400 -"20000114093000",53.59375,56.96875,52.875,56.125,73417400 -"20000113093000",52.1875,54.3125,50.75,53.8125,83144000 -"20000112093000",54.25,54.4375,52.21875,52.90625,66538200 -"20000111093000",55.75,57.125,54.34375,54.6875,46747800 -"20000110093000",56.71875,56.84375,55.6875,56.125,44963600 -"20000107093000",54.3125,56.125,53.65625,55.71875,62013600 -"20000106093000",56.09375,56.9375,54.1875,55,54976600 -"20000105093000",55.5625,58.1875,54.6875,56.90625,64059600 -"20000104093000",56.78125,58.5625,56.125,56.3125,54094400 -"20000103093000",58.6875,59.3125,56,58.28125,53236000 -"19991231093000",58.75,58.875,58.125,58.375,12517600 -"19991230093000",58.9375,59.96875,58.5625,58.8125,22360000 -"19991229093000",58.46875,59.1875,58.40625,58.84375,17449000 -"19991228093000",59.375,59.40625,58.53125,58.75,24591000 -"19991227093000",59.21875,59.625,58.0625,59.54685,32202200 -"19991223093000",58.625,59.625,58.375,58.71875,31028400 -"19991222093000",58.1406,59,57.5625,58.78125,38565200 -"19991221093000",56.1875,58.3125,55.3125,57.9375,57446000 -"19991220093000",57.40625,57.5,55.59375,56.375,39433800 -"19991217093000",58.3125,58.5625,56.8125,57.625,105898800 -"19991216093000",54.625,57.5,54.46875,56.8125,128659600 -"19991215093000",49.28125,54.375,49.25,54.125,155571600 -"19991214093000",48.09375,50.5625,47.65625,49.34375,144121200 -"19991213093000",46.79685,48.46875,46.375,48.3125,52691600 -"19991210093000",46.6875,47.0625,46.125,46.9375,36836000 -"19991209093000",46,46.65625,45.71875,46.375,46258200 -"19991208093000",46.5625,47.15625,45.84375,45.875,40955800 -"19991207093000",47.375,47.4375,46.4375,46.5,56859200 -"19991206093000",47.625,48.59375,47.375,47.71875,49098200 -"19991203093000",47.90625,48.5625,47.85935,48.0625,64100600 -"19991202093000",46.53125,47.625,46.4375,47.34375,55473800 -"19991201093000",45.53125,46.96875,45.4375,46.59375,48864200 -"19991130093000",44.875,46.4375,44.78125,45.5156,64145600 -"19991129093000",45.0625,46.03125,44.75,45.09375,51512200 -"19991126093000",45.8125,46.6875,45.5,45.5625,28514200 -"19991124093000",44.78125,46.125,44.75,45.84375,53771000 -"19991123093000",44.625,45.6875,44.1875,44.84375,70787400 -"19991122093000",44.8125,45.1875,44.21875,44.90625,91029400 -"19991119093000",42.21875,43.28125,42.1875,43,58231200 -"19991118093000",42.46875,42.90625,42.25,42.40625,64493200 -"19991117093000",43.21875,43.53125,42.5,42.5,66819000 -"19991116093000",43.46875,43.875,42.9375,43.65625,59165400 -"19991115093000",44.125,44.25,43.46875,43.5,47073400 -"19991112093000",44.875,45,43.53125,44.59375,49414200 -"19991111093000",44.125,45.21875,44.125,44.8125,69269400 -"19991110093000",44.0625,44.5625,43.21875,43.5625,69385400 -"19991109093000",44.875,44.9375,43.21875,44.4375,109769800 -"19991108093000",42.40625,45.375,42.1875,44.96875,243832200 -"19991105093000",45.90625,46.4375,45.25,45.78125,70165400 -"19991104093000",46.15625,46.375,45.15625,45.78125,54239400 -"19991103093000",46.46875,46.75,45.75,46,44517000 -"19991102093000",46.375,47.25,45.96875,46.28125,46349000 -"19991101093000",46.625,47.09375,46.0625,46.1875,53261200 -"19991029093000",45.71875,47,45.625,46.28125,79452600 -"19991028093000",45,45.4375,44.65625,44.96875,70568400 -"19991027093000",45.75,45.8125,44.84375,45.4375,54416600 -"19991026093000",47.1875,47.625,46.125,46.1875,52467600 -"19991025093000",46,46.78125,45.5625,46.21875,30492200 -"19991022093000",46.78125,46.9375,45.875,46.34375,43650600 -"19991021093000",45.28125,46.5625,45.25,46.53125,60801200 -"19991020093000",45.78125,46.1875,45.125,46.125,88090600 -"19991019093000",44.125,44.625,42.625,43.15625,69945600 -"19991018093000",43.59375,44,42.53125,43.8906,75312800 -"19991015093000",44.75,44.90625,43.65625,44.03125,73788000 -"19991014093000",45.4375,46.10935,44.84375,45.34375,42737800 -"19991013093000",46,46.5625,45.15625,45.53125,38088400 -"19991012093000",47,47.0625,46.1875,46.28125,27663400 -"19991011093000",47.3125,47.5,47.0625,47.15625,19943800 -"19991008093000",46.75,47.59375,46.0625,47.46875,35697000 -"19991007093000",46.84375,47.53125,46.34375,46.875,46036400 -"19991006093000",46.15625,47,46.03125,46.84375,35501200 -"19991005093000",46.375,46.9375,44.75,45.96875,43397000 -"19991004093000",45.25,46.3125,45.125,46.28125,29998000 -"19991001093000",45.09375,45.3125,44.15625,44.98435,44239000 -"19990930093000",45,45.84375,44.40625,45.28125,47455400 -"19990929093000",45.78125,46.0625,44.5625,44.75,37484400 -"19990928093000",45.625,46.34375,44.53125,46.0625,46000600 -"19990927093000",46,46.46875,45.4375,45.71875,34132200 -"19990924093000",45.09375,45.6875,44.4375,45.46875,70277000 -"19990923093000",48.4375,48.4375,45.0156,45.59375,71073600 -"19990922093000",47.375,48.3125,46.84375,48.03125,48531600 -"19990921093000",48.28125,48.28125,47.0625,47.3125,47082800 -"19990920093000",48,48.9375,47.5,48.78125,48601800 -"19990917093000",47.1875,48.25,46.90625,48.21875,79773400 -"19990916093000",46.4375,47.03125,45.3125,46.875,45796000 -"19990915093000",47.75,47.875,46.1875,46.3125,48413800 -"19990914093000",46.84375,47.78125,46.8125,47.5,40207800 -"19990913093000",47.25,47.40625,46.6875,46.9375,27870800 -"19990910093000",47.53125,47.65625,47,47.5,34455000 -"19990909093000",46.21875,47.0625,45.8906,47.03125,38475200 -"19990908093000",46.84375,47.34375,46.03125,46.125,42568200 -"19990907093000",47.4375,48.34375,46.875,47.125,47028000 -"19990903093000",46.875,48.21875,46.75,47.875,52098000 -"19990902093000",45.75,46.28125,45.34375,45.90625,33340800 -"19990901093000",46.15625,46.71875,45.8125,46.1875,36607200 -"19990831093000",45.90625,46.5625,45.0625,46.28125,46882800 -"19990830093000",46.4375,46.71875,45.78125,46.125,33300800 -"19990827093000",47.53125,47.5625,46.1875,46.625,41948400 -"19990826093000",47.6875,48.1875,46.84375,47.3125,61246000 -"19990825093000",46.8125,48,46.59375,47.65625,81877600 -"19990824093000",43.53125,46.75,43.53125,46.09375,120450000 -"19990823093000",42.15625,43.3125,41.9375,43.21875,60447000 -"19990820093000",42,42.3906,41.53125,41.6875,46072800 -"19990819093000",42.28125,42.5625,41.5625,41.90625,71478200 -"19990818093000",42.21875,43.09375,42.03125,42.5,58361200 -"19990817093000",42.71875,42.75,41.46875,42.28125,51749000 -"19990816093000",42.53125,42.9375,41.15625,42.15625,57321800 -"19990813093000",41.46875,42.8125,41.375,42.34375,65099800 -"19990812093000",41.96875,42.09375,40.8125,40.875,61062000 -"19990811093000",42,42.34375,41.15625,42.09375,66105200 -"19990810093000",41.78125,42.03125,40.8125,41.46875,62743000 -"19990809093000",42.8125,42.90625,41.84375,41.90625,39333600 -"19990806093000",43.03125,43.21875,42.46875,42.5625,67205800 -"19990805093000",42.6875,43.1875,42.375,42.875,76634000 -"19990804093000",42.5625,43.59375,42.375,42.46875,75573400 -"19990803093000",42.9375,43.03125,42.1875,42.375,55051200 -"19990802093000",42.84375,43.46875,42.1875,42.40625,48050600 -"19990730093000",44.34375,44.3125,42.75,42.90625,51127400 -"19990729093000",44.34375,44.40625,43.15625,43.46875,57968200 -"19990728093000",44.59375,45.25,44.1875,45,62215200 -"19990727093000",44.40625,44.875,44,44.40625,65513000 -"19990726093000",44.4375,44.90625,43.8125,43.875,51107800 -"19990723093000",45.78125,45.875,44.84375,45.125,68810000 -"19990722093000",47.1875,47.25,45,45.53125,60892400 -"19990721093000",46.8125,47.65625,46.5,47.34375,54045600 -"19990720093000",48.21875,48.375,46.15625,46.65625,92269200 -"19990719093000",50,50.375,48.90625,49.1875,81169200 -"19990716093000",47.75,49.9375,47.5,49.71875,115419800 -"19990715093000",47.5,47.625,46.875,47.1875,40915000 -"19990714093000",46.875,47.5,46.25,47.46875,37985200 -"19990713093000",46.5625,47.03125,46.40625,46.8125,30844400 -"19990712093000",46.60935,47.375,46.1875,47.09375,43847800 -"19990709093000",46.1875,46.65625,46.125,46.625,33884200 -"19990708093000",46.1406,46.5,45.34375,46.28125,37790400 -"19990707093000",44.79685,46.15625,44.9375,46.15625,33834600 -"19990706093000",46.125,46.46875,44.625,44.78125,45413000 -"19990702093000",45.4375,46.0625,45.15625,46,32088400 -"19990701093000",44.9375,45.75,44.1875,45.59375,47752400 -"19990630093000",43.875,45.125,43.375,45.09375,57543400 -"19990629093000",43.34375,44.03125,43,44,38972400 -"19990628093000",42.75,43.40625,42.46875,43.375,31700800 -"19990625093000",42.6875,43.21875,42.1875,42.46875,24938200 -"19990624093000",42.875,43.125,42,42.3125,33557800 -"19990623093000",42.96875,43.6875,42.53125,43,33941200 -"19990622093000",44.21875,44.21875,43.125,43.25,38746200 -"19990621093000",42.4375,44.5,42.4375,44.46875,56083200 -"19990618093000",41.15625,42.5,41.0625,42.5,69341000 -"19990617093000",40.34375,41.5,40.25,41.4375,44460800 -"19990616093000",39.53125,40.8125,39.46875,40.5,48317800 -"19990615093000",39.03125,39.4375,38.34375,38.84375,36976400 -"19990614093000",39.375,39.84375,38.71875,38.78125,28364400 -"19990611093000",40,40.25,38.78125,39.0625,34543000 -"19990610093000",40.9375,41.15625,39.53125,39.9375,35269400 -"19990609093000",40.0625,41.3125,40,41.15625,53308800 -"19990608093000",39.9375,41.0625,39.5,39.6875,41502800 -"19990607093000",39.96875,40.53125,39.59375,40.125,32389800 -"19990604093000",38.46875,39.84375,38.375,39.78125,35666200 -"19990603093000",39.1875,39.46875,38.0625,38.21875,32940400 -"19990602093000",39.03125,39.3125,38.125,39.21875,42812600 -"19990601093000",40.3125,40.375,39.21875,39.25,36045800 -"19990528093000",39.375,40.4375,39.0625,40.34375,41548200 -"19990527093000",39.125,39.71875,38.75,39.1875,56700000 -"19990526093000",38.59375,39.25,37.75,39.25,52022800 -"19990525093000",38.375,39.625,38.0625,38.10935,50779200 -"19990524093000",38.9375,38.9375,38.03125,38.625,38987200 -"19990521093000",39.25,39.5,38.5,38.78125,56569800 -"19990520093000",39.78125,40,39.1875,39.21875,42371000 -"19990519093000",39.9375,39.9375,38.625,39.65625,46516000 -"19990518093000",39.90625,40.125,38.96875,39.34375,63857400 -"19990517093000",38.6875,39.78125,38.5,39.5625,66850000 -"19990514093000",39.4375,39.96875,38.3125,38.4375,84401200 -"19990513093000",40.5625,40.875,39.5625,39.5625,51735200 -"19990512093000",40.375,40.5,39.625,40.1875,60133400 -"19990511093000",40.375,40.5156,39.53125,39.9375,42784400 -"19990510093000",39.9375,40.25,39.125,39.84375,46218000 -"19990507093000",39.8125,40.1875,39,39.53125,48010200 -"19990506093000",40.34375,40.5625,38.75,39.0625,74011800 -"19990505093000",39.5625,39.9375,38.21875,39.5,67026400 -"19990504093000",40.25,40.90625,38.875,39.03125,66500200 -"19990503093000",40.71875,40.75,39.28125,39.875,67183000 -"19990430093000",41.375,41.875,39.9375,40.65625,58555200 -"19990429093000",41.1875,41.84375,40.2031,41.03125,60878600 -"19990428093000",42.65625,43.25,40.85935,41.0625,55961400 -"19990427093000",44.375,44.375,41.96875,42,58664400 -"19990426093000",43.59375,44.46875,43.375,44,48347400 -"19990423093000",42.5,43.5,41.5,43,56597800 -"19990422093000",42.5,42.625,41.6875,42.40625,55095200 -"19990421093000",41.0625,41.25,40,41,92759800 -"19990420093000",41.125,42,40,41.5625,108460000 -"19990419093000",43.4375,44.0625,40.1875,40.5,75380400 -"19990416093000",44.3125,44.5625,42.9375,43.3125,44772200 -"19990415093000",43.65625,44.9375,41.9375,44.4375,72594600 -"19990414093000",45.40625,45.5625,42.9375,42.9375,52944000 -"19990413093000",46.5625,46.5625,44.59375,45.0625,46744400 -"19990412093000",45.78125,46.8125,45.6875,46.5,37855200 -"19990409093000",47.125,47.5,46.5,47.125,31816400 -"19990408093000",46.625,47.3125,45.5,47.28125,38629600 -"19990407093000",47.4375,47.5,45.625,46.65625,46909600 -"19990406093000",47.59375,47.8125,46.625,47.03125,39673800 -"19990405093000",47.15625,47.5156,46.75,47.46875,39848600 -"19990401093000",45.625,46.4375,45.125,46.34375,41106000 -"19990331093000",47.25,47.3125,44.5625,44.8125,58764600 -"19990330093000",46.6875,46.75,46.125,46.5,67502200 -"19990329093000",45.0625,46.3125,43.9375,46.09375,79816800 -"19990326093000",44.734375,45.09375,43.9375,44.53125,94687600 -"19990325093000",43.265625,45.015625,43.125,44.953125,109448400 -"19990324093000",41.75,42.953125,40.78125,42.8125,82637600 -"19990323093000",43.171875,43.53125,41.5625,41.640625,69579600 -"19990322093000",43.234375,43.734375,43,43.203125,55748800 -"19990319093000",43.46875,43.53125,42.46875,42.796875,92175200 -"19990318093000",41.609375,43.140625,41.546875,43.109375,56231600 -"19990317093000",42.265625,42.359375,41.6875,41.78125,44919600 -"19990316093000",41.375,42.5,41.0625,42.265625,68555200 -"19990315093000",40.140625,41.5,39.46875,41.46875,60609600 -"19990312093000",40.65625,40.6875,39.203125,40.046875,73396800 -"19990311093000",40.25,41.140625,39.828125,40.359375,62948400 -"19990310093000",40.578125,40.625,39.796875,40.34375,53112800 -"19990309093000",39.96875,41.1875,39.9375,40.453125,90124800 -"19990308093000",38.875,39.804675,38.75,39.75,46754000 -"19990305093000",38.6875,38.84375,38.28125,38.734375,47296800 -"19990304093000",37.78125,38.375,37.03125,38.0625,61696400 -"19990303093000",37.25,37.671875,36.765625,37.40625,76798400 -"19990302093000",37.96875,38.53125,36.90625,37.140625,58587600 -"19990301093000",37.390625,38.140625,37.375,37.9375,58332000 -"19990226093000",38.09375,38.125,37.375,37.53125,59281200 -"19990225093000",38.09375,38.4375,37.40625,38.375,70276800 -"19990224093000",39.109375,39.84375,38.1875,38.21875,67695600 -"19990223093000",38.234375,38.90625,37.625,38.859375,95098800 -"19990222093000",37.0625,37.25,36.1875,37.25,92514800 -"19990219093000",36.859375,37.3125,36.4375,36.9375,73120000 -"19990218093000",37.734375,37.84375,35.992175,36.4375,117035200 -"19990217093000",38.234375,38.53125,37.125,37.5,101442800 -"19990216093000",39.9375,39.96875,38.640625,39.0625,73667600 -"19990212093000",40.421875,40.921875,39.28125,39.4375,62930400 -"19990211093000",40.6875,40.96875,40.09375,40.6875,60366000 -"19990210093000",39.96875,41.09375,39.65625,40.15625,73701600 -"19990209093000",41.234375,41.6875,39.9375,40.015625,77293600 -"19990208093000",40.640625,41.390625,40.40625,41.3125,109866800 -"19990205093000",40.0625,40.40625,38.71875,40,127945200 -"19990204093000",42.03125,42.09375,39.71875,39.765625,89151600 -"19990203093000",41.59375,42.46875,41.5,41.703125,73749600 -"19990202093000",43.125,43.140625,41.5625,41.90625,91965600 -"19990201093000",43.859375,43.984375,42.703125,43.234375,81727200 -"19990129093000",43.6875,43.78125,42.71875,43.75,79571600 -"19990128093000",42.9375,43.515625,42.453125,43.5,78838400 -"19990127093000",43.125,43.609375,42.125,42.1875,98048400 -"19990126093000",41.375,42.9375,41.125,42.890625,120203200 -"19990125093000",40.46875,40.828125,39.78125,40.46875,103076400 -"19990122093000",38.90625,40.054675,38.8125,39.0625,82160000 -"19990121093000",40.4375,40.828125,39.4375,39.578125,80077200 -"19990120093000",41.78125,41.9375,40.617175,40.625,125526800 -"19990119093000",37.84375,39.59375,37.71875,38.90625,102773600 -"19990115093000",35.734375,37.5,35.34375,37.4375,59344000 -"19990114093000",36.3125,36.390625,35.375,35.4375,59214000 -"19990113093000",34,36.9375,34,35.953125,75346000 -"19990112093000",37.03125,37.03125,35.25,35.546875,57907200 -"19990111093000",37.71875,37.734375,36.0625,36.875,46460000 -"19990108093000",38.046875,38.125,36.75,37.46875,50236000 -"19990107093000",37.4375,37.65625,37.0625,37.625,51150400 -"19990106093000",37.375,37.875,36.6875,37.8125,69077200 -"19990105093000",35.46875,37,35.359375,36.625,64278800 -"19990104093000",34.898425,36.3125,34.84375,35.25,69300400 -"19981231093000",34.796875,35,34.5,34.671875,23834400 -"19981230093000",35.21875,35.835925,34.71875,34.75,34942800 -"19981229093000",35.640625,35.640625,34.90625,35.0625,29652000 -"19981228093000",35.75,35.90625,35.375,35.59375,23636400 -"19981224093000",35.40625,35.5,35.375,35.4375,1250800 -"19981223093000",35.09375,35.953125,34.84375,35.890625,34940000 -"19981222093000",35.125,35.125,34.34375,34.609375,41350000 -"19981221093000",34.65625,35.546875,34.4375,35.109375,48112000 -"19981218093000",33.75,34.5625,33.53125,34.453125,59648000 -"19981217093000",33.546875,33.71875,33.0625,33.59375,46963600 -"19981216093000",33.125,33.78125,32.28125,33.4375,60024000 -"19981215093000",32.328125,33,32.3125,32.96875,51719600 -"19981214093000",33.1875,33.4375,31.921875,31.984375,64076400 -"19981211093000",32.75,33.671875,32.6875,33.5,51760800 -"19981210093000",33.28125,33.65625,32.84375,32.890625,57135600 -"19981209093000",33.03125,33.453125,32.5,33.40625,44781600 -"19981208093000",33.21875,33.5625,32.4375,32.796875,77583600 -"19981207093000",31.921875,33.4375,31.6875,33.390625,89809200 -"19981204093000",31.234375,31.84375,31,31.84375,44352000 -"19981203093000",31.71875,32.234375,30.5,30.53125,51426800 -"19981202093000",32.296875,32.4375,31.375,31.6875,65596000 -"19981201093000",30.0625,32.4375,30.03125,32.390625,86330400 -"19981130093000",32.34375,32.5625,30.484375,30.5,70900000 -"19981127093000",31.28125,32.03125,31.078125,32.015625,26335600 -"19981125093000",30.671875,31.09375,30.1875,31.0625,41356800 -"19981124093000",29.671875,31.265625,29.65625,30.421875,101114800 -"19981123093000",28.125,30.046875,28.125,29.796875,110885200 -"19981120093000",28.1875,28.4375,27.8125,28.40625,48405600 -"19981119093000",27.265625,28.125,27.265625,27.9375,45220800 -"19981118093000",27.390625,27.765625,27.28125,27.4375,41691600 -"19981117093000",27.25,28.09375,27.234375,27.96875,58744000 -"19981116093000",27.828125,27.9375,26.875,27.203125,42620800 -"19981113093000",27.109375,27.625,27.09375,27.5,28368800 -"19981112093000",27.5625,27.78125,27.125,27.1875,38526800 -"19981111093000",28.359375,28.6875,27.71875,27.765625,63899200 -"19981110093000",27.53125,28.359375,27.515625,28.015625,72087600 -"19981109093000",27.296875,27.84375,27.203125,27.671875,68956800 -"19981106093000",26.515625,27.4375,26.484375,27.328125,74461200 -"19981105093000",26.328125,26.90625,26.3125,26.59375,76727200 -"19981104093000",26.453125,26.828125,26.21875,26.375,67459600 -"19981103093000",26.375,26.640625,26.1875,26.296875,36546800 -"19981102093000",26.59375,26.71875,26.25,26.453125,48388400 -"19981030093000",26.8125,27.046875,26.28125,26.46875,59322800 -"19981029093000",26.359375,26.875,26.359375,26.640625,52403200 -"19981028093000",26.21875,26.65625,26.21875,26.421875,56808400 -"19981027093000",26.9375,26.96875,26.25,26.359375,65436800 -"19981026093000",26.703125,27,26.421875,26.765625,59678400 -"19981023093000",27.25,27.5,26.546875,26.59375,59891200 -"19981022093000",26.5,27.53125,26.3125,27.5,81912800 -"19981021093000",26.21875,26.71875,25.765625,26.578125,125381600 -"19981020093000",25.8125,25.84375,24.90625,25.0625,94369200 -"19981019093000",26.03125,26.046875,25.28125,25.734375,60177200 -"19981016093000",26.5,26.625,26,26.265625,68636000 -"19981015093000",25.03125,26.40625,24.90625,26.359375,66253600 -"19981014093000",23.96875,25.34375,23.96875,25.046875,62403200 -"19981013093000",24.875,24.9375,23.9375,24.109375,47987600 -"19981012093000",24.8125,25.25,24.625,24.9375,51502800 -"19981009093000",23.296875,24.25,23.0625,24.21875,72661600 -"19981008093000",22.640625,22.96875,21.9375,22.796875,144657600 -"19981007093000",24.34375,24.9375,23.34375,23.53125,90761600 -"19981006093000",25.625,25.90625,24.34375,24.40625,76550000 -"19981005093000",25.625,25.71875,24.125,25.1875,114938000 -"19981002093000",25.84375,26.296875,25.25,26.03125,65885600 -"19981001093000",27.015625,27.375,26,26.015625,65445200 -"19980930093000",28.078125,28.390625,27.5078,27.515625,38875600 -"19980929093000",27.953125,28.5,27.84375,28.21875,48743200 -"19980928093000",28.25,28.59375,27.4375,27.828125,41406400 -"19980925093000",27.28125,28.28125,27.15625,28.265625,47878400 -"19980924093000",28.28125,28.65625,27.25,27.53125,63521600 -"19980923093000",27.40625,28.46875,27.125,28.40625,65263600 -"19980922093000",27.109375,27.46875,26.6875,27.296875,43082000 -"19980921093000",25.625,27.015625,25.59375,26.96875,45872000 -"19980918093000",26.5625,26.5625,26.078125,26.34375,47361600 -"19980917093000",26.328125,26.625,26.203125,26.234375,45178400 -"19980916093000",26.96875,27.125,26.53125,27.046875,42886800 -"19980915093000",26.46875,27.109375,26.28125,27.078125,49413600 -"19980914093000",26.234375,26.765625,26.21875,26.5,45086800 -"19980911093000",25.28125,26.15625,25.03125,26.0625,58989200 -"19980910093000",25,25.28125,24.671875,25.1875,60758000 -"19980909093000",25.5625,26.109375,25.40625,25.5625,65494400 -"19980908093000",24.734375,25.515625,24.765625,25.492175,60625600 -"19980904093000",24.921875,25.0625,24.03125,24.15625,50890400 -"19980903093000",24.6875,25.1875,24.5625,24.8125,67468000 -"19980902093000",25.453125,26.0625,25.0625,25.140625,63438400 -"19980901093000",23.8125,25.4375,23.625,25.3125,140112400 -"19980831093000",26.21875,26.625,23.9375,23.984375,132688400 -"19980828093000",27.0625,27.40625,26.1875,26.3125,72730000 -"19980827093000",27.640625,28.1875,27.125,27.3125,74874000 -"19980826093000",27.8125,28.4375,27.71875,28.140625,44804400 -"19980825093000",27.84375,28.421875,27.78125,28.203125,58027200 -"19980824093000",27.578125,28,27.5,27.59375,26319200 -"19980821093000",27.78125,27.96875,27.1875,27.65625,59523600 -"19980820093000",27.53125,28.1875,27.421875,28.140625,49964000 -"19980819093000",28.0625,28.1875,27.5625,27.640625,55709600 -"19980818093000",26.96875,27.953125,26.84375,27.8125,70591200 -"19980817093000",25.875,26.84375,25.75,26.828125,54073200 -"19980814093000",26.171875,26.265625,25.875,26.0625,29566400 -"19980813093000",26.03125,26.5,25.9375,25.984375,51193200 -"19980812093000",26.078125,26.296875,25.75,26.265625,53760000 -"19980811093000",25.71875,26.09375,25.5,25.859375,60976400 -"19980810093000",26.453125,26.578125,26.109375,26.109375,46763200 -"19980807093000",26.859375,26.875,26.265625,26.46875,54972400 -"19980806093000",25.9375,26.734375,25.90625,26.71875,68308000 -"19980805093000",26.03125,26.5625,25.375,26.078125,120191200 -"19980804093000",27.15625,27.40625,26.046875,26.125,91412000 -"19980803093000",27.28125,27.71875,26.84375,27.109375,73566400 -"19980731093000",28.234375,28.375,27.484375,27.484375,53706000 -"19980730093000",27.984375,28.40625,27.6875,28.359375,72746400 -"19980729093000",28.3125,28.5625,27.515625,27.671875,59904800 -"19980728093000",29,29.21875,28,28.0625,78378800 -"19980727093000",28.28125,29.1875,27.671875,29.1875,58998000 -"19980724093000",28.4375,28.90625,28.109375,28.453125,60366800 -"19980723093000",29.078125,29.375,28.25,28.25,51029600 -"19980722093000",28,29.3125,27.96875,29.1875,71630400 -"19980721093000",29.21875,29.75,28.125,28.203125,74605200 -"19980720093000",29.546875,29.875,29.203125,29.25,45794800 -"19980717093000",29.4375,29.90625,28.984375,29.484375,83137600 -"19980716093000",29.515625,29.71875,29.15625,29.34375,65130800 -"19980715093000",29,29.5,28.90625,29.34375,48690000 -"19980714093000",29.5625,29.6875,28.875,29.125,56972400 -"19980713093000",28.53125,29.5625,28.40625,29.390625,69223200 -"19980710093000",27.78125,28.3125,27.46875,28.296875,45396800 -"19980709093000",27.5,28,27.4375,27.75,43690000 -"19980708093000",27.03125,27.53125,26.6875,27.46875,41553600 -"19980707093000",26.96875,27.140625,26.625,26.984375,32423600 -"19980706093000",26.71875,27.015625,26.34375,26.953125,35260400 -"19980702093000",27.203125,27.28125,26.78125,26.8125,27321200 -"19980701093000",27.28125,27.53125,26.796875,27.34375,53474000 -"19980630093000",26.3125,27.140625,26.15625,27.09375,77010000 -"19980629093000",26.375,26.921875,26.3125,26.859375,65906000 -"19980626093000",25.5625,26.15625,25.5,26.109375,55680400 -"19980625093000",26.46875,26.71875,25.34375,25.390625,88969600 -"19980624093000",25.421875,26.28125,24.984375,26.234375,105728800 -"19980623093000",23.953125,25.21875,23.8125,25.1875,124675200 -"19980622093000",23.6875,23.984375,23.421875,23.953125,48969600 -"19980619093000",23.375,23.6875,23.125,23.671875,91345600 -"19980618093000",22.703125,22.9375,22.59375,22.796875,39228400 -"19980617093000",22.484375,23.09375,22.4375,22.765625,76145200 -"19980616093000",21.578125,22.484375,21.375,22.46875,61138400 -"19980615093000",21.171875,21.828125,21.140625,21.484375,42846000 -"19980612093000",21.21875,21.53125,21,21.4375,41999600 -"19980611093000",21.609375,21.78125,21.28125,21.328125,41511200 -"19980610093000",21.65625,22.09375,21.46875,21.5,33305600 -"19980609093000",21.328125,21.890625,21.3125,21.765625,36171600 -"19980608093000",21.40625,21.578125,21.25,21.421875,18900400 -"19980605093000",21.46875,21.625,21.1875,21.5625,34654000 -"19980604093000",21.171875,21.53125,20.90625,21.515625,33815200 -"19980603093000",21.46875,21.609375,21,21.078125,35992800 -"19980602093000",21.015625,21.484375,20.96875,21.375,39188000 -"19980601093000",20.96875,21.148425,20.78125,20.9375,42441600 -"19980529093000",21.59375,21.625,21.1875,21.203125,34094400 -"19980528093000",21.4375,21.59375,21.265625,21.578125,30868400 -"19980527093000",20.71875,21.53125,20.71875,21.5,58689600 -"19980526093000",21.328125,21.546875,20.875,20.90625,44532000 -"19980522093000",21.65625,21.6875,21.359375,21.390625,32211600 -"19980521093000",21.453125,21.84375,21.375,21.59375,36680400 -"19980520093000",21.53125,21.71875,21.34375,21.4375,35532400 -"19980519093000",21.453125,21.734375,21.390625,21.625,51278800 -"19980518093000",21.125,21.90625,21.125,21.515625,80977600 -"19980515093000",22.53125,22.546875,22.1875,22.359375,48150800 -"19980514093000",21.46875,22.75,21.453125,22.234375,94771200 -"19980513093000",22.1875,22.1875,21.625,21.734375,80681200 -"19980512093000",20.8125,21.4375,20.8125,21.421875,64122400 -"19980511093000",21.53125,21.546875,21.015625,21.046875,51474400 -"19980508093000",20.46875,21.53125,20.46875,21.4375,96249200 -"19980507093000",21.546875,21.5625,20.796875,20.84375,78022800 -"19980506093000",21.875,21.875,21.5,21.59375,48110800 -"19980505093000",21.90625,22.390625,21.75,21.9375,50839600 -"19980504093000",22.296875,22.46875,21.984375,22.015625,37898800 -"19980501093000",22.546875,22.625,22.03125,22.40625,36135200 -"19980430093000",22.875,22.90625,22.421875,22.53125,54481600 -"19980429093000",22.515625,22.875,22.40625,22.625,50171600 -"19980428093000",23.03125,23.0625,22.25,22.46875,56769600 -"19980427093000",22.375,22.6328,22.125,22.578125,58748000 -"19980424093000",23.375,23.6875,22.96875,23,51436000 -"19980423093000",24.3125,24.3125,23.53125,23.625,64215600 -"19980422093000",24,24.78125,23.90625,24.6875,80153600 -"19980421093000",23.671875,23.75,23.28125,23.75,51932400 -"19980420093000",23.09375,23.75,23.046875,23.65625,45534400 -"19980417093000",22.875,23.0625,22.578125,23.046875,37402800 -"19980416093000",22.59375,23.015625,22.5625,22.921875,39695600 -"19980415093000",22.3125,22.84375,22.21875,22.84375,40498400 -"19980414093000",22.171875,22.390625,21.875,22.109375,28476800 -"19980413093000",22.203125,22.25,21.6875,22.15625,33156400 -"19980409093000",21.984375,22.40625,21.898425,22.25,33619200 -"19980408093000",21.6875,22.265625,21.65625,22.234375,36798800 -"19980407093000",22.328125,22.65625,21.6875,21.8125,63295200 -"19980406093000",23.15625,23.15625,22.265625,22.484375,74242800 -"19980403093000",23,23.265625,22.875,23.25,40987600 -"19980402093000",22.671875,22.984375,22.46875,22.828125,41412800 -"19980401093000",22.453125,22.65625,22.125,22.59375,36840000 -"19980331093000",22.15625,22.4375,22.125,22.375,38126400 -"19980330093000",22.015625,22.15625,21.78125,22,27463200 -"19980327093000",22.34375,22.34375,21.890625,21.953125,38940000 -"19980326093000",22.125,22.390625,21.875,22.0625,45442400 -"19980325093000",22.59375,22.734375,21.8125,22.203125,124248000 -"19980324093000",21.046875,21.265625,20.859375,21.234375,32281600 -"19980323093000",20.296875,21.15625,20.265625,20.96875,55090400 -"19980320093000",20.53125,20.75,20.125,20.46875,56310000 -"19980319093000",20.375,20.578125,20.3125,20.5,30297200 -"19980318093000",20.015625,20.453125,19.96875,20.4375,33887600 -"19980317093000",20.421875,20.421875,19.921875,20.09375,53842400 -"19980316093000",20.609375,20.6875,20.34375,20.5,27979600 -"19980313093000",20.609375,20.75,20.390625,20.59375,32542400 -"19980312093000",20.625,20.59375,20.203125,20.46875,47921200 -"19980311093000",20.5,20.5,19.9375,20.171875,39839600 -"19980310093000",20.296875,20.375,19.984375,20.390625,47406400 -"19980309093000",20.625,20.625,19.875,19.898425,52255600 -"19980306093000",20.078125,20.6875,20.0625,20.640625,51405200 -"19980305093000",19.8125,20.359375,19.875,20.015625,92256400 -"19980304093000",20.609375,20.953125,20.390625,20.578125,71513600 -"19980303093000",20.65625,21.140625,20.640625,21.125,50754400 -"19980302093000",21.46875,21.46875,20.765625,20.84375,50094000 -"19980227093000",21.390625,21.5,21.140625,21.1875,47528400 -"19980226093000",21.375,21.421875,21.109375,21.375,61388000 -"19980225093000",20.859375,21.25,20.765625,21.234375,94944800 -"19980224093000",20.84375,21.234375,20.46875,20.53125,118314400 -"19980223093000",20.21875,20.421875,19.84375,20.40625,120803600 -"19980220093000",19.4375,19.46875,19.109375,19.390625,86108000 -"19980219093000",19.4375,19.5078125,19.28125,19.359375,73773600 -"19980218093000",19.328125,19.5,19.21875,19.328125,76608800 -"19980217093000",19.8125,19.8125,19.234375,19.296875,85673600 -"19980213093000",19.828125,19.84375,19.671875,19.6875,42206400 -"19980212093000",19.7578125,19.8671875,19.5078125,19.84375,76698400 -"19980211093000",19.9921875,20.0078125,19.6328125,19.8671875,76460000 -"19980210093000",19.65625,19.9375,19.59375,19.90625,48099200 -"19980209093000",19.84375,19.859375,19.453125,19.6484375,54682400 -"19980206093000",19.421875,19.78125,19.390625,19.765625,50070400 -"19980205093000",19.765625,19.84375,19.34375,19.4296875,67014400 -"19980204093000",19.484375,19.75,19.3828125,19.6015625,61940800 -"19980203093000",19.390625,19.515625,19.2265625,19.484375,61374400 -"19980202093000",18.96875,19.390625,18.8125,19.34375,98392000 -"19980130093000",18.578125,18.75,18.453125,18.6484375,50071200 -"19980129093000",18.6171875,18.765625,18.4375,18.53125,73571200 -"19980128093000",18.28125,18.6875,18.1875,18.625,79388800 -"19980127093000",17.796875,18.234375,17.6953125,18.1484375,97540000 -"19980126093000",17.484375,17.734375,17.3046875,17.71875,74276000 -"19980123093000",17.34375,17.4296875,17.0859375,17.28125,63312000 -"19980122093000",16.9453125,17.484375,16.9140625,17.328125,159360800 -"19980121093000",17.15625,17.3046875,16.953125,17.125,85562400 -"19980120093000",16.765625,17.25,16.75,17.2265625,64956000 -"19980116093000",16.546875,16.921875,16.5390625,16.90625,72943200 -"19980115093000",16.296875,16.625,16.234375,16.5390625,50624000 -"19980114093000",16.515625,16.5625,16.15625,16.390625,54774400 -"19980113093000",16.1875,16.5234375,16.015625,16.515625,66945600 -"19980112093000",16.078125,16.25,15.546875,16.1953125,78400800 -"19980109093000",16.2578125,16.4375,15.734375,15.875,87534400 -"19980108093000",16.078125,16.515625,15.9375,16.3125,77657600 -"19980107093000",16.234375,16.328125,15.9375,16.1953125,61492800 -"19980106093000",16.21875,16.625,16.15625,16.390625,67836800 -"19980105093000",16.40625,16.703125,15.984375,16.296875,80377600 -"19980102093000",16.203125,16.4375,16.1875,16.390625,39748000 -"19971231093000",16.375,16.4375,16.125,16.15625,46146400 -"19971230093000",15.8046875,16.375,15.78125,16.28125,77881600 -"19971229093000",15.296875,15.84375,15.265625,15.7890625,67799200 -"19971226093000",14.859375,15.09375,14.84375,15.09375,32388800 -"19971224093000",15.46875,15.484375,14.75,14.8671875,88411200 -"19971223093000",15.8828125,16.03125,15.375,15.4140625,67195200 -"19971222093000",16.140625,16.25,15.734375,15.8828125,59063200 -"19971219093000",16.09375,16.2734375,15.78125,16.0703125,137783200 -"19971218093000",16.8125,16.84375,16.296875,16.359375,98774400 -"19971217093000",17.484375,17.546875,16.9453125,16.953125,51472000 -"19971216093000",16.984375,17.546875,16.875,17.3828125,65401600 -"19971215093000",17.0546875,17.125,16.515625,17.015625,84314400 -"19971212093000",17.21875,17.3125,17,17.09375,54375200 -"19971211093000",17.546875,17.625,17.359375,17.3828125,70189600 -"19971210093000",17.78125,17.90625,17.625,17.78125,66434400 -"19971209093000",18.125,18.171875,17.9375,18.0390625,51864000 -"19971208093000",17.9375,18.328125,17.890625,18.265625,49952800 -"19971205093000",17.765625,18.09375,17.765625,17.890625,48136000 -"19971204093000",18.09375,18.234375,17.78125,17.8203125,62627200 -"19971203093000",17.7109375,18.1328125,17.625,18.09375,57712000 -"19971202093000",17.9453125,18.109375,17.75,17.78125,50167200 -"19971201093000",17.7421875,18,17.703125,17.9765625,49006400 -"19971128093000",17.65625,17.78125,17.640625,17.6875,17392800 -"19971127093000",-1,-1,-1,-1,-1 -"19971126093000",17.375,17.734375,17.28125,17.6953125,63053600 -"19971125093000",16.984375,17.40625,16.96875,17.375,56464800 -"19971124093000",17.140625,17.265625,16.9375,16.9375,39084000 -"19971121093000",17.2265625,17.25,17.046875,17.234375,68220800 -"19971120093000",16.90625,17.140625,16.859375,17.109375,53680800 -"19971119093000",16.703125,16.890625,16.671875,16.8828125,31720800 -"19971118093000",16.8671875,16.9375,16.71875,16.75,36683200 -"19971117093000",16.8125,16.9765625,16.6796875,16.859375,60094400 -"19971114093000",16.453125,16.734375,16.421875,16.6640625,46663200 -"19971113093000",16.2578125,16.453125,16.1484375,16.4453125,60094400 -"19971112093000",16.265625,16.375,16.125,16.1484375,45784000 -"19971111093000",16.3046875,16.4296875,16.171875,16.328125,37013600 -"19971110093000",16.453125,16.5625,16.21875,16.2734375,36764800 -"19971107093000",16.2578125,16.5,16.234375,16.4453125,63631200 -"19971106093000",16.65625,16.6875,16.46875,16.5078125,40266400 -"19971105093000",16.8125,16.828125,16.5625,16.6953125,42512800 -"19971104093000",16.75,16.8671875,16.6484375,16.78125,49126400 -"19971103093000",16.453125,16.78125,16.4140625,16.765625,67714400 -"19971031093000",16.375,16.4375,16.203125,16.25,46808800 -"19971030093000",16.1875,16.453125,16.0625,16.078125,72097600 -"19971029093000",16.71875,16.8828125,16.265625,16.390625,85533600 -"19971028093000",15.5,16.78125,15.4375,16.671875,159689600 -"19971027093000",16.859375,17.03125,16.078125,16.109375,96792800 -"19971024093000",17.109375,17.15625,16.65625,16.921875,70030400 -"19971023093000",16.5,17.15625,16.5,16.953125,66413600 -"19971022093000",17.296875,17.3125,16.921875,16.9609375,55775200 -"19971021093000",17.015625,17.4023375,16.9140625,17.3125,115682400 -"19971020093000",16.625,16.90625,15.9375,16.5625,154052800 -"19971017093000",16.640625,16.828125,16.296875,16.53125,87720000 -"19971016093000",17.015625,17.078125,16.53125,16.738275,47327200 -"19971015093000",16.96875,17,16.921875,16.96875,44997600 -"19971014093000",17.140625,17.171875,16.921875,17.0859375,33361600 -"19971013093000",17.125,17.234375,17.0703125,17.09375,19051200 -"19971010093000",17.2890625,17.34375,17.03125,17.0625,24893600 -"19971009093000",17.3125,17.453125,17.265625,17.3671875,34482400 -"19971008093000",17.078125,17.3828125,17.03125,17.375,71196800 -"19971007093000",16.875,17.2109375,16.828125,17.0625,54548800 -"19971006093000",16.984375,17.03125,16.78125,16.890625,41776800 -"19971003093000",16.8671875,17.03125,16.671875,16.8671875,60287200 -"19971002093000",16.71875,16.828125,16.59375,16.6484375,28756000 -"19971001093000",16.5625,16.8125,16.421875,16.734375,61466400 -"19970930093000",16.8046875,16.96875,16.53125,16.5390625,43892800 -"19970929093000",16.6875,16.84375,16.609375,16.8125,27505600 -"19970926093000",16.703125,16.71875,16.453125,16.671875,36644000 -"19970925093000",16.609375,16.765625,16.5078125,16.59375,39272000 -"19970924093000",16.953125,17.0078125,16.515625,16.5546875,60043200 -"19970923093000",16.6953125,16.9375,16.640625,16.9375,39946400 -"19970922093000",16.875,16.984375,16.6484375,16.6640625,43251200 -"19970919093000",16.53125,16.90625,16.5,16.8984375,77428800 -"19970918093000",16.78125,16.890625,16.4296875,16.53125,61077600 -"19970917093000",17.078125,17.09375,16.578125,16.6484375,61609600 -"19970916093000",16.46875,17.125,16.375,17.046875,102540800 -"19970915093000",16.953125,17.15625,16.328125,16.3359375,129004000 -"19970912093000",17.109375,17.296875,16.953125,17.2421875,48576000 -"19970911093000",16.875,17.171875,16.609375,17.1015625,61779200 -"19970910093000",17.359375,17.390625,16.8828125,16.890625,53294400 -"19970909093000",17.40625,17.53125,17.296875,17.4375,39465600 -"19970908093000",17.21875,17.4765625,17.21875,17.4140625,42416000 -"19970905093000",17.3828125,17.4609375,17.03125,17.1640625,48398400 -"19970904093000",17,17.3125,17.015625,17.2734375,44481600 -"19970903093000",17.203125,17.359375,17.0234375,17.0703125,42872800 -"19970902093000",16.640625,17.1875,16.625,17.1484375,50106400 -"19970901093000",-1,-1,-1,-1,-1 -"19970829093000",16.5078125,16.734375,16.46875,16.5234375,37857600 -"19970828093000",16.6875,16.71875,16.5,16.5078125,43641600 -"19970827093000",16.90625,16.9140625,16.625,16.8203125,49372000 -"19970826093000",17,17.109375,16.84375,16.875,34124000 -"19970825093000",17.234375,17.375,16.953125,17.0625,38856800 -"19970822093000",16.90625,17.1875,16.765625,17.15625,72029600 -"19970821093000",17.703125,17.796875,17.1875,17.234375,64443200 -"19970820093000",17.375,17.5859375,17.125,17.5703125,50312800 -"19970819093000",16.84375,17.375,16.828125,17.3515625,91013600 -"19970818093000",16.625,16.734375,16.375,16.734375,69921600 -"19970815093000",16.9375,17,16.59375,16.609375,51078400 -"19970814093000",17,17.09375,16.765625,17.03125,45912800 -"19970813093000",17.265625,17.28125,16.84375,17.0078125,66731200 -"19970812093000",17.421875,17.46875,16.9765625,17,60887200 -"19970811093000",17.5,17.53125,17.046875,17.28125,72695200 -"19970808093000",17.8515625,17.890625,17.5,17.5,66811200 -"19970807093000",18.0390625,18.046875,17.75,18.0429625,43964800 -"19970806093000",17.9140625,18.078125,17.78125,17.9296875,43412000 -"19970805093000",17.78125,18.046875,17.75,17.9140625,59336000 -"19970804093000",17.53125,17.75,17.4296875,17.6953125,46312800 -"19970801093000",17.671875,17.7265625,17.3984375,17.578125,58912800 -"19970731093000",17.75,17.765625,17.609375,17.6875,42232800 -"19970730093000",17.59375,17.75,17.453125,17.640625,78323200 -"19970729093000",17.09375,17.5078125,17.015625,17.4921875,78816000 -"19970728093000",17.40625,17.421875,16.96875,17.125,56404000 -"19970725093000",17.3125,17.78125,17.15625,17.3125,90308800 -"19970724093000",17.296875,17.546875,16.953125,17.25,141855200 -"19970723093000",18.15625,18.359375,17.625,17.6796875,95857600 -"19970722093000",17.109375,18.1015625,17.09375,18.03125,101383200 -"19970721093000",17.609375,17.625,16.71875,16.9921875,127221600 -"19970718093000",18.1875,18.421875,17.5,17.5625,158937600 -"19970717093000",18.8125,18.84375,18.3125,18.6796875,131656800 -"19970716093000",17.765625,18.6875,17.5,18.5546875,110971200 -"19970715093000",17.2578125,17.40625,17.078125,17.3085875,75501600 -"19970714093000",16.3515625,17,16.3125,16.9921875,57424000 -"19970711093000",16.28125,16.3828125,16.0546875,16.21875,38096000 -"19970710093000",16.3125,16.40625,16.109375,16.234375,43780800 -"19970709093000",16.5625,16.578125,16.1875,16.34375,48239200 -"19970708093000",16.171875,16.4140625,16.1171875,16.40625,36007200 -"19970707093000",16.328125,16.46875,16.171875,16.1875,39320000 -"19970704093000",-1,-1,-1,-1,-1 -"19970703093000",16.2578125,16.2578125,16.0625,16.1953125,28764000 -"19970702093000",15.703125,16.0625,15.5078125,16.046875,53237600 -"19970701093000",15.8046875,15.859375,15.40625,15.6171875,59377600 -"19970630093000",15.984375,16.09375,15.7734375,15.796875,38286400 -"19970627093000",16.140625,16.25,15.90625,15.9375,38198400 -"19970626093000",16.265625,16.3515625,15.984375,16.03125,37212800 -"19970625093000",16.609375,16.65625,16.15625,16.3046875,49576800 -"19970624093000",16.1875,16.515625,16.046875,16.5078125,39319200 -"19970623093000",16.234375,16.4375,16,16.0078125,35724800 -"19970620093000",16.171875,16.421875,16.0625,16.234375,64236000 -"19970619093000",16.046875,16.34375,16,16.1640625,65515200 -"19970618093000",16.65625,16.6875,16.2578125,16.2734375,55648000 -"19970617093000",16.4375,16.8671875,16.359375,16.7734375,53191200 -"19970616093000",16.203125,16.421875,16.109375,16.421875,40612800 -"19970613093000",15.84375,16.2578125,15.8203125,16.203125,50116000 -"19970612093000",15.84375,16.015625,15.6875,15.84375,44620000 -"19970611093000",15.6015625,15.921875,15.4453125,15.875,49056800 -"19970610093000",15.640625,15.8828125,15.46875,15.6015625,53135200 -"19970609093000",15.609375,15.765625,15.3125,15.65625,48200000 -"19970606093000",15.171875,15.5390625,15.125,15.5,35964000 -"19970605093000",15.03125,15.1875,14.9375,15.046875,35892000 -"19970604093000",15.078125,15.28125,14.78125,14.8984375,54639200 -"19970603093000",15.421875,15.4375,15.078125,15.2578125,41987200 -"19970602093000",15.625,15.6875,15.390625,15.546875,38939200 -"19970530093000",14.6875,15.703125,14.6875,15.5,83340000 -"19970529093000",15.90625,16.1328125,15.625,15.734375,51103200 -"19970528093000",15.90625,15.90625,15.609375,15.734375,52241600 -"19970527093000",15.34375,15.921875,15.296875,15.828125,69036000 -"19970526093000",-1,-1,-1,-1,-1 -"19970523093000",15.171875,15.375,15.109375,15.359375,28904800 -"19970522093000",15.125,15.203125,14.96875,15.078125,33478400 -"19970521093000",15.078125,15.3671875,14.96875,15.046875,76620000 -"19970520093000",14.484375,14.90625,14.40625,14.890625,64876800 -"19970519093000",14.515625,14.640625,14.390625,14.390625,45632000 -"19970516093000",14.546875,14.625,14.359375,14.4296875,59913600 -"19970515093000",14.5,14.734375,14.484375,14.640625,41864800 -"19970514093000",14.796875,14.828125,14.453125,14.484375,60741600 -"19970513093000",14.796875,14.90625,14.609375,14.71875,49813600 -"19970512093000",14.6875,14.8125,14.625,14.765625,42974400 -"19970509093000",14.75,14.8125,14.46875,14.59375,58392000 -"19970508093000",14.40625,14.765625,14.390625,14.5625,53834400 -"19970507093000",14.546875,14.875,14.390625,14.4375,70532800 -"19970506093000",-1,-1,-1,-1,-1 -"19970505093000",14.953125,15.09375,14.4375,15,110850400 -"19970502093000",15.25,15.4375,14.8671875,15.09375,96188800 -"19970501093000",15.25,15.40625,14.90625,15.125,72317600 -"19970430093000",14.828125,15.328125,14.796875,15.1875,90204000 -"19970429093000",14.671875,14.890625,14.5625,14.875,73952000 -"19970428093000",14.21875,14.3828125,13.953125,14.359375,67224000 -"19970425093000",14.1875,14.421875,14.15625,14.203125,58565600 -"19970424093000",14.578125,14.734375,14.09375,14.265625,118175200 -"19970423093000",13.828125,14.46875,13.796875,14.390625,102813600 -"19970422093000",13.453125,13.8515625,13.4375,13.828125,82420800 -"19970421093000",13.375,13.984375,13.265625,13.453125,155708800 -"19970418093000",13,13.453125,12.953125,13.453125,231800800 -"19970417093000",12.3125,12.5,12.1875,12.265625,71829600 -"19970416093000",12.078125,12.3125,12.03125,12.28125,42710400 -"19970415093000",12.234375,12.375,11.984375,12.140625,84438400 -"19970414093000",11.84375,12.171875,11.671875,12.171875,59267200 -"19970411093000",11.9375,12.15625,11.8671875,11.875,60033600 -"19970410093000",12.21875,12.21875,11.9375,12.09375,67913600 -"19970409093000",12.390625,12.40625,12.21875,12.25,73760800 -"19970408093000",12.078125,12.28125,11.9375,12.28125,53331200 -"19970407093000",11.953125,12.203125,11.90625,12,76507200 -"19970404093000",11.71875,12.09375,11.71875,11.7734375,94963200 -"19970403093000",11.375,11.921875,11.328125,11.859375,92252800 -"19970402093000",11.609375,11.703125,11.375,11.5,63330400 -"19970401093000",11.265625,11.71875,11.21875,11.65625,86684000 -"19970331093000",11.640625,11.8125,11.40625,11.4609375,93826400 -"19970328093000",-1,-1,-1,-1,-1 -"19970327093000",11.5625,12.015625,11.5625,11.5625,93927200 -"19970326093000",11.34375,11.828125,11.328125,11.78125,81270400 -"19970325093000",11.328125,11.421875,11.109375,11.2890625,89712800 -"19970324093000",11.640625,11.6875,10.9375,11.296875,186269600 -"19970321093000",12.0625,12.140625,11.609375,11.75,85829600 -"19970320093000",12.078125,12.21875,11.921875,12,81410400 -"19970319093000",12.21875,12.28125,11.8671875,12.09375,111556800 -"19970318093000",12.578125,12.6015625,12.359375,12.453125,59007200 -"19970317093000",12.3125,12.59375,12.25,12.578125,83958400 -"19970314093000",12.46875,12.53125,12.359375,12.375,61327200 -"19970313093000",12.28125,12.515625,12.25,12.4375,45505600 -"19970312093000",12.21875,12.4375,12.21875,12.34375,43234400 -"19970311093000",12.453125,12.5703125,12.296875,12.296875,47577600 -"19970310093000",12.140625,12.515625,11.9921875,12.5,45997600 -"19970307093000",12.296875,12.4375,12.0625,12.09375,46032000 -"19970306093000",12.59375,12.609375,12.2148375,12.21875,57018400 -"19970305093000",12.4375,12.625,12.40625,12.609375,46393600 -"19970304093000",12.40625,12.515625,12.328125,12.390625,63920800 -"19970303093000",12.125,12.515625,12.078125,12.4375,53874400 -"19970228093000",12.015625,12.296875,11.9296875,12.1875,78412000 -"19970227093000",12.53125,12.53125,12,12.015625,56628800 -"19970226093000",12.4375,12.546875,12.296875,12.53125,48939200 -"19970225093000",12.5,12.625,12.359375,12.4375,63941600 -"19970224093000",11.78125,12.53125,11.75,12.515625,68599200 -"19970221093000",11.859375,11.921875,11.75,11.875,61131200 -"19970220093000",12.109375,12.15625,11.890625,11.90625,75395200 -"19970219093000",12.171875,12.265625,12.0625,12.1875,56383200 -"19970218093000",12.203125,12.234375,12.015625,12.171875,52546400 -"19970217093000",-1,-1,-1,-1,-1 -"19970214093000",12.421875,12.5625,12.203125,12.234375,57395200 -"19970213093000",12.5625,12.640625,12.421875,12.5,58277600 -"19970212093000",12.296875,12.5,12.1875,12.484375,72009600 -"19970211093000",12.28125,12.328125,11.890625,12.3125,88841600 -"19970210093000",12.59375,12.6875,12.203125,12.21875,66812800 -"19970207093000",12.296875,12.5625,12.1875,12.546875,62448000 -"19970206093000",12.28125,12.296875,12,12.140625,102122400 -"19970205093000",12.890625,12.9375,12.109375,12.296875,110099200 -"19970204093000",12.796875,12.90625,12.5625,12.890625,56464000 -"19970203093000",12.828125,12.921875,12.640625,12.796875,60804800 -"19970131093000",12.734375,12.90625,12.609375,12.75,86529600 -"19970130093000",12.28125,12.65625,12.25,12.640625,79946400 -"19970129093000",12.09375,12.171875,11.96875,12.15625,48933600 -"19970128093000",12.296875,12.34375,11.84375,11.953125,64657600 -"19970127093000",12.0625,12.171875,11.9375,12.015625,53263200 -"19970124093000",11.890625,12.21875,11.796875,11.9921875,89821600 -"19970123093000",12.265625,12.46875,11.8125,11.84375,105320000 -"19970122093000",11.890625,12.3125,11.828125,12.171875,129260800 -"19970121093000",11.328125,11.8828125,11.203125,11.875,114592000 -"19970120093000",10.875,11.609375,10.828125,11.34375,146220800 -"19970117093000",10.703125,10.96875,10.6875,10.890625,65368800 -"19970116093000",10.625,10.890625,10.625,10.75,58688000 -"19970115093000",10.703125,10.78125,10.546875,10.578125,53058400 -"19970114093000",10.53125,10.828125,10.53125,10.671875,63728000 -"19970113093000",10.640625,10.6875,10.4375,10.46875,50361600 -"19970110093000",10.25,10.546875,10.203125,10.53125,66578400 -"19970109093000",10.46875,10.46875,10.28125,10.296875,47764800 -"19970108093000",10.625,10.6523375,10.390625,10.421875,50593600 -"19970107093000",10.5625,10.640625,10.421875,10.625,36880800 -"19970106093000",10.578125,10.65625,10.390625,10.546875,55948800 -"19970103093000",10.28125,10.59375,10.25,10.578125,44124000 -"19970102093000",10.390625,10.390625,10.09375,10.203125,54419200 -"19970101093000",-1,-1,-1,-1,-1 -"19961231093000",10.5,10.53125,10.3125,10.328125,34367200 -"19961230093000",10.671875,10.703125,10.4375,10.4375,27279200 -"19961227093000",10.6875,10.71875,10.5,10.53125,19079200 -"19961226093000",10.65625,10.765625,10.640625,10.6875,27905600 -"19961225093000",-1,-1,-1,-1,-1 -"19961224093000",10.515625,10.640625,10.390625,10.609375,16246400 -"19961223093000",10.515625,10.59375,10.359375,10.46875,36892800 -"19961220093000",10.6875,10.703125,10.421875,10.453125,90414400 -"19961219093000",10.5,10.640625,10.375,10.609375,94609600 -"19961218093000",10.25,10.34375,10,10.328125,61796800 -"19961217093000",9.578125,10.015625,9.546875,9.984375,68952800 -"19961216093000",10.03125,10.09375,9.5625,9.59375,64883200 -"19961213093000",10.140625,10.25,9.9023375,10,74544000 -"19961212093000",10.625,10.65625,10.125,10.140625,78272800 -"19961211093000",10.125,10.453125,10.015625,10.421875,113576000 -"19961210093000",10.546875,10.5703125,10.21875,10.234375,125725600 -"19961209093000",9.796875,10.234375,9.75,10.21875,94718400 -"19961206093000",9.3125,9.65625,9.265625,9.5546875,110238400 -"19961205093000",9.5859375,9.7109375,9.4921875,9.5625,74950400 -"19961204093000",9.6953125,9.703125,9.5078125,9.578125,102542400 -"19961203093000",9.8984375,9.96875,9.6640625,9.6679625,77563200 -"19961202093000",9.84375,9.859375,9.703125,9.859375,64502400 -"19961129093000",9.71875,9.8203125,9.71875,9.8046875,17152000 -"19961128093000",-1,-1,-1,-1,-1 -"19961127093000",9.6328125,9.734375,9.609375,9.71875,44446400 -"19961126093000",9.625,9.7109375,9.5234375,9.609375,108238400 -"19961125093000",9.4453125,9.6015625,9.40625,9.59375,75131200 -"19961122093000",9.421875,9.53125,9.3359375,9.40625,94424000 -"19961121093000",9.65625,9.6640625,9.375,9.3984375,130718400 -"19961120093000",9.75,9.875,9.578125,9.578125,123857600 -"19961119093000",9.40625,9.7421875,9.390625,9.7421875,104739200 -"19961118093000",9.3359375,9.46875,9.2890625,9.3984375,98585600 -"19961115093000",9.421875,9.4296875,9.2109375,9.3125,104041600 -"19961114093000",9.078125,9.3515625,9.078125,9.3515625,114969600 -"19961113093000",8.9765625,9.109375,8.9453125,9.0625,90409600 -"19961112093000",9,9.1171875,8.84375,8.859375,81156800 -"19961111093000",8.9609375,9.046875,8.9375,8.9765625,38593600 -"19961108093000",8.9609375,8.96875,8.84375,8.96875,67369600 -"19961107093000",9.03125,9.1328125,8.9453125,8.96875,76742400 -"19961106093000",8.828125,9.03125,8.8125,9.03125,71438400 -"19961105093000",8.65625,8.84375,8.644525,8.84375,86417600 -"19961104093000",8.578125,8.6484375,8.546875,8.625,36006400 -"19961101093000",8.578125,8.671875,8.53125,8.5859375,56531200 -"19961031093000",8.5234375,8.5859375,8.5078125,8.578125,37028800 -"19961030093000",8.4609375,8.5625,8.4296875,8.515625,60526400 -"19961029093000",8.5546875,8.5859375,8.4296875,8.4609375,66756800 -"19961028093000",8.5429625,8.6015625,8.515625,8.5390625,51241600 -"19961025093000",8.5390625,8.6171875,8.5078125,8.5273375,53084800 -"19961024093000",8.4296875,8.5859375,8.3671875,8.5390625,81417600 -"19961023093000",8.2890625,8.421875,8.234375,8.40625,67408000 -"19961022093000",8.3203125,8.3359375,8.203125,8.28125,113806400 -"19961021093000",8.421875,8.5,8.34375,8.375,71401600 -"19961018093000",8.375,8.4375,8.34765,8.4375,69646400 -"19961017093000",8.640625,8.6875,8.46875,8.46875,49097600 -"19961016093000",8.671875,8.6835875,8.5625,8.625,36427200 -"19961015093000",8.671875,8.6953125,8.5859375,8.6796875,61206400 -"19961014093000",8.5859375,8.6328125,8.5234375,8.5390625,36091200 -"19961011093000",8.4140625,8.578125,8.390625,8.5703125,36523200 -"19961010093000",8.359375,8.5078125,8.3359375,8.359375,51739200 -"19961009093000",8.5,8.5078125,8.328125,8.40625,64960000 -"19961008093000",8.609375,8.609375,8.4375,8.4609375,48465600 -"19961007093000",8.5234375,8.6328125,8.4921875,8.59375,42432000 -"19961004093000",8.4140625,8.5390625,8.390625,8.5234375,45166400 -"19961003093000",8.421875,8.4453125,8.3515625,8.375,58294400 -"19961002093000",8.3046875,8.484375,8.2734375,8.421875,68760000 -"19961001093000",8.234375,8.3671875,8.1796875,8.2578125,69124800 -"19960930093000",8.34375,8.4296875,8.234375,8.2421875,89574400 -"19960927093000",8.28125,8.453125,8.203125,8.3984375,98372800 -"19960926093000",8.484375,8.5078125,8.234375,8.25,92604800 -"19960925093000",8.59375,8.6171875,8.4609375,8.4765625,44067200 -"19960924093000",8.59375,8.6484375,8.5078125,8.5546875,72520000 -"19960923093000",8.6015625,8.6328125,8.515625,8.609375,46385600 -"19960920093000",8.5625,8.6640625,8.4921875,8.6328125,104849600 -"19960919093000",8.53125,8.640625,8.484375,8.609375,75912000 -"19960918093000",8.375,8.6171875,8.328125,8.53125,86049600 -"19960917093000",8.3046875,8.4140625,8.265625,8.3671875,75624000 -"19960916093000",8.1953125,8.3203125,8.1875,8.21875,62409600 -"19960913093000",8.1015625,8.2109375,8.0546875,8.1875,80136000 -"19960912093000",7.84375,8.09375,7.8242125,8.019525,95944000 -"19960911093000",7.7460875,7.84375,7.7265625,7.8203125,36387200 -"19960910093000",7.796875,7.8203125,7.7265625,7.7734375,38904000 -"19960909093000",7.65625,7.8125,7.640625,7.8046875,41747200 -"19960906093000",7.625,7.671875,7.6015625,7.65625,41921600 -"19960905093000",7.671875,7.6875,7.59375,7.59375,40372800 -"19960904093000",7.7109375,7.7265625,7.6835875,7.7109375,27126400 -"19960903093000",7.625,7.7109375,7.5390625,7.7109375,48524800 -"19960902093000",-1,-1,-1,-1,-1 -"19960830093000",7.765625,7.765625,7.65625,7.65625,28088000 -"19960829093000",7.828125,7.828125,7.7265625,7.7578125,34182400 -"19960828093000",7.8125,7.859375,7.8046875,7.8515625,32070400 -"19960827093000",7.6875,7.796875,7.6875,7.796875,28038400 -"19960826093000",7.6875,7.734375,7.671875,7.6796875,31952000 -"19960823093000",7.8046875,7.8125,7.703125,7.703125,44006400 -"19960822093000",7.7578125,7.8203125,7.71875,7.8125,50236800 -"19960821093000",7.6484375,7.71875,7.609375,7.71875,49345600 -"19960820093000",7.734375,7.7578125,7.703125,7.7109375,25678400 -"19960819093000",7.7421875,7.7578125,7.640625,7.71875,43131200 -"19960816093000",7.8203125,7.828125,7.7265625,7.7265625,47598400 -"19960815093000",7.796875,7.859375,7.7734375,7.8203125,35556800 -"19960814093000",7.7421875,7.8203125,7.734375,7.8046875,52032000 -"19960813093000",7.8125,7.8671875,7.7109375,7.71875,72508800 -"19960812093000",7.765625,7.8828125,7.75,7.828125,66187200 -"19960809093000",7.796875,7.84375,7.7421875,7.78125,44313600 -"19960808093000",7.7578125,7.8671875,7.734375,7.828125,54379200 -"19960807093000",7.7734375,7.8203125,7.6796875,7.796875,76790400 -"19960806093000",7.6015625,7.7578125,7.5546875,7.75,67388800 -"19960805093000",7.71875,7.734375,7.578125,7.609375,55072000 -"19960802093000",7.6328125,7.7421875,7.5390625,7.7109375,109289600 -"19960801093000",7.3671875,7.5546875,7.3359375,7.5390625,96025600 -"19960731093000",7.4375,7.4765625,7.3515625,7.3671875,56320000 -"19960730093000",7.3671875,7.421875,7.2578125,7.4140625,66976000 -"19960729093000",7.453125,7.4921875,7.296875,7.3046875,56748800 -"19960726093000",7.46875,7.46875,7.390625,7.4453125,59304000 -"19960725093000",7.25,7.421875,7.1953125,7.40625,100920000 -"19960724093000",6.84375,7.234375,6.84375,7.171875,192176000 -"19960723093000",7.5,7.5078125,6.890625,7.0078125,257678400 -"19960722093000",7.5625,7.59375,7.3671875,7.484375,144475200 -"19960719093000",7.359375,7.6015625,7.359375,7.5605375,99208000 -"19960718093000",7.328125,7.5,7.2421875,7.4921875,98537600 -"19960717093000",7.359375,7.3828125,7.2265625,7.3203125,126272000 -"19960716093000",6.890625,7.2265625,6.71875,7.2109375,182116800 -"19960715093000",7.0234375,7.109375,6.8671875,6.9140625,111832000 -"19960712093000",7.1992125,7.1992125,6.9042875,7.0234375,139478400 -"19960711093000",7.390625,7.3984375,7.109375,7.15625,140915200 -"19960710093000",7.5,7.5,7.3828125,7.46875,77980800 -"19960709093000",7.5546875,7.5859375,7.5,7.5,32316800 -"19960708093000",7.40625,7.546875,7.3828125,7.519525,64440000 -"19960705093000",7.421875,7.5234375,7.3984375,7.3984375,35331200 -"19960704093000",-1,-1,-1,-1,-1 -"19960703093000",7.6015625,7.6796875,7.5390625,7.5703125,44243200 -"19960702093000",7.6484375,7.6640625,7.578125,7.6015625,38548800 -"19960701093000",7.515625,7.65625,7.5078125,7.644525,47859200 -"19960628093000",7.53125,7.5625,7.4453125,7.5078125,51960000 -"19960627093000",7.53125,7.5625,7.4375,7.4960875,77582400 -"19960626093000",7.6171875,7.625,7.4375,7.53125,71457600 -"19960625093000",7.765625,7.765625,7.5859375,7.625,41145600 -"19960624093000",7.75,7.8203125,7.6875,7.7578125,48102400 -"19960621093000",7.6484375,7.7578125,7.59375,7.7304625,56806400 -"19960620093000",7.625,7.6542875,7.4375,7.609375,102228800 -"19960619093000",7.65625,7.6953125,7.5859375,7.609375,73409600 -"19960618093000",7.78125,7.78125,7.625,7.6484375,74585600 -"19960617093000",7.6953125,7.8125,7.6484375,7.7890625,57499200 -"19960614093000",7.796875,7.8125,7.6796875,7.6875,55944000 -"19960613093000",7.8203125,7.8671875,7.734375,7.7890625,62577600 -"19960612093000",7.6796875,7.8359375,7.671875,7.8125,88844800 -"19960611093000",7.546875,7.703125,7.5390625,7.6328125,65259200 -"19960610093000",7.5625,7.578125,7.4980375,7.5390625,45819200 -"19960607093000",7.3515625,7.578125,7.3515625,7.578125,70198400 -"19960606093000",7.609375,7.6875,7.484375,7.488275,88136000 -"19960605093000",7.375,7.578125,7.3671875,7.5546875,50968000 -"19960604093000",7.4140625,7.4296875,7.265625,7.3671875,65854400 -"19960603093000",7.421875,7.46875,7.3828125,7.3984375,31684800 -"19960531093000",7.41015,7.4609375,7.375,7.421875,40259200 -"19960530093000",7.328125,7.390625,7.2890625,7.3828125,33824000 -"19960529093000",7.3359375,7.390625,7.2890625,7.3203125,33569600 -"19960528093000",7.421875,7.4453125,7.3203125,7.328125,43376000 -"19960527093000",-1,-1,-1,-1,-1 -"19960524093000",7.40625,7.4375,7.390625,7.40625,26443200 -"19960523093000",7.3046875,7.4453125,7.3046875,7.40625,51976000 -"19960522093000",7.1875,7.328125,7.1640625,7.3046875,45646400 -"19960521093000",7.296875,7.3046875,7.1953125,7.1953125,42113600 -"19960520093000",7.3359375,7.3671875,7.2890625,7.296875,38457600 -"19960517093000",7.3671875,7.375,7.2734375,7.3125,35392000 -"19960516093000",7.25,7.3359375,7.2265625,7.3203125,67092800 -"19960515093000",7.4375,7.484375,7.3359375,7.3515625,56323200 -"19960514093000",7.453125,7.5,7.3886625,7.4375,76832000 diff --git a/examples/data/s1045.ima b/examples/data/s1045.ima deleted file mode 100644 index 381754b95e146f8965a14f38d8fe895b2513333f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 131072 zcmeFa_j{FBw&(defe}1pgd~D8D1rh(WRMU!=bWQRCS!6kn4F`DHeejUIh9?mDp%c} zd#8J*yMO3s{+;=J_D1EZnd+{pdvEo%;GFl-(FyN)!~U+d_R2d+QjgRKq(&e$0;v&5 zjX-JyQX`NWfz$}3Mj$l;sS!wxKxzb1Baj+_)Cih1X3fA8iCXZq(&e$0;v&5jX-JyQX`NWfz$}3Mj$l;sS!wxKxzb1Baj+_ z)Ci_pS0vgUP@k1 z(x8XRWNGEecpQ4IC8;)P(o6hii zcee7RC*0l))H@*c+w-aed@ZsS$uKy*A3R^q>*}O$(uY^YaDII&IHZeq&eSZBNg&M zvnxCvw{-S+6pjUUvrlT=r2n$mMk&5~CM?QcEFp(1txbqY;cj zCKNycHc{y7?dpAe^_u;oWyqgN0 zq(NZ=Id*(xK})H}f5Zs1!c5E3SEWX{5{OWd5rgsVmH%nea4}6KsduNreh#nl+48_T zhwrl3_Z5!#S~z}l{!3qZ=$1p!05kcY$vMa3FPO=k;-eG4Nl`!;ihuZ15AZDofp(yz z+|B~iR^ZkZ37zpwgBL^PayqE!3F-n~aTZYDS2C0YEuk1Hki(Vi#eAY>Sj;i<0-kL+ z{!84?D`Bo^$uX*-fPw7YgL8JqH!wRH&u@HmwKKqjAk)aiTj+8LlHh?cMw@xEtxpe#%J8gD zut(UG2W`*_v@KufEd2wG^+B@aC5!MH5BBQI2*g_>b9}rE|L60a{)P^mabvP8naE z+e%)oNY*CndA|T(p7Fj_$ueSoi+Dd9)W_rBo5}lCd^0b|i1AQRe<;n_Lw{iOA9dnN zT66yXLCzE+3HtE6iR|H{JG7B{{CkW*_rP&!97->4HWctGf7Ghh#$*%QmSlUfmDlT&4Sco;S+F2khuq%H=WnoWOxEzpG-zNxpYKd| z@X2bZU@;Ull4JLSvWyezKkmi3J1`5pgcdjiI_uAswS_(wLsL-~Ot`|-pO{+kxT4u6IB>VWEdxjbvz6~g(wgQhnK zbVh;GT<}^CZo8BH$)V&h`0fM89elEx&)4F&TLa27*j6TclH+U#lfCS-k9XUkfR%9l z7Ct+c9Od`>p`VRmj#z|zHx4+ESwC6{Wn4vvK$*sxOQ6>j zg}Yt>`;KVZdf(dcziYs{3{LC8XlvW4|JNY#hqH}94o?Ny4RG>4@H+$tA4^UoZ}Wd2 z)bJ)qZU@=T?6Crlp25D`!1yG4yv2Xf-p#iS(7?8U|M5Tr`*`Q9(SX#L!Mrk#Z8YZ_ zz`3;v+M$oU0`l6F6-a|}Xl(=E`^dmLOg;YI5zy9d8Dzcr8?S(VIx~DvMz%LPo}PU@ zfc?T;KMaXKGHhd*yO+Rydji)V1=Taj#pF_Q9)u6W;kyG3?0^QgG25?XmS2D**bT;~ z*yF@AN|D<)fZ!26JB4hJCbmKq+rs>?8tF0#DNx5*M?iNqAl?(YYz+;hb4B_fGPu4q z9AhG~s%7vJ{Jr=8V(%~KHxD{~3pl?;nDGnYcfE8aAg_i4=&vc zFCP!sUrMfk{<(nSVdVH8B!F7oP7qbnufYaffjl_O9%tFkCl`{_%=ufOpuBbgF`Ty^-LEfKq77}B7zNP%@w#oNeBx$*ptq#-z`usR@j3PU7-MOR%#_c~%6CqU(YaoX zZGU9`7-aoS_7*XERi?ADM9knQ@qX-{#2bgAc$9nz z1>E8{Z$L47*#AAY%Rx`r&8H`s58g>`LpNukrbfSlUgDMLA2X2xLqNR%twk?oDKf!m zRY|ZEs=1S{++*tTrz2p_l)jzUkelXiWq^B6=1+4qV@6g9^ZiKpei}Ts0MDv_D;V*e zK_1JGr$F>D7##_?ivBe?|8DXC>~4V4PW(3O;nY)b_!Tfc2l|)6@h*So_*L`_?FZ9` z0sosExdDA*C;PsSJh%~bKz$0QIrd#BN2)o@rzg+|^bT%;!WN*B7)u_+JY_u4e4{Gt zf^6=pfUBRuyVT>)N5DBT9hu(_ZOQC9C4C{XKj!X~!1>zv)?M#n z&$FEZji{9!1`*LcANcfLC_oEfKl^Wlo6myYRo-jq%g6VbB`zaB)a14!1y1wHQ}DjT zzU!cXz3l&lPi{e9+Koq{hgF#WP9!|c_{ukJ;BE{chj<^o>=oyll z&ISBG$^;|+dsliA>NIR1Dz@)>@w&Uk_&9tr3lWl#0THOQp7{4Ec3P>Z%w1O=Fr zP=f5zTV>_YEIv0!F#nGu@Z!Gc%&1tK)d8vB0vga`W<1ZlO!M-}7^{JdopHQ{AaBHW zHN3x&vDRN}%;q#$TmwseG}6Q2XPelZ;PX4^b031v1k5FI`&>GD8WdMetq#T;O<5Eu#+n@t7HT6VjC2*jaNpB zC!q&af_Nt=pnLFFbc4!^x&E<8xsFiAi~Gn2-(1E;ZO^*AHp~I#a7lUKekEl&*w@4P z(}GN09OirDZ)R&PW0a4Bg<9S_&-n2mIB1=n*{t7IL2i@KgF-^gZ?-C;yQcoW&d-`4^NQ?ciH12pWbG>%30L-^#8qqELs6w zsyj%5`j_=KECJ_{+>x~+ov{0Qpb-q@j$c6=Sir1izG(IfN&sfn7BL!?;GaMNIdHwT z_*FUBMKF9fP{2d*euA`@3O?ZV z)8wnv@pV=Ws6jq??je+Z{ zKwLW@kGX6bk{}E8mq6|6056&^s5jQJR&XWreG%i)n^CDjqA!33N|5?``vx*BS<5j?H=dzSO>W>Ekx~5=N)Gi zeT@g8Mf1zd8=cI3nGKMMWs}ZbkLDg*^4S~6jZ!GT=L@9;lm%ob!}scaMa1m~Fca1x z4<_>8y1QOT%+c_Tz8z=O10ZNL=M>!KcAT-+kFzhx`8&+(diZa{cgN7e-@w9qi+7*G z!B6>r5?sXp5%{X(U4m*(aE!COR`2@=ygz6A4Aj2~zfo8GCi#}nex`}197}3&b0&ER z1w@~*`iL=Na}6#cao%G_I?1(dhZa{r)3c!UaolBP&~@7KJdpcr1?t+bwMYW1kY1E{ zKm}tlml=I5D7RwP?*cCr13(&|>=;bIgz+>=x!t9`j?k(Ow;N3?&tL2%^aS3VgF`qpN{QeF6{(bTT zsDB2+pFsy-Ll0jBx={0P+>{VX1Lqd`-?;HMHo5-{)b@xo=t(%pwXXpAQBZb0bN&$U z&jaPQNP*taetSF}Ly&GWp?9+yUJN_161#T+a(x&YaZ9{?)<$#)V`5&1{k2M<0`qCi z-&ziTyorUSZ(on?Eynx~D67RQbQ|A(&E4v@_|DAw}9@!gVF2BPb<^WxSFGbop z{RZzYgVkf+f6At`|1tSp@>B9#C_owT70I&M0I?7C>nAXd5?qxJHTnVz?48~mUu`fDcA#>F>_Q>Ru{O4W) zH11uCj313I)E>#-9KAoC%}yQGPg<{24(Cr}R$R=iISVSixNy z(Jlw|?)W?Ua;KBwe{0E~Z!NGJcRwDfZndrr<@ZDyJim`lc)rH64M5fz z<1xzDh1X{DTQO-S&j4(~saR4Q(cg^WZ-Q&=!>FIf{7durwBkSF`2yp;3Er`0XCKnt z+2MVVR9ZiQyDx#kA@+I%+7J2eH26ym%5{1DH%R**p@Asr<4o_be`E&uUD*8ZeDDnv zbdw_)OS%LFs^2;D$4t`wU@x`4$rWCJKBN=5-`r9)mp8*JGegV^n27wVM$&i2>gxgi z#ye|}V@m`2cA0uUADP_iNcg`951&=~Ex1d!p{X*B- z=MbOl;ZHqOTXQ#iE#oe%DIUrw*o7nmiPs-q=mw3i3uDuVZ=T0TCuF{oFArX~gNij$ zSZO zfA@k^{}KuP5H36!M*lkY-N*2&SvvQi1!eqi1Hymc`8S~bLy#H%<{|rj5oE(}*(*wj zFF^DH$2!3o%o^5js0Df&ypKSWTfx?u=@j($4l~nZq>Q@%UN-&C<{9ZD&=0g2TAhIe zDC3^Z3F(Rc-xDsFj0~BNZfLywd3;obSa=OoA3Nyi1?_;wXI7t8x@K=r2H_QKOF`WH zEc0>>A@>`gh&4eT?BLUrjPWCIx&=R<;CpNN+}9Y;H9r3$XaL6Twfgk?UIbI)IJcn) zJ@{V-e1A&*5O`eq{v-H*5%hVp0G=QLeqbLZ!xvDFv-v3yG)}CpZ*IW>aBa-~HU4;x zeXc-bA2auS8f1@AVX5T+RCuC8^WD1=7ZCti;sl3KRER!4TtkUR%eO_sPn(q%X!s>pPK>HD#_bo_%9cFT8h|8d6 z9{)#t@(EaK?L`mIuY+v=Dfy@5pOb&#`8WLPLuAS&w7Lh-h?4);;Qt{Mp|8<7|8}4c z^S^g;R6yJ-!{9)Gq0mj=gG|$RL|w$=3fT{>Im=%(?<^KLs}}^DhI|@57NdLGuRR7`OX^EqZjE{eO#mcfZe|m)}DJ z{|Rn?66O@?@i@x3*x&L>}{67Y?FN4c{j`%g`{|W?^7-|vkK^Nb{|6en6TnlIN ziqsuGMLH;X&T<9kxx$z$bc&;V!oF9Y(ZfEjDb|y1<-dN3n>@c2<_oKaS98CvD3AmG zo#1z^z+yCmO;ANT8bI#z0zWd&i0%;X^cCzpyEiE7+9Lh4xX&_V-%w`5`SAUE=D#&; zo8c!bHjJ!Wce4{-GD`mtob>PC;+u<%{#mHxZMe&5yV=_hLEtMe)+_&j?Gbo<431j# zzXJKl`#*rHw*A-066wb*u6z8#Xy0exeu+;`a)t-cjKBH_?6mUb;fLX9pYxe9z(@Q} z+Bn4Zo@0M4Ou65>ac78~Q0@k>-pM}Zh+p9-2a#4*rWl``%bZsV`g%TGTOt?zXA8Wd zF3^kT=i^ZYMb~k6t+^eu9L#}f7c3wBeSPruh`y+A27mRxtw`7NjJE!L`)|lUF*i?n zZuPD+!%0won~~Kca{(Og!tX}qjL$w|Ge)bYSAN%Dug({@i2s++(UD*|=utE`Ti8r`5&cC{!F|rFg?SikKZNey;hM}FbKW=i)cl_)ov!em zH3E78tR%9F%mQKp)r^K6g!}QTD-vNdpT_9d^N|r|p36k6{%p9v6?bU2WjnHGLG4y; z4!{zc7tps8$3}QVJKnrJ<0?max1F(!c^pPmPQqR0e#m21c15d8{5}lQ{d1^5nQtuk z30QrLT>qZu=-ZbPwEcgNc4rpnY4F(&N~by7O%Sq1$hpOQ@tYj+TlW2y|7Lk=IX>pK zabhLOr=Wj{>ruly0tM+gdWUO@mWcM^ajsGyz<%z>+T)wthyH?n!DGB@( zW>%J*u5V>Gqjv*t{)q9v#Q2(NwH^&>9V2@hiimMvqj&mrjrA*+?}OFny#GFI;{Oe= ze#55U=O;|8k8FrZK)T&T&o#x(@5xcnlMc}UnU^jYm+jG$e%^V%Z?5H28sXwxy zX*(+R-v&yd$3ruxhHV7wOH>k-&?6=MC}x~sP(IfX%QZR z0vebnwt?D3_IwD^dULhlKL-V4gLiq>i)Z9U&F(w!H_9XDYWe?~Zy$lsX{cyDJhzH# zPzqcJC96R^?)&VmrSM&#DKmr~aAfno^gce|*Jgg3i*}iPJ@aj@PkOK}z|0^uJ}m_^ zR`eA{dqM4BD`%X8$D;BSwsrvB*7os2=dFGSb3@;R5et^->J zug&is0{t&y^tZu(cHr2@XsLUdlWTncOz^K9WaMr#zFJq&4`**4YxJZICF?CH;8U~!Ex(Uho9?Uk=SxtOo(@8H%b9}~^Iy)r3TkTiMj1WAZ`fCx z;u9qNV`c}XfU`j3Y^3g~u3&WdU4D0vt3JgQzxxb->ktn>C0d2rh0Ygxj2qB;#)7{! zfcBF&H#8rea2pb_8~8gjH04J=a%>D37en2yucwzU8(MFVB@RxbMxdn^|R=S-_2N_WZ&D+%cH>WM*cnlpZCFEU(m0?U&-*4 zBiQxlBFH@8osoP!h;MUdv-6e&pQG7Z)_(2;r|V$s@1vLSCn)Jx98u5SeU2SxBm0P) z;_9pt{g!XO#*@LvnSj$#YY_lASJF|d53WG{H5Z}1NJ zS%1c;={`DgU&Gj3Z%LnDtm2GaS?dhzZ+OCN)wS-}TD zMSRrZjxztO=Bg$lmG*N)GYNhS+Jai3Ui}Z@>WF`1Mu`;!<`nB)_<-v=!BOlRVHWXq zj%j3YGw2%!(3UYrYzrEP_|HTCABNm7gdg(p097+P<`W~E3HBNIMXI5Truygs=Z}QC z`*Lrhuh*w1x{fQVBp1bMNI$vMgH$){?!X} zjJ@Rl-@*4^aXuqQ@346t(vMokHGXeK+AYwQHq1xSXRRkn+wc@uW=5c0B2Mtmc+df8 zOuv9$tp+rJI#BKzG$T97c4O9G3B8O*Bh2T0Q_Ka56|GfZZ#TT+Ap1*@0~Mfd?S3f~ zZynzhxNH^pH-NE~v{CAtPorgTez&pvt$b_D|0K9wcqY5m;?%y+Ln$X1&rOWje)iC2 zdmL~#W78O)xm-U&3-3W27dWDwJNJY0U1Wv+Sbev#2FN;4HFSGJNr_ekd=zZOFZs2R zemjS$9f<$?;BP!xALNyweLRJpVwA`Z5&Efaa}Q=Mnu8eaROs71$JZXq&H-;S zDtcX`)pVY5vNpq-z5R@a@jba*z3K+M`#H#d3)0s>(0)DU-t2%{&ISC<&NG`!e~%RK z8{RAHwZ?WMch&N=#icW`)=z&KZdGSAr&Oe!Z;S$KPdwngp8hDCtP)oWnFsucz0_3o z8$As4WESdmzBixrU4CJgDeDBK8M_2%0qV6hH`xl*jp%#B;Rs_sBaw%$BRG!nn8cWM zL}oTU4bXg!OpqT0kM{v>*Uak8ebqtdag{ySSQw7gNv2)zBk zjOBa$Xpiat)3f&pXTQViSPN|BXPncOM`|TfhMp#?1!5fH0mt>1Px#b4Kx+bHl)_km zT|x9tJmk1;>W;>b)n8*K(N4I%4nEfp>byUk5gW>9Q~2Kj?#XX*>~BoJ3mk6O?J6ii zug~D13DoeunosS#KOQa1Ob@%PFXVpL!I|dn*rUq|oBQBwh2`ZSbJYfwyvklP|IFU{ z78z^bg_H1-GpZ5b80QsxbMu{%A8@=+LD8D;>(I)6IBq?2ig`s!WwkXkir?j|Y7AO= z#+Jobjb4jRz0rCuGrsI0qwb)u*Lon4H(yL??_6|->of{&<$zbqD*eq4)PJGo@Q8DI0!U7PT+2zj!J0PwY5vQH)n$ym97(v{REFa%XpK`Qwa^ z^Sc?{T}s5-r~yScIS3y2B}mTAib$yT!H(e?x-zd^wJ2W zI>t#}-3j=A27Rj)*eSrfKY;G)%Ax8d!sepLHfSw)q_9PZ-Hlg4;bqY>qI_deV*JJANdW z@G`<|lvuw}BiBo1u@=n#Mx}2vLl}=XCaI=i7ZPI?J9s|Dw@Rju`F{%RU0Fc---Got zomszz%^6euzY7}Cax{Q!c*k17rt@%pL{~qtD`Oe@Yx5A!ktjBFp~jGo0h#8V)z7s%Of2b#|uB)_YR)r1+qJ{W_L|I--9 zbaxIsz&zLLf0{a+gdJbxV7-i+EsH_HjDpBIPPP{ zUzw_}J#I$bZX?N!@>-LxmtQUM>K`R+%>Qt1Rytd$bD3iu=1j(vm_V8@=icx?HupSAAR59=OV5BB77w7|QIzHfTX!~i*U;26~kzUe* zt7n!43K)RaZv}^48tt2VH1LOBe|;@VYI7wH@ya|ZJv`AG(=TIJmz&^l4mvS^-<%%5 zH81BFqZ#!x{rdXlou5B|T4GgZ^uQeo_EyvprK0;_d52@F8z^mluI4j$(>lT!365tq z$H?qIEzijP$|QAE>%a6?s!?3wPkU6~g>#z`KYu9|=-o1gsnoi~9wKi&>uxAzAtO`G zsJR-s-rz2bnrl{6qdzG-o5nigov~QEApPy!Qwi#w@cS9nEalGh{aX1GJM_91gP83J z-tYsA*cJYah^v=hLYG$m`wA5Gx@z^s%n4_SV~ptyv~_i^n5pF~q69HQ6mve5(AH|H zS-b@=T6Y&aHCz3sCawh+GsLX?RnIWT-+FzuLL+q18)XbipPiEGB_}E8J_(lTKdifk$$uZ^$Xc0%)AgQg64p_YXua7xSF6HqQ^lMBZBno ziyqh%9(L>P93;N{Zf~nJ=-BlZtNE+MA{dTLGt18|%1VBvvm?-Gi&CQ9oCNVT5BzOT=Wmw`N^8h*uBa5U*Ej=tMP3?+g!tJdjvTnO4s1~ zC?~Yh%?CEFW4(_0TBJ(jL3Z{OPqlx2#MX`K<&V~-@g;3LQVgk@&}s>*nHq8zki;cvX+AvA*N{ z%D9QWKCIyX5FABE$!p(k{kO*4e73gVu6)PY`wcuSn>ezzhLmC+rny0%aSpQqt^L$@ ze+BfNt9VVR>4svbN8K2nkN~?JQT+@+fvxA*ct9Wh-j{>OG6?a`>s+_J92#wZ zd-oaf*}zCey(m^~y$yab&(qa)jHQ@$tL0^Gt(y9kXZRmve$Z~b1PAFIx)Ufv>WO)K zdWp=@`GD;%SS$VY_pgS^jzB@m88ts=ljtYXtDu~*Bj_0@I&WxLDPnN?+{TR(({v#c#b?x0;B)#!$yIW+3d(swEAB?q~uEV94AN3zI<@A_e zU@Xk?J^^p4BYh1=-exql-p$35`_<&_u3q)=Fd;7PU@B1DonVoYFq@(t= z8}8TFq@Azy_ZL=iY4e#esE2T!X#d$O@^+Xv z{H0f_N7*_wBZPV)^j+%9mKx0zd>e|s%Wp1nuD5t+_38?=y^>w4{EZ-V3T& z1pjnkG@F72=!#}`ZSDf~_JS7d<(LWn#(`pArvZWgU0X}r$d$9y0%E_`vq(+fp9ewx zu%Cgaog1Q$$Qr=dkJm~XyEQqsQ8zT^uS9oc7p=v6{L=9jKY4C@u)ob9cYbz;c4arK zJIp6EL*NT2N#Ct}YkbLG@yZ=N21cCJPW9b7Cm9WlmY>?68Aj%VX(QNo^d`r-4E9C@ zrBG-3J6zixHmg;X4KXk99gb=avsbtSPxut%zBvH)ys2ZRbiE*Z+7}~3^$Gp*AFjHa zfz0m$`jxzny?hF|7uVh#4ENWd|4oFdU7y1)X?lR(W*i)`nB{+fSNeWM#2)Rjr>3*9 za#-JuGS(_f<0$rCaOQVKr)baF`_Xu;8oQo&<3gL@|Bal>9?*6NHvh|>y+8MTv5SCn zzr7&!@|sWV@$4XE=TIeiv=GfI(eGmxTGTY`5~v+vS8;6$y9dTTQhFfna(70T^c=s- zJM#+dHXD1)$2r6N<~3-5R)BXy()VYSs-Xn?!K?)PF2OGR<*yLn>Z?ZjUFT>36x$UI zz_rl(L(fKj2k=S>VBc;jdj+!G%sIPm+rvYNaFEwVZ_TT}$hU8To^gHUzO#eUKrfup zb#rZEd{BK}yYGF**t#I+aWyw*^X+JxuKVaOjm<^RpZJ==siaZ&dyn&~#f!h)+^zpt zvMWvAvQNU%8v_KC7@m==ZI2b{s;EU(_@%oL@8{v~r!{LYn# z))4ovg>US4*azfYzj!Ed(WS`JcKnq$0S|!ryvBO7xr2esW7%AJTRzjL={k({U~k-S z4tEthcH1e%xX2AKI|BNfLFoouW8V%lzwMl5tac0ADy-qv$OCPw=!JU>cWQ4(UX}-~ zuF_UJ#Hhx|n(O*XH~QH+_Rapu5kCu?+Iwng3iqOMO^s^D8RfQJNfp3l3jzfo+!5~G%Z3NuMem; zuF7RToq66`Xz##Pj;KD@w;4IBVK=hbGiMn%nw4+1_X99Ax@N4svFEE&Up+w!&X}^k z1vBqrrv`O$XLhr)^$_Yiwv*E>j-YmCrM6MN*u6uP<#7FwdIsfa@i)#BV-oSTT8ME! zXBBe_W85l6DvSrXZkQ3ExC)Wfs$QY(XI~hvO&fT1;QtE7P9I_S(ULO6aH^1e6J&@AXNjjOMZ1pl}as})_w#A5Z9m{`djS7(T|-PYwCXAk=( zIZB&}hpptDp5mCBb)8pcRaxhyofubi6n*zui(te?OS=Iiv6!gg`_dh|d8y(Pd z81u12Uu*w7JZk?A<2iaEjS3ivH2$Q&SKoqqqtU6@DLQhq`5|U6dGzSFx(8(%pE}Hy zD222l)%mS&KX(;)({(M zjQPVc3qX4KGW;^m^j|^+_6adIA*Fgh_WZR*Sv%CqmDrK|B4@X@MQ%4H=Lpvrn8Z~+jIC(NH`dZ=(}}*L zYX4oUf+CISV^{YxYV;0AmpiT6js09A=4xT?A3MQo=}93d(CJ%YWoTv)1>Uy)+pNex zxsBaeK@{_b^a&|v^vtPlVMJq?_8m3f; za~^PQDD{0&|JlPAtB9lpbwa%kc8AcKjJ;nX!p=0YAD9uK*b~l9<@Oej(ZCBxic6gF zDA&}0E-U)08G%LUev{Gus~J7M?P-iW30e$MPFn;Mv`lrE4!^45c9^!q5i`-H#p13ygoI3Er6KWp*?8C z=|RvNj&gKseAVZqIOBuP0D7w8N@K&&m z55MS}FJg?}tdN+2A9-Gl-He{b+_J|1^1oR<#*y^!K7fAA7kQ5(Su+$@mXl&#_c!{L zt?p}#8>-=(^P}DwH3X%Aet+|o4u#pj0X}d&G5f}6IDI<9>=7WwrmpY;tApo;sj+S}YeWp(U+Fc&&e3v#WVxE^=pD?PP( z-{mwpOD~C4c~Z=*kVD`aD^_!=y%|SU>dI^8Yd9Y}{&rmuef_fb3^Fsr+1VT&=Wcy{ z`fb$doawC@GDBPY(CSdVO81aMdV%#6*mK@UwUH=kPY&0@jFe#P&`q1(&OcUsy6U)< zEP5lO7x*T0x{W)w%gq|3z)D8M3NY7%=?30*#+u4LyLqkcHx$YF%lG~`KiR#?T=fy$ zo2y?=;C|%)8s;$L|JBg;Soqys9INo0|5x&E8+%&;uo;fFCN6gQ*IR4EELKTHZ;pLB z?3}k8YS1qrt!T9w6>#-VQHnl5wQnJT*>%)~jZt9uN_0B+A_x6+Vo}@q5oYWsJofx??EBrLqZs(`j z+=)GI7cwdp@QUmIRDpFNlyRKTJM!AdS&oC-1RkBBVQs!)%<1~P=0LeE0!o z8eTI4dasgNRQ){tfuTRI*-oK7#j20eXT-BIXv6tMZ6%eCn^1c*a|Ss9s?$4Rr!wv>H-No-7yH0pu!LOBoxzc(EU#YqdMtZ$LeZ`6hM=5*PjGKYRD}C7Ul2(X|6Ztov}?2Q@Wy z_9!W0H-S$A>QVat>71{gr`+~;$`Uu_iSvswJtcsZ{Cf74L23a}d)4}|W?jmbLZvsY z1Lc)ggLa)Bzu9cAelv}^-yHwWXiN5iD&gMuu}3MkUjT+C{n!`-`TvlfuHpyTT-YA(F!H}KtDwxwZqG+HzlZkZlFS;o61jE)_< zVnuz#-`9F_qnuWo*9-R$-dA4}#pnSv(3X_=ZRS)R*JO5!Vyj}HdaygLozf4-)|#*+OM!9^t_cZKZ_I`#a*;Q3dBm_3hr|N-%jS<=dmr| zE;lkJ+EQl2n%k%3T*dd}(H^Gre}4gm(POhVV$PO0=}Az} zHupyD-Id^ChhV*oaelB`R}Wv*_0;_2d%b;X{4p!o+ygmWbfv7=%P(@U86jpD*!S6* zbaVKl?JpHbCtHzEi=kfg9HRuV=5#5N%b0{~S(w?ig!il1=5t?VaK5WwnK847``C*P z-Hg}9Q3@Lew~74kj_+a@vhyNiGa0R>MX>yeSGFFYd0#t37JM0avouICug{1GzZg6&hQ3w3FLR|iLeJ?$6G0)1lo>gAa zha2O0(caV7>t;r`G5vSBc5{=}N1Sui;;c>ZtkQ!tX6!(}t`ra@fLgy@2+TIqv*XOZ zJYZ~}GCy0#w|1>lo+OqbIKYSj#bwa}+zI)dk7WbY}lZr#+$T>7`gFA8v`f_J z#ov`j0}}II2|3x`ffeH*8RBZYXSG1$6P<3^Xx(< z*dcu^w9zy&zyDN1RlotKkhPZ?o!KDR8Qk-c16`O4%x^L~P#Q2RL@Joh{_@6Z#&8aN zZmzJ18wa&Bcpo;YpcZ>+DWkmhnI84Cw=Kq8i~);?TDDqRWB(Yv1E)dv{h;l|?vIUj ze)RI&Q_!`6)jxLe-`s68QjAcEr+!+ygPDaW)kWmp+itbym)XD0Sxg%y&ItOf;wvfA z^(l;Bx=NK?KO5|w>Bewhd2o7H=0?4|133Q~u454VUj=UrZbG(SBMtOJ_F12C7cQC4 zU8Um#Ov9GV0?$6&r)zxn;+0-uu^j;~EM;WoKnW8-xd!ab7_n1~K0~E|G&7X%^%gmc z%8_wy)>5`pu=U(_inmXYUN>j`#+aPFeasjX`)K8>>x;d9zF0#V>$L63wFmmKpR}Fl zTv^oBDCF!IrHC~iKI^kGf5QwFwZQ0yRtBk$h<>c^Qbxp%Z|kA(dCYoKpn!SY%}CH! z=68ZK?2OS7e$c16BzRG4(UYnh2ek?P9|%Slm_zTucX|NY5)*c_`)2{P?%FTSp>@}F z&*!s3s9c+H8uG3VnNW*N90zBZGitvWv!4psyP8k!6V-^n9vFQvW)T`Ojw>+73;^qk zl+ex)qVI|@QPa12E5`7pfKQndVwJF!WzOP8kkuyD<9C31!?U^E4t{3rcuvo{1<7E~ zF)cum7JsFK8iQ4gv0s&zfn6<>8qqFr-KWXSd#(c93*HxfR{+wqwA*V$zcHTQSnnAv zgc!Y#U1;Kw?L(|5%3LB>om$5$DM8In`ZKf8KlRq=`Hg-a^^fQe7I$Tn-bwS&^$Bg@ zSj*7@mNE-W=HBe|(i#5fz$`Z%ygM^?((FViqLBAZarVz;ZaWA+n!U9Zp0<{~1swkx zf34Yk?RrHDjP2E1N~2A8-o@g9gIdAs0Z}sD9#u499u0*Z9y!IpxDXh zZKzF+?QlTfPLguHI^az-`dHm-&Q7fNwQsXoyRkmJvGat!M`wH2=hRkHfA^IU3g5e8 zmlnMJs$8Qac5zkP(7I3qHU4;ndyg>z<&V`Q`iji>FnZ;Ylwa%kZ@zCO6p+mbVdIu&2{+|F1)FCAYvkhRZ%p)8dB!DBij9GFCXsi$T+coeS2smR~>tPnB z(N7&t>Tft}Z`OLU;wCn6v z>^!0G*Z6=rM^QgC!z)sSwugBNF}CIW(HPy(8#I=CD&XGDm!HM`^kqI=!Y?-Qc~+2i zeVZWu*=RSe!D-dq6nNL!zZK7}?%DzhXbWw->YutmIh<`j*c>>(trUqjk@?ZyXNwr2 zg}fRM*AIgm?2p$QdEkoB#(-xa3zmSF8Dw_WQIenHwQ^ev+Q_c`*sbsV5*^P~;N(*? zyj;m4R{QBOjJ{oMG-HddHEmDAY3L++ob@)kDyx|)_Ni`+`N-w+xH(v^m<8Yrpnjq5pdPsk3LXXCu7y#?Jt}Ej^KliwUB>8i0{>dZrs+M(;d-n3c5_eT zKsI5vZ_OOvo>@*gpUJcR-|hadCEz+>+J)vlDE*C!iLF^7MtbHjQ`YmH{zH2sj0xIP zJ)<)o8rgufv?joQ4mTM8##pR5KUQtoMdk~1ygO+0u}ioDPXBKXS7%SK4zB2m{ROPCeB6;^f|;_0CSn_4q`2nw4;^a z`aerJgZZ-goM$25G=P3FcXN)rc1@%)P<>Ne1Goq1sTZvTA3fKvLdzY%-_AhF`V5}U zX^wNgT0nc`Lpr=a2<{%rR>v==LIDdwLyyTE=7UOLX0*H1q0V5u};D0 zMD#jFn=X1B^)$w+fkp`sbv^Od6QSO3j3VOiF{B!zGGn!#GiM>=_9K~A zF+N4`&OpYhsXaP@(u5$pXEJAZfcHBi=`)zyJA-t0wr*j|4jQ1{?W755!OkcB84Y<{ zbj=`+-9eWldtEEp{upK8GB()Hi@{3`+g=N1x6 zBX}`pU{0B{w7wi;b8#h(8qQJzow*{}KxU&sP~L3lOi!@UK6{4B;Zbs^+egIBKZ|l8 z&L%M*NG;?#)MrMDRh~-!Sn;und(iXK6Kb9h{wt9*W_{_osAH@KFp5=84ScRwpS3>P zxnXu|5%Ry)?d1AwFjn5{>&`Oz)`H@aGeCZ;SS;Z zYGj1bL+wEOfav#+tAE7$TciE4!typF?`q4@FJlZqp0)B@ZZu{r1<2LLot87_tB)In zZ-bW7GFYXq$&m?HPJ%xhGYw-FcjS9zh}xgCzZr{-T?%5(p)$$bvDkIce5aTbq$hAb zcUZ=(SIw~(qg^h;*2zQmT;OPxjL%>wujzSyCD_5-&k`^i0sUsd_jda>r$rs#K5*r{ z@5&t(f^`}HUHdhcJzFCM?0=!1HxO+N9?GYZFFqu+N)0+BlGRG)6)RT9}K$yBdjh znY*=nZqr@=y)SpP2<&R%;>y71cDBt0|7^Iw3K?ggvwU9nXAdi#rHcYa+BHz^e__OL zD8IK_a88f_+Rj$Uxqo$_0lNrnU`!7&w&LqdZeK6Evsul10nU{3_2W5v8yz%PK%~qO zH9N?)Wp==MGm$N>NpH`U=E+OJLT!$%qR+Y`a;bMf$*Kb>$UHDBMnvB@u&aTab7J=? z>$_cb%C3S|BT8@jp^X#juU1>xfu=VTvZI*+k$8%Dbv^z9d6zks2Pi@gGk zz^sO@Mu$1WJn}&xwv;hF48r>2oj2opUC#Q~;5jX?h=0`c#NJK6fZBrk;!)^o3h34% zRqV2v4*ot~4d}NCSJaKGmjAcI|JwI@dz|%u?iAt-e~aTiMBmh_V6~DGB1#JTdsxL9 zrT;Fte=*1F&G-~T&Gp>jT<*-dZ7o!^7rtl>jSpjln%+Zur6*E*4%lTent4!i7x*a+ zTIj_H4+&gd$7m1Yex2{_2RNBejSo9V^x!kI1Z&x&BGAhOs7Vj3HIn0y9?l?I0_9N0 zJVrI@Z!sGvuIr<%ryqC^c)6Ls)5!UDin8|K)!{CI%Tln2F@_vw{MSML75EyYSTJ33eqsAZv_A=(A8+sq+wHFrc$kUiZ7fUb4^{key+ zXfso})3Je~CWf&Z&b>FqM_0zHBPi?H%48PPbDzeDy3(UvK<)oHjuEeg!|iFK*Wc)W zT>nD*SKc<>FD5;ppT-$7t`abX&r8Er0A0zM%N#5bdZ@>iQ@cZpXC<8N8JkkYmE%HcZq(APF(p=WSVObNmDWVC(iSB5p^v< zySwX4G|x!e&#VMBMDqsC5mLw0_SXx%fHA1z9(pqxN;vajN3d;WKC<4g1NS(XJ8y~) zx%_pu493p2z18V^gqeN>_hi(+9^GvQbKEHI*y!(Iq=k7>6G1)3`up)|HGjPsgRcB~ z5H@)9z`IsfJ^N{)xq_(Nna^lV;|NB48mld|0JX9s|2qd*gJtHn_Mv^foSQd+gA`WG zb0*hnOw!Hkk2Aks$_&2i5hRV-$F5Ci-GF(f_MNbcoBh6{7eQ~Y(x@>nL7%YbTe)Da z^BU&)x$uUwUkNnOpS#rJG0STmM?A{7q#-qHpvb1R;zJ{?W+0i}dcZ+1qe;1@xiPL% zsC)t2EU;47axLg#;4dGP@k(#2J+IUbYe3(AH|59|oPmvXiJ#?8|@Aw2uFCWtr7XZF_viWDr0?1pdV-XQP6k+6qOzDuLwHeK)%_7 z1#uMmXvr0r71I>`{*r1Z?yNW5GMq8X4%l>rx9kX5!Dmz9VzayT9=0PJ)|)&jAX`Z z8r`1%l5px6_+=DhTn|@TwWxG$!yWemvvKgjaz;Xbeic$7t`(vLNM~=eyod9;++~hV1yOA95F{$2>4CaC3BL zGrk$%ZBB})x8mxY^R2y79~}-39m3~IgZ9u_HI%ysY@_#H&B8o&vjCjc%?*oHN*j2u zmZ&|du4h*87CtjqAd@iSu=T4v_C zkAA9OI9$*Ec<{5!L0d*&E^NU*J^0Kn2!r_>!HgjK-5Dc&9ytv&Qj`q zExD4`oY8e^3ZMX`Qlm#=6kNXzK8?1Yl3#?iIgIlv`D5l+W4@369(xbOS~fL+<;W*j z_R*v4XqXA#7g}C}^tg=vxQtP2!RN*wnx^jeGevZSlZG<>*2paly1rE$t_5Xxt4hYV znvp0%{@EW+UyJL**(YuWIQM5W-tYI>9Lbrum`~IY<}!{8gQlPtsW-T{fKDo*omL=d zhM9SE<`T|B+Kz)xDv&cnp`9g+uszo8O5X~pZw``_=@FV?_nDn!eu@&Ml3(S(`7NOb z*Rjmxs>dN!;(D!d)f#pC==G0&9^(md1*@3v7kve;@Ua#8GlDgq`?fzub)c^{(AXH} zg{|Q4iewWwpO)Wn&i*_+a*^YknAP-$?B~@oi zaUL_!%^@|*!1%J6#{D>Fhd_aPeO?3acKkMn^Q)WofKs&o+H>3tex(Oc8KNIB_I}aQ zh}|aT{+RP)m8cP-STX8<^I&Fk^+PzWzU?|jri?4gVHRA+vGf(L87HF$@~Ep}Rq@#b zsAF2NAg3^PqZrZt%>L~`x*K>70lkD{N=ME$%J2@nR+BK>G-~nom$#?HHh51QGU5MM zpc3iDOqDb!z!|!LBNwq55t5Evji&)_HRsdpLNPvp&1Rjk9tG=!WA{1h0b-4k^Mg5` z3%Ea{Ay%@D;5r9z^wu149@fG|e!UOLl*N7M5o!v3-u^ZMO=kp$B89DsS&de?HHm#XpBLtl}PwLuggRm}0C0((W@RVC9+Fo3R!|ZE<_hLMB1iR=Y{H>b>^)$wE@C zg!k=Myo)Pu&v~qOX*!kuf1L`n`bL4LnH*+OtpU9OVCotXofy-W@ZM`+QwN$$7~c#e zzS(!fkhW%d)v|9kXgD@@MUN3-tA^*ZpPr!MjNEue)YYXYF`}=5eM_FzC|-TW)2*Px z0i1a=7`+JvW$=A>_HN)zrO=5MW~;#cYJ}P_71cMKyn3T~<6*Jh4r3Fa|6){0F) zqRc}FT*UF@rjb0?Gef+}UKs&<{myN`)T}cR?ZVjx@*DHJCUb@se42)AnTi%s4c(Y~ zq!#cRpX#+v2lYJAH!r;--{=i6l3|UC>oF__e=87U1(Nk&`kt-!P~%reFe^o`uURE# zFHVGZ)K+_N6ltmiT37`ASf92NPeC1{&=yHn!5N>oM^7l-+1z@^1~_9sJlh7o?$6l1 z0$#1bbtALjF>o~>+|_~RfT}Zqm66?{igfnXs?;ust4G>BK%iILGT3N1_st0suH`>0uHruu}*CN$8WB9ErF&JTJ4>Er4FEnv^&H`3|So!JvrY|7Y0_k%$$72mLZ8rBanrp5La?hUbx!lDxe&JeFb}rb=_2)o+ z1$^EVdVK!9^yw^`kGvCcvnfY0rfKj(4%}}=U`H@shXs6wF|i(INRY4AL_2fTB6nkj zh*?5P4ObD@Ll`qeX9ay=0b^``wDzDmisM;HkPh7#Jt~5iE5KnJ7!BgnwtQ<`!PwMb zj$>~$ z=OZ|x6lY|q5IUer2RZ?}3@bHPFL$a(zB0_P3F5%`@x{ zw;SbA*7O76j-cIzD~cAWv6%v>!VbKxpaHX3v?lUENb6%Nh`N69LJ+U#9$epSAm>hfEs+UI zg?3zRUvRcIF|K4{pT5_jZhIRkN%UKf=G!q`*(A<2C0w7^X6C9=Z!9ujJJ`-OyLmMg zy0d3uE%-N;6<+@>G-`jFGWf+V07~ADjBY1TFh)0?G0s9#zZFn1BWO$*!69KT)@pJ# zcNJ;<$4Y_GjPXoxw^C>cxSL5BV~kd1zrpw#ZMIj06(ai?_nBbT0h}|yGN0FjK{Ny8 z^#P@UWG3gZM~&SHD!5X;PaUBbJqWMzyIekv85`nrGjIJD-jBYhwsdW)YL1l8 zo_dyJd{aGP9;n;v#V!xE(E3o$Zyy5J0Ms8okKeU}8Y{SN{edsW!%h$NaPA03s|#Bh z)V~=1-^M6d8$1%ZIEQhx{?mAm{ZX;`3y@B}Ev4vK2zlfc6G zN`Fw00<_A^yqJ#MHH)}`{rYmwbdG3dnN(25QKhE-yl%%8r18BOs6(Kyf$VMX0sX&v z1+)Z>7A66CJ%&n-p6u^64Gq__0=c8VcQUeF8koUV)pG1o?(!fRUUs0}4_!JFdAwro z(!SqKug>dVN3TYP$8q=O`c%PZHN3O`*CfU$4X&!jcHYZA#_+~4*UksMUT|j)dph4* zCFp8mcE+$O++Vwo^KJC4npbDGfOYn6D?mYQUCn$FRHp^*TI726da!ToDm4SF(~$8k z;CB14>G_XUO6H?>2WeMkF6O&e;rwP?sksB~_|(;!M?$Z$hGP+Qx0q{>u}ZbrVeob_ zSGhlAAljj3E7z*u*_@a0j6+k+_4)fLpcB~5gd@#`i&>Cn!NrxL%oI!Dq%CmBd_GmD z8V<6v;6rV8y(7-R!=arC{CaedBiaZvcs(3?uv>;1{29=QdSL9WXr6|(yDQkw6?UyV zG}0tL7a--$IMeDF&im$|Doym_2&L@Tff*^EJxchzCn(oLGZ|csdE)Jm60T$(eL;5i z(gGP8jx~$taa_9&?d z=xul1SmkeT_T}^0;H`w4!e_>i$8%3+AM4}V$Nd|xvdiOmwt@VAaUPi< zrSE((V>6hsaiswJfSBQ9CTs^rxPjWOj~J&R@MtggpT#(98+AuA=P;r(8DX`5y+meI zYK_|=q85rWf7HCep5Rl*ceB`MF%;mc0eT+I4JhQ>Jb2iwpCahQb*fAGr5;DUK1zQ3 z5#;gT&J^|~C}V$pLCv66bN0%i8uJg#RveF{asJYNH}`QY=&Oy|w{{4>sYD~VK$Oqb zh7O^V^y4nm*w=_>)9dW|Z==;5WTgF)8o<>0H<6dm${3aYjGi`_RWKjoty#w&`i#f2 z?@;zMQdGt7&7svZtQU4J-`PiN4EQVmjk1>n$=)p-Qw|ox3>5K z+ky3VyulCQmbIX2uZQt`mV@NYWW3c1hx4Z=-tH{&nVdEOZnTcdKKl907shXMkso83 zYpm}a&AH7KQ19=~x90ro@v&aTzCu=>h^Z?u7D55q|H=yewX=~mebD-}0GmNOF@w$C z0LqvpP?zxs*KRN7D(3TvoxNxB+YGM#6uzw+Jn!Xx#&hvry8h3x{ad~% z0v%W3+y)|(8PN>JUmMIiF?&KZ;~*Uv)doh(4&7JLlpUvGjHFfKYIRl)C}Hgkq*r|c zlGhGBcI_}ayMS-aEiB=1U8_h|})S*o1NK~B5S8I+A+VtdDm|A;^j7xr^)5YGayh)HP6vkp|B?0?H@^&9?j%aV)KZOum~Hw2E;YOYejJ9wUFw zR_2!~MRpQ*dcwVo;VgO$OQ4d8TvuVx0$w!yYtZ~YO@0TiTNx2+e60l@0V3jWRHh9> z(gDtz47T=mFe_*UBW+f%@jjy~#`mlSU&Uz0iXbUq6!wH1YyU7aL(MgJ#ZkKqsPU`M z8T&K(YsJm(P`$SYS#71Yn!eR3&i=**-Aj+N9fzG^tWGx~Xf|L6EJt(J#z1>Z!gr%M zzm}-}zDfMTwU38EN5h!Ke#1Prj&nET?xel(-0$-k<^Nk~S^S?SzlSG|G4A$uS-^-* zV8oQpX58j6POrgb_JA1(58K~wGUH}m=vd_ZG{)Dcpf;WBW;)l}MLR}+jVTz-uV(AT zYgZjE54aoE@#uP-3y=!-kzY;B$yK}8f|HbCo|1Zk-HGfqTgg@fC7JOt8cdxv%rSo* zDbchR|Mq=q(Ci;4 ze@K49!rvQaZ|mf&hj!GptD}F_ENp9W)CxtzO08n3!C0T!7qj8K=+P5@GXbrvGsC8m zIlVGS0egrWYqVcf3A&z9U8_l~C9%(ltE`O2BD(}lj)$++3ydDe6}XKsS&M8uNBd$T zC|h%^j%uD@PM}Wfn9S@kv)6t^()1vXqWx#h>K&xr1t_(eU!_BHdc1T0_ThT&_N+jg zdk=~DTd3d&$j8X7(Q$n*_F%9hjvjb5tv0;!(E>U!gV)~wF>lJAaCQu^s#5FD3=k>9 zxx~)#W*LnF2lK4uV`F@xp9>GRLc_5Bz}k@EXy<4Cs9_lMvHGHlU(|rF@xP(qYbQ`E zj;%1!Z(!D9hak(XS{Tcj#&B-eF`5(3X&(9{Xn7SYOni#pcTBi`b4RTHdU1Tc0lYtZ z8p4eJKD}7Kqa))Pykc5TcG6YG>$%hGsy?0$kF|hDjgOgsX(#M{jI&u+_Kt|1VVA)7 zuCNp>L8bHzWP^P|r2x6jyuMtHXjfJHkZ41i6KbaaYw-UFFtXSFR(>nqR(|RaG{?xw z5_8axjz7;| zcJH47{J(tDk?}eN=YPiv%w}U9K*O_V!v^#@{XEXEMqccO;pTc+?ckT5NQS;3s%97S zFK5AR_60SL)X4vHpbF!BR{U9CClbbPmG@?JKP~z%~H8)ggU<4>?f?8p& z6*WElIo?`+)`P46Sre{gP*Q7siD5Yym}zf+QTqg$#b-{i@jH74M4O-v`D5S4bzs-% zCveuc8;_MGW*LtIXFWju*wpQv+3T61y7Fvgi`s~`$Sg1)z`m>a>xrfNHCoOJq>j~z zY7Z}}*54=;iWrScaE0qGea<{^8O_V6oE{uAeysQ~7h6g&irWs3&EcK>;_4XFSovr6 zwYk@3e5(0L18N0IXtTn79)c9Hi>H2NvpI7E_nXCSU9w#xM9)4C13=3vzReun`~p|0 zb`}tSv$D+OvscY9KGoZ&mv0DkHW51N2CwUfG`e6-^5n3WeIlGAj$rAW;3(#m_2RfM zuGZg(e*rf8U8Mi7lka){67H}AlO7ZGYxS&{6HtbvFfY(9@oMGH<&9WOMB3`}SK8Y% zPYpnypEs{quk-qrFmdSni#(Z<-}&k8X;4U3tRPGYIe0C~Mk_7!l` z%WQ^$6rfcwoIU2Ve>rDc%N3MyWcy9n*Iy~NfGaZsrDxLk&;@M&wMd`n&(Op1qCdLB zCl8bVl>9RmfI8qOSl@e)ysqP*H*XOzfp$u+ms>jJfm1{(RPh zUk;Bl>e@zs}-5S5sls0X~Ily?TXm#C7+{h4-tuJ(2Q|iWxpO;{dx8% z8^f86^NtQzX#TP5*6KMl3t%>O?3>`PE;0iU7X>U<}6pj{Vzgp?_ZP3tO*?il5@idJu{s{=$^ zAm)HfgEG|J2Y`$5qJf}k_o$ewW9@)G1Zz9Z<2Kvd+GArmqmfG6;nayxS}DJ>>P$MD z#3%an_3o$(Oaoza;-BKA_)01E1gxFgkV;8GHyWd;@%=j{FiRnZx5+FY0=(l&pj| z&m&@EZO9ZpiIo=ijm-0v$|%vW))B;|T4L4emQ3=nCe1n=`Zv-ERie z(hBsAC#N2+2|gK4{|fB?Z~lHl19(bopQLHG&*O0Df6#gUB>g- zi+UXIrMu}ISt(*CyE@)$Z5mlv!aQKr_yFi{8oyDm=*3=Yic{HZ9yC$}{=2#QH14H0 za?Hxq)FWYJ50TmRTV{a&4h{SSEqnw8*d_lGGT?3G=y15yDq(f`!OX5^*x2(&JAXd- zE0fg$^t!q-vYvPCLg^xQgHeXp^NqQf=J1q2QJHXL0a95XfD*v<2fH!%XG0I!LC&Z< zC^tlWFxROqBK~TW`W|Ls;Z5XN6Vdj~;)$}t4%b$JSaYtPYFug@N9+?ciW1Hg*K|1ZgZMFRX7R%EkZx?OqiU@@&@tV`fxJ*uO@L4Tk=c&mVGqf=h>MUS^&fxvYcptr)Sk*&dOu=sXZwsKuW&mrw2Kpbe6GG>*U|tm1Eye_{JW z@B(~=40s9!d=ysa+r!A4rPYfOH?uo-O0r{k)b(P%=N!JXOPo?b&#Zd4QXtL++GXNq zwun+<5E8%++vfS`4Yt>Zxn|K4(3da2D?9Yjb?o8ry z`}VnRL;>=@700e(X6erRg~*>wuKo@7Qo87Qda-gm8e|rjTzuyf(`H) zet-{|6&@o2j-x%5AXB@7g`WPAU}pq>7!p3_`%Vo~z*>zdP=HlHG55-~`ow%RzY()W zT}~~+xRM>?o$p>T_+$d- zFwi~v;vB!%m0J`?uTCQaP2wUxK9!h=CE%o*chMKHW z>WxI{1Wioh=;FTus9Y(M>g|1D6!H*o(0d;wqce=l6;iZQid zzX2_JGZMkLYYk&8)o(xUs6R^{Un?3gI3a$O795Bn;xFl^uB?)g6j3 z+rzGWb_}iH?CODW?ZN3>t6Am~*xTwOXV8dgiVD zGvmh<0L;CU4$QQ-%1_^*dEim|bA4EIH@-++4XFURa;o!=k2UyWvi41qnup7Jl zA9F{fHnU9Z;#3EU#tWJ;d-Q_u?c-4bE!ef#O!Y3Vznmlx@MrWfE7J@2-GXZ+kD{)z8}e7Z{DeGx`*rj>StC9 z=)){wR&rau84kYIhS>e374}^zS2Pof*0byy1$Cfb1l>$xKUcmvbjfsic#%fIBG-y+kXpD)PR446B^IK;+ zz07p_hxPsXJRFy0S(FvGKX}fW-Tm(Qp6@xk=ec~I>-#CpA2Xy5gd(!FY`>es54r=z z>>SerLJO$h*b}`jI|z54{HypkeGR?~sfH!9E!0;psyj?9kS77HYFo~on{45NoL~Lr zOG593u~R>jUF| zd@oj@Sny9H@dqM5u;3mH#UXaAja-_?OxkH#=VD{6FD?e~Jh2yHtdnNhbL5&}w6zD3oLf34?jIM{@rCk^ZXB z-WOUH<`)~V;($Ch5j&YYeVY{nu`|m=;&#}SC>tClY{@8KJ?8gYY+dEAUccKzy$50${yJaxN4u_$?%tE5I)CmCAIKK^E*~IY zPyb&RPT<9{4dFxZ=qtC&)`zoQU4hqxV$j&(f$;{1qvLgqu?ctOK6HbcQ1n-!&Z>h7 z1u1eg*WVN=ms?(#YdBAb$?cKQ$dpNIV?E>tzWq62C} z_xtDia*ng;am6Hg`U8|Jh9{HjekGX=l{Rg;())(5tU%K=ea}6{Z>4{=Myn{J@o%| z-uZg8Hz}1PygSdDhlT@Wd+2(xKdK0H{f0G6bT; zTcbhtgbV0@^oJ%fl51=XMWF-e4}}_bTex^2pBT&;s>F4e-V%PjC-3WBQeo0ZfG$LR z$CgGKPsQVVD^)=6Hw*CXSOBl3C-<4q**x@{BK^^}A%x~n6%S6^nuaQBDm+as-FfV)E@l|j6J7%&4(_p1^`Et4L_Y{VMa5rrbIs&H*6 zNycH7T$NAq5BB9QPy?6bxCx=GOWh`>(jUwn^e>?Qrw!#}I%;3&I0U>Wllgx)8K8d& z2mC%(z;D6uk-1y3Vq~()M*zM%r(&lrqJmA(?2+r-5daQqp+dP6xa~j^D%Uy zLotFUv^l&8>u)eR=~N<^GQu#%RhjhL^iN=AX!YGt7Umlcc=v1!;K@8gKHcGTXFiv@ zG1FUF20BJ=%5xsgcPqP{O(zaib2fBssoqy9s&>D6`gm`J3}803KGVU_Ton)`sLzH{ z!!0JTDo1n;S!1mKaKg-yV$C_iM=*y-je(w(-8pVL*=V%Sm!ehXNA^$WZ{HlcTlw{z z_1nds!1`EAKZtGjUSh!iobT^O1DwgKe==);+W(WW0iZXVsr`74=@o|1t^1nIFW0v> zQjYG{`s>0OyuF$;F0)^F(_+6e0M%Eh)0~7>KhPDSA|%-LIjTea${d#+;OUtQ_ZOj~ z2@P;6#&UmAMm?Q(qT^YK%>xv1w+0*tO{!yyeOFyusyO(ERS{6JUpVc$ zO4;*jLB=A_D#ZV?U5)+z`TX{oP}@xQ@oXWv5s(aR^#uVV0qaG8vNe$o}~ zFEF##l(4(A=Jb0191>sjrKyjPWtIP3vjW)wZzU4&i>&rf=lGMMyY7G=MgyG6lV#oC z5K4{arx`1}|EdWW8&(m@?t{Tn{ovI*s3KSdhxE(zFUc$Mfo+lBg*kpORJ$d|^$9{7 zh5#u3yE4?J56qZV55x=9g(zRJFL&pU&P^pDd0cT^R8b0FG};tZ!QZ3A5BE~ z^=SV;#23^T@OC)hrNn|vS$i(@H)rqhc#MZ*b=}<7VpC#t-mv(2er50T2l@Fhc~k{g z1^_Mu`d8Fi7}Zq0)uvL^uAs&9p9UxA#@PT&6$M|a6@-L8i)<+ZEkSiU|dwuSAGL0|(+uA(UC!+)2jGy=0Xn?o##S_2*dhA}zs~@JX z;@k1A55)$6+-8y%8RrG63PKI_zty!-l^|6Y%nIZK%J7NoFO5uJkyTwE=y3EpB$|7| zEzo1HiZshMn&+`IM|MRQu;a}juW6Gt&&j>4Eo0FZI#suZ=3_Z?PyQxIFvHFMyZC?I zzdP{+#^X6X9y|Z%iSzuntpIPtDm)X(H)GwLRdd}<@pw4)!mXhu^uSwM9e`?3o&RWJ z7vkq7%GjfljiYx-N;}(XucI4Uv;WQP>`?4bR7Qh5`Kgz4E(W^M%wQ#`e$ppThpSnZ; zHk3DE_u1%z??y{}D>^{GzBruxyLw>0o=#n|FaEEVyQT!85j{R0=^Se-z^X{*XY&XB zRkQu(MT*T6g(YqFysjYBX6flBmNUdR8*&|)XVC@xR^0|L$5w>ugSoai;o^KkjoRK^ z0g_<9ee@?VlqdYP#sRNp?HBQTJ8OWb&)jGkk;oVvMZH$)zYazkc?0Ah ziVta*m(xMED|Ar-&YFYys+MG4D9-{kh2wMKqA%upNAh)R&R)^1e`wI+O8k6l2Yk@N zmgHrMJnA%{|J8?x0Ikm}E5-h1p%nc;`v2aa=?N?gy$YKX_20>^BIHas;Du-a@?ZNC z(ExXZLSnT$B8~dO%KB&h>E@HiHJPO-D4U}PK;5URoSOWjGn>D+AoRU0@~`J_ZzSD3 zip`-r>dF?w29^al5UT4ukz=T?6J2N>{YP_$HL)IcN1NOi?p&Aq^tqo)7JvzI*7L>D9;!z~k5v=k0=6KW$GdYb>8A&v3}2fo$t3AL zUzNXSZ>*Ce`Lv^b?Eg~f4<~G2p5IfU`5V#y@5B#yBl(|~qW|gs@3pRgQ?15sPc*t3 z{?++}YG9FIJ9?vdRr~D6xNg)C1+tC0V-x!U&d2t>1M^0)P|-%F?eoJNlaBIQ4e?7tBWKnMJN z^Zp)BY~55(h`;xQ8c<$GBd=>h^QzWW{fTD2AbRN?Q2Vcfiv?(w9Q1B^9rhU2}b^}ibW|0esdVgvjr`rlObM?!zNzxI1ViLF`1d2GBho}Zn?uhLKD7TJ{J zHxb6nNt0d+0c2k2W1^=H-+RMRhoafx$SjI?Fc$fjJ*v54)eofCpkhjXS7~Za-JZ~0 zZ=tDyYjWjHIY(a*wCH{Xm>~n?$z2y4@A>$DZ-xhc-YkF@qXWL5i13LTQYliU|HP9PmmaK|g9%!0BWG%yu**81ftBAGm??^m6y49T%X6njSrW zWPe?LnhT)TlfE`1?#`?w4~Cm)ew4m3beo%~;Fi!;W|{m~ZMp6~RivVf{K>A)m<3>( z(BfzzC}Y>fkNj#@9}_3~{?D0H-zUc-ou{+zza07hS*rkfJ`q5(Hfy%0scv6tvZgWv z4NU%0$8Vm~SZFX3dcuK``%(V^8(1`NG_Op7fIxmS{B&QWmR#@5r&V{OzxWQjPlma2 zOEiFrL%s#yvi9xK|7wWL51pI4;U!b$#&b`$Nx#kf32bZ}@Hf%^FGv1=9E;%T=mgVW zYW|1GZhH4s>8bOO;WNE~2f%kHr`BmmKqkF9Qk9@LX6-nVtC$skI%~-tp|}cO4 z8zQk+MP^4r-HQK-0~gK|>dP~bf7vBGRzAnJXcR~g^RoiMEVUwS&N(Uw`xwy2Wn>=p z!;$+J5)~8&d^WG2NWB1LhDVy@s{Ss-UNXv(>$<+GN4z}s>vL56&O8VH{x_Q)@ldEw z{!MNY=O2sp2+<9a9L-Uf!YWIw|2%)#V%1?(yk@ebRRzMkE>W06c7jUmjRx;8R%(9&WzigQ2KNK!-zR2w}JY&7p&u7j`n| z@f#k@ce}ap$D;*~<%szWcSXVc2_tGokt9&&c(|-TQW<`ct92{mF2|=}@+GIqI?spu!)HoSP4GEL46t z=cpn+6)wOBbv8`bL)nk!swcuF2O71+2j+yDH4VxPNSc6@AIQ(bgfp$WCWO)QqR`zs zzcR89uV6H^7a??sMQ*x%i)fB)(p{J=)k2dXZ1+WsF3yL(MF5wy%PR0Q>G>Vu7n`Y2 z^a2laTl>t;=!2p5UjOZKJOP;=5j!(?PDZL9ZE`Iq0548d(28!R1ig;xaz!G1^uYt! zMfpYgRD2$5yx^62atEWim!8$tP<~i{`UcqmRYxG+4^2i5p&3$5tq7WF;TU-JXBUWriw%bP-T>N<_H`y`oAg)3o-86rvDd3)_3MU zvIFj9j-=?r`YDnw`>-TD(8mTooZ8c!adqShUYBW)qCVDUGJ5S<`j{q%QgS{zbSoz? z7%xrFC(LH^MUG@0Ingx8v2ernx#D2EAeMmbIAu(>x#X}@j+&j2Qcs1yw{=poKDZ0FQjYt zc&rE$oDN5OKz1!_9jYrWZk0#vZr{>)g6?2h75CIgriO=m!zg(x(2?&rLm zuL^Nsie|XvfB#eZfy-k%Eee(Ij{MUAti;sJNBC($@ZHLo9<3rsW%zNxBuhjdR^@;ALzb?$Np~&RA{Ire6a)k1G zBtKDml4(CApY2Cys5ZOM=5OjYy@UNW(KWnZS5}~? zT~_6V>Axym!RF`l7oOOK|1WrB6I-tVCZ5GiUUim$*{-H~Ss7?~RG)q`n}Kgn64%8K zFjH3FMn`{hh^*s02=cFrSYD@o^PPXM225wb#&#n;<5h=H^oKAbBXs`8`+k;X#2AFeYgJ83sp^m{+rrWR2At+ z8V+x*XnF~6nl&+bvsRtUn_>Yy2TXoOv+*0;hw=90hZCo{tI_|q&>SsR<)`=$#Ng^1 z?K}YMKf8ZpxCfpTPp|0D`-BY5A6=V$xKX+4LMQ&8`JuL%bmq}_o7L-Fj_8i}KR?+g zV7@qee_kkP(xmw!yF(rMKlNQac^m*0l*TWMA4iPjiw|g3fE{f^^THA|a~!^;N|MFV z36rY;YbHIrr7X}n(Ku|Cew*zlAYWJZ{?gFVq;Y88R_CSR2%4QQH=c7;kBj0j0uv}rYD z2SOXGwtj9MM0~lCChtXizF<`rZ^-+q!1aCGAcpZpQF7{f4nw3iNQ29BUu($72XenS z+M}NpeD)E|;t%VyZD}GmvV=wd`H^^092J40K;#{I1Us-$c{CLh zT#$22D(tt}d;KACUKT?uzLCPKU55O7EDB08gUdX733s32kgEW6kN@w-o|t$tUWQdH8WW!HNmc z51VtOXeB2xIhRwkmx~bbm#yFxnnbTtO%;OKLnaZ`T4KssT>+wS?+r9E%*r>m8D9+w z@Xk=$YOo~INk5bR^7nZCCdTmuMS8sp8@^2Axctw3m z|Lf@{ttGE=|6`Hm>9(rzGc&4o`XB$`fG$fd@>`Q1jKR3th%xZnm9I-8sty@@9po diff --git a/examples/pylab_examples/date_index_formatter.py b/examples/pylab_examples/date_index_formatter.py index f6198ae275af..0afaec28c368 100644 --- a/examples/pylab_examples/date_index_formatter.py +++ b/examples/pylab_examples/date_index_formatter.py @@ -11,9 +11,12 @@ import numpy from matplotlib.mlab import csv2rec from pylab import figure, show +import matplotlib.cbook as cbook from matplotlib.ticker import Formatter -r = csv2rec('../data/msft.csv')[-40:] +datafile = cbook.get_sample_data('msft.csv', asobj=False) +print 'loading', datafile +r = csv2rec(datafile)[-40:] class MyFormatter(Formatter): def __init__(self, dates, fmt='%Y-%m-%d'): diff --git a/examples/pylab_examples/image_demo2.py b/examples/pylab_examples/image_demo2.py index ce1d432ece90..70f32a641135 100644 --- a/examples/pylab_examples/image_demo2.py +++ b/examples/pylab_examples/image_demo2.py @@ -2,7 +2,10 @@ from pylab import * w, h = 512, 512 -s = file('../data/ct.raw', 'rb').read() + +datafile = cbook.get_sample_data('ct.raw', asobj=False) +print 'loading', datafile +s = file(datafile, 'rb').read() A = fromstring(s, uint16).astype(float) A *= 1.0/max(A) A.shape = w, h diff --git a/examples/pylab_examples/image_demo3.py b/examples/pylab_examples/image_demo3.py index 792d63fcb05a..0e1ba6e5f903 100644 --- a/examples/pylab_examples/image_demo3.py +++ b/examples/pylab_examples/image_demo3.py @@ -5,7 +5,8 @@ except ImportError, exc: raise SystemExit("PIL must be installed to run this example") -lena = Image.open('../data/lena.jpg') +datafile = cbook.get_sample_data('lena.jpg') +lena = cbook.Image.open(datafile) dpi = rcParams['figure.dpi'] figsize = lena.size[0]/dpi, lena.size[1]/dpi diff --git a/examples/pylab_examples/load_converter.py b/examples/pylab_examples/load_converter.py index d0bc81606643..53c825da12b5 100644 --- a/examples/pylab_examples/load_converter.py +++ b/examples/pylab_examples/load_converter.py @@ -2,9 +2,13 @@ #from matplotlib.mlab import load import numpy as np from pylab import figure, show +import matplotlib.cbook as cbook + +datafile = cbook.get_sample_data('msft.csv', asobj=False) +print 'loading', datafile dates, closes = np.loadtxt( - '../data/msft.csv', delimiter=',', + datafile, delimiter=',', converters={0:strpdate2num('%d-%b-%y')}, skiprows=1, usecols=(0,2), unpack=True) diff --git a/examples/pylab_examples/loadrec.py b/examples/pylab_examples/loadrec.py index 198ab90faca4..df97d9a367a6 100644 --- a/examples/pylab_examples/loadrec.py +++ b/examples/pylab_examples/loadrec.py @@ -1,7 +1,10 @@ from matplotlib import mlab from pylab import figure, show +import matplotlib.cbook as cbook -a = mlab.csv2rec('../data/msft.csv') +datafile = cbook.get_sample_data('msft.csv', asobj=False) +print 'loading', datafile +a = mlab.csv2rec(datafile) a.sort() print a.dtype diff --git a/examples/pylab_examples/logo.py b/examples/pylab_examples/logo.py index 88a1af876e20..d6f8092ee6a0 100644 --- a/examples/pylab_examples/logo.py +++ b/examples/pylab_examples/logo.py @@ -4,8 +4,10 @@ # convert data to mV -x = 1000*0.1*fromstring( - file('../data/membrane.dat', 'rb').read(), float32) +datafile = cbook.get_sample_data('membrane.dat', asobj=False) +print 'loading', datafile + +x = 1000*0.1*fromstring(file(datafile, 'rb').read(), float32) # 0.0005 is the sample interval t = 0.0005*arange(len(x)) figure(1, figsize=(7,1), dpi=100) diff --git a/examples/pylab_examples/mri_with_eeg.py b/examples/pylab_examples/mri_with_eeg.py index 535c7224b389..58d08f350d44 100644 --- a/examples/pylab_examples/mri_with_eeg.py +++ b/examples/pylab_examples/mri_with_eeg.py @@ -9,12 +9,13 @@ from matplotlib.pyplot import * from matplotlib.collections import LineCollection - +import matplotlib.cbook as cbook # I use if 1 to break up the different regions of code visually if 1: # load the data # data are 256x256 16 bit integers - dfile = '../data/s1045.ima' + dfile = cbook.get_sample_data('s1045.ima', asfileobj=False) + print 'loading image', dfile im = np.fromstring(file(dfile, 'rb').read(), np.uint16).astype(float) im.shape = 256, 256 @@ -38,7 +39,9 @@ # load the data numSamples, numRows = 800,4 - data = np.fromstring(file('../data/eeg.dat', 'rb').read(), float) + eegfile = cbook.get_sample_data('eeg.dat', asfileobj=False) + print 'loading eeg', eegfile + data = np.fromstring(file(eegfile, 'rb').read(), float) data.shape = numSamples, numRows t = 10.0 * np.arange(numSamples, dtype=float)/numSamples ticklocs = [] diff --git a/examples/pylab_examples/plotfile_demo.py b/examples/pylab_examples/plotfile_demo.py index 37067af4cf83..d28c3d4c1bc5 100644 --- a/examples/pylab_examples/plotfile_demo.py +++ b/examples/pylab_examples/plotfile_demo.py @@ -1,7 +1,8 @@ from pylab import plotfile, show, gca +import matplotlib.cbook as cbook -fname = '../data/msft.csv' -fname2 = '../data/data_x_x2_x3.csv' +fname = cbook.get_sample_data('msft.csv', asobj=False) +fname2 = cbook.get_sample_data('data_x_x2_x3.csv', asobj=False) # test 1; use ints plotfile(fname, (0,5,6)) diff --git a/examples/user_interfaces/embedding_in_wx3.py b/examples/user_interfaces/embedding_in_wx3.py index 5bb35e9747d6..b405b7d483ca 100644 --- a/examples/user_interfaces/embedding_in_wx3.py +++ b/examples/user_interfaces/embedding_in_wx3.py @@ -27,6 +27,7 @@ import matplotlib matplotlib.use('WXAgg') import matplotlib.cm as cm +import matplotlib.cbook as cbook from matplotlib.backends.backend_wxagg import Toolbar, FigureCanvasWxAgg from matplotlib.figure import Figure import numpy as npy @@ -101,8 +102,9 @@ def onEraseBackground(self, evt): class MyApp(wx.App): def OnInit(self): - xrcfile = os.path.join(os.path.dirname(__file__),"..","data", - "embedding_in_wx3.xrc") + xrcfile = cbook.get_sample_data('embedding_in_wx3.xrc', asobj=False) + print 'loading', xrcfile + self.res = xrc.XmlResource(xrcfile) # main frame and panel --------- diff --git a/examples/user_interfaces/rec_edit_gtk_custom.py b/examples/user_interfaces/rec_edit_gtk_custom.py index 53c7db6ff8e0..a92dd32c0be4 100644 --- a/examples/user_interfaces/rec_edit_gtk_custom.py +++ b/examples/user_interfaces/rec_edit_gtk_custom.py @@ -6,9 +6,12 @@ import gtk import numpy as np import matplotlib.mlab as mlab +import matplotlib.cbook as cbook import mpl_toolkits.gtktools as gtktools -r = mlab.csv2rec('data/demodata.csv', converterd={'weekdays':str}) + +datafile = cbook.get_sample_data('demodata.csv', asobj=False) +r = mlab.csv2rec(datafile, converterd={'weekdays':str}) formatd = mlab.get_formatd(r) diff --git a/examples/user_interfaces/rec_edit_gtk_simple.py b/examples/user_interfaces/rec_edit_gtk_simple.py index ce4c0849ecdd..ec9f09a89bd0 100644 --- a/examples/user_interfaces/rec_edit_gtk_simple.py +++ b/examples/user_interfaces/rec_edit_gtk_simple.py @@ -5,9 +5,11 @@ import gtk import numpy as np import matplotlib.mlab as mlab +import matplotlib.cbook as cbook import mpl_toolkits.gtktools as gtktools -r = mlab.csv2rec('data/demodata.csv', converterd={'weekdays':str}) +datafile = cbook.get_sample_data('demodata.csv', asobj=False) +r = mlab.csv2rec(datafile, converterd={'weekdays':str}) liststore, treeview, win = gtktools.edit_recarray(r) win.set_title('click to edit') From 94e15a0b4a4d3c582d909c11a384b844cb535362 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Wed, 5 Aug 2009 16:23:06 +0000 Subject: [PATCH 0033/1000] removed examples/data; ported all examples to use sample_data svn path=/trunk/matplotlib/; revision=7383 --- examples/pylab_examples/date_index_formatter.py | 2 +- examples/pylab_examples/image_demo2.py | 3 ++- examples/pylab_examples/load_converter.py | 2 +- examples/pylab_examples/loadrec.py | 2 +- examples/pylab_examples/logo.py | 2 +- examples/pylab_examples/plotfile_demo.py | 4 ++-- 6 files changed, 8 insertions(+), 7 deletions(-) diff --git a/examples/pylab_examples/date_index_formatter.py b/examples/pylab_examples/date_index_formatter.py index 0afaec28c368..e5ba7e34f63c 100644 --- a/examples/pylab_examples/date_index_formatter.py +++ b/examples/pylab_examples/date_index_formatter.py @@ -14,7 +14,7 @@ import matplotlib.cbook as cbook from matplotlib.ticker import Formatter -datafile = cbook.get_sample_data('msft.csv', asobj=False) +datafile = cbook.get_sample_data('msft.csv', asfileobj=False) print 'loading', datafile r = csv2rec(datafile)[-40:] diff --git a/examples/pylab_examples/image_demo2.py b/examples/pylab_examples/image_demo2.py index 70f32a641135..50e994faf07a 100644 --- a/examples/pylab_examples/image_demo2.py +++ b/examples/pylab_examples/image_demo2.py @@ -1,9 +1,10 @@ #!/usr/bin/env python from pylab import * +import matplotlib.cbook as cbook w, h = 512, 512 -datafile = cbook.get_sample_data('ct.raw', asobj=False) +datafile = cbook.get_sample_data('ct.raw', asfileobj=False) print 'loading', datafile s = file(datafile, 'rb').read() A = fromstring(s, uint16).astype(float) diff --git a/examples/pylab_examples/load_converter.py b/examples/pylab_examples/load_converter.py index 53c825da12b5..ec4523617a23 100644 --- a/examples/pylab_examples/load_converter.py +++ b/examples/pylab_examples/load_converter.py @@ -4,7 +4,7 @@ from pylab import figure, show import matplotlib.cbook as cbook -datafile = cbook.get_sample_data('msft.csv', asobj=False) +datafile = cbook.get_sample_data('msft.csv', asfileobj=False) print 'loading', datafile dates, closes = np.loadtxt( diff --git a/examples/pylab_examples/loadrec.py b/examples/pylab_examples/loadrec.py index df97d9a367a6..74fa34a5785e 100644 --- a/examples/pylab_examples/loadrec.py +++ b/examples/pylab_examples/loadrec.py @@ -2,7 +2,7 @@ from pylab import figure, show import matplotlib.cbook as cbook -datafile = cbook.get_sample_data('msft.csv', asobj=False) +datafile = cbook.get_sample_data('msft.csv', asfileobj=False) print 'loading', datafile a = mlab.csv2rec(datafile) a.sort() diff --git a/examples/pylab_examples/logo.py b/examples/pylab_examples/logo.py index d6f8092ee6a0..24e4c752c8ad 100644 --- a/examples/pylab_examples/logo.py +++ b/examples/pylab_examples/logo.py @@ -4,7 +4,7 @@ # convert data to mV -datafile = cbook.get_sample_data('membrane.dat', asobj=False) +datafile = cbook.get_sample_data('membrane.dat', asfileobj=False) print 'loading', datafile x = 1000*0.1*fromstring(file(datafile, 'rb').read(), float32) diff --git a/examples/pylab_examples/plotfile_demo.py b/examples/pylab_examples/plotfile_demo.py index d28c3d4c1bc5..04b94665c167 100644 --- a/examples/pylab_examples/plotfile_demo.py +++ b/examples/pylab_examples/plotfile_demo.py @@ -1,8 +1,8 @@ from pylab import plotfile, show, gca import matplotlib.cbook as cbook -fname = cbook.get_sample_data('msft.csv', asobj=False) -fname2 = cbook.get_sample_data('data_x_x2_x3.csv', asobj=False) +fname = cbook.get_sample_data('msft.csv', asfileobj=False) +fname2 = cbook.get_sample_data('data_x_x2_x3.csv', asfileobj=False) # test 1; use ints plotfile(fname, (0,5,6)) From 1220720170b79eaa2c75874c19afa995eed93e60 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Wed, 5 Aug 2009 16:24:03 +0000 Subject: [PATCH 0034/1000] fixed typo in sample data examples svn path=/trunk/matplotlib/; revision=7384 --- examples/api/watermark_image.py | 2 +- examples/user_interfaces/embedding_in_wx3.py | 2 +- examples/user_interfaces/rec_edit_gtk_custom.py | 2 +- examples/user_interfaces/rec_edit_gtk_simple.py | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/examples/api/watermark_image.py b/examples/api/watermark_image.py index 2320d5c8a41a..27f27a23b4fe 100644 --- a/examples/api/watermark_image.py +++ b/examples/api/watermark_image.py @@ -8,7 +8,7 @@ import matplotlib.image as image import matplotlib.pyplot as plt -datafile = cbook.get_sample_data('logo2.png', asobj=False) +datafile = cbook.get_sample_data('logo2.png', asfileobj=False) print 'loading', datafile im = image.imread(datafile) im[:,:,-1] = 0.5 # set the alpha channel diff --git a/examples/user_interfaces/embedding_in_wx3.py b/examples/user_interfaces/embedding_in_wx3.py index b405b7d483ca..de67cc0b181c 100644 --- a/examples/user_interfaces/embedding_in_wx3.py +++ b/examples/user_interfaces/embedding_in_wx3.py @@ -102,7 +102,7 @@ def onEraseBackground(self, evt): class MyApp(wx.App): def OnInit(self): - xrcfile = cbook.get_sample_data('embedding_in_wx3.xrc', asobj=False) + xrcfile = cbook.get_sample_data('embedding_in_wx3.xrc', asfileobj=False) print 'loading', xrcfile self.res = xrc.XmlResource(xrcfile) diff --git a/examples/user_interfaces/rec_edit_gtk_custom.py b/examples/user_interfaces/rec_edit_gtk_custom.py index a92dd32c0be4..75dd1b8d09b7 100644 --- a/examples/user_interfaces/rec_edit_gtk_custom.py +++ b/examples/user_interfaces/rec_edit_gtk_custom.py @@ -10,7 +10,7 @@ import mpl_toolkits.gtktools as gtktools -datafile = cbook.get_sample_data('demodata.csv', asobj=False) +datafile = cbook.get_sample_data('demodata.csv', asfileobj=False) r = mlab.csv2rec(datafile, converterd={'weekdays':str}) diff --git a/examples/user_interfaces/rec_edit_gtk_simple.py b/examples/user_interfaces/rec_edit_gtk_simple.py index ec9f09a89bd0..61986429a6f3 100644 --- a/examples/user_interfaces/rec_edit_gtk_simple.py +++ b/examples/user_interfaces/rec_edit_gtk_simple.py @@ -8,7 +8,7 @@ import matplotlib.cbook as cbook import mpl_toolkits.gtktools as gtktools -datafile = cbook.get_sample_data('demodata.csv', asobj=False) +datafile = cbook.get_sample_data('demodata.csv', asfileobj=False) r = mlab.csv2rec(datafile, converterd={'weekdays':str}) liststore, treeview, win = gtktools.edit_recarray(r) From 5843bb69828a885d5e096bb660498e7629f420bf Mon Sep 17 00:00:00 2001 From: John Hunter Date: Wed, 5 Aug 2009 16:30:55 +0000 Subject: [PATCH 0035/1000] fixed a couple of missing cbook imports in sample_data examples svn path=/trunk/matplotlib/; revision=7385 --- examples/pylab_examples/image_demo3.py | 4 +++- examples/pylab_examples/logo.py | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/examples/pylab_examples/image_demo3.py b/examples/pylab_examples/image_demo3.py index 0e1ba6e5f903..46f87147f4e4 100644 --- a/examples/pylab_examples/image_demo3.py +++ b/examples/pylab_examples/image_demo3.py @@ -5,8 +5,10 @@ except ImportError, exc: raise SystemExit("PIL must be installed to run this example") +import matplotlib.cbook as cbook + datafile = cbook.get_sample_data('lena.jpg') -lena = cbook.Image.open(datafile) +lena = Image.open(datafile) dpi = rcParams['figure.dpi'] figsize = lena.size[0]/dpi, lena.size[1]/dpi diff --git a/examples/pylab_examples/logo.py b/examples/pylab_examples/logo.py index 24e4c752c8ad..64e97c7b0134 100644 --- a/examples/pylab_examples/logo.py +++ b/examples/pylab_examples/logo.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # This file generates the matplotlib web page logo from pylab import * - +import matplotlib.cbook as cbook # convert data to mV datafile = cbook.get_sample_data('membrane.dat', asfileobj=False) From 8c49b9af46c26b5f0c33db8befa4200468a8ddf6 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Wed, 5 Aug 2009 17:20:12 +0000 Subject: [PATCH 0036/1000] fixed another example to use sample data svn path=/trunk/matplotlib/; revision=7389 --- examples/pylab_examples/data_helper.py | 14 ++++++++++---- 1 file changed, 10 insertions(+), 4 deletions(-) diff --git a/examples/pylab_examples/data_helper.py b/examples/pylab_examples/data_helper.py index 8c05f53987dd..d58823c14896 100644 --- a/examples/pylab_examples/data_helper.py +++ b/examples/pylab_examples/data_helper.py @@ -2,7 +2,7 @@ # Some functions to load a return data for the plot demos from numpy import fromstring, argsort, take, array, resize - +import matplotlib.cbook as cbook def get_two_stock_data(): """ load stock time and price data for two stocks The return values @@ -10,11 +10,14 @@ def get_two_stock_data(): and 2 (intc and aapl) """ ticker1, ticker2 = 'INTC', 'AAPL' - M1 = fromstring( file('../data/%s.dat' % ticker1, 'rb').read(), ' Date: Wed, 5 Aug 2009 17:21:09 +0000 Subject: [PATCH 0037/1000] fixed another example to use sample data svn path=/trunk/matplotlib/; revision=7390 --- examples/pylab_examples/mri_demo.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/examples/pylab_examples/mri_demo.py b/examples/pylab_examples/mri_demo.py index 514b38fe17a8..d91998063785 100644 --- a/examples/pylab_examples/mri_demo.py +++ b/examples/pylab_examples/mri_demo.py @@ -1,9 +1,10 @@ #!/usr/bin/env python from pylab import * - +import matplotlib.cbook as cbook # data are 256x256 16 bit integers -dfile = '../data/s1045.ima' -im = fromstring(file(dfile, 'rb').read(), uint16).astype(float) +dfile = cbook.get_sample_data('s1045.ima', asfileobj=False) +print 'loading image', dfile +im = np.fromstring(file(dfile, 'rb').read(), np.uint16).astype(float) im.shape = 256, 256 #imshow(im, ColormapJet(256)) From bfe793fbf74c76b743652bdbc4a247a868dad053 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Wed, 5 Aug 2009 17:36:27 +0000 Subject: [PATCH 0038/1000] updated devel doc with sample_data instructions svn path=/trunk/matplotlib/; revision=7391 --- doc/devel/coding_guide.rst | 40 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/doc/devel/coding_guide.rst b/doc/devel/coding_guide.rst index 53cb9caae36c..a488a08a8cd1 100644 --- a/doc/devel/coding_guide.rst +++ b/doc/devel/coding_guide.rst @@ -563,6 +563,45 @@ external backend via the ``module`` directive. if .. _license-discussion: + +Writing examples +================ + +We have hundreds of examples in subdirectories of +file:`matplotlib/examples` in the trunk, and these are automatically +generated when the website it built to show up both in the `examples +`_ and `gallery +`_ sections of the +website. Many people find these examples from the website, and do not +have ready access to the file:`examples` directory in which they +reside. Thus any example data that is required for the example should +be provided through the sample_data svn directory, which can then be +accessed using :func:`matplotlib.cbook.get_sample_data`. First get a +copy of the repository and svn add your data:: + + svn co http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/sample_data + cp ~/path/to/mydata.dat sample_data/ + cd sample_data + svn add mydata.dat + svn commit -m 'added my data' + +and then in your example code you can load it into a file handle with:: + + import matplotlib.cbook as cbook + fh = cbook.get_sample_data('mydata.dat') + +The file will be fetched from the svn repo using urllib and updated +when the revision number changes. + + +If you prefer just to get the full path to the file instead of an file +object:: + + import matplotlib.cbook as cbook + datafile = cbook.get_sample_data('mydata.dat', asfileobj=False) + print 'datafile', datafile + + Licenses ======== @@ -630,3 +669,4 @@ The other reason is licensing compatibility with the other python extensions for scientific computing: ipython, numpy, scipy, the enthought tool suite and python itself are all distributed under BSD compatible licenses. +> \ No newline at end of file From 11f579f285173f78ad82c6ef97f7e2b4560c8264 Mon Sep 17 00:00:00 2001 From: John Hunter Date: Wed, 5 Aug 2009 17:59:12 +0000 Subject: [PATCH 0039/1000] fixed some svn doc bugs; svn path=/trunk/matplotlib/; revision=7392 --- doc/devel/coding_guide.rst | 2 +- lib/matplotlib/cbook.py | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/doc/devel/coding_guide.rst b/doc/devel/coding_guide.rst index a488a08a8cd1..dadf53c882ee 100644 --- a/doc/devel/coding_guide.rst +++ b/doc/devel/coding_guide.rst @@ -579,7 +579,7 @@ be provided through the sample_data svn directory, which can then be accessed using :func:`matplotlib.cbook.get_sample_data`. First get a copy of the repository and svn add your data:: - svn co http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/sample_data + svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/sample_data cp ~/path/to/mydata.dat sample_data/ cd sample_data svn add mydata.dat diff --git a/lib/matplotlib/cbook.py b/lib/matplotlib/cbook.py index eeced282bbd6..325de12ddf57 100644 --- a/lib/matplotlib/cbook.py +++ b/lib/matplotlib/cbook.py @@ -521,7 +521,7 @@ def get_sample_data(fname, asfileobj=True): To add a datafile to this directory, you need to check out sample_data from matplotlib svn:: - svn co http://matplotlib.svn.sourceforge.net/viewvc/matplotlib/trunk/sample_data + svn co https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/trunk/sample_data and svn add the data file you want to support. This is primarily intended for use in mpl examples that need custom data From 0b86208406cddb1efa37c420bc09a94edad238bc Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Wed, 5 Aug 2009 19:18:26 +0000 Subject: [PATCH 0040/1000] Merged revisions 7393 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7393 | leejjoon | 2009-08-05 15:12:38 -0400 (Wed, 05 Aug 2009) | 1 line fix typo in axes_divider.py. use nanmin, nanmax in angle_helper.py (patch by Christoph Gohlke) ........ svn path=/trunk/matplotlib/; revision=7394 --- lib/mpl_toolkits/axes_grid/angle_helper.py | 8 ++++---- lib/mpl_toolkits/axes_grid/axes_divider.py | 2 +- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/lib/mpl_toolkits/axes_grid/angle_helper.py b/lib/mpl_toolkits/axes_grid/angle_helper.py index cb1b15a2e659..45e88e07bbb7 100644 --- a/lib/mpl_toolkits/axes_grid/angle_helper.py +++ b/lib/mpl_toolkits/axes_grid/angle_helper.py @@ -293,14 +293,14 @@ def __call__(self, transform_xy, x1, y1, x2, y2): # iron out jumps, but algorithm should be improved. # Tis is just naive way of doing and my fail for some cases. if self.lon_cycle is not None: - lon0 = lon.min() + lon0 = np.nanmin(lon) lon -= 360. * ((lon - lon0) > 180.) if self.lat_cycle is not None: - lat0 = lat.min() + lat0 = np.nanmin(lat) lat -= 360. * ((lat - lat0) > 180.) - lon_min, lon_max = lon.min(), lon.max() - lat_min, lat_max = lat.min(), lat.max() + lon_min, lon_max = np.nanmin(lon), np.nanmax(lon) + lat_min, lat_max = np.nanmin(lat), np.nanmax(lat) lon_min, lon_max, lat_min, lat_max = \ self._adjust_extremes(lon_min, lon_max, lat_min, lat_max) diff --git a/lib/mpl_toolkits/axes_grid/axes_divider.py b/lib/mpl_toolkits/axes_grid/axes_divider.py index 6c13e2f32131..5847e97458d5 100644 --- a/lib/mpl_toolkits/axes_grid/axes_divider.py +++ b/lib/mpl_toolkits/axes_grid/axes_divider.py @@ -544,7 +544,7 @@ def get_axes_locator(self): def apply_aspect(self, position=None): if self.get_axes_locator() is None: - self._axes_class.apply_apsect(self, position) + self._axes_class.apply_aspect(self, position) else: pos = self.get_axes_locator()(self, self._locator_renderer) self._axes_class.apply_aspect(self, position=pos) From ad9bb4127765cab88be0b905bca81d66ca52ce22 Mon Sep 17 00:00:00 2001 From: Ryan May Date: Thu, 6 Aug 2009 18:49:24 +0000 Subject: [PATCH 0041/1000] Don't leave colorbar_doc as part of the pyplot namespace. svn path=/trunk/matplotlib/; revision=7406 --- lib/matplotlib/pyplot.py | 5 +---- 1 file changed, 1 insertion(+), 4 deletions(-) diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index 07c90ebf8ce0..6106d562f550 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -1359,7 +1359,6 @@ def colormaps(): ## Plotting part 1: manually generated functions and wrappers ## -from matplotlib.colorbar import colorbar_doc def colorbar(mappable=None, cax=None, ax=None, **kw): if mappable is None: mappable = gci() @@ -1369,7 +1368,7 @@ def colorbar(mappable=None, cax=None, ax=None, **kw): ret = gcf().colorbar(mappable, cax = cax, ax=ax, **kw) draw_if_interactive() return ret -colorbar.__doc__ = colorbar_doc +colorbar.__doc__ = matplotlib.colorbar.colorbar_doc def clim(vmin=None, vmax=None): """ @@ -2691,5 +2690,3 @@ def spectral(): if im is not None: im.set_cmap(cm.spectral) draw_if_interactive() - - From 0e6ef96f3ed298d3c2253cf2bddee944a7259fa2 Mon Sep 17 00:00:00 2001 From: Ryan May Date: Thu, 6 Aug 2009 19:24:40 +0000 Subject: [PATCH 0042/1000] Add missing import. svn path=/trunk/matplotlib/; revision=7408 --- lib/matplotlib/pyplot.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/matplotlib/pyplot.py b/lib/matplotlib/pyplot.py index 6106d562f550..68cefaf5288e 100644 --- a/lib/matplotlib/pyplot.py +++ b/lib/matplotlib/pyplot.py @@ -1358,7 +1358,7 @@ def colormaps(): ## Plotting part 1: manually generated functions and wrappers ## - +import matplotlib.colorbar def colorbar(mappable=None, cax=None, ax=None, **kw): if mappable is None: mappable = gci() From 45634de9263adf02efe309c9eb1ce442aa84a5da Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Thu, 6 Aug 2009 20:05:41 +0000 Subject: [PATCH 0043/1000] Turn off contourf compound path generation; enable ContourSet as contour arg. The former change is part of a continuing effort to make compound paths work; in its present state, users should see no difference. The second change is to make it easier to use line contours with filled contours. svn path=/trunk/matplotlib/; revision=7410 --- examples/pylab_examples/contourf_demo.py | 5 +- lib/matplotlib/contour.py | 59 +++++++++++++----------- 2 files changed, 34 insertions(+), 30 deletions(-) diff --git a/examples/pylab_examples/contourf_demo.py b/examples/pylab_examples/contourf_demo.py index 3e5fbb2a3676..69fe60627f89 100755 --- a/examples/pylab_examples/contourf_demo.py +++ b/examples/pylab_examples/contourf_demo.py @@ -55,9 +55,10 @@ # Note that in the following, we explicitly pass in a subset of # the contour levels used for the filled contours. Alternatively, -# We could pass in additional levels to provide extra resolution. +# We could pass in additional levels to provide extra resolution, +# or leave out the levels kwarg to use all of the original levels. -CS2 = contour(X, Y, Z, CS.levels[::2], +CS2 = contour(CS, levels=CS.levels[::2], colors = 'r', origin=origin, hold='on') diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index 795acfc5b3db..b2bef546191f 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -539,6 +539,7 @@ def __init__(self, ax, *args, **kwargs): """ self.ax = ax + self.noslit = kwargs.get('noslit', False) # **Temporary** self.levels = kwargs.get('levels', None) self.filled = kwargs.get('filled', False) self.linewidths = kwargs.get('linewidths', None) @@ -571,12 +572,31 @@ def __init__(self, ax, *args, **kwargs): if self.colors is not None and cmap is not None: raise ValueError('Either colors or cmap must be None') if self.origin == 'image': self.origin = mpl.rcParams['image.origin'] - x, y, z = self._contour_args(*args) # also sets self.levels, - # self.layers + + if isinstance(args[0], ContourSet): + C = args[0].Cntr + if self.levels is None: + self.levels = args[0].levels + else: + x, y, z = self._contour_args(*args) + + x0 = ma.minimum(x) + x1 = ma.maximum(x) + y0 = ma.minimum(y) + y1 = ma.maximum(y) + self.ax.update_datalim([(x0,y0), (x1,y1)]) + self.ax.autoscale_view() + _mask = ma.getmask(z) + if _mask is ma.nomask: + _mask = None + C = _cntr.Cntr(x, y, z.filled(), _mask) + self.Cntr = C + self._process_levels() + if self.colors is not None: cmap = colors.ListedColormap(self.colors, N=len(self.layers)) if self.filled: - self.collections = cbook.silent_list('collections.PolyCollection') + self.collections = cbook.silent_list('collections.PathCollection') else: self.collections = cbook.silent_list('collections.LineCollection') self.segs = [] @@ -590,14 +610,9 @@ def __init__(self, ax, *args, **kwargs): kw['norm'] = norm cm.ScalarMappable.__init__(self, **kw) # sets self.cmap; self._process_colors() - _mask = ma.getmask(z) - if _mask is ma.nomask: - _mask = None - if self.filled: if self.linewidths is not None: warnings.warn('linewidths is ignored by contourf') - C = _cntr.Cntr(x, y, z.filled(), _mask) lowers = self._levels[:-1] uppers = self._levels[1:] for level, level_upper in zip(lowers, uppers): @@ -620,7 +635,6 @@ def __init__(self, ax, *args, **kwargs): tlinewidths = self._process_linewidths() self.tlinewidths = tlinewidths tlinestyles = self._process_linestyles() - C = _cntr.Cntr(x, y, z.filled(), _mask) for level, width, lstyle in zip(self.levels, tlinewidths, tlinestyles): nlist = C.trace(level) nseg = len(nlist)//2 @@ -637,24 +651,18 @@ def __init__(self, ax, *args, **kwargs): self.segs.append(segs) self.kinds.append(kinds) self.changed() # set the colors - x0 = ma.minimum(x) - x1 = ma.maximum(x) - y0 = ma.minimum(y) - y1 = ma.maximum(y) - self.ax.update_datalim([(x0,y0), (x1,y1)]) - self.ax.autoscale_view() - - @staticmethod - def _make_paths(segs, kinds): + + def _make_paths(self, segs, kinds): paths = [] for seg, kind in zip(segs, kinds): codes = np.zeros(kind.shape, dtype=mpath.Path.code_type) codes.fill(mpath.Path.LINETO) codes[0] = mpath.Path.MOVETO # points that begin a slit or are in it: - in_slit = kind[:-1] >= _cntr._slitkind # use moveto for any point *following* such a point - codes[1:][in_slit] = mpath.Path.MOVETO + if self.noslit: + in_slit = kind[:-1] >= _cntr._slitkind + codes[1:][in_slit] = mpath.Path.MOVETO paths.append(mpath.Path(seg, codes)) return paths @@ -813,14 +821,10 @@ def _contour_args(self, *args): "Last %s arg must give levels; see help(%s)" % (fn,fn)) if self.filled and len(lev) < 2: raise ValueError("Filled contours require at least 2 levels.") - # Workaround for cntr.c bug wrt masked interior regions: - #if filled: - # z = ma.masked_array(z.filled(-1e38)) - # It's not clear this is any better than the original bug. self.levels = lev - #if self._auto and self.extend in ('both', 'min', 'max'): - # raise TypeError("Auto level selection is inconsistent " - # + "with use of 'extend' kwarg") + return (x, y, z) + + def _process_levels(self): self._levels = list(self.levels) if self.extend in ('both', 'min'): self._levels.insert(0, min(self.levels[0],self.zmin) - 1) @@ -841,7 +845,6 @@ def _contour_args(self, *args): if self.extend in ('both', 'max'): self.layers[-1] = 0.5 * (self.vmax + self._levels[-2]) - return (x, y, z) def _process_colors(self): """ From db82b78288073f6f0964c59cb6add3346432630a Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Fri, 7 Aug 2009 17:02:28 +0000 Subject: [PATCH 0044/1000] Refactor some backend methods for consistency and to reduce explosion of the number of arguments. A first crack at Gouraud shading in the Agg backend (not hooked up to anything). svn path=/trunk/matplotlib/; revision=7417 --- CHANGELOG | 39 ++++- doc/api/api_changes.rst | 37 +++++ examples/pylab_examples/quadmesh_demo.py | 2 +- lib/matplotlib/axes.py | 10 +- lib/matplotlib/backend_bases.py | 85 +++++----- lib/matplotlib/backends/backend_agg.py | 2 +- lib/matplotlib/backends/backend_cairo.py | 4 +- lib/matplotlib/backends/backend_gdk.py | 4 +- lib/matplotlib/backends/backend_macosx.py | 36 +++-- lib/matplotlib/backends/backend_mixed.py | 17 +- lib/matplotlib/backends/backend_pdf.py | 8 +- lib/matplotlib/backends/backend_ps.py | 24 +-- lib/matplotlib/backends/backend_svg.py | 22 ++- lib/matplotlib/backends/backend_template.py | 17 +- lib/matplotlib/backends/backend_wx.py | 7 +- lib/matplotlib/collections.py | 31 ++-- lib/matplotlib/figure.py | 9 +- lib/matplotlib/font_manager.py | 2 +- lib/matplotlib/image.py | 23 +-- src/_backend_agg.cpp | 167 +++++++++++++------- src/_backend_agg.h | 2 +- 21 files changed, 342 insertions(+), 206 deletions(-) diff --git a/CHANGELOG b/CHANGELOG index 647c47bfd122..14859848e926 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,41 @@ +2009-08-07 In an effort to simplify the backend API, all clipping rectangles + and paths are now passed in using GraphicsContext objects, even + on collections and images. Therefore: + + draw_path_collection(self, master_transform, cliprect, clippath, + clippath_trans, paths, all_transforms, offsets, + offsetTrans, facecolors, edgecolors, linewidths, + linestyles, antialiaseds, urls) + + becomes: + + draw_path_collection(self, gc, master_transform, paths, all_transforms, + offsets, offsetTrans, facecolors, edgecolors, + linewidths, linestyles, antialiaseds, urls) + + + + draw_quad_mesh(self, master_transform, cliprect, clippath, + clippath_trans, meshWidth, meshHeight, coordinates, + offsets, offsetTrans, facecolors, antialiased, + showedges) + + becomes: + + draw_quad_mesh(self, gc, master_transform, meshWidth, meshHeight, + coordinates, offsets, offsetTrans, facecolors, + antialiased, showedges) + + + + draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None) + + becomes: + + draw_image(self, gc, x, y, im) + + - MGD + 2009-08-06 Tagging the 0.99.0 release at svn r7397 - JDH * fixed an alpha colormapping bug posted on sf 2832575 @@ -30,7 +68,6 @@ * apply sf patches 2830233 and 2823885 for osx setup and 64 bit; thanks Michiel - 2009-08-04 Made cbook.get_sample_data make use of the ETag and Last-Modified headers of mod_dav_svn. - JKS diff --git a/doc/api/api_changes.rst b/doc/api/api_changes.rst index ca9e2129152e..a441bfa8809a 100644 --- a/doc/api/api_changes.rst +++ b/doc/api/api_changes.rst @@ -18,6 +18,43 @@ list may help describe what changes may be necessary in your code. .. _configobj: http://www.voidspace.org.uk/python/configobj.html .. _`enthought.traits`: http://code.enthought.com/projects/traits +Changes beyond 0.99.x +===================== + +In an effort to simplify the backend API, all clipping rectangles +and paths are now passed in using GraphicsContext objects, even +on collections and images. Therefore:: + + draw_path_collection(self, master_transform, cliprect, clippath, + clippath_trans, paths, all_transforms, offsets, + offsetTrans, facecolors, edgecolors, linewidths, + linestyles, antialiaseds, urls) + + # is now + + draw_path_collection(self, gc, master_transform, paths, all_transforms, + offsets, offsetTrans, facecolors, edgecolors, + linewidths, linestyles, antialiaseds, urls) + + + draw_quad_mesh(self, master_transform, cliprect, clippath, + clippath_trans, meshWidth, meshHeight, coordinates, + offsets, offsetTrans, facecolors, antialiased, + showedges) + + # is now + + draw_quad_mesh(self, gc, master_transform, meshWidth, meshHeight, + coordinates, offsets, offsetTrans, facecolors, + antialiased, showedges) + + + draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None) + + # is now + + draw_image(self, gc, x, y, im) + Changes in 0.99 ====================== diff --git a/examples/pylab_examples/quadmesh_demo.py b/examples/pylab_examples/quadmesh_demo.py index 8ab80629024e..c8745b6499ba 100644 --- a/examples/pylab_examples/quadmesh_demo.py +++ b/examples/pylab_examples/quadmesh_demo.py @@ -11,7 +11,7 @@ from matplotlib import cm, colors from numpy import ma -n = 56 +n = 12 x = np.linspace(-1.5,1.5,n) y = np.linspace(-1.5,1.5,n*2) X,Y = np.meshgrid(x,y); diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index 295a1cadd6c6..36ae91bd19fa 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -1705,12 +1705,14 @@ def draw(self, renderer=None, inframe=False): l, b, w, h = self.bbox.bounds # composite images need special args so they will not # respect z-order for now - renderer.draw_image( - round(l), round(b), im, self.bbox, - self.patch.get_path(), - self.patch.get_transform()) + gc = renderer.new_gc() + gc.set_clip_rectangle(self.bbox) + gc.set_clip_path(mtransforms.TransformedPath( + self.patch.get_path(), + self.patch.get_transform())) + renderer.draw_image(gc, round(l), round(b), im) if dsu_rasterized: for zorder, i, a in dsu_rasterized: diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 9955fc6e87cf..57aeb65264b9 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -108,24 +108,23 @@ def draw_markers(self, gc, marker_path, marker_trans, path, trans, rgbFace=None) marker_trans + transforms.Affine2D().translate(x, y), rgbFace) - def draw_path_collection(self, master_transform, cliprect, clippath, - clippath_trans, paths, all_transforms, offsets, - offsetTrans, facecolors, edgecolors, linewidths, - linestyles, antialiaseds, urls): + def draw_path_collection(self, gc, master_transform, paths, all_transforms, + offsets, offsetTrans, facecolors, edgecolors, + linewidths, linestyles, antialiaseds, urls): """ - Draws a collection of paths, selecting drawing properties from + Draws a collection of paths selecting drawing properties from the lists *facecolors*, *edgecolors*, *linewidths*, *linestyles* and *antialiaseds*. *offsets* is a list of offsets to apply to each of the paths. The offsets in - *offsets* are first transformed by *offsetTrans* before - being applied. + *offsets* are first transformed by *offsetTrans* before being + applied. This provides a fallback implementation of :meth:`draw_path_collection` that makes multiple calls to - draw_path. Some backends may want to override this in order - to render each set of path data only once, and then reference - that path multiple times with the different offsets, colors, - styles etc. The generator methods + :meth:`draw_path`. Some backends may want to override this in + order to render each set of path data only once, and then + reference that path multiple times with the different offsets, + colors, styles etc. The generator methods :meth:`_iter_collection_raw_paths` and :meth:`_iter_collection` are provided to help with (and standardize) the implementation across backends. It is highly @@ -137,18 +136,16 @@ def draw_path_collection(self, master_transform, cliprect, clippath, master_transform, paths, all_transforms): path_ids.append((path, transform)) - for xo, yo, path_id, gc, rgbFace in self._iter_collection( - path_ids, cliprect, clippath, clippath_trans, - offsets, offsetTrans, facecolors, edgecolors, + for xo, yo, path_id, gc0, rgbFace in self._iter_collection( + gc, path_ids, offsets, offsetTrans, facecolors, edgecolors, linewidths, linestyles, antialiaseds, urls): path, transform = path_id transform = transforms.Affine2D(transform.get_matrix()).translate(xo, yo) - self.draw_path(gc, path, transform, rgbFace) + self.draw_path(gc0, path, transform, rgbFace) - def draw_quad_mesh(self, master_transform, cliprect, clippath, - clippath_trans, meshWidth, meshHeight, coordinates, - offsets, offsetTrans, facecolors, antialiased, - showedges): + def draw_quad_mesh(self, gc, master_transform, meshWidth, meshHeight, + coordinates, offsets, offsetTrans, facecolors, + antialiased, showedges): """ This provides a fallback implementation of :meth:`draw_quad_mesh` that generates paths and then calls @@ -166,11 +163,11 @@ def draw_quad_mesh(self, master_transform, cliprect, clippath, linewidths = np.array([0.0], np.float_) return self.draw_path_collection( - master_transform, cliprect, clippath, clippath_trans, - paths, [], offsets, offsetTrans, facecolors, edgecolors, - linewidths, [], [antialiased], [None]) + gc, master_transform, paths, [], offsets, offsetTrans, facecolors, + edgecolors, linewidths, [], [antialiased], [None]) - def _iter_collection_raw_paths(self, master_transform, paths, all_transforms): + def _iter_collection_raw_paths(self, master_transform, paths, + all_transforms): """ This is a helper method (along with :meth:`_iter_collection`) to make it easier to write a space-efficent :meth:`draw_path_collection` @@ -200,9 +197,9 @@ def _iter_collection_raw_paths(self, master_transform, paths, all_transforms): transform = all_transforms[i % Ntransforms] yield path, transform + master_transform - def _iter_collection(self, path_ids, cliprect, clippath, clippath_trans, - offsets, offsetTrans, facecolors, edgecolors, - linewidths, linestyles, antialiaseds, urls): + def _iter_collection(self, gc, path_ids, offsets, offsetTrans, facecolors, + edgecolors, linewidths, linestyles, antialiaseds, + urls): """ This is a helper method (along with :meth:`_iter_collection_raw_paths`) to make it easier to write @@ -243,18 +240,14 @@ def _iter_collection(self, path_ids, cliprect, clippath, clippath_trans, if Noffsets: toffsets = offsetTrans.transform(offsets) - gc = self.new_gc() - - gc.set_clip_rectangle(cliprect) - if clippath is not None: - clippath = transforms.TransformedPath(clippath, clippath_trans) - gc.set_clip_path(clippath) + gc0 = self.new_gc() + gc0.copy_properties(gc) if Nfacecolors == 0: rgbFace = None if Nedgecolors == 0: - gc.set_linewidth(0.0) + gc0.set_linewidth(0.0) xo, yo = 0, 0 for i in xrange(N): @@ -264,20 +257,20 @@ def _iter_collection(self, path_ids, cliprect, clippath, clippath_trans, if Nfacecolors: rgbFace = facecolors[i % Nfacecolors] if Nedgecolors: - gc.set_foreground(edgecolors[i % Nedgecolors]) + gc0.set_foreground(edgecolors[i % Nedgecolors]) if Nlinewidths: - gc.set_linewidth(linewidths[i % Nlinewidths]) + gc0.set_linewidth(linewidths[i % Nlinewidths]) if Nlinestyles: - gc.set_dashes(*linestyles[i % Nlinestyles]) + gc0.set_dashes(*linestyles[i % Nlinestyles]) if rgbFace is not None and len(rgbFace)==4: - gc.set_alpha(rgbFace[-1]) + gc0.set_alpha(rgbFace[-1]) rgbFace = rgbFace[:3] - gc.set_antialiased(antialiaseds[i % Naa]) + gc0.set_antialiased(antialiaseds[i % Naa]) if Nurls: - gc.set_url(urls[i % Nurls]) + gc0.set_url(urls[i % Nurls]) - yield xo, yo, path_id, gc, rgbFace - gc.restore() + yield xo, yo, path_id, gc0, rgbFace + gc0.restore() def get_image_magnification(self): """ @@ -287,10 +280,13 @@ def get_image_magnification(self): """ return 1.0 - def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None): + def draw_image(self, gc, x, y, im): """ Draw the image instance into the current axes; + *gc* + a GraphicsContext containing clipping information + *x* is the distance in pixels from the left hand side of the canvas. @@ -301,11 +297,6 @@ def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None): *im* the :class:`matplotlib._image.Image` instance - - *bbox* - a :class:`matplotlib.transforms.Bbox` instance for clipping, or - None - """ raise NotImplementedError diff --git a/lib/matplotlib/backends/backend_agg.py b/lib/matplotlib/backends/backend_agg.py index f36ed245f62a..eb8044bb2974 100644 --- a/lib/matplotlib/backends/backend_agg.py +++ b/lib/matplotlib/backends/backend_agg.py @@ -250,7 +250,7 @@ def restore_region(self, region, bbox=None, xy=None): >>> x1, y1, x2, y2 = region.get_extents() >>> renderer.restore_region(region, bbox=(x1+dx, y1, x2, y2), xy=(x1-dx, y1)) - + """ if bbox is not None or xy is not None: if bbox is None: diff --git a/lib/matplotlib/backends/backend_cairo.py b/lib/matplotlib/backends/backend_cairo.py index 98d892609f2b..5f76d9afdde1 100644 --- a/lib/matplotlib/backends/backend_cairo.py +++ b/lib/matplotlib/backends/backend_cairo.py @@ -151,10 +151,12 @@ def draw_path(self, gc, path, transform, rgbFace=None): self._fill_and_stroke(ctx, rgbFace, gc.get_alpha()) - def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None): + def draw_image(self, gc, x, y, im): # bbox - not currently used if _debug: print '%s.%s()' % (self.__class__.__name__, _fn_name()) + clippath, clippath_trans = gc.get_clip_path() + im.flipud_out() rows, cols, buf = im.color_conv (BYTE_FORMAT) diff --git a/lib/matplotlib/backends/backend_gdk.py b/lib/matplotlib/backends/backend_gdk.py index 9e8c66eca8fb..dfcdc4d28bfd 100644 --- a/lib/matplotlib/backends/backend_gdk.py +++ b/lib/matplotlib/backends/backend_gdk.py @@ -97,7 +97,9 @@ def draw_path(self, gc, path, transform, rgbFace=None): if gc.gdkGC.line_width > 0: self.gdkDrawable.draw_lines(gc.gdkGC, polygon) - def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None): + def draw_image(self, gc, x, y, im): + bbox = gc.get_clip_rectangle() + if bbox != None: l,b,w,h = bbox.bounds #rectangle = (int(l), self.height-int(b+h), diff --git a/lib/matplotlib/backends/backend_macosx.py b/lib/matplotlib/backends/backend_macosx.py index 41379c230241..89b443ed3873 100644 --- a/lib/matplotlib/backends/backend_macosx.py +++ b/lib/matplotlib/backends/backend_macosx.py @@ -59,12 +59,19 @@ def draw_markers(self, gc, marker_path, marker_trans, path, trans, rgbFace=None) gc.draw_markers(marker_path, marker_trans, path, trans, rgbFace) def draw_path_collection(self, *args): - gc = self.gc - args = args[:13] + # TODO: We should change this in the C code eventually, but this + # re-ordering of arguments should work for now + gc = args[0] + args = tuple([gc, args[1], gc.get_clip_rectangle()] + \ + list(gc.get_clip_path()) + list(args[2:])) gc.draw_path_collection(*args) def draw_quad_mesh(self, *args): - gc = self.gc + # TODO: We should change this in the C code eventually, but this + # re-ordering of arguments should work for now + gc = args[0] + args = [gc, args[1], gc.get_clip_rectangle()] + \ + list(gc.get_clip_path()) + list(args[2:]) gc.draw_quad_mesh(*args) def new_gc(self): @@ -72,12 +79,15 @@ def new_gc(self): self.gc.set_hatch(None) return self.gc - def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None): + def draw_image(self, gc, x, y, im): + # TODO: We should change this in the C code eventually, but this + # re-ordering of arguments should work for now im.flipud_out() nrows, ncols, data = im.as_rgba_str() - self.gc.draw_image(x, y, nrows, ncols, data, bbox, clippath, clippath_trans) + gc.draw_image(x, y, nrows, ncols, data, gc.get_clip_rectangle(), + *gc.get_clip_path()) im.flipud_out() - + def draw_tex(self, gc, x, y, s, prop, angle): # todo, handle props, angle, origins size = prop.get_size_in_points() @@ -128,7 +138,7 @@ def get_text_width_height_descent(self, s, prop, ismath): def flipy(self): return False - + def points_to_pixels(self, points): return points/72.0 * self.dpi @@ -168,7 +178,7 @@ def set_clip_path(self, path): _macosx.GraphicsContext.set_clip_path(self, path) ######################################################################## -# +# # The following functions and classes are for pylab and implement # window/figure managers, etc... # @@ -281,7 +291,7 @@ def __init__(self, canvas, num): self.toolbar = NavigationToolbar2Mac(canvas) else: self.toolbar = None - if self.toolbar is not None: + if self.toolbar is not None: self.toolbar.update() def notify_axes_change(fig): @@ -300,7 +310,7 @@ def close(self): Gcf.destroy(self.num) class NavigationToolbarMac(_macosx.NavigationToolbar): - + def __init__(self, canvas): self.canvas = canvas basedir = os.path.join(matplotlib.rcParams['datapath'], "images") @@ -331,7 +341,7 @@ def _read_ppm_image(self, filename): assert magic=="P6" assert len(imagedata)==width*height*3 # 3 colors in RGB return (width, height, imagedata) - + def panx(self, direction): axes = self.canvas.figure.axes selected = self.get_active() @@ -401,9 +411,9 @@ def set_message(self, message): _macosx.NavigationToolbar2.set_message(self, message.encode('utf-8')) ######################################################################## -# +# # Now just provide the standard names that backend.__init__ is expecting -# +# ######################################################################## diff --git a/lib/matplotlib/backends/backend_mixed.py b/lib/matplotlib/backends/backend_mixed.py index 94b00170883d..fcc816c52f8e 100644 --- a/lib/matplotlib/backends/backend_mixed.py +++ b/lib/matplotlib/backends/backend_mixed.py @@ -14,7 +14,7 @@ def __init__(self, figure, width, height, dpi, vector_renderer, raster_renderer_class=None, bbox_inches_restore=None): """ - figure: The figure instance. + figure: The figure instance. width: The width of the canvas in logical units @@ -49,7 +49,7 @@ def __init__(self, figure, width, height, dpi, vector_renderer, self.figure=figure self._bbox_inches_restore = bbox_inches_restore - + self._set_current_renderer(vector_renderer) _methods = """ @@ -88,8 +88,8 @@ def start_rasterizing(self): mode="png") self._bbox_inches_restore = r - - + + if self._rasterizing == 0: self._raster_renderer = self._raster_renderer_class( self._width*self.dpi, self._height*self.dpi, self.dpi) @@ -117,9 +117,12 @@ def stop_rasterizing(self): image = frombuffer(buffer, w, h, True) image.is_grayscale = False image.flipud_out() - self._renderer.draw_image(int(float(l)/self.dpi*72.), - int((float(height) - b - h)/self.dpi*72.), - image, None) + gc = self._renderer.new_gc() + self._renderer.draw_image( + gc, + int(float(l)/self.dpi*72.), + int((float(height) - b - h)/self.dpi*72.), + image) self._raster_renderer = None self._rasterizing = False diff --git a/lib/matplotlib/backends/backend_pdf.py b/lib/matplotlib/backends/backend_pdf.py index 763cc1678019..bcf7c72ea625 100644 --- a/lib/matplotlib/backends/backend_pdf.py +++ b/lib/matplotlib/backends/backend_pdf.py @@ -1286,13 +1286,7 @@ def merge_used_characters(self, other): def get_image_magnification(self): return self.image_dpi/72.0 - def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None): - gc = self.new_gc() - if bbox is not None: - gc.set_clip_rectangle(bbox) - if clippath is not None: - clippath = TransformedPath(clippath, clippath_trans) - gc.set_clip_path(clippath) + def draw_image(self, gc, x, y, im): self.check_gc(gc) h, w = im.get_size_out() diff --git a/lib/matplotlib/backends/backend_ps.py b/lib/matplotlib/backends/backend_ps.py index 06207d304691..8d807902d752 100644 --- a/lib/matplotlib/backends/backend_ps.py +++ b/lib/matplotlib/backends/backend_ps.py @@ -374,7 +374,7 @@ def get_image_magnification(self): """ return self.image_magnification - def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None): + def draw_image(self, gc, x, y, im): """ Draw the Image instance into the current axes; x is the distance in pixels from the left hand side of the canvas and y @@ -400,6 +400,9 @@ def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None): figh = self.height*72 #print 'values', origin, flipud, figh, h, y + bbox = gc.get_clip_rectangle() + clippath, clippath_trans = gc.get_clip_path() + clip = [] if bbox is not None: clipx,clipy,clipw,cliph = bbox.bounds @@ -504,10 +507,9 @@ def draw_markers(self, gc, marker_path, marker_trans, path, trans, rgbFace=None) ps = '\n'.join(ps_cmd) self._draw_ps(ps, gc, rgbFace, fill=False, stroke=False) - def draw_path_collection(self, master_transform, cliprect, clippath, - clippath_trans, paths, all_transforms, offsets, - offsetTrans, facecolors, edgecolors, linewidths, - linestyles, antialiaseds, urls): + def draw_path_collection(self, gc, master_transform, paths, all_transforms, + offsets, offsetTrans, facecolors, edgecolors, + linewidths, linestyles, antialiaseds, urls): write = self._pswriter.write path_codes = [] @@ -521,13 +523,11 @@ def draw_path_collection(self, master_transform, cliprect, clippath, write('\n'.join(ps_cmd)) path_codes.append(name) - for xo, yo, path_id, gc, rgbFace in self._iter_collection( - path_codes, cliprect, clippath, clippath_trans, - offsets, offsetTrans, facecolors, edgecolors, + for xo, yo, path_id, gc0, rgbFace in self._iter_collection( + gc, path_codes, offsets, offsetTrans, facecolors, edgecolors, linewidths, linestyles, antialiaseds, urls): - ps = "%g %g %s" % (xo, yo, path_id) - self._draw_ps(ps, gc, rgbFace) + self._draw_ps(ps, gc0, rgbFace) self._path_collection_id += 1 @@ -964,7 +964,7 @@ def _print_figure(self, outfile, format, dpi=72, facecolor='w', edgecolor='w', class NullWriter(object): def write(self, *kl, **kwargs): pass - + self._pswriter = NullWriter() else: self._pswriter = StringIO() @@ -1096,7 +1096,7 @@ def _print_figure_tex(self, outfile, format, dpi, facecolor, edgecolor, class NullWriter(object): def write(self, *kl, **kwargs): pass - + self._pswriter = NullWriter() else: self._pswriter = StringIO() diff --git a/lib/matplotlib/backends/backend_svg.py b/lib/matplotlib/backends/backend_svg.py index d9e1c4d3355f..97040f925c7b 100644 --- a/lib/matplotlib/backends/backend_svg.py +++ b/lib/matplotlib/backends/backend_svg.py @@ -262,10 +262,9 @@ def draw_markers(self, gc, marker_path, marker_trans, path, trans, rgbFace=None) self._svgwriter.write ('\n' % (style, details)) write('') - def draw_path_collection(self, master_transform, cliprect, clippath, - clippath_trans, paths, all_transforms, offsets, - offsetTrans, facecolors, edgecolors, linewidths, - linestyles, antialiaseds, urls): + def draw_path_collection(self, gc, master_transform, paths, all_transforms, + offsets, offsetTrans, facecolors, edgecolors, + linewidths, linestyles, antialiaseds, urls): write = self._svgwriter.write path_codes = [] @@ -280,18 +279,17 @@ def draw_path_collection(self, master_transform, cliprect, clippath, path_codes.append(name) write('\n') - for xo, yo, path_id, gc, rgbFace in self._iter_collection( - path_codes, cliprect, clippath, clippath_trans, - offsets, offsetTrans, facecolors, edgecolors, + for xo, yo, path_id, gc0, rgbFace in self._iter_collection( + gc, path_codes, offsets, offsetTrans, facecolors, edgecolors, linewidths, linestyles, antialiaseds, urls): - clipid = self._get_gc_clip_svg(gc) - url = gc.get_url() + clipid = self._get_gc_clip_svg(gc0) + url = gc0.get_url() if url is not None: self._svgwriter.write('' % url) if clipid is not None: write('' % clipid) details = 'xlink:href="#%s" x="%f" y="%f"' % (path_id, xo, self.height - yo) - style = self._get_style(gc, rgbFace) + style = self._get_style(gc0, rgbFace) self._svgwriter.write ('\n' % (style, details)) if clipid is not None: write('') @@ -300,7 +298,7 @@ def draw_path_collection(self, master_transform, cliprect, clippath, self._path_collection_id += 1 - def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None): + def draw_image(self, gc, x, y, im): # MGDTODO: Support clippath here trans = [1,0,0,1,0,0] transstr = '' @@ -643,7 +641,7 @@ def _print_svg(self, filename, svgwriter, fh_to_close=None, **kwargs): # the problem. I hope someone who knows the svg backends # take a look at this problem. Meanwhile, the dpi # parameter is ignored and image_dpi is fixed at 72. - JJL - + #image_dpi = kwargs.pop("dpi", 72) image_dpi = 72 _bbox_inches_restore = kwargs.pop("bbox_inches_restore", None) diff --git a/lib/matplotlib/backends/backend_template.py b/lib/matplotlib/backends/backend_template.py index a8b0f3625556..f29b144793ed 100644 --- a/lib/matplotlib/backends/backend_template.py +++ b/lib/matplotlib/backends/backend_template.py @@ -87,22 +87,21 @@ def draw_path(self, gc, path, transform, rgbFace=None): # draw_path_collection is optional, and we get more correct # relative timings by leaving it out. backend implementers concerned with # performance will probably want to implement it -# def draw_path_collection(self, master_transform, cliprect, clippath, -# clippath_trans, paths, all_transforms, offsets, -# offsetTrans, facecolors, edgecolors, linewidths, -# linestyles, antialiaseds): +# def draw_path_collection(self, gc, master_transform, paths, +# all_transforms, offsets, offsetTrans, facecolors, +# edgecolors, linewidths, linestyles, +# antialiaseds): # pass # draw_quad_mesh is optional, and we get more correct # relative timings by leaving it out. backend implementers concerned with # performance will probably want to implement it -# def draw_quad_mesh(self, master_transform, cliprect, clippath, -# clippath_trans, meshWidth, meshHeight, coordinates, -# offsets, offsetTrans, facecolors, antialiased, -# showedges): +# def draw_quad_mesh(self, gc, master_transform, meshWidth, meshHeight, +# coordinates, offsets, offsetTrans, facecolors, +# antialiased, showedges): # pass - def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None): + def draw_image(self, gc, x, y, im): pass def draw_text(self, gc, x, y, s, prop, angle, ismath=False): diff --git a/lib/matplotlib/backends/backend_wx.py b/lib/matplotlib/backends/backend_wx.py index 8e2e7eeb5cdf..03b4acc7e9ba 100644 --- a/lib/matplotlib/backends/backend_wx.py +++ b/lib/matplotlib/backends/backend_wx.py @@ -361,7 +361,8 @@ def draw_path(self, gc, path, transform, rgbFace=None): gfx_ctx.StrokePath(wxpath) gc.unselect() - def draw_image(self, x, y, im, bbox, clippath=None, clippath_trans=None): + def draw_image(self, gc, x, y, im): + bbox = gc.get_clip_rectangle() if bbox != None: l,b,w,h = bbox.bounds else: @@ -776,7 +777,7 @@ def do_nothing(*args, **kwargs): bind(self, wx.EVT_MIDDLE_DOWN, self._onMiddleButtonDown) bind(self, wx.EVT_MIDDLE_DCLICK, self._onMiddleButtonDown) bind(self, wx.EVT_MIDDLE_UP, self._onMiddleButtonUp) - + self.SetBackgroundStyle(wx.BG_STYLE_CUSTOM) self.macros = {} # dict from wx id to seq of macros @@ -1257,7 +1258,7 @@ def _onLeftButtonUp(self, evt): if self.HasCapture(): self.ReleaseMouse() FigureCanvasBase.button_release_event(self, x, y, 1, guiEvent=evt) - #Add middle button events + #Add middle button events def _onMiddleButtonDown(self, evt): """Start measuring on an axis.""" x = evt.GetX() diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index ba08d986f8d2..ce0b1caef841 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -204,18 +204,16 @@ def draw(self, renderer): self.update_scalarmappable() - clippath, clippath_trans = self.get_transformed_clip_path_and_affine() - if clippath_trans is not None: - clippath_trans = clippath_trans.frozen() - transform, transOffset, offsets, paths = self._prepare_points() + gc = renderer.new_gc() + gc.set_clip_rectangle(self.get_clip_box()) + gc.set_clip_path(self.get_clip_path()) + renderer.draw_path_collection( - transform.frozen(), self.clipbox, clippath, clippath_trans, - paths, self.get_transforms(), - offsets, transOffset, - self.get_facecolor(), self.get_edgecolor(), self._linewidths, - self._linestyles, self._antialiaseds, self._urls) + gc, transform.frozen(), paths, self.get_transforms(), + offsets, transOffset, self.get_facecolor(), self.get_edgecolor(), + self._linewidths, self._linestyles, self._antialiaseds, self._urls) renderer.close_group(self.__class__.__name__) def contains(self, mouseevent): @@ -1149,10 +1147,6 @@ def draw(self, renderer): if self.check_update('array'): self.update_scalarmappable() - clippath, clippath_trans = self.get_transformed_clip_path_and_affine() - if clippath_trans is not None: - clippath_trans = clippath_trans.frozen() - if not transform.is_affine: coordinates = self._coordinates.reshape( (self._coordinates.shape[0] * @@ -1168,11 +1162,14 @@ def draw(self, renderer): offsets = transOffset.transform_non_affine(offsets) transOffset = transOffset.get_affine() + gc = renderer.new_gc() + gc.set_clip_rectangle(self.get_clip_box()) + gc.set_clip_path(self.get_clip_path()) + renderer.draw_quad_mesh( - transform.frozen(), self.clipbox, clippath, clippath_trans, - self._meshWidth, self._meshHeight, coordinates, - offsets, transOffset, self.get_facecolor(), self._antialiased, - self._showedges) + gc, transform.frozen(), self._meshWidth, self._meshHeight, + coordinates, offsets, transOffset, self.get_facecolor(), + self._antialiased, self._showedges) renderer.close_group(self.__class__.__name__) diff --git a/lib/matplotlib/figure.py b/lib/matplotlib/figure.py index 46f21bc3e6e2..36e20eee2a84 100644 --- a/lib/matplotlib/figure.py +++ b/lib/matplotlib/figure.py @@ -766,9 +766,10 @@ def draw(self, renderer): im.is_grayscale = False l, b, w, h = self.bbox.bounds - clippath, affine = self.get_transformed_clip_path_and_affine() - renderer.draw_image(l, b, im, self.bbox, - clippath, affine) + gc = renderer.new_gc() + gc.set_clip_rectangle(self.bbox) + gc.set_clip_path(self.get_clip_path()) + renderer.draw_image(gc, l, b, im) # render the axes for a in self.axes: a.draw(renderer) @@ -851,7 +852,7 @@ def legend(self, handles, labels, *args, **kwargs): *fancybox*: [ None | False | True ] if True, draw a frame with a round fancybox. If None, use rc - + *shadow*: [ None | False | True ] If *True*, draw a shadow behind legend. If *None*, use rc settings. diff --git a/lib/matplotlib/font_manager.py b/lib/matplotlib/font_manager.py index b65190dd3371..3685ecfc0b8e 100644 --- a/lib/matplotlib/font_manager.py +++ b/lib/matplotlib/font_manager.py @@ -707,7 +707,7 @@ def _parse_fontconfig_pattern(self, pattern): def __hash__(self): l = [(k, getattr(self, "get" + k)()) for k in sorted(self.__dict__)] return hash(repr(l)) - + def __str__(self): return self.get_fontconfig_pattern() diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index b4c1441ed7fe..61697ada8846 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -235,9 +235,10 @@ def draw(self, renderer, *args, **kwargs): im = self.make_image(renderer.get_image_magnification()) im._url = self.get_url() l, b, widthDisplay, heightDisplay = self.axes.bbox.bounds - clippath, affine = self.get_transformed_clip_path_and_affine() - renderer.draw_image(round(l), round(b), im, self.axes.bbox.frozen(), - clippath, affine) + gc = renderer.new_gc() + gc.set_clip_rectangle(self.axes.bbox.frozen()) + gc.set_clip_path(self.get_clip_path()) + renderer.draw_image(gc, round(l), round(b), im) def contains(self, mouseevent): """ @@ -576,11 +577,13 @@ def make_image(self, magnification=1.0): def draw(self, renderer, *args, **kwargs): if not self.get_visible(): return im = self.make_image(renderer.get_image_magnification()) - renderer.draw_image(round(self.axes.bbox.xmin), + gc = renderer.new_gc() + gc.set_clip_rectangle(self.axes.bbox.frozen()) + gc.set_clip_path(self.get_clip_path()) + renderer.draw_image(gc, + round(self.axes.bbox.xmin), round(self.axes.bbox.ymin), - im, - self.axes.bbox.frozen(), - *self.get_transformed_clip_path_and_affine()) + im) def set_data(self, x, y, A): @@ -730,8 +733,10 @@ def draw(self, renderer, *args, **kwargs): if not self.get_visible(): return # todo: we should be able to do some cacheing here im = self.make_image(renderer.get_image_magnification()) - renderer.draw_image(round(self.ox), round(self.oy), im, self.figure.bbox, - *self.get_transformed_clip_path_and_affine()) + gc = renderer.new_gc() + gc.set_clip_rectangle(self.figure.bbox) + gc.set_clip_path(self.get_clip_path()) + renderer.draw_image(gc, round(self.ox), round(self.oy), im) def write_png(self, fname): """Write the image to png file with fname""" diff --git a/src/_backend_agg.cpp b/src/_backend_agg.cpp index 24a018d59b1a..5ce590ce38e9 100644 --- a/src/_backend_agg.cpp +++ b/src/_backend_agg.cpp @@ -31,6 +31,7 @@ #include "agg_span_image_filter_rgba.h" #include "agg_span_interpolator_linear.h" #include "agg_span_pattern_rgba.h" +#include "agg_span_gouraud_rgba.h" #include "agg_conv_shorten_path.h" #include "util/agg_color_conv_rgb8.h" @@ -799,23 +800,17 @@ Py::Object RendererAgg::draw_image(const Py::Tuple& args) { _VERBOSE("RendererAgg::draw_image"); - args.verify_length(4, 6); + args.verify_length(4); - double x = Py::Float(args[0]); - double y = Py::Float(args[1]); - Image *image = static_cast(args[2].ptr()); - Py::Object box_obj = args[3]; - Py::Object clippath; - agg::trans_affine clippath_trans; + GCAgg gc(args[0], dpi); + double x = Py::Float(args[1]); + double y = Py::Float(args[2]); + Image *image = static_cast(args[3].ptr()); bool has_clippath = false; theRasterizer.reset_clipping(); rendererBase.reset_clipping(true); - if (args.size() == 6) { - clippath = args[4]; - clippath_trans = py_to_agg_transformation_matrix(args[5].ptr(), false); - has_clippath = render_clippath(clippath, clippath_trans); - } + has_clippath = render_clippath(gc.clippath, gc.clippath_trans); Py::Tuple empty; image->flipud_out(empty); @@ -855,7 +850,7 @@ RendererAgg::draw_image(const Py::Tuple& args) { theRasterizer.add_path(rect2); agg::render_scanlines(theRasterizer, slineP8, ri); } else { - set_clipbox(box_obj, rendererBase); + set_clipbox(gc.cliprect, rendererBase); rendererBase.blend_from(pixf, 0, (int)x, (int)(height-(y+image->rowsOut))); } @@ -1026,15 +1021,13 @@ RendererAgg::draw_path(const Py::Tuple& args) { _VERBOSE("RendererAgg::draw_path"); args.verify_length(3, 4); - Py::Object gc_obj = args[0]; - Py::Object path_obj = args[1]; + GCAgg gc(args[0], dpi); + PathIterator path(args[1]); agg::trans_affine trans = py_to_agg_transformation_matrix(args[2].ptr()); Py::Object face_obj; if (args.size() == 4) face_obj = args[3]; - PathIterator path(path_obj); - GCAgg gc = GCAgg(gc_obj, dpi); facepair_t face = _get_rgba_face(face_obj, gc.alpha); theRasterizer.reset_clipping(); @@ -1275,32 +1268,29 @@ class PathListGenerator { Py::Object RendererAgg::draw_path_collection(const Py::Tuple& args) { _VERBOSE("RendererAgg::draw_path_collection"); - args.verify_length(14); + args.verify_length(12); - //segments, trans, clipbox, colors, linewidths, antialiaseds - agg::trans_affine master_transform = py_to_agg_transformation_matrix(args[0].ptr()); - Py::Object cliprect = args[1]; - Py::Object clippath = args[2]; - agg::trans_affine clippath_trans = py_to_agg_transformation_matrix(args[3].ptr(), false); - Py::SeqBase paths = args[4]; - Py::SeqBase transforms_obj = args[5]; - Py::Object offsets_obj = args[6]; - agg::trans_affine offset_trans = py_to_agg_transformation_matrix(args[7].ptr()); - Py::Object facecolors_obj = args[8]; - Py::Object edgecolors_obj = args[9]; - Py::SeqBase linewidths = args[10]; - Py::SeqBase linestyles_obj = args[11]; - Py::SeqBase antialiaseds = args[12]; + GCAgg gc(args[0], dpi); + agg::trans_affine master_transform = py_to_agg_transformation_matrix(args[1].ptr()); + PathListGenerator paths(args[2]); + Py::SeqBase transforms_obj = args[3]; + Py::Object offsets_obj = args[4]; + agg::trans_affine offset_trans = py_to_agg_transformation_matrix(args[5].ptr()); + Py::Object facecolors_obj = args[6]; + Py::Object edgecolors_obj = args[7]; + Py::SeqBase linewidths = args[8]; + Py::SeqBase linestyles_obj = args[9]; + Py::SeqBase antialiaseds = args[10]; // We don't actually care about urls for Agg, so just ignore it. - // Py::SeqBase urls = args[13]; + // Py::SeqBase urls = args[11]; PathListGenerator path_generator(paths); try { _draw_path_collection_generic (master_transform, - cliprect, - clippath, - clippath_trans, + gc.cliprect, + gc.clippath, + gc.clippath_trans, path_generator, transforms_obj, offsets_obj, @@ -1390,22 +1380,20 @@ class QuadMeshGenerator { Py::Object RendererAgg::draw_quad_mesh(const Py::Tuple& args) { _VERBOSE("RendererAgg::draw_quad_mesh"); - args.verify_length(12); + args.verify_length(10); //segments, trans, clipbox, colors, linewidths, antialiaseds - agg::trans_affine master_transform = py_to_agg_transformation_matrix(args[0].ptr()); - Py::Object cliprect = args[1]; - Py::Object clippath = args[2]; - agg::trans_affine clippath_trans = py_to_agg_transformation_matrix(args[3].ptr(), false); - size_t mesh_width = Py::Int(args[4]); - size_t mesh_height = Py::Int(args[5]); - PyObject* coordinates = args[6].ptr(); - Py::Object offsets_obj = args[7]; - agg::trans_affine offset_trans = py_to_agg_transformation_matrix(args[8].ptr()); - Py::Object facecolors_obj = args[9]; - bool antialiased = (bool)Py::Int(args[10]); - bool showedges = (bool)Py::Int(args[11]); + GCAgg gc(args[0], dpi); + agg::trans_affine master_transform = py_to_agg_transformation_matrix(args[1].ptr()); + size_t mesh_width = Py::Int(args[2]); + size_t mesh_height = Py::Int(args[3]); + PyObject* coordinates = args[4].ptr(); + Py::Object offsets_obj = args[5]; + agg::trans_affine offset_trans = py_to_agg_transformation_matrix(args[6].ptr()); + Py::Object facecolors_obj = args[7]; + bool antialiased = (bool)Py::Int(args[8]); + bool showedges = (bool)Py::Int(args[9]); bool free_edgecolors = false; QuadMeshGenerator path_generator(mesh_width, mesh_height, coordinates); @@ -1437,9 +1425,9 @@ RendererAgg::draw_quad_mesh(const Py::Tuple& args) { try { _draw_path_collection_generic (master_transform, - cliprect, - clippath, - clippath_trans, + gc.cliprect, + gc.clippath, + gc.clippath_trans, path_generator, transforms_obj, offsets_obj, @@ -1466,6 +1454,73 @@ RendererAgg::draw_quad_mesh(const Py::Tuple& args) { return Py::Object(); } +Py::Object +RendererAgg::draw_gouraud_triangle(const Py::Tuple& args) { + _VERBOSE("RendererAgg::draw_quad_mesh"); + args.verify_length(4); + + typedef agg::rgba8 color_t; + typedef agg::span_gouraud_rgba span_gen_t; + typedef agg::span_allocator span_alloc_t; + + //segments, trans, clipbox, colors, linewidths, antialiaseds + GCAgg gc(args[0], dpi); + Py::Object points_obj = args[1]; + Py::Object colors_obj = args[2]; + agg::trans_affine master_transform = py_to_agg_transformation_matrix(args[3].ptr()); + + PyArrayObject* points = (PyArrayObject*)PyArray_ContiguousFromAny + (points_obj.ptr(), PyArray_DOUBLE, 2, 2); + if (!points || + PyArray_DIM(points, 0) != 3 || PyArray_DIM(points, 1) != 2) + throw Py::ValueError("points must be a 3x2 numpy array"); + + PyArrayObject* colors = (PyArrayObject*)PyArray_ContiguousFromAny + (colors_obj.ptr(), PyArray_DOUBLE, 2, 2); + if (!colors || + PyArray_DIM(colors, 0) != 3 || PyArray_DIM(colors, 1) != 4) + throw Py::ValueError("colors must be a 3x4 numpy array"); + + try { + double* opoints = (double*)PyArray_DATA(points); + double* c = (double*)PyArray_DATA(colors); + double tpoints[6]; + + for (int i = 0; i < 6; i += 2) { + tpoints[i] = opoints[i]; + tpoints[i+1] = opoints[i+1]; + master_transform.transform(&tpoints[i], &tpoints[i+1]); + } + + span_alloc_t span_alloc; + span_gen_t span_gen; + + span_gen.colors( + agg::rgba(c[0], c[1], c[2], c[3]), + agg::rgba(c[4], c[5], c[6], c[7]), + agg::rgba(c[8], c[9], c[10], c[11])); + span_gen.triangle( + tpoints[0], tpoints[1], + tpoints[2], tpoints[3], + tpoints[4], tpoints[5], + 1.0); + + theRasterizer.add_path(span_gen); + agg::render_scanlines_aa( + theRasterizer, slineP8, rendererBase, span_alloc, span_gen); + } catch (...) { + Py_DECREF(points); + Py_DECREF(colors); + + throw; + } + + Py_DECREF(points); + Py_DECREF(colors); + + return Py::Object(); +} + Py::Object RendererAgg::write_rgba(const Py::Tuple& args) { _VERBOSE("RendererAgg::write_rgba"); @@ -1802,15 +1857,17 @@ void RendererAgg::init_type() add_varargs_method("draw_path", &RendererAgg::draw_path, "draw_path(gc, path, transform, rgbFace)\n"); add_varargs_method("draw_path_collection", &RendererAgg::draw_path_collection, - "draw_path_collection(master_transform, cliprect, clippath, clippath_trans, paths, transforms, offsets, offsetTrans, facecolors, edgecolors, linewidths, linestyles, antialiaseds)\n"); + "draw_path_collection(gc, master_transform, paths, transforms, offsets, offsetTrans, facecolors, edgecolors, linewidths, linestyles, antialiaseds)\n"); add_varargs_method("draw_quad_mesh", &RendererAgg::draw_quad_mesh, - "draw_quad_mesh(master_transform, cliprect, clippath, clippath_trans, meshWidth, meshHeight, coordinates, offsets, offsetTrans, facecolors, antialiaseds, showedges)\n"); + "draw_quad_mesh(gc, master_transform, meshWidth, meshHeight, coordinates, offsets, offsetTrans, facecolors, antialiaseds, showedges)\n"); + add_varargs_method("draw_gouraud_triangle", &RendererAgg::draw_gouraud_triangle, + "draw_gouraud_triangle(gc, points, colors, master_transform)\n"); add_varargs_method("draw_markers", &RendererAgg::draw_markers, "draw_markers(gc, marker_path, marker_trans, path, rgbFace)\n"); add_varargs_method("draw_text_image", &RendererAgg::draw_text_image, "draw_text_image(font_image, x, y, r, g, b, a)\n"); add_varargs_method("draw_image", &RendererAgg::draw_image, - "draw_image(x, y, im)"); + "draw_image(gc, x, y, im)"); add_varargs_method("write_rgba", &RendererAgg::write_rgba, "write_rgba(fname)"); add_varargs_method("tostring_rgb", &RendererAgg::tostring_rgb, diff --git a/src/_backend_agg.h b/src/_backend_agg.h index f6cc8920f068..ced59ca1760a 100644 --- a/src/_backend_agg.h +++ b/src/_backend_agg.h @@ -164,7 +164,7 @@ class RendererAgg: public Py::PythonExtension { Py::Object draw_path(const Py::Tuple & args); Py::Object draw_path_collection(const Py::Tuple & args); Py::Object draw_quad_mesh(const Py::Tuple& args); - + Py::Object draw_gouraud_triangle(const Py::Tuple& args); Py::Object write_rgba(const Py::Tuple & args); Py::Object tostring_rgb(const Py::Tuple & args); From f7d3900f748807131c39b9368cddf1ab5410eccc Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Fri, 7 Aug 2009 18:31:45 +0000 Subject: [PATCH 0045/1000] Experimental Gouraud shading support in the Agg backend. svn path=/trunk/matplotlib/; revision=7418 --- examples/pylab_examples/quadmesh_demo.py | 2 +- lib/matplotlib/axes.py | 13 +++-- lib/matplotlib/backend_bases.py | 8 ++++ lib/matplotlib/backends/backend_agg.py | 1 + lib/matplotlib/collections.py | 61 ++++++++++++++++++++++-- src/_backend_agg.cpp | 15 +++--- 6 files changed, 83 insertions(+), 17 deletions(-) diff --git a/examples/pylab_examples/quadmesh_demo.py b/examples/pylab_examples/quadmesh_demo.py index c8745b6499ba..597eb8ec6e14 100644 --- a/examples/pylab_examples/quadmesh_demo.py +++ b/examples/pylab_examples/quadmesh_demo.py @@ -28,7 +28,7 @@ fig = figure() ax = fig.add_subplot(121) ax.set_axis_bgcolor("#bdb76b") -ax.pcolormesh(Qx,Qz,Z) +ax.pcolormesh(Qx,Qz,Z, shading='gouraud') ax.set_title('Without masked values') ax = fig.add_subplot(122) diff --git a/lib/matplotlib/axes.py b/lib/matplotlib/axes.py index 36ae91bd19fa..3d1bdaeac913 100644 --- a/lib/matplotlib/axes.py +++ b/lib/matplotlib/axes.py @@ -6543,7 +6543,7 @@ def pcolormesh(self, *args, **kwargs): and max of the color array *C* is used. If you pass a *norm* instance, *vmin* and *vmax* will be ignored. - *shading*: [ 'flat' | 'faceted' ] + *shading*: [ 'flat' | 'faceted' | 'gouraud' ] If 'faceted', a black grid is drawn around each rectangle; if 'flat', edges are not drawn. Default is 'flat', contrary to Matlab(TM). @@ -6584,7 +6584,7 @@ def pcolormesh(self, *args, **kwargs): cmap = kwargs.pop('cmap', None) vmin = kwargs.pop('vmin', None) vmax = kwargs.pop('vmax', None) - shading = kwargs.pop('shading', 'flat') + shading = kwargs.pop('shading', 'flat').lower() edgecolors = kwargs.pop('edgecolors', 'None') antialiased = kwargs.pop('antialiased', False) @@ -6592,8 +6592,11 @@ def pcolormesh(self, *args, **kwargs): Ny, Nx = X.shape # convert to one dimensional arrays - C = ma.ravel(C[0:Ny-1, 0:Nx-1]) # data point in each cell is value at - # lower left corner + if shading != 'gouraud': + C = ma.ravel(C[0:Ny-1, 0:Nx-1]) # data point in each cell is value at + # lower left corner + else: + C = C.ravel() X = X.ravel() Y = Y.ravel() @@ -6608,7 +6611,7 @@ def pcolormesh(self, *args, **kwargs): collection = mcoll.QuadMesh( Nx - 1, Ny - 1, coords, showedges, - antialiased=antialiased) # kwargs are not used + antialiased=antialiased, shading=shading) # kwargs are not used collection.set_alpha(alpha) collection.set_array(C) if norm is not None: assert(isinstance(norm, mcolors.Normalize)) diff --git a/lib/matplotlib/backend_bases.py b/lib/matplotlib/backend_bases.py index 57aeb65264b9..75133ff596a9 100644 --- a/lib/matplotlib/backend_bases.py +++ b/lib/matplotlib/backend_bases.py @@ -166,6 +166,14 @@ def draw_quad_mesh(self, gc, master_transform, meshWidth, meshHeight, gc, master_transform, paths, [], offsets, offsetTrans, facecolors, edgecolors, linewidths, [], [antialiased], [None]) + def draw_gouraud_triangle(self, gc, points, colors, transform): + """ + Draw a Gouraud-shaded triangle. + + EXPERIMENTAL + """ + raise NotImplementedError + def _iter_collection_raw_paths(self, master_transform, paths, all_transforms): """ diff --git a/lib/matplotlib/backends/backend_agg.py b/lib/matplotlib/backends/backend_agg.py index eb8044bb2974..94662d60a24d 100644 --- a/lib/matplotlib/backends/backend_agg.py +++ b/lib/matplotlib/backends/backend_agg.py @@ -63,6 +63,7 @@ def __init__(self, width, height, dpi): self.draw_markers = self._renderer.draw_markers self.draw_path_collection = self._renderer.draw_path_collection self.draw_quad_mesh = self._renderer.draw_quad_mesh + self.draw_gouraud_triangle = self._renderer.draw_gouraud_triangle self.draw_image = self._renderer.draw_image self.copy_from_bbox = self._renderer.copy_from_bbox self.tostring_rgba_minimized = self._renderer.tostring_rgba_minimized diff --git a/lib/matplotlib/collections.py b/lib/matplotlib/collections.py index ce0b1caef841..c6cd0e6c5d71 100644 --- a/lib/matplotlib/collections.py +++ b/lib/matplotlib/collections.py @@ -1073,14 +1073,18 @@ class QuadMesh(Collection): coordinates of the vertex at mesh coordinates (0, 0), then the one at (0, 1), then at (0, 2) .. (0, meshWidth), (1, 0), (1, 1), and so on. + + *shading* may be 'flat', 'faceted' or 'gouraud' """ - def __init__(self, meshWidth, meshHeight, coordinates, showedges, antialiased=True): + def __init__(self, meshWidth, meshHeight, coordinates, showedges, + antialiased=True, shading='flat'): Collection.__init__(self) self._meshWidth = meshWidth self._meshHeight = meshHeight self._coordinates = coordinates self._showedges = showedges self._antialiased = antialiased + self._shading = shading self._bbox = transforms.Bbox.unit() self._bbox.update_from_data_xy(coordinates.reshape( @@ -1125,6 +1129,46 @@ def convert_mesh_to_paths(meshWidth, meshHeight, coordinates): points = points.reshape((meshWidth * meshHeight, 5, 2)) return [Path(x) for x in points] + def convert_mesh_to_triangles(self, meshWidth, meshHeight, coordinates): + """ + Converts a given mesh into a sequence of triangles, each point + with its own color + :class:`matplotlib.path.Path` objects for easier rendering by + backends that do not directly support quadmeshes. + + This function is primarily of use to backend implementers. + """ + Path = mpath.Path + + if ma.isMaskedArray(coordinates): + c = coordinates.data + else: + c = coordinates + + triangles = np.concatenate(( + c[0:-1, 0:-1], + c[0:-1, 1: ], + c[1: , 1: ], + c[1: , 1: ], + c[1: , 0:-1], + c[0:-1, 0:-1] + ), axis=2) + triangles = triangles.reshape((meshWidth * meshHeight * 2, 3, 2)) + + c = self.get_facecolor().reshape((meshHeight + 1, meshWidth + 1, 4)) + colors = np.concatenate(( + c[0:-1, 0:-1], + c[0:-1, 1: ], + c[1: , 1: ], + c[1: , 1: ], + c[1: , 0:-1], + c[0:-1, 0:-1] + ), axis=2) + + colors = colors.reshape((meshWidth * meshHeight * 2, 3, 4)) + + return triangles, colors + def get_datalim(self, transData): return self._bbox @@ -1166,10 +1210,17 @@ def draw(self, renderer): gc.set_clip_rectangle(self.get_clip_box()) gc.set_clip_path(self.get_clip_path()) - renderer.draw_quad_mesh( - gc, transform.frozen(), self._meshWidth, self._meshHeight, - coordinates, offsets, transOffset, self.get_facecolor(), - self._antialiased, self._showedges) + if self._shading == 'gouraud': + triangles, colors = self.convert_mesh_to_triangles( + self._meshWidth, self._meshHeight, coordinates) + check = {} + for tri, col in zip(triangles, colors): + renderer.draw_gouraud_triangle(gc, tri, col, transform.frozen()) + else: + renderer.draw_quad_mesh( + gc, transform.frozen(), self._meshWidth, self._meshHeight, + coordinates, offsets, transOffset, self.get_facecolor(), + self._antialiased, self._showedges) renderer.close_group(self.__class__.__name__) diff --git a/src/_backend_agg.cpp b/src/_backend_agg.cpp index 5ce590ce38e9..aa2d83e129d3 100644 --- a/src/_backend_agg.cpp +++ b/src/_backend_agg.cpp @@ -1464,10 +1464,13 @@ RendererAgg::draw_gouraud_triangle(const Py::Tuple& args) { typedef agg::span_allocator span_alloc_t; //segments, trans, clipbox, colors, linewidths, antialiaseds - GCAgg gc(args[0], dpi); - Py::Object points_obj = args[1]; - Py::Object colors_obj = args[2]; - agg::trans_affine master_transform = py_to_agg_transformation_matrix(args[3].ptr()); + GCAgg gc(args[0], dpi); + Py::Object points_obj = args[1]; + Py::Object colors_obj = args[2]; + agg::trans_affine trans = py_to_agg_transformation_matrix(args[3].ptr()); + + trans *= agg::trans_affine_scaling(1.0, -1.0); + trans *= agg::trans_affine_translation(0.0, (double)height); PyArrayObject* points = (PyArrayObject*)PyArray_ContiguousFromAny (points_obj.ptr(), PyArray_DOUBLE, 2, 2); @@ -1489,7 +1492,7 @@ RendererAgg::draw_gouraud_triangle(const Py::Tuple& args) { for (int i = 0; i < 6; i += 2) { tpoints[i] = opoints[i]; tpoints[i+1] = opoints[i+1]; - master_transform.transform(&tpoints[i], &tpoints[i+1]); + trans.transform(&tpoints[i], &tpoints[i+1]); } span_alloc_t span_alloc; @@ -1503,7 +1506,7 @@ RendererAgg::draw_gouraud_triangle(const Py::Tuple& args) { tpoints[0], tpoints[1], tpoints[2], tpoints[3], tpoints[4], tpoints[5], - 1.0); + 0.5); theRasterizer.add_path(span_gen); agg::render_scanlines_aa( From 812e132b5385a0b387841dc909dd0432e6fcbb53 Mon Sep 17 00:00:00 2001 From: Michael Droettboom Date: Fri, 7 Aug 2009 19:39:27 +0000 Subject: [PATCH 0046/1000] Fix segfault in Agg backend svn path=/trunk/matplotlib/; revision=7420 --- src/_backend_agg.cpp | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/_backend_agg.cpp b/src/_backend_agg.cpp index aa2d83e129d3..643d28cd217c 100644 --- a/src/_backend_agg.cpp +++ b/src/_backend_agg.cpp @@ -1270,9 +1270,11 @@ RendererAgg::draw_path_collection(const Py::Tuple& args) { _VERBOSE("RendererAgg::draw_path_collection"); args.verify_length(12); - GCAgg gc(args[0], dpi); + Py::Object gc_obj = args[0]; + GCAgg gc(gc_obj, dpi); agg::trans_affine master_transform = py_to_agg_transformation_matrix(args[1].ptr()); - PathListGenerator paths(args[2]); + Py::SeqBase path = args[2]; + PathListGenerator path_generator(path); Py::SeqBase transforms_obj = args[3]; Py::Object offsets_obj = args[4]; agg::trans_affine offset_trans = py_to_agg_transformation_matrix(args[5].ptr()); @@ -1283,7 +1285,6 @@ RendererAgg::draw_path_collection(const Py::Tuple& args) { Py::SeqBase antialiaseds = args[10]; // We don't actually care about urls for Agg, so just ignore it. // Py::SeqBase urls = args[11]; - PathListGenerator path_generator(paths); try { _draw_path_collection_generic From e4bfcc09eb728569aea3f69b812662d76ad829f2 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Sat, 8 Aug 2009 01:46:44 +0000 Subject: [PATCH 0047/1000] Convert slit paths to compound paths inside cntr.c. svn path=/trunk/matplotlib/; revision=7422 --- lib/matplotlib/contour.py | 21 +--- src/cntr.c | 197 +++++++++++++++++++++++++++++++++++++- 2 files changed, 199 insertions(+), 19 deletions(-) diff --git a/lib/matplotlib/contour.py b/lib/matplotlib/contour.py index b2bef546191f..aa4a6e7b0771 100644 --- a/lib/matplotlib/contour.py +++ b/lib/matplotlib/contour.py @@ -539,7 +539,6 @@ def __init__(self, ax, *args, **kwargs): """ self.ax = ax - self.noslit = kwargs.get('noslit', False) # **Temporary** self.levels = kwargs.get('levels', None) self.filled = kwargs.get('filled', False) self.linewidths = kwargs.get('linewidths', None) @@ -599,8 +598,6 @@ def __init__(self, ax, *args, **kwargs): self.collections = cbook.silent_list('collections.PathCollection') else: self.collections = cbook.silent_list('collections.LineCollection') - self.segs = [] - self.kinds = [] # label lists must be initialized here self.labelTexts = [] self.labelCValues = [] @@ -629,8 +626,6 @@ def __init__(self, ax, *args, **kwargs): alpha=self.alpha) self.ax.add_collection(col) self.collections.append(col) - self.segs.append(segs) - self.kinds.append(kinds) else: tlinewidths = self._process_linewidths() self.tlinewidths = tlinewidths @@ -639,7 +634,7 @@ def __init__(self, ax, *args, **kwargs): nlist = C.trace(level) nseg = len(nlist)//2 segs = nlist[:nseg] - kinds = nlist[nseg:] + #kinds = nlist[nseg:] col = collections.LineCollection(segs, linewidths = width, linestyle = lstyle, @@ -648,24 +643,16 @@ def __init__(self, ax, *args, **kwargs): col.set_label('_nolegend_') self.ax.add_collection(col, False) self.collections.append(col) - self.segs.append(segs) - self.kinds.append(kinds) self.changed() # set the colors def _make_paths(self, segs, kinds): paths = [] for seg, kind in zip(segs, kinds): - codes = np.zeros(kind.shape, dtype=mpath.Path.code_type) - codes.fill(mpath.Path.LINETO) - codes[0] = mpath.Path.MOVETO - # points that begin a slit or are in it: - # use moveto for any point *following* such a point - if self.noslit: - in_slit = kind[:-1] >= _cntr._slitkind - codes[1:][in_slit] = mpath.Path.MOVETO - paths.append(mpath.Path(seg, codes)) + paths.append(mpath.Path(seg, codes=kind)) return paths + + def changed(self): tcolors = [ (tuple(rgba),) for rgba in self.to_rgba(self.cvalues, alpha=self.alpha)] diff --git a/src/cntr.c b/src/cntr.c index 6bd21527a1e0..9ad52fc099d2 100644 --- a/src/cntr.c +++ b/src/cntr.c @@ -1318,12 +1318,204 @@ void cntr_del(Csite *site) site = NULL; } +#define MOVETO 1 +#define LINETO 2 -/* Build a list of XY 2-D arrays, shape (N,2), to which a list of K arrays - is concatenated. */ +int reorder(double *xpp, double *ypp, short *kpp, + double *xy, unsigned char *c, int npts) +{ + int *i0; + int *i1; + int *subp=NULL; /* initialized to suppress warning */ + int isp, nsp; + int iseg, nsegs; + int isegplus; + int i; + int k; + int started; + int maxnsegs = npts/2 + 1; + + /* allocate maximum possible size--gross overkill */ + i0 = malloc(maxnsegs * sizeof(int)); + i1 = malloc(maxnsegs * sizeof(int)); + + /* Find the segments. */ + iseg = 0; + started = 0; + for (i=0; i= kind_slit_up) || (i == npts-1)) + { + i1[iseg] = i; + started = 0; + iseg++; + if (iseg == maxnsegs) + { + k = -1; + goto ending; + } + } + } + else if ((kpp[i] < kind_slit_up) && (i < npts-1)) + { + i0[iseg] = i; + started = 1; + } + } + + nsegs = iseg; + + + /* Find the subpaths as sets of connected segments. */ + + subp = malloc(nsegs * sizeof(int)); + for (i=0; i= 0) continue; + subp[iseg] = nsp; + nsp++; + if (iseg == nsegs-1) continue; + for (isegplus = iseg+1; isegplus < nsegs; isegplus++) + { + if (subp[isegplus] >= 0) continue; + + if (xend == xpp[i0[isegplus]] && yend == ypp[i0[isegplus]]) + { + subp[isegplus] = subp[iseg]; + xend = xpp[i1[isegplus]]; + yend = ypp[i1[isegplus]]; + } + + } + } + + /* Generate the verts and codes from the subpaths. */ + k = 0; + for (isp=0; isp npts) /* should never happen */ + { + k = -1; + goto ending; + } + } + } + } + + ending: + free(i0); + free(i1); + free(subp); + + return k; +} + +/* Build a list of XY 2-D arrays, shape (N,2), to which a list of path + code arrays is concatenated. +*/ static PyObject * build_cntr_list_v2(long *np, double *xp, double *yp, short *kp, int nparts, long ntotal) +{ + PyObject *all_contours; + PyArrayObject *xyv; + PyArrayObject *kv; + npy_intp dims[2]; + npy_intp kdims[1]; + int i; + long k; + + PyArray_Dims newshape; + + all_contours = PyList_New(nparts*2); + + for (i=0, k=0; i < nparts; k+= np[i], i++) + { + double *xpp = xp+k; + double *ypp = yp+k; + short *kpp = kp+k; + int n; + + + dims[0] = np[i]; + dims[1] = 2; + kdims[0] = np[i]; + xyv = (PyArrayObject *) PyArray_SimpleNew(2, dims, PyArray_DOUBLE); + if (xyv == NULL) goto error; + kv = (PyArrayObject *) PyArray_SimpleNew(1, kdims, PyArray_UBYTE); + if (kv == NULL) goto error; + + n = reorder(xpp, ypp, kpp, + (double *) xyv->data, + (unsigned char *) kv->data, + np[i]); + if (n == -1) goto error; + newshape.len = 2; + dims[0] = n; + newshape.ptr = dims; + if (PyArray_Resize(xyv, &newshape, 1, NPY_CORDER) == NULL) goto error; + + newshape.len = 1; /* ptr, dims can stay the same */ + if (PyArray_Resize(kv, &newshape, 1, NPY_CORDER) == NULL) goto error; + + + if (PyList_SetItem(all_contours, i, (PyObject *)xyv)) goto error; + if (PyList_SetItem(all_contours, nparts+i, + (PyObject *)kv)) goto error; + } + return all_contours; + + error: + Py_XDECREF(xyv); + Py_XDECREF(kv); + Py_XDECREF(all_contours); + return NULL; +} + +#if 0 /* preprocess this out when we are not using it. */ +/* Build a list of XY 2-D arrays, shape (N,2), to which a list of K arrays + is concatenated. + This is kept in the code in case we need to switch back to it, + or in case we need it for investigating the infamous internal + masked region bug. +*/ + +static PyObject * +__build_cntr_list_v2(long *np, double *xp, double *yp, short *kp, + int nparts, long ntotal) { PyObject *all_contours; PyArrayObject *xyv; @@ -1364,6 +1556,7 @@ build_cntr_list_v2(long *np, double *xp, double *yp, short *kp, return NULL; } +#endif /* preprocessing out the old version for now */ /* cntr_trace is called once per contour level or level pair. From df066b5d47d5ca9e39c523a721c6d2302e3ef5c6 Mon Sep 17 00:00:00 2001 From: Jae-Joon Lee Date: Sat, 8 Aug 2009 02:06:56 +0000 Subject: [PATCH 0048/1000] BboxImage implemented and two examples added. svn path=/trunk/matplotlib/; revision=7423 --- CHANGELOG | 3 + examples/pylab_examples/demo_bboximage.py | 62 +++++++++ examples/pylab_examples/demo_ribbon_box.py | 140 ++++++++++++++++++++ lib/matplotlib/image.py | 145 +++++++++++++++++++++ 4 files changed, 350 insertions(+) create mode 100644 examples/pylab_examples/demo_bboximage.py create mode 100644 examples/pylab_examples/demo_ribbon_box.py diff --git a/CHANGELOG b/CHANGELOG index 14859848e926..98dc74e8c7af 100644 --- a/CHANGELOG +++ b/CHANGELOG @@ -1,3 +1,6 @@ +2009-08-07 BboxImage implemented. Two examples, demo_bboximage.py and + demo_ribbon_box.py added. - JJL + 2009-08-07 In an effort to simplify the backend API, all clipping rectangles and paths are now passed in using GraphicsContext objects, even on collections and images. Therefore: diff --git a/examples/pylab_examples/demo_bboximage.py b/examples/pylab_examples/demo_bboximage.py new file mode 100644 index 000000000000..e442fb70bc3a --- /dev/null +++ b/examples/pylab_examples/demo_bboximage.py @@ -0,0 +1,62 @@ +import matplotlib.pyplot as plt +import numpy as np +from matplotlib.image import BboxImage +from matplotlib.transforms import Bbox, TransformedBbox + +if __name__ == "__main__": + + fig = plt.figure(1) + ax = plt.subplot(121) + + txt = ax.text(0.5, 0.5, "test", size=30, ha="center", color="w") + kwargs = dict() + + bbox_image = BboxImage(txt.get_window_extent, + norm = None, + origin=None, + clip_on=False, + **kwargs + ) + a = np.arange(256).reshape(1,256)/256. + bbox_image.set_data(a) + ax.add_artist(bbox_image) + + + ax = plt.subplot(122) + a = np.linspace(0, 1, 256).reshape(1,-1) + a = np.vstack((a,a)) + + maps = sorted(m for m in plt.cm.datad if not m.endswith("_r")) + #nmaps = len(maps) + 1 + + #fig.subplots_adjust(top=0.99, bottom=0.01, left=0.2, right=0.99) + + ncol = 2 + nrow = len(maps)//ncol + 1 + + xpad_fraction = 0.3 + dx = 1./(ncol + xpad_fraction*(ncol-1)) + + ypad_fraction = 0.3 + dy = 1./(nrow + ypad_fraction*(nrow-1)) + + for i,m in enumerate(maps): + ix, iy = divmod(i, nrow) + #plt.figimage(a, 10, i*10, cmap=plt.get_cmap(m), origin='lower') + bbox0 = Bbox.from_bounds(ix*dx*(1+xpad_fraction), + 1.-iy*dy*(1+ypad_fraction)-dy, + dx, dy) + bbox = TransformedBbox(bbox0, ax.transAxes) + + bbox_image = BboxImage(bbox, + cmap = plt.get_cmap(m), + norm = None, + origin=None, + **kwargs + ) + + bbox_image.set_data(a) + ax.add_artist(bbox_image) + + plt.draw() + plt.show() diff --git a/examples/pylab_examples/demo_ribbon_box.py b/examples/pylab_examples/demo_ribbon_box.py new file mode 100644 index 000000000000..2503ddbc698a --- /dev/null +++ b/examples/pylab_examples/demo_ribbon_box.py @@ -0,0 +1,140 @@ +import matplotlib.pyplot as plt +import numpy as np +from matplotlib.image import BboxImage + +from matplotlib._png import read_png +import matplotlib.colors +from matplotlib.cbook import get_sample_data + +class RibbonBox(object): + + original_image = read_png(get_sample_data("Minduka_Present_Blue_Pack.png", + asfileobj=False)) + cut_location = 70 + b_and_h = original_image[:,:,2] + color = original_image[:,:,2] - original_image[:,:,0] + alpha = original_image[:,:,3] + nx = original_image.shape[1] + + def __init__(self, color): + rgb = matplotlib.colors.colorConverter.to_rgb(color) + + im = np.empty(self.original_image.shape, + self.original_image.dtype) + + + im[:,:,:3] = self.b_and_h[:,:,np.newaxis] + im[:,:,:3] -= self.color[:,:,np.newaxis]*(1.-np.array(rgb)) + im[:,:,3] = self.alpha + + self.im = im + + + def get_stretched_image(self, stretch_factor): + stretch_factor = max(stretch_factor, 1) + ny, nx, nch = self.im.shape + ny2 = int(ny*stretch_factor) + + stretched_image = np.empty((ny2, nx, nch), + self.im.dtype) + cut = self.im[self.cut_location,:,:] + stretched_image[:,:,:] = cut + stretched_image[:self.cut_location,:,:] = \ + self.im[:self.cut_location,:,:] + stretched_image[-(ny-self.cut_location):,:,:] = \ + self.im[-(ny-self.cut_location):,:,:] + + self._cached_im = stretched_image + return stretched_image + + + +class RibbonBoxImage(BboxImage): + zorder = 1 + + def __init__(self, bbox, color, + cmap = None, + norm = None, + interpolation=None, + origin=None, + filternorm=1, + filterrad=4.0, + resample = False, + **kwargs + ): + + BboxImage.__init__(self, bbox, + cmap = None, + norm = None, + interpolation=None, + origin=None, + filternorm=1, + filterrad=4.0, + resample = False, + **kwargs + ) + + self._ribbonbox = RibbonBox(color) + self._cached_ny = None + + + def draw(self, renderer, *args, **kwargs): + + bbox = self.get_window_extent(renderer) + stretch_factor = bbox.height / bbox.width + + ny = int(stretch_factor*self._ribbonbox.nx) + if self._cached_ny != ny: + arr = self._ribbonbox.get_stretched_image(stretch_factor) + self.set_array(arr) + self._cached_ny = ny + + BboxImage.draw(self, renderer, *args, **kwargs) + + +if 1: + from matplotlib.transforms import Bbox, TransformedBbox + from matplotlib.ticker import ScalarFormatter + + fig = plt.gcf() + fig.clf() + ax = plt.subplot(111) + + years = np.arange(2004, 2009) + box_colors = [(0.8, 0.2, 0.2), + (0.2, 0.8, 0.2), + (0.2, 0.2, 0.8), + (0.7, 0.5, 0.8), + (0.3, 0.8, 0.7), + ] + heights = np.random.random(years.shape) * 7000 + 3000 + + fmt = ScalarFormatter(useOffset=False) + ax.xaxis.set_major_formatter(fmt) + + for year, h, bc in zip(years, heights, box_colors): + bbox0 = Bbox.from_extents(year-0.4, 0., year+0.4, h) + bbox = TransformedBbox(bbox0, ax.transData) + rb_patch = RibbonBoxImage(bbox, bc) + + ax.add_artist(rb_patch) + + ax.annotate(r"%d" % (int(h/100.)*100), + (year, h), va="bottom", ha="center") + + patch_gradient = BboxImage(ax.bbox, + interpolation="bicubic", + zorder=0.1, + ) + gradient = np.zeros((2, 2, 4), dtype=np.float) + gradient[:,:,:3] = [1, 1, 0.] + gradient[:,:,3] = [[0.1, 0.3],[0.3, 0.5]] # alpha channel + patch_gradient.set_array(gradient) + ax.add_artist(patch_gradient) + + + ax.set_xlim(years[0]-0.5, years[-1]+0.5) + ax.set_ylim(0, 10000) + + plt.show() + diff --git a/lib/matplotlib/image.py b/lib/matplotlib/image.py index 61697ada8846..18cb88181dbf 100644 --- a/lib/matplotlib/image.py +++ b/lib/matplotlib/image.py @@ -24,6 +24,8 @@ # the image namespace: from matplotlib._image import * +from matplotlib.transforms import BboxBase + class AxesImage(martist.Artist, cm.ScalarMappable): zorder = 1 # map interpolation strings to module constants @@ -744,6 +746,149 @@ def write_png(self, fname): rows, cols, buffer = im.as_rgba_str() _png.write_png(buffer, cols, rows, fname) + +class BboxImage(AxesImage): + """ + The Image class whose size is determined by the given bbox. + """ + zorder = 1 + def __init__(self, bbox, + cmap = None, + norm = None, + interpolation=None, + origin=None, + filternorm=1, + filterrad=4.0, + resample = False, + **kwargs + ): + + """ + cmap is a colors.Colormap instance + norm is a colors.Normalize instance to map luminance to 0-1 + + kwargs are an optional list of Artist keyword args + """ + + AxesImage.__init__(self, ax=None, + cmap = cmap, + norm = norm, + interpolation=interpolation, + origin=origin, + filternorm=filternorm, + filterrad=filterrad, + resample = resample, + **kwargs + ) + + self.bbox = bbox + + def get_window_extent(self, renderer=None): + if renderer is None: + renderer = self.get_figure()._cachedRenderer + + if isinstance(self.bbox, BboxBase): + return self.bbox + elif callable(self.bbox): + return self.bbox(renderer) + else: + raise ValueError("unknown type of bbox") + + + def contains(self, mouseevent): + """Test whether the mouse event occured within the image. + """ + + if callable(self._contains): return self._contains(self,mouseevent) + + if not self.get_visible():# or self.get_figure()._renderer is None: + return False,{} + + x, y = mouseevent.x, mouseevent.y + inside = self.get_window_extent().contains(x, y) + + return inside,{} + + def get_size(self): + 'Get the numrows, numcols of the input image' + if self._A is None: + raise RuntimeError('You must first set the image array') + + return self._A.shape[:2] + + def make_image(self, renderer, magnification=1.0): + if self._A is None: + raise RuntimeError('You must first set the image array or the image attribute') + + if self._imcache is None: + if self._A.dtype == np.uint8 and len(self._A.shape) == 3: + im = _image.frombyte(self._A, 0) + im.is_grayscale = False + else: + if self._rgbacache is None: + x = self.to_rgba(self._A, self._alpha) + self._rgbacache = x + else: + x = self._rgbacache + im = _image.fromarray(x, 0) + if len(self._A.shape) == 2: + im.is_grayscale = self.cmap.is_gray() + else: + im.is_grayscale = False + self._imcache = im + + if self.origin=='upper': + im.flipud_in() + else: + im = self._imcache + + if 0: + fc = self.axes.patch.get_facecolor() + bg = mcolors.colorConverter.to_rgba(fc, 0) + im.set_bg( *bg) + + # image input dimensions + im.reset_matrix() + + im.set_interpolation(self._interpd[self._interpolation]) + + im.set_resample(self._resample) + + l, b, r, t = self.get_window_extent(renderer).extents #bbox.extents + widthDisplay = (round(r) + 0.5) - (round(l) - 0.5) + heightDisplay = (round(t) + 0.5) - (round(b) - 0.5) + widthDisplay *= magnification + heightDisplay *= magnification + #im.apply_translation(tx, ty) + + numrows, numcols = self._A.shape[:2] + + # resize viewport to display + rx = widthDisplay / numcols + ry = heightDisplay / numrows + #im.apply_scaling(rx*sx, ry*sy) + im.apply_scaling(rx, ry) + #im.resize(int(widthDisplay+0.5), int(heightDisplay+0.5), + # norm=self._filternorm, radius=self._filterrad) + im.resize(int(widthDisplay), int(heightDisplay), + norm=self._filternorm, radius=self._filterrad) + return im + + + @allow_rasterization + def draw(self, renderer, *args, **kwargs): + if not self.get_visible(): return + # todo: we should be able to do some cacheing here + image_mag = renderer.get_image_magnification() + im = self.make_image(renderer, image_mag) + l, b, r, t = self.get_window_extent(renderer).extents + gc = renderer.new_gc() + self._set_gc_clip(gc) + #gc.set_clip_path(self.get_clip_path()) + renderer.draw_image(gc, round(l), round(b), im) + + + def imread(fname): """ Return image file in *fname* as :class:`numpy.array`. From 3cedb3167afad439cf399a0d888bd6d057ad6c43 Mon Sep 17 00:00:00 2001 From: Eric Firing Date: Sat, 8 Aug 2009 06:24:00 +0000 Subject: [PATCH 0049/1000] Merged revisions 7407,7409,7414,7416,7424 via svnmerge from https://matplotlib.svn.sourceforge.net/svnroot/matplotlib/branches/v0_99_maint ........ r7407 | jdh2358 | 2009-08-06 08:51:58 -1000 (Thu, 06 Aug 2009) | 1 line hide colorbar_doc a bit ........ r7409 | ryanmay | 2009-08-06 09:28:16 -1000 (Thu, 06 Aug 2009) | 1 line Tweak solution for hiding colorbar_doc to sync with trunk. ........ r7414 | jdh2358 | 2009-08-07 00:15:04 -1000 (Fri, 07 Aug 2009) | 1 line some doc fixes ........ r7416 | jdh2358 | 2009-08-07 05:40:56 -1000 (Fri, 07 Aug 2009) | 1 line don't fail on window icon load ........ r7424 | efiring | 2009-08-07 20:07:06 -1000 (Fri, 07 Aug 2009) | 2 lines Restore default colormap behavior: no color (alpha = 0) for masked data ........ svn path=/trunk/matplotlib/; revision=7425 --- doc/_templates/indexsidebar.html | 2 +- doc/users/annotations.rst | 4 +- doc/users/artists.rst | 41 +- doc/users/credits.rst | 21 +- doc/users/event_handling.rst | 1108 ++++++++++++------------ doc/users/pyplot_tutorial.rst | 20 +- doc/users/screenshots.rst | 15 + doc/users/whats_new.rst | 11 +- lib/matplotlib/backends/backend_gtk.py | 17 +- lib/matplotlib/colors.py | 5 +- 10 files changed, 619 insertions(+), 625 deletions(-) diff --git a/doc/_templates/indexsidebar.html b/doc/_templates/indexsidebar.html index 0d018744fcd7..6a80b22d55e4 100644 --- a/doc/_templates/indexsidebar.html +++ b/doc/_templates/indexsidebar.html @@ -29,7 +29,7 @@